diff --git a/Cargo.toml b/Cargo.toml index 7034a82..c8ef1d7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,8 @@ edition = "2018" derivative = "1.0.3" libc = "0.2" thiserror = "1.0.9" +serde = { version = "1.0.104", features = ["derive"], optional = true } [features] no_wrapper = [] +default = ["serde"] diff --git a/src/lib.rs b/src/lib.rs index 153d12b..0e8b7c4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,6 +45,9 @@ mod v4l2; pub type Result = result::Result; +#[cfg(feature = "serde")] +extern crate serde; + #[macro_use] extern crate derivative; @@ -62,7 +65,8 @@ pub enum Error { BadField, } -#[derive(Debug)] +#[derive(Debug, Copy, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Config<'a> { /// The mix of numerator and denominator. v4l2 uses frame intervals instead of frame rates. /// Default is `(1, 10)`. @@ -94,6 +98,7 @@ impl<'a> Default for Config<'a> { } } +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct FormatInfo { /// FourCC of format (e.g. `b"H264"`). pub format: [u8; 4], @@ -143,6 +148,7 @@ impl fmt::Debug for FormatInfo { } } +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub enum ResolutionInfo { Discretes(Vec<(u32, u32)>), Stepwise { @@ -173,6 +179,7 @@ impl fmt::Debug for ResolutionInfo { } } +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub enum IntervalInfo { Discretes(Vec<(u32, u32)>), Stepwise { @@ -242,6 +249,7 @@ impl Drop for Frame { } #[derive(Debug, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] enum State { Idle, Streaming, @@ -249,11 +257,13 @@ enum State { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Camera { fd: RawFd, state: State, resolution: (u32, u32), format: [u8; 4], + #[cfg_attr(feature = "serde", serde(skip_serializing))] buffers: Vec>, } @@ -661,6 +671,7 @@ impl Drop for Camera { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct FormatIter<'a> { camera: &'a Camera, index: u32, @@ -752,6 +763,7 @@ impl Settable for String { } #[derive(Debug, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct Control { pub id: u32, pub name: String, @@ -761,6 +773,7 @@ pub struct Control { } #[derive(Debug, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub enum CtrlData { Integer { value: i32, @@ -807,12 +820,14 @@ pub enum CtrlData { } #[derive(Debug, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct CtrlMenuItem { pub index: u32, pub name: String, } #[derive(Debug, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] pub struct CtrlIntMenuItem { pub index: u32, pub value: i64, diff --git a/src/v4l2.rs b/src/v4l2.rs index 9657132..4b4f088 100644 --- a/src/v4l2.rs +++ b/src/v4l2.rs @@ -166,6 +166,7 @@ impl Format { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct PixFormat { pub width: u32, @@ -193,6 +194,7 @@ impl PixFormat { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct RequestBuffers { pub count: u32, @@ -242,6 +244,7 @@ impl Buffer { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct TimeCode { pub ttype: u32, @@ -254,6 +257,7 @@ pub struct TimeCode { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct FmtDesc { pub index: u32, @@ -293,6 +297,7 @@ impl StreamParm { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct CaptureParm { pub capability: u32, @@ -304,6 +309,7 @@ pub struct CaptureParm { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct Fract { pub numerator: u32, @@ -311,6 +317,7 @@ pub struct Fract { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct Frmsizeenum { pub index: u32, @@ -337,6 +344,7 @@ impl Frmsizeenum { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct FrmsizeDiscrete { pub width: u32, @@ -344,6 +352,7 @@ pub struct FrmsizeDiscrete { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct FrmsizeStepwise { pub min_width: u32, @@ -355,6 +364,7 @@ pub struct FrmsizeStepwise { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct Frmivalenum { pub index: u32, @@ -385,6 +395,7 @@ impl Frmivalenum { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct FrmivalStepwise { pub min: Fract, @@ -393,6 +404,7 @@ pub struct FrmivalStepwise { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct QueryCtrl { pub id: u32, @@ -415,6 +427,7 @@ impl QueryCtrl { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct QueryExtCtrl { pub id: u32, @@ -442,11 +455,14 @@ impl QueryExtCtrl { } } -#[derive(Debug, Copy, Clone)] +#[derive(Derivative, Debug, Copy, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C, packed)] pub struct QueryMenu { pub id: u32, pub index: u32, + #[derivative(Debug="ignore")] + #[serde(skip_serializing)] pub data: QueryMenuData, reserved: u32, } @@ -483,6 +499,7 @@ impl QueryMenuData { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct Control { pub id: u32, @@ -496,6 +513,7 @@ impl Control { } #[derive(Debug, Copy, Clone)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C, packed)] pub struct ExtControl { pub id: u32, @@ -516,6 +534,7 @@ impl ExtControl { } #[derive(Debug)] +#[cfg_attr(feature = "serde", derive(serde::Serialize))] #[repr(C)] pub struct ExtControls<'a> { pub ctrl_class: u32,