use std::io::{self, Seek};
use byteorder::ReadBytesExt;
use bytes::Bytes;
use nutype_enum::nutype_enum;
use crate::error::FlvError;
pub mod enhanced;
pub mod legacy;
nutype_enum! {
pub enum VideoFrameType(u8) {
KeyFrame = 1,
InterFrame = 2,
DisposableInterFrame = 3,
GeneratedKeyFrame = 4,
Command = 5,
}
}
nutype_enum! {
pub enum VideoCommand(u8) {
StartSeek = 0,
EndSeek = 1,
}
}
#[derive(Debug, Clone, PartialEq)]
pub enum VideoTagHeaderData {
Legacy(legacy::LegacyVideoTagHeader),
Enhanced(enhanced::ExVideoTagHeader),
}
#[derive(Debug, Clone, PartialEq)]
pub struct VideoTagHeader {
pub frame_type: VideoFrameType,
pub data: VideoTagHeaderData,
}
impl VideoTagHeader {
#[allow(clippy::unusual_byte_groupings)]
pub fn demux(reader: &mut io::Cursor<Bytes>) -> Result<Self, FlvError> {
let byte = reader.read_u8()?;
reader.seek_relative(-1)?;
let is_ex_video_header = (byte & 0b1_000_0000) != 0;
let data = if !is_ex_video_header {
VideoTagHeaderData::Legacy(legacy::LegacyVideoTagHeader::demux(reader)?)
} else {
VideoTagHeaderData::Enhanced(enhanced::ExVideoTagHeader::demux(reader)?)
};
Ok(VideoTagHeader {
frame_type: VideoFrameType::from((byte & 0b0_111_0000) >> 4),
data,
})
}
}