scuffle_flv/video/header/
legacy.rs1use std::io;
4
5use byteorder::{BigEndian, ReadBytesExt};
6use bytes::Bytes;
7use nutype_enum::nutype_enum;
8
9use super::{VideoCommand, VideoFrameType};
10
11nutype_enum! {
12 pub enum VideoCodecId(u8) {
19 SorensonH263 = 2,
21 ScreenVideo = 3,
23 On2VP6 = 4,
25 On2VP6WithAlphaChannel = 5,
27 ScreenVideoVersion2 = 6,
29 Avc = 7,
31 }
32}
33
34nutype_enum! {
35 pub enum AvcPacketType(u8) {
43 SeqHdr = 0,
45 Nalu = 1,
47 EndOfSequence = 2,
49 }
50}
51
52#[derive(Debug, Clone, PartialEq)]
54pub enum LegacyVideoTagHeaderAvcPacket {
55 SequenceHeader,
57 Nalu {
59 composition_time_offset: u32,
61 },
62 EndOfSequence,
64 Unknown {
66 avc_packet_type: AvcPacketType,
68 composition_time_offset: u32,
70 },
71}
72
73impl LegacyVideoTagHeaderAvcPacket {
74 pub fn demux(reader: &mut io::Cursor<Bytes>) -> io::Result<Self> {
76 let avc_packet_type = AvcPacketType::from(reader.read_u8()?);
77 let composition_time_offset = reader.read_u24::<BigEndian>()?;
78
79 match avc_packet_type {
80 AvcPacketType::SeqHdr => Ok(Self::SequenceHeader),
81 AvcPacketType::Nalu => Ok(Self::Nalu { composition_time_offset }),
82 AvcPacketType::EndOfSequence => Ok(Self::EndOfSequence),
83 _ => Ok(Self::Unknown {
84 avc_packet_type,
85 composition_time_offset,
86 }),
87 }
88 }
89}
90
91#[derive(Debug, Clone, PartialEq)]
96pub enum LegacyVideoTagHeader {
97 VideoCommand(VideoCommand),
99 AvcPacket(LegacyVideoTagHeaderAvcPacket),
101 Other {
103 video_codec_id: VideoCodecId,
105 },
106}
107
108impl LegacyVideoTagHeader {
109 pub fn demux(reader: &mut io::Cursor<Bytes>) -> io::Result<Self> {
111 let first_byte = reader.read_u8()?;
112 let frame_type = VideoFrameType::from(first_byte >> 4); let video_codec_id = VideoCodecId::from(first_byte & 0b0000_1111);
114
115 if video_codec_id == VideoCodecId::Avc {
116 let avc_packet = LegacyVideoTagHeaderAvcPacket::demux(reader)?;
117 return Ok(Self::AvcPacket(avc_packet));
118 }
119
120 if frame_type == VideoFrameType::Command {
121 return Ok(Self::VideoCommand(VideoCommand::from(reader.read_u8()?)));
122 }
123
124 Ok(Self::Other { video_codec_id })
125 }
126}