use crate::audio::AudioInfoFrame;
use crate::avi::AviInfoFrame;
use crate::decoded::Decoded;
use crate::dynamic_hdr::{DynamicHdrFragment, DynamicHdrInfoFrame, DynamicHdrIter};
use crate::encode::{IntoPackets, SinglePacketIter};
use crate::hdmi_forum_vsi::HdmiForumVsi;
use crate::hdr_static::HdrStaticInfoFrame;
use crate::warn::Warning;
#[allow(clippy::large_enum_variant)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum InfoFrame {
Avi(AviInfoFrame),
Audio(AudioInfoFrame),
HdrStatic(HdrStaticInfoFrame),
HdmiForumVsi(HdmiForumVsi),
DynamicHdr(DynamicHdrInfoFrame),
Unknown {
type_code: u8,
version: u8,
payload: [u8; 27],
},
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum InfoFramePacket {
Avi(AviInfoFrame),
Audio(AudioInfoFrame),
HdrStatic(HdrStaticInfoFrame),
HdmiForumVsi(HdmiForumVsi),
DynamicHdrFragment(DynamicHdrFragment),
Unknown {
type_code: u8,
version: u8,
payload: [u8; 27],
},
}
pub struct InfoFrameIter(InfoFrameIterInner);
#[allow(clippy::large_enum_variant)]
enum InfoFrameIterInner {
Single(Option<SinglePacketIter>),
Dynamic(DynamicHdrIter),
}
impl Iterator for InfoFrameIter {
type Item = [u8; 31];
fn next(&mut self) -> Option<[u8; 31]> {
match &mut self.0 {
InfoFrameIterInner::Single(s) => s.as_mut()?.next(),
InfoFrameIterInner::Dynamic(d) => d.next(),
}
}
}
impl IntoPackets for InfoFrame {
type Iter = InfoFrameIter;
type Warning = Warning;
fn into_packets(self) -> Decoded<InfoFrameIter, Warning> {
match self {
InfoFrame::Avi(f) => f.into_packets().wrap(
|iter| InfoFrameIter(InfoFrameIterInner::Single(Some(iter))),
Warning::Avi,
),
InfoFrame::Audio(f) => f.into_packets().wrap(
|iter| InfoFrameIter(InfoFrameIterInner::Single(Some(iter))),
Warning::Audio,
),
InfoFrame::HdrStatic(f) => f.into_packets().wrap(
|iter| InfoFrameIter(InfoFrameIterInner::Single(Some(iter))),
Warning::HdrStatic,
),
InfoFrame::HdmiForumVsi(f) => f.into_packets().wrap(
|iter| InfoFrameIter(InfoFrameIterInner::Single(Some(iter))),
Warning::HdmiForumVsi,
),
InfoFrame::DynamicHdr(f) => f.into_packets().wrap(
|iter| InfoFrameIter(InfoFrameIterInner::Dynamic(iter)),
Warning::DynamicHdr,
),
InfoFrame::Unknown {
type_code,
version,
payload,
} => {
let mut hp = [0u8; 30];
hp[0] = type_code;
hp[1] = version;
hp[2] = 27;
hp[3..30].copy_from_slice(&payload);
let checksum = crate::checksum::compute_checksum(&hp);
let mut packet = [0u8; 31];
packet[..3].copy_from_slice(&hp[..3]);
packet[3] = checksum;
packet[4..].copy_from_slice(&hp[3..]);
Decoded::new(InfoFrameIter(InfoFrameIterInner::Single(Some(
SinglePacketIter::new(packet),
))))
}
}
}
}
#[cfg(test)]
#[path = "frame_tests.rs"]
mod tests;