use bytes::Bytes;
use flowly::Fourcc;
pub mod mpeg4_avc;
#[derive(Clone, Debug, PartialEq)]
pub struct VideoTag {
pub header: VideoTagHeader,
pub body: VideoTagBody,
pub track_id: u8,
}
#[derive(Clone, Debug, PartialEq)]
pub struct VideoTagBody {
pub pts_offset: i32,
pub param_count: u32,
pub nalus: Vec<Bytes>,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum VideoPacketType {
SequenceStart = 0,
CodedFrames = 1,
SequenceEnd = 2,
CodedFramesX = 3,
Metadata = 4,
MPEG2TSSequenceStart = 5,
Multitrack = 6,
ModEx = 7,
Unknown(u8),
}
impl From<u8> for VideoPacketType {
fn from(value: u8) -> Self {
match value {
0 => VideoPacketType::SequenceStart,
1 => VideoPacketType::CodedFrames,
2 => VideoPacketType::SequenceEnd,
3 => VideoPacketType::CodedFramesX,
4 => VideoPacketType::Metadata,
5 => VideoPacketType::MPEG2TSSequenceStart,
6 => VideoPacketType::Multitrack,
7 => VideoPacketType::ModEx,
_ => unreachable!(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum VideoPacketModExType {
TimestampOffsetNano = 0,
Unknown(u8),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub enum AvMultitrackType {
OneTrack = 0,
ManyTracks = 1,
ManyTracksManyCodecs = 2,
Unknown(u8),
}
impl From<u8> for AvMultitrackType {
fn from(value: u8) -> Self {
match value {
0 => AvMultitrackType::OneTrack,
1 => AvMultitrackType::ManyTracks,
2 => AvMultitrackType::ManyTracksManyCodecs,
t => AvMultitrackType::Unknown(t),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct VideoTagHeader {
pub frame_type: VideoFrameType,
pub pkt_type: VideoPacketType,
pub multitrack: bool,
pub fourcc: Fourcc,
pub has_body: bool,
pub multitrack_type: AvMultitrackType,
pub(crate) enhanced: bool,
}
impl From<u8> for VideoPacketModExType {
fn from(value: u8) -> Self {
match value {
0 => Self::TimestampOffsetNano,
v => Self::Unknown(v),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PacketExData {
pub pkt_type: VideoPacketType,
pub ex_type: VideoPacketModExType,
pub dts_offset_ns: u32,
pub ex_data: Bytes,
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum VideoCommand {
StartSeek = 0,
EndSeek = 1,
Unknown(u8), }
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum VideoFrameType {
Key,
Inter,
DisposableInter,
Generated,
Command,
Unknown(u8),
}
impl From<u8> for VideoFrameType {
fn from(value: u8) -> Self {
match value {
1 => VideoFrameType::Key,
2 => VideoFrameType::Inter,
3 => VideoFrameType::DisposableInter,
4 => VideoFrameType::Generated,
5 => VideoFrameType::Command,
t => VideoFrameType::Unknown(t),
}
}
}
#[allow(clippy::upper_case_acronyms)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum CodecID {
SorensonH263,
Screen1,
VP6,
VP6Alpha,
Screen2,
AVC,
RealH263,
Hevc,
Unknown(u8),
}
impl From<u8> for CodecID {
fn from(value: u8) -> Self {
match value {
2 => CodecID::SorensonH263,
3 => CodecID::Screen1,
4 => CodecID::VP6,
5 => CodecID::VP6Alpha,
6 => CodecID::Screen2,
7 => CodecID::AVC,
8 => CodecID::RealH263,
12 => CodecID::Hevc,
c => CodecID::Unknown(c),
}
}
}
#[allow(clippy::upper_case_acronyms)]
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(u8)]
pub enum AvcPacketType {
SequenceHeader,
NALU,
EndOfSequence,
Unknown(u8),
}
impl From<u8> for AvcPacketType {
fn from(value: u8) -> Self {
match value {
0 => AvcPacketType::SequenceHeader,
1 => AvcPacketType::NALU,
2 => AvcPacketType::EndOfSequence,
t => AvcPacketType::Unknown(t),
}
}
}