X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihed-cros-libva%2Fsrc%2Fdisplay.rs;h=7cff18fa3ab6ab80fa182e669f04a3f3abc2eb6d;hb=49bf1d79384ecf1b28822101233719fb1c1b29b1;hp=9e7c3e0d91135daf809ba95fb6ed5f2e09fdef6b;hpb=379fea7e311111ee1dfefba1526979e69073c650;p=nihav-player.git diff --git a/nihed-cros-libva/src/display.rs b/nihed-cros-libva/src/display.rs index 9e7c3e0..7cff18f 100644 --- a/nihed-cros-libva/src/display.rs +++ b/nihed-cros-libva/src/display.rs @@ -12,6 +12,7 @@ use std::rc::Rc; use crate::bindings; use crate::config::Config; use crate::context::Context; +use crate::formats::{RTFormat, VAFourcc}; use crate::status::*; use crate::surface::Surface; use crate::UsageHints; @@ -55,6 +56,10 @@ impl Iterator for DrmDeviceIterator { } } +unsafe extern "C" fn null_msg_cb(_ctx: *mut std::ffi::c_void, _message: *const std::ffi::c_char) { +// let msg = CStr::from_ptr(message).to_string_lossy(); +} + /// A VADisplay opened over DRM. /// /// A Display is the starting point to using libva. This struct is essentially a safe wrapper over @@ -77,6 +82,9 @@ impl Display { /// /// `path` is the path to a DRM device that supports VAAPI, e.g. `/dev/dri/renderD128`. pub fn open_drm_display>(path: P) -> VAResult> { + Self::open_drm_display_internal(path, false) + } + fn open_drm_display_internal>(path: P, silent: bool) -> VAResult> { let file = std::fs::File::options() .read(true) .write(true) @@ -91,12 +99,26 @@ impl Display { return Err(VAError::InvalidDisplay); } + if silent { + // Safe because we ensure that the display is valid (i.e not NULL) before call. + unsafe { + bindings::vaSetInfoCallback(display, Some(null_msg_cb), std::ptr::null_mut()); + } + } + let mut major = 0i32; let mut minor = 0i32; // Safe because we ensure that the display is valid (i.e not NULL) before calling // vaInitialize. The File will close the DRM fd on drop. (unsafe { bindings::vaInitialize(display, &mut major, &mut minor) }).check()?; + if silent { + // Safe because we ensure that the display is valid (i.e not NULL) before call. + unsafe { + bindings::vaSetInfoCallback(display, None, std::ptr::null_mut()); + } + } + Ok(Rc::new(Self { handle: display, drm_file: file, @@ -120,6 +142,26 @@ impl Display { None } + /// Opens the first device that succeeds and returns its `Display`. + /// + /// The only difference from ordinary `open` is that it does not print debug information + /// about libva version and opened driver. + /// + /// If an error occurs on a given device, it is ignored and the next one is tried until one + /// succeeds or we reach the end of the iterator. + pub fn open_silently() -> Option> { + let devices = DrmDeviceIterator::default(); + + // Try all the DRM devices until one succeeds. + for device in devices { + if let Ok(display) = Self::open_drm_display_internal(device, true) { + return Some(display); + } + } + + None + } + /// Returns the handle of this display. pub(crate) fn handle(&self) -> bindings::VADisplay { self.handle @@ -230,7 +272,7 @@ impl Display { /// /// # Arguments /// - /// * `rt_format` - The desired surface format. See `VA_RT_FORMAT_*` + /// * `rt_format` - The desired surface format. /// * `va_fourcc` - The desired pixel format (optional). See `VA_FOURCC_*` /// * `width` - Width for the create surfaces /// * `height` - Height for the created surfaces @@ -238,8 +280,8 @@ impl Display { /// * `num_surfaces` - Number of surfaces to create pub fn create_surfaces( self: &Rc, - rt_format: u32, - va_fourcc: Option, + rt_format: RTFormat, + va_fourcc: Option, width: u32, height: u32, usage_hints: Option,