use nokhwa_core::{
error::NokhwaError,
types::{ApiBackend, CameraInfo},
};
#[must_use]
pub fn native_api_backend() -> Option<ApiBackend> {
match std::env::consts::OS {
"linux" => Some(ApiBackend::Video4Linux),
"macos" | "ios" => Some(ApiBackend::AVFoundation),
"windows" => Some(ApiBackend::MediaFoundation),
_ => None,
}
}
pub fn query(api: ApiBackend) -> Result<Vec<CameraInfo>, NokhwaError> {
match api {
ApiBackend::Auto => {
match std::env::consts::OS {
"linux" => {
if cfg!(feature = "input-v4l") && cfg!(target_os = "linux") {
query(ApiBackend::Video4Linux)
} else if cfg!(feature = "input-opencv") {
query(ApiBackend::OpenCv)
} else {
dbg!("Error: No suitable Backends available. Perhaps you meant to enable one of the backends such as `input-v4l`? (Please read the docs.)");
Err(NokhwaError::UnsupportedOperationError(ApiBackend::Auto))
}
}
"windows" => {
if cfg!(feature = "input-msmf") && cfg!(target_os = "windows") {
query(ApiBackend::MediaFoundation)
} else if cfg!(feature = "input-opencv") {
query(ApiBackend::OpenCv)
} else {
dbg!("Error: No suitable Backends available. Perhaps you meant to enable one of the backends such as `input-msmf`? (Please read the docs.)");
Err(NokhwaError::UnsupportedOperationError(ApiBackend::Auto))
}
}
"macos" => {
if cfg!(feature = "input-avfoundation") {
query(ApiBackend::AVFoundation)
} else if cfg!(feature = "input-opencv") {
query(ApiBackend::OpenCv)
} else {
dbg!("Error: No suitable Backends available. Perhaps you meant to enable one of the backends such as `input-avfoundation`? (Please read the docs.)");
Err(NokhwaError::UnsupportedOperationError(ApiBackend::Auto))
}
}
"ios" => {
if cfg!(feature = "input-avfoundation") {
query(ApiBackend::AVFoundation)
} else {
dbg!("Error: No suitable Backends available. Perhaps you meant to enable one of the backends such as `input-avfoundation`? (Please read the docs.)");
Err(NokhwaError::UnsupportedOperationError(ApiBackend::Auto))
}
}
_ => {
dbg!("Error: No suitable Backends available. You are on an unsupported platform.");
Err(NokhwaError::NotImplementedError("Bad Platform".to_string()))
}
}
}
ApiBackend::AVFoundation => query_avfoundation(),
ApiBackend::Video4Linux => query_v4l(),
ApiBackend::MediaFoundation => query_msmf(),
ApiBackend::OpenCv | ApiBackend::Network => {
Err(NokhwaError::UnsupportedOperationError(api))
}
ApiBackend::Browser => query_wasm(),
_ => Err(NokhwaError::UnsupportedOperationError(api)),
}
}
#[cfg(all(feature = "input-v4l", target_os = "linux"))]
fn query_v4l() -> Result<Vec<CameraInfo>, NokhwaError> {
nokhwa_bindings_linux::query()
}
#[cfg(any(not(feature = "input-v4l"), not(target_os = "linux")))]
fn query_v4l() -> Result<Vec<CameraInfo>, NokhwaError> {
Err(NokhwaError::UnsupportedOperationError(
ApiBackend::Video4Linux,
))
}
#[cfg(all(feature = "input-msmf", target_os = "windows"))]
fn query_msmf() -> Result<Vec<CameraInfo>, NokhwaError> {
nokhwa_bindings_windows::wmf::query_media_foundation_descriptors()
}
#[cfg(any(not(feature = "input-msmf"), not(target_os = "windows")))]
fn query_msmf() -> Result<Vec<CameraInfo>, NokhwaError> {
Err(NokhwaError::UnsupportedOperationError(
ApiBackend::MediaFoundation,
))
}
#[cfg(all(
feature = "input-avfoundation",
any(target_os = "macos", target_os = "ios")
))]
fn query_avfoundation() -> Result<Vec<CameraInfo>, NokhwaError> {
use nokhwa_bindings_macos::query_avfoundation;
Ok(query_avfoundation()?
.into_iter()
.collect::<Vec<CameraInfo>>())
}
#[cfg(not(all(
feature = "input-avfoundation",
any(target_os = "macos", target_os = "ios")
)))]
fn query_avfoundation() -> Result<Vec<CameraInfo>, NokhwaError> {
Err(NokhwaError::UnsupportedOperationError(
ApiBackend::AVFoundation,
))
}
#[cfg(feature = "input-jscam")]
fn query_wasm() -> Result<Vec<CameraInfo>, NokhwaError> {
use crate::js_camera::query_js_cameras;
use wasm_rs_async_executor::single_threaded::block_on;
block_on(query_js_cameras())
}
#[cfg(not(feature = "input-jscam"))]
fn query_wasm() -> Result<Vec<CameraInfo>, NokhwaError> {
Err(NokhwaError::UnsupportedOperationError(ApiBackend::Browser))
}