Merge remote-tracking branch 'origin/senpai' into senpai

# Conflicts:
#	nokhwa-bindings-windows/Cargo.toml
#	nokhwa-bindings-windows/src/lib.rs
This commit is contained in:
l1npengtul
2022-10-13 01:05:37 +09:00
3 changed files with 66 additions and 63 deletions
+1
View File
@@ -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();
}
+3 -3
View File
@@ -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"]
+62 -60
View File
@@ -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<CameraControl, NokhwaError> {
let media_source = unsafe {
let mut receiver: MaybeUninit<IMFMediaSource> = MaybeUninit::uninit();
let mut ptr_receiver = receiver.as_mut_ptr();
let camera_control = unsafe {
let mut receiver: MaybeUninit<IAMCameraControl> = 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<IAMVideoProcAmp> = 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::<IAMCameraControl>()
.map_err(|why| NokhwaError::StructureError {
structure: "IAMCameraControl".to_string(),
error: why.to_string(),
})?;
let video_proc_amp: IAMVideoProcAmp =
media_source.cast::<IAMVideoProcAmp>().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<IMFMediaSource> = MaybeUninit::uninit();
let mut ptr_receiver = receiver.as_mut_ptr();
let camera_control = unsafe {
let mut receiver: MaybeUninit<IAMCameraControl> = 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::<IAMCameraControl>()
.map_err(|why| NokhwaError::StructureError {
structure: "IAMCameraControl".to_string(),
error: why.to_string(),
})?;
let video_proc_amp: IAMVideoProcAmp =
media_source.cast::<IAMVideoProcAmp>().map_err(|why| {
NokhwaError::StructureError {
structure: "IAMVideoProcAmp".to_string(),
error: why.to_string(),
}
})?;
let video_proc_amp = unsafe {
let mut receiver: MaybeUninit<IAMVideoProcAmp> = 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;