use serde::ser::SerializeStruct;
use serde::{Deserialize, Serialize, Serializer};
use crate::parsers::BitrateMode;
use crate::results::MinimalFallback;
#[derive(Debug, Clone, Deserialize, Default)]
pub struct VideoMetadata {
pub width: usize,
pub height: usize,
pub aspect_ratio: Option<f64>,
pub display_aspect_ratio: Option<String>,
pub sample_aspect_ratio: Option<String>,
pub coded_width: Option<usize>,
pub coded_height: Option<usize>,
pub has_b_frames: Option<bool>,
pub video_language: Option<String>,
pub creation_time: Option<String>,
pub duration_seconds: Option<f64>,
pub video_codec: Option<String>,
pub video_codec_profile: Option<String>,
pub video_codec_level: Option<String>,
pub pixel_format: Option<String>,
pub bit_depth: Option<u32>,
pub color_space: Option<String>,
pub chroma_subsampling: Option<String>,
pub scan_type: Option<String>,
pub frame_rate: Option<f64>,
pub frame_count: Option<u64>,
pub bitrate: Option<u64>,
pub video_bitrate: Option<u64>,
pub bitrate_mode: Option<BitrateMode>,
pub audio_codec: Option<String>,
pub audio_bitrate: Option<u64>,
pub audio_channels: Option<u32>,
pub audio_channel_layout: Option<String>,
pub audio_sample_rate: Option<u32>,
pub audio_language: Option<String>,
pub container_format: Option<String>,
pub video_stream_size: Option<u64>,
pub audio_stream_size: Option<u64>,
pub stream_size: Option<usize>,
pub encoded_library: Option<String>,
}
impl Serialize for VideoMetadata {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut state = serializer.serialize_struct("VideoMetadata", 30)?;
state.serialize_field("width", &self.width)?;
state.serialize_field("height", &self.height)?;
crate::serialize_optional!(state, self.aspect_ratio, "aspect_ratio");
crate::serialize_optional!(state, self.display_aspect_ratio, "display_aspect_ratio");
crate::serialize_optional!(state, self.sample_aspect_ratio, "sample_aspect_ratio");
crate::serialize_optional!(state, self.coded_width, "coded_width");
crate::serialize_optional!(state, self.coded_height, "coded_height");
crate::serialize_optional!(state, self.has_b_frames, "has_b_frames");
crate::serialize_optional!(state, self.video_language, "video_language");
crate::serialize_optional!(state, self.creation_time, "creation_time");
crate::serialize_optional!(state, self.duration_seconds, "duration_seconds");
crate::serialize_optional!(state, self.video_codec, "video_codec");
crate::serialize_optional!(state, self.video_codec_profile, "video_codec_profile");
crate::serialize_optional!(state, self.video_codec_level, "video_codec_level");
crate::serialize_optional!(state, self.pixel_format, "pixel_format");
crate::serialize_optional!(state, self.bit_depth, "bit_depth");
crate::serialize_optional!(state, self.color_space, "color_space");
crate::serialize_optional!(state, self.chroma_subsampling, "chroma_subsampling");
crate::serialize_optional!(state, self.scan_type, "scan_type");
crate::serialize_optional!(state, self.frame_rate, "frame_rate");
crate::serialize_optional!(state, self.frame_count, "frame_count");
crate::serialize_optional!(state, self.bitrate, "bitrate");
crate::serialize_optional!(state, self.video_bitrate, "video_bitrate");
crate::serialize_optional!(state, self.bitrate_mode, "bitrate_mode");
crate::serialize_optional!(state, self.audio_codec, "audio_codec");
crate::serialize_optional!(state, self.audio_bitrate, "audio_bitrate");
crate::serialize_optional!(state, self.audio_channels, "audio_channels");
crate::serialize_optional!(state, self.audio_channel_layout, "audio_channel_layout");
crate::serialize_optional!(state, self.audio_sample_rate, "audio_sample_rate");
crate::serialize_optional!(state, self.audio_language, "audio_language");
crate::serialize_optional!(state, self.container_format, "container_format");
crate::serialize_optional!(state, self.video_stream_size, "video_stream_size");
crate::serialize_optional!(state, self.audio_stream_size, "audio_stream_size");
crate::serialize_optional!(state, self.stream_size, "stream_size");
crate::serialize_optional!(state, self.encoded_library, "encoded_library");
state.end()
}
}
crate::impl_minimal_fallback!(VideoMetadata);