1use bytes::Bytes;
2use flowly::Fourcc;
3
4pub mod mpeg4_avc;
5
6#[derive(Clone, Debug, PartialEq)]
8pub struct VideoTag {
9 pub header: VideoTagHeader, pub body: VideoTagBody,
14
15 pub track_id: u8,
17}
18
19#[derive(Clone, Debug, PartialEq)]
20pub struct VideoTagBody {
21 pub pts_offset: i32,
22 pub param_count: u32,
23 pub nalus: Vec<Bytes>,
24}
25
26#[derive(Copy, Clone, Debug, Eq, PartialEq)]
27#[repr(u8)]
28pub enum VideoPacketType {
29 SequenceStart = 0,
30 CodedFrames = 1,
31 SequenceEnd = 2,
32
33 CodedFramesX = 3,
37
38 Metadata = 4,
47
48 MPEG2TSSequenceStart = 5,
52
53 Multitrack = 6,
55
56 ModEx = 7,
65
66 Unknown(u8),
67}
68
69impl From<u8> for VideoPacketType {
70 fn from(value: u8) -> Self {
71 match value {
72 0 => VideoPacketType::SequenceStart,
73 1 => VideoPacketType::CodedFrames,
74 2 => VideoPacketType::SequenceEnd,
75 3 => VideoPacketType::CodedFramesX,
76 4 => VideoPacketType::Metadata,
77 5 => VideoPacketType::MPEG2TSSequenceStart,
78 6 => VideoPacketType::Multitrack,
79 7 => VideoPacketType::ModEx,
80 _ => unreachable!(),
81 }
82 }
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Eq)]
86#[repr(u8)]
87pub enum VideoPacketModExType {
88 TimestampOffsetNano = 0,
89 Unknown(u8),
90}
91
92#[derive(Debug, Clone, Copy, PartialEq, Eq)]
93#[repr(u8)]
94pub enum AvMultitrackType {
95 OneTrack = 0,
96 ManyTracks = 1,
97 ManyTracksManyCodecs = 2,
98 Unknown(u8),
99}
100
101impl From<u8> for AvMultitrackType {
102 fn from(value: u8) -> Self {
103 match value {
104 0 => AvMultitrackType::OneTrack,
105 1 => AvMultitrackType::ManyTracks,
106 2 => AvMultitrackType::ManyTracksManyCodecs,
107 t => AvMultitrackType::Unknown(t),
108 }
109 }
110}
111
112#[derive(Clone, Debug, Eq, PartialEq)]
114pub struct VideoTagHeader {
115 pub frame_type: VideoFrameType,
116 pub pkt_type: VideoPacketType,
117 pub multitrack: bool,
118 pub fourcc: Fourcc,
119 pub has_body: bool,
120 pub multitrack_type: AvMultitrackType,
121 pub(crate) enhanced: bool,
122}
123
124impl From<u8> for VideoPacketModExType {
125 fn from(value: u8) -> Self {
126 match value {
127 0 => Self::TimestampOffsetNano,
128 v => Self::Unknown(v),
129 }
130 }
131}
132
133#[derive(Debug, Clone, PartialEq, Eq)]
134pub struct PacketExData {
135 pub pkt_type: VideoPacketType,
136 pub ex_type: VideoPacketModExType,
137 pub dts_offset_ns: u32,
138 pub ex_data: Bytes,
139}
140
141#[derive(Copy, Clone, Debug, Eq, PartialEq)]
142#[repr(u8)]
143pub enum VideoCommand {
144 StartSeek = 0,
145 EndSeek = 1,
146 Unknown(u8), }
148
149#[derive(Copy, Clone, Debug, Eq, PartialEq)]
151pub enum VideoFrameType {
152 Key,
154
155 Inter,
157
158 DisposableInter,
160
161 Generated,
163
164 Command,
166
167 Unknown(u8),
169}
170
171impl From<u8> for VideoFrameType {
172 fn from(value: u8) -> Self {
173 match value {
174 1 => VideoFrameType::Key,
175 2 => VideoFrameType::Inter,
176 3 => VideoFrameType::DisposableInter,
177 4 => VideoFrameType::Generated,
178 5 => VideoFrameType::Command,
179 t => VideoFrameType::Unknown(t),
180 }
181 }
182}
183
184#[allow(clippy::upper_case_acronyms)]
186#[derive(Copy, Clone, Debug, Eq, PartialEq)]
187#[repr(u8)]
188pub enum CodecID {
189 SorensonH263,
191
192 Screen1,
194
195 VP6,
197
198 VP6Alpha,
200
201 Screen2,
203
204 AVC,
206
207 RealH263,
209
210 Hevc,
212
213 Unknown(u8),
215}
216
217impl From<u8> for CodecID {
218 fn from(value: u8) -> Self {
219 match value {
220 2 => CodecID::SorensonH263,
221 3 => CodecID::Screen1,
222 4 => CodecID::VP6,
223 5 => CodecID::VP6Alpha,
224 6 => CodecID::Screen2,
225 7 => CodecID::AVC,
226 8 => CodecID::RealH263,
227 12 => CodecID::Hevc,
228 c => CodecID::Unknown(c),
229 }
230 }
231}
232
233#[allow(clippy::upper_case_acronyms)]
235#[derive(Copy, Clone, Debug, Eq, PartialEq)]
236#[repr(u8)]
237pub enum AvcPacketType {
238 SequenceHeader,
240
241 NALU,
243
244 EndOfSequence,
246
247 Unknown(u8),
249}
250
251impl From<u8> for AvcPacketType {
252 fn from(value: u8) -> Self {
253 match value {
254 0 => AvcPacketType::SequenceHeader,
255 1 => AvcPacketType::NALU,
256 2 => AvcPacketType::EndOfSequence,
257 t => AvcPacketType::Unknown(t),
258 }
259 }
260}