mirror of
https://github.com/l1npengtul/nokhwa.git
synced 2026-07-04 02:27:26 +00:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user