use super::context::Context;
use super::error::XCamError;
use super::ffi;
use super::types::{OpMode, XCamResult};
pub trait HighDynamicRange {
fn get_hdr_mode(&self) -> XCamResult<OpMode>;
fn set_hdr_mode<T: Into<OpMode>>(&self, mode: T) -> XCamResult<()>;
fn get_hdr_strth(&self) -> XCamResult<(bool, u32)>;
fn set_hdr_strth(&self, enabled: bool, level: u32) -> XCamResult<()>;
}
impl HighDynamicRange for Context {
fn get_hdr_mode(&self) -> XCamResult<OpMode> {
#[cfg(feature = "v2_0")]
unsafe {
let mut mode: ffi::opMode_t = Default::default();
XCamError::from(ffi::rk_aiq_uapi_getHDRMode(
self.internal.as_ptr(),
&mut mode,
))
.ok()
.map(|_| mode.into())
}
#[cfg(any(feature = "v3_0", feature = "v4_0", feature = "v5_0"))]
Ok(OpMode::Auto)
}
#[cfg(feature = "v2_0")]
fn set_hdr_mode<T: Into<OpMode>>(&self, mode: T) -> XCamResult<()> {
unsafe {
XCamError::from(ffi::rk_aiq_uapi_setHDRMode(
self.internal.as_ptr(),
mode.into().into(),
))
.ok()
}
}
#[cfg(any(feature = "v3_0", feature = "v4_0", feature = "v5_0"))]
fn set_hdr_mode<T: Into<OpMode>>(&self, _mode: T) -> XCamResult<()> {
Ok(())
}
fn get_hdr_strth(&self) -> XCamResult<(bool, u32)> {
let mut enabled: bool = false;
let mut level: u32 = 0;
#[cfg(feature = "v2_0")]
unsafe {
XCamError::from(ffi::rk_aiq_uapi_getMHDRStrth(
self.internal.as_ptr(),
&mut enabled,
&mut level,
))
.ok()
.map(|_| (enabled, level))
}
#[cfg(any(feature = "v3_0", feature = "v4_0", feature = "v5_0"))]
unsafe {
XCamError::from(ffi::rk_aiq_uapi2_getMHDRStrth(
self.internal.as_ptr(),
&mut enabled,
&mut level,
))
.ok()
.map(|_| (enabled, level))
}
}
fn set_hdr_strth(&self, enabled: bool, level: u32) -> XCamResult<()> {
#[cfg(feature = "v2_0")]
unsafe {
XCamError::from(ffi::rk_aiq_uapi_setMHDRStrth(
self.internal.as_ptr(),
enabled,
level,
))
.ok()
}
#[cfg(any(feature = "v3_0", feature = "v4_0", feature = "v5_0"))]
unsafe {
XCamError::from(ffi::rk_aiq_uapi2_setMHDRStrth(
self.internal.as_ptr(),
enabled,
level,
))
.ok()
}
}
}