symphonia_core/codecs/
video.rs1use std::fmt;
11
12#[cfg(feature = "exp-video-codecs")]
13use crate::codecs::CodecInfo;
14use crate::codecs::CodecProfile;
15use crate::common::FourCc;
16
17#[repr(transparent)]
26#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
27pub struct VideoCodecId(u32);
28
29pub const CODEC_ID_NULL_VIDEO: VideoCodecId = VideoCodecId(0x0);
31
32impl Default for VideoCodecId {
33 fn default() -> Self {
34 CODEC_ID_NULL_VIDEO
35 }
36}
37
38impl VideoCodecId {
39 pub const fn new(cc: FourCc) -> VideoCodecId {
41 Self(0x8000_0000 | u32::from_be_bytes(cc.get()))
43 }
44}
45
46impl From<FourCc> for VideoCodecId {
47 fn from(value: FourCc) -> Self {
48 VideoCodecId::new(value)
49 }
50}
51
52impl fmt::Display for VideoCodecId {
53 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
54 write!(f, "{:#x}", self.0)
55 }
56}
57
58#[repr(transparent)]
60#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
61pub struct VideoExtraDataId(u32);
62
63pub const VIDEO_EXTRA_DATA_ID_NULL: VideoExtraDataId = VideoExtraDataId(0x0);
65
66impl Default for VideoExtraDataId {
67 fn default() -> Self {
68 VIDEO_EXTRA_DATA_ID_NULL
69 }
70}
71
72#[derive(Clone, Debug, Default)]
74pub struct VideoExtraData {
75 pub id: VideoExtraDataId,
77 pub data: Box<[u8]>,
79}
80
81#[derive(Clone, Debug, Default)]
83pub struct VideoCodecParameters {
84 pub codec: VideoCodecId,
86 pub profile: Option<CodecProfile>,
88 pub level: Option<u32>,
90 pub width: Option<u16>,
92 pub height: Option<u16>,
94 pub extra_data: Vec<VideoExtraData>,
96}
97
98impl VideoCodecParameters {
99 pub fn for_codec(&mut self, codec: VideoCodecId) -> &mut Self {
101 self.codec = codec;
102 self
103 }
104
105 pub fn with_profile(&mut self, profile: CodecProfile) -> &mut Self {
107 self.profile = Some(profile);
108 self
109 }
110
111 pub fn with_level(&mut self, level: u32) -> &mut Self {
113 self.level = Some(level);
114 self
115 }
116
117 pub fn with_width(&mut self, width: u16) -> &mut Self {
119 self.width = Some(width);
120 self
121 }
122
123 pub fn with_height(&mut self, height: u16) -> &mut Self {
125 self.height = Some(height);
126 self
127 }
128
129 pub fn add_extra_data(&mut self, data: VideoExtraData) -> &mut Self {
131 self.extra_data.push(data);
132 self
133 }
134}
135
136#[cfg(feature = "exp-video-codecs")]
138#[non_exhaustive]
139#[derive(Copy, Clone, Debug, Default)]
140pub struct VideoDecoderOptions {
141 }
143
144#[cfg(feature = "exp-video-codecs")]
147pub trait VideoDecoder: Send + Sync {
148 fn reset(&mut self);
158
159 fn codec_info(&self) -> &CodecInfo;
161
162 fn codec_params(&self) -> &VideoCodecParameters;
165}
166
167pub mod well_known {
169 use super::VideoCodecId;
170
171 pub const CODEC_ID_MJPEG: VideoCodecId = VideoCodecId(0x100);
173
174 pub const CODEC_ID_BINK_VIDEO: VideoCodecId = VideoCodecId(0x200);
178 pub const CODEC_ID_SMACKER_VIDEO: VideoCodecId = VideoCodecId(0x201);
180
181 pub const CODEC_ID_CINEPAK: VideoCodecId = VideoCodecId(0x300);
183
184 pub const CODEC_ID_INDEO2: VideoCodecId = VideoCodecId(0x400);
188 pub const CODEC_ID_INDEO3: VideoCodecId = VideoCodecId(0x401);
190 pub const CODEC_ID_INDEO4: VideoCodecId = VideoCodecId(0x402);
192 pub const CODEC_ID_INDEO5: VideoCodecId = VideoCodecId(0x403);
194
195 pub const CODEC_ID_SVQ1: VideoCodecId = VideoCodecId(0x500);
199 pub const CODEC_ID_SVQ3: VideoCodecId = VideoCodecId(0x501);
201 pub const CODEC_ID_FLV: VideoCodecId = VideoCodecId(0x502);
203
204 pub const CODEC_ID_RV10: VideoCodecId = VideoCodecId(0x600);
208 pub const CODEC_ID_RV20: VideoCodecId = VideoCodecId(0x601);
210 pub const CODEC_ID_RV30: VideoCodecId = VideoCodecId(0x602);
212 pub const CODEC_ID_RV40: VideoCodecId = VideoCodecId(0x603);
214
215 pub const CODEC_ID_MSMPEG4V1: VideoCodecId = VideoCodecId(0x700);
219 pub const CODEC_ID_MSMPEG4V2: VideoCodecId = VideoCodecId(0x701);
221 pub const CODEC_ID_MSMPEG4V3: VideoCodecId = VideoCodecId(0x702);
223 pub const CODEC_ID_WMV1: VideoCodecId = VideoCodecId(0x703);
225 pub const CODEC_ID_WMV2: VideoCodecId = VideoCodecId(0x704);
227 pub const CODEC_ID_WMV3: VideoCodecId = VideoCodecId(0x705);
229
230 pub const CODEC_ID_VP3: VideoCodecId = VideoCodecId(0x800);
234 pub const CODEC_ID_VP4: VideoCodecId = VideoCodecId(0x801);
236 pub const CODEC_ID_VP5: VideoCodecId = VideoCodecId(0x802);
238 pub const CODEC_ID_VP6: VideoCodecId = VideoCodecId(0x803);
240 pub const CODEC_ID_VP7: VideoCodecId = VideoCodecId(0x804);
242 pub const CODEC_ID_VP8: VideoCodecId = VideoCodecId(0x805);
244 pub const CODEC_ID_VP9: VideoCodecId = VideoCodecId(0x806);
246
247 pub const CODEC_ID_THEORA: VideoCodecId = VideoCodecId(0x900);
251 pub const CODEC_ID_AV1: VideoCodecId = VideoCodecId(0x901);
253
254 pub const CODEC_ID_MPEG1: VideoCodecId = VideoCodecId(0xa00);
258 pub const CODEC_ID_MPEG2: VideoCodecId = VideoCodecId(0xa01);
260 pub const CODEC_ID_MPEG4: VideoCodecId = VideoCodecId(0xa02);
262
263 pub const CODEC_ID_H261: VideoCodecId = VideoCodecId(0xb01);
267 pub const CODEC_ID_H263: VideoCodecId = VideoCodecId(0xb03);
269 pub const CODEC_ID_H264: VideoCodecId = VideoCodecId(0xb04);
271 pub const CODEC_ID_HEVC: VideoCodecId = VideoCodecId(0xb05);
273 pub const CODEC_ID_VVC: VideoCodecId = VideoCodecId(0xb06);
275
276 pub const CODEC_ID_VC1: VideoCodecId = VideoCodecId(0xc00);
280
281 pub const CODEC_ID_AVS1: VideoCodecId = VideoCodecId(0xd00);
285 pub const CODEC_ID_AVS2: VideoCodecId = VideoCodecId(0xd01);
287 pub const CODEC_ID_AVS3: VideoCodecId = VideoCodecId(0xd02);
289
290 pub mod profiles {
292 use crate::codecs::CodecProfile;
293
294 pub const CODEC_PROFILE_AV1_MAIN: CodecProfile = CodecProfile(0);
299 pub const CODEC_PROFILE_AV1_HIGH: CodecProfile = CodecProfile(1);
301 pub const CODEC_PROFILE_AV1_PROFESSIONAL: CodecProfile = CodecProfile(2);
303
304 pub const CODEC_PROFILE_MPEG2_SIMPLE: CodecProfile = CodecProfile(0);
309 pub const CODEC_PROFILE_MPEG2_MAIN: CodecProfile = CodecProfile(1);
311 pub const CODEC_PROFILE_MPEG2_SNR_SCALABLE: CodecProfile = CodecProfile(2);
313 pub const CODEC_PROFILE_MPEG2_SPATIAL_SCALABLE: CodecProfile = CodecProfile(3);
315 pub const CODEC_PROFILE_MPEG2_HIGH: CodecProfile = CodecProfile(4);
317 pub const CODEC_PROFILE_MPEG2_422: CodecProfile = CodecProfile(5);
319
320 pub const CODEC_PROFILE_MPEG4_SIMPLE: CodecProfile = CodecProfile(0);
325 pub const CODEC_PROFILE_MPEG4_ADVANCED_SIMPLE: CodecProfile = CodecProfile(1);
327
328 pub const CODEC_PROFILE_H264_BASELINE: CodecProfile = CodecProfile(66);
333 pub const CODEC_PROFILE_H264_CONSTRAINED_BASELINE: CodecProfile =
335 CodecProfile(66 | 1 << (8 + 1)); pub const CODEC_PROFILE_H264_MAIN: CodecProfile = CodecProfile(77);
338 pub const CODEC_PROFILE_H264_EXTENDED: CodecProfile = CodecProfile(88);
340 pub const CODEC_PROFILE_H264_HIGH: CodecProfile = CodecProfile(100);
342 pub const CODEC_PROFILE_H264_PROGRESSIVE_HIGH: CodecProfile =
344 CodecProfile(100 | 1 << (8 + 4)); pub const CODEC_PROFILE_H264_CONSTRAINED_HIGH: CodecProfile =
347 CodecProfile(100 | 1 << (8 + 4) | 1 << (8 + 5)); pub const CODEC_PROFILE_H264_HIGH_10: CodecProfile = CodecProfile(110);
350 pub const CODEC_PROFILE_H264_HIGH_10_INTRA: CodecProfile = CodecProfile(110 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_HIGH_422: CodecProfile = CodecProfile(122);
354 pub const CODEC_PROFILE_H264_HIGH_422_INTRA: CodecProfile =
356 CodecProfile(122 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_HIGH_444: CodecProfile = CodecProfile(144);
359 pub const CODEC_PROFILE_H264_HIGH_444_PREDICTIVE: CodecProfile = CodecProfile(244);
361 pub const CODEC_PROFILE_H264_HIGH_444_INTRA: CodecProfile =
363 CodecProfile(244 | 1 << (8 + 3)); pub const CODEC_PROFILE_H264_CAVLC_444: CodecProfile = CodecProfile(44);
366
367 pub const CODEC_PROFILE_HEVC_MAIN: CodecProfile = CodecProfile(1);
372 pub const CODEC_PROFILE_HEVC_MAIN_10: CodecProfile = CodecProfile(2);
374 pub const CODEC_PROFILE_HEVC_MAIN_STILL_PICTURE: CodecProfile = CodecProfile(3);
376
377 pub const CODEC_PROFILE_VP9_0: CodecProfile = CodecProfile(0);
382 pub const CODEC_PROFILE_VP9_1: CodecProfile = CodecProfile(1);
384 pub const CODEC_PROFILE_VP9_2: CodecProfile = CodecProfile(2);
386 pub const CODEC_PROFILE_VP9_3: CodecProfile = CodecProfile(3);
388
389 pub const CODEC_PROFILE_VC1_SIMPLE: CodecProfile = CodecProfile(0);
394 pub const CODEC_PROFILE_VC1_MAIN: CodecProfile = CodecProfile(1);
396 pub const CODEC_PROFILE_VC1_ADVANCED: CodecProfile = CodecProfile(2);
398 }
399
400 pub mod extra_data {
401 use crate::codecs::video::VideoExtraDataId;
402
403 pub const VIDEO_EXTRA_DATA_ID_AVC_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(1);
405
406 pub const VIDEO_EXTRA_DATA_ID_HEVC_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(2);
408
409 pub const VIDEO_EXTRA_DATA_ID_VP9_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(3);
411
412 pub const VIDEO_EXTRA_DATA_ID_AV1_DECODER_CONFIG: VideoExtraDataId = VideoExtraDataId(4);
414
415 pub const VIDEO_EXTRA_DATA_ID_DOLBY_VISION_CONFIG: VideoExtraDataId = VideoExtraDataId(5);
417
418 pub const VIDEO_EXTRA_DATA_ID_DOLBY_VISION_EL_HEVC: VideoExtraDataId = VideoExtraDataId(6);
420 }
421}