use crate::codec::Fourcc;
use bitflags::bitflags;
bitflags! {
#[repr(transparent)]
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct FrameFlags: u64 {
const KEYFRAME = 0b1 << 0;
const LAST = 0b1 << 1;
const LIVE = 0b1 << 2;
const TIME_SYNCED = 0b1 << 3;
const HAS_PARAMS = 0b1 << 4;
const HAS_TIMESTAMP = 0b1 << 5;
const MULTICHANNEL = 0b1 << 6;
const COMPRESSED = 0b1 << 7;
const AUDIO_STREAM = 0b1 << 16;
const VIDEO_STREAM = 0b1 << 17;
const METADATA_STREAM = 0b1 << 18;
}
}
pub trait Frame {
fn dts(&self) -> u64;
fn pts(&self) -> i64;
fn codec(&self) -> Fourcc;
fn flags(&self) -> FrameFlags;
fn track(&self) -> u32;
fn timestamp(&self) -> Option<u64>;
fn params(&self) -> impl Iterator<Item = &[u8]>;
fn units(&self) -> impl Iterator<Item = &[u8]>;
fn is_keyframe(&self) -> bool {
self.flags().contains(FrameFlags::KEYFRAME)
}
fn is_multichannel(&self) -> bool {
self.flags().contains(FrameFlags::KEYFRAME)
}
fn is_compressed(&self) -> bool {
self.flags().contains(FrameFlags::COMPRESSED)
}
fn is_last(&self) -> bool {
self.flags().contains(FrameFlags::LAST)
}
fn has_params(&self) -> bool {
self.flags().contains(FrameFlags::HAS_PARAMS)
}
fn has_timestamp(&self) -> bool {
self.flags().contains(FrameFlags::HAS_TIMESTAMP)
}
fn is_audio(&self) -> bool {
self.flags().contains(FrameFlags::AUDIO_STREAM)
}
fn is_video(&self) -> bool {
self.flags().contains(FrameFlags::VIDEO_STREAM)
}
fn is_metadata(&self) -> bool {
self.flags().contains(FrameFlags::VIDEO_STREAM)
}
fn units_annexb(&self) -> impl Iterator<Item = &[u8]> {
self.units().map(|x| [&[0, 0, 0, 1][..], &x[..]]).flatten()
}
}