diff --git a/examples/setting/src/main.rs b/examples/setting/src/main.rs index d7191f5..a3bd2dc 100644 --- a/examples/setting/src/main.rs +++ b/examples/setting/src/main.rs @@ -5,4 +5,5 @@ fn main() { let known = camera.camera_controls_known_camera_controls().unwrap(); let mut control = *known.get(&KnownCameraControl::Gamma).unwrap(); control.set_value(101).unwrap(); + camera.set_camera_control(control).unwrap(); } diff --git a/nokhwa-bindings-windows/Cargo.toml b/nokhwa-bindings-windows/Cargo.toml index 98e8455..32c9afe 100644 --- a/nokhwa-bindings-windows/Cargo.toml +++ b/nokhwa-bindings-windows/Cargo.toml @@ -17,6 +17,6 @@ lazy_static = "1.4.0" version = "0.1" path = "../nokhwa-core" -[target.'cfg(any(target_os="windows",target_os="windows"))'.dependencies.windows] -version = "0.42" -features = ["Win32_Media_MediaFoundation", "Win32_System_Com", "Win32_Foundation", "Win32_Media_DirectShow", "Win32_Media", "Win32"] +[dependencies.windows] +version = "0.42.0" +features = ["Win32_Media_MediaFoundation", "Win32_System_Com", "Win32_Foundation", "Win32_Media_DirectShow", "Win32_Media", "Win32", "Win32_Media_KernelStreaming"] diff --git a/nokhwa-bindings-windows/src/lib.rs b/nokhwa-bindings-windows/src/lib.rs index 962905a..ed58d71 100644 --- a/nokhwa-bindings-windows/src/lib.rs +++ b/nokhwa-bindings-windows/src/lib.rs @@ -63,6 +63,7 @@ pub mod wmf { core::{Interface, GUID, PWSTR}, Win32::{ Media::{ + KernelStreaming::GUID_NULL, DirectShow::{ CameraControl_Exposure, CameraControl_Focus, CameraControl_Iris, CameraControl_Pan, CameraControl_Roll, CameraControl_Tilt, CameraControl_Zoom, @@ -79,7 +80,7 @@ pub mod wmf { MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID, MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, - MF_MEDIASOURCE_SERVICE, MF_MT_FRAME_RATE, MF_MT_FRAME_RATE_RANGE_MAX, + MF_MT_FRAME_RATE, MF_MT_FRAME_RATE_RANGE_MAX, MF_MT_FRAME_RATE_RANGE_MIN, MF_MT_FRAME_SIZE, MF_MT_MAJOR_TYPE, MF_MT_SUBTYPE, MF_READWRITE_DISABLE_CONVERTERS, }, @@ -118,6 +119,7 @@ pub mod wmf { ); const MEDIA_FOUNDATION_FIRST_VIDEO_STREAM: u32 = 0xFFFF_FFFC; + const MF_SOURCE_READER_MEDIASOURCE: u32 = 0xFFFF_FFFF; const CAM_CTRL_AUTO: i32 = 0x0001; const CAM_CTRL_MANUAL: i32 = 0x0002; @@ -665,38 +667,40 @@ pub mod wmf { } pub fn control(&self, control: KnownCameraControl) -> Result { - let media_source = unsafe { - let mut receiver: MaybeUninit = MaybeUninit::uninit(); - let mut ptr_receiver = receiver.as_mut_ptr(); + let camera_control = unsafe { + let mut receiver: MaybeUninit = MaybeUninit::uninit(); + let ptr_receiver = receiver.as_mut_ptr(); if let Err(why) = self.source_reader.GetServiceForStream( MF_SOURCE_READER_MEDIASOURCE, - &MF_MEDIASOURCE_SERVICE, - &IMFMediaSource::IID, - std::ptr::addr_of_mut!(ptr_receiver).cast::<*mut std::ffi::c_void>(), + &GUID_NULL, + &IAMCameraControl::IID, + (ptr_receiver as *mut IAMCameraControl).cast::<*mut std::ffi::c_void>(), ) { - return Err(NokhwaError::SetPropertyError { - property: "MEDIA_FOUNDATION_FIRST_VIDEO_STREAM".to_string(), - value: "MF_MEDIASOURCE_SERVICE".to_string(), - error: why.to_string(), - }); + return Err(BindingError::GUIDSetError( + "MF_SOURCE_READER_MEDIASOURCE".to_string(), + "IAMCameraControl".to_string(), + why.to_string(), + )); + } + receiver.assume_init() + }; + let video_proc_amp = unsafe { + let mut receiver: MaybeUninit = MaybeUninit::uninit(); + let ptr_receiver = receiver.as_mut_ptr(); + if let Err(why) = self.source_reader.GetServiceForStream( + MF_SOURCE_READER_MEDIASOURCE, + &GUID_NULL, + &IAMVideoProcAmp::IID, + (ptr_receiver as *mut IAMVideoProcAmp).cast::<*mut std::ffi::c_void>(), + ) { + return Err(BindingError::GUIDSetError( + "MF_SOURCE_READER_MEDIASOURCE".to_string(), + "IAMVideoProcAmp".to_string(), + why.to_string(), + )); } receiver.assume_init() }; - - let camera_control: IAMCameraControl = media_source - .cast::() - .map_err(|why| NokhwaError::StructureError { - structure: "IAMCameraControl".to_string(), - error: why.to_string(), - })?; - - let video_proc_amp: IAMVideoProcAmp = - media_source.cast::().map_err(|why| { - NokhwaError::StructureError { - structure: "IAMVideoProcAmp".to_string(), - error: why.to_string(), - } - })?; let mut min = 0; let mut max = 0; @@ -847,38 +851,37 @@ pub mod wmf { ) -> Result<(), NokhwaError> { let current_value = self.control(control)?; - let media_source = unsafe { - let mut receiver: MaybeUninit = MaybeUninit::uninit(); - let mut ptr_receiver = receiver.as_mut_ptr(); + let camera_control = unsafe { + let mut receiver: MaybeUninit = MaybeUninit::uninit(); + let ptr_receiver = receiver.as_mut_ptr(); if let Err(why) = self.source_reader.GetServiceForStream( - MEDIA_FOUNDATION_FIRST_VIDEO_STREAM, - &MF_MEDIASOURCE_SERVICE, - &IMFMediaSource::IID, - std::ptr::addr_of_mut!(ptr_receiver).cast::<*mut std::ffi::c_void>(), + MF_SOURCE_READER_MEDIASOURCE, + &GUID_NULL, + &IAMCameraControl::IID, + (ptr_receiver as *mut IAMCameraControl).cast::<*mut std::ffi::c_void>(), ) { - return Err(NokhwaError::SetPropertyError { - property: "MEDIA_FOUNDATION_FIRST_VIDEO_STREAM".to_string(), - value: "MF_MEDIASOURCE_SERVICE".to_string(), - error: why.to_string(), - }); + return Err(BindingError::GUIDSetError( + "MF_SOURCE_READER_MEDIASOURCE".to_string(), + "IAMCameraControl".to_string(), + why.to_string(), + )); } receiver.assume_init() }; - - let camera_control: IAMCameraControl = media_source - .cast::() - .map_err(|why| NokhwaError::StructureError { - structure: "IAMCameraControl".to_string(), - error: why.to_string(), - })?; - - let video_proc_amp: IAMVideoProcAmp = - media_source.cast::().map_err(|why| { - NokhwaError::StructureError { - structure: "IAMVideoProcAmp".to_string(), - error: why.to_string(), - } - })?; + let video_proc_amp = unsafe { + let mut receiver: MaybeUninit = MaybeUninit::uninit(); + let ptr_receiver = receiver.as_mut_ptr(); + if let Err(why) = self.source_reader.GetServiceForStream( + MF_SOURCE_READER_MEDIASOURCE, + &GUID_NULL, + &IAMVideoProcAmp::IID, + (ptr_receiver as *mut IAMVideoProcAmp).cast::<*mut std::ffi::c_void>(), + ) { + return Err(BindingError::GUIDSetError( + "MF_SOURCE_READER_MEDIASOURCE".to_string(), + "IAMVideoProcAmp".to_string(), + why.to_string(), + )); let control_id = kcc_to_i32(control).ok_or(NokhwaError::SetPropertyError { property: "CameraControl".to_string(), @@ -895,6 +898,7 @@ pub mod wmf { error: "invalid value type".to_string(), }) } + receiver.assume_init() }; let flag = current_value @@ -1228,12 +1232,10 @@ pub mod wmf { #[allow(clippy::missing_errors_doc)] #[allow(clippy::unused_self)] pub mod wmf { - use nokhwa_core::{ - error::NokhwaError, - types::{ - CameraControl, CameraFormat, CameraIndex, CameraInfo, ControlValueSetter, - KnownCameraControl, - }, + use nokhwa_core::error::NokhwaError; + use nokhwa_core::types::{ + CameraControl, CameraFormat, CameraIndex, CameraInfo, ControlValueSetter, + KnownCameraControl, }; use std::borrow::Cow;