]> git.nihav.org Git - nihav.git/blame_incremental - nihav-registry/src/register.rs
mov: recognise and export navigable data
[nihav.git] / nihav-registry / src / register.rs
... / ...
CommitLineData
1//! Global registry of codec information.
2//!
3//! This module contains codec information from technical level that allows user to retrieve information about codec type and features without creating and invoking a decoder for such codec.
4use std::fmt;
5
6/// Codec types.
7#[derive(Debug,Clone,Copy,PartialEq)]
8#[allow(dead_code)]
9pub enum CodecType {
10 /// Video codec.
11 Video,
12 /// Audio codec.
13 Audio,
14 /// Subtitle codec.
15 Subtitles,
16 /// Some special codec (e.g. some event stream or separate timecodes stream).
17 Data,
18 /// Dummy codec.
19 None,
20}
21
22impl fmt::Display for CodecType {
23 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
24 match *self {
25 CodecType::Video => write!(f, "Video"),
26 CodecType::Audio => write!(f, "Audio"),
27 CodecType::Subtitles => write!(f, "Subtitles"),
28 CodecType::Data => write!(f, "Data"),
29 CodecType::None => write!(f, "-"),
30 }
31 }
32}
33
34/// Codec capability flag for intra-only codecs.
35pub const CODEC_CAP_INTRAONLY:u32 = 0x0001;
36/// Codec capability flag for lossless codecs.
37pub const CODEC_CAP_LOSSLESS:u32 = 0x0002;
38/// Codec capability flag for codecs with frame reordering.
39pub const CODEC_CAP_REORDER:u32 = 0x0004;
40/// Codec capability flag for codecs that can be both lossy and lossless.
41pub const CODEC_CAP_HYBRID:u32 = 0x0008;
42/// Codec capability flag for codecs with scalability features.
43pub const CODEC_CAP_SCALABLE:u32 = 0x0010;
44/// Codec capability flag for codecs with complex frame reordering.
45pub const CODEC_CAP_COMPLEX_REORDER:u32 = 0x0020;
46
47/// Codec description structure.
48#[derive(Clone)]
49pub struct CodecDescription {
50 /// Short codec name.
51 ///
52 /// Short codec name is used inside NihAV as the unique identifier.
53 pub name: &'static str,
54 /// Full codec name.
55 pub fname: &'static str,
56 /// Codec type.
57 pub ctype: CodecType,
58 /// Codec capabilities.
59 pub caps: u32,
60}
61
62impl CodecDescription {
63 /// Returns short codec name.
64 pub fn get_name(&self) -> &'static str { self.name }
65 /// Returns full codec name.
66 pub fn get_full_name(&self) -> &'static str { self.fname }
67 /// Returns codec type.
68 pub fn get_codec_type(&self) -> CodecType { self.ctype }
69 /// Reports whether the codec has only intra frames or not.
70 pub fn is_intraonly(&self) -> bool { (self.caps & CODEC_CAP_INTRAONLY) != 0 }
71 /// Reports whether the codec is lossless.
72 pub fn is_lossless(&self) -> bool { (self.caps & CODEC_CAP_LOSSLESS) != 0 }
73 /// Reports whether the codec requires frame reordering.
74 pub fn has_reorder(&self) -> bool { (self.caps & CODEC_CAP_REORDER) != 0 }
75 /// Reports whether the codec can be either lossless or lossy.
76 pub fn is_hybrid(&self) -> bool { (self.caps & CODEC_CAP_HYBRID) != 0 }
77 /// Reports whether codec supports scalability.
78 ///
79 /// Scalability means that codec can be decoded in reduced resolution by design.
80 pub fn is_scalable(&self) -> bool { (self.caps & CODEC_CAP_SCALABLE) != 0 }
81}
82
83impl fmt::Display for CodecDescription {
84 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85 let mut out = self.fname.to_string();
86 if self.caps != 0 {
87 let mut capfmt = "".to_string();
88 if (self.caps & CODEC_CAP_INTRAONLY) != 0 {
89 capfmt = format!("{} Intra-only", capfmt);
90 }
91 if (self.caps & CODEC_CAP_LOSSLESS) != 0 {
92 capfmt = format!("{} Lossless", capfmt);
93 }
94 if (self.caps & CODEC_CAP_REORDER) != 0 {
95 capfmt = format!("{} Frame reorder", capfmt);
96 }
97 if (self.caps & CODEC_CAP_HYBRID) != 0 {
98 capfmt = format!("{} Can be lossy and lossless", capfmt);
99 }
100 if (self.caps & CODEC_CAP_SCALABLE) != 0 {
101 capfmt = format!("{} Scalable", capfmt);
102 }
103 out = format!("{} ({})", out, capfmt);
104 }
105 write!(f, "{}", out)
106 }
107}
108
109macro_rules! desc {
110 (video; $n:expr, $fn:expr) => ({
111 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
112 caps: 0 }
113 });
114 (video; $n:expr, $fn:expr, $c:expr) => ({
115 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
116 caps: $c }
117 });
118 (video-ll; $n:expr, $fn:expr) => ({
119 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
120 caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
121 });
122 (video-llp; $n:expr, $fn:expr) => ({
123 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
124 caps: CODEC_CAP_LOSSLESS }
125 });
126 (video-im; $n:expr, $fn:expr) => ({
127 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
128 caps: CODEC_CAP_INTRAONLY }
129 });
130 (video-modern; $n:expr, $fn:expr) => ({
131 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
132 caps: CODEC_CAP_REORDER | CODEC_CAP_HYBRID }
133 });
134 (audio; $n:expr, $fn:expr) => ({
135 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
136 caps: 0 }
137 });
138 (audio-ll; $n:expr, $fn:expr) => ({
139 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
140 caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
141 });
142 (audio-hyb; $n:expr, $fn:expr) => ({
143 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
144 caps: CODEC_CAP_HYBRID }
145 });
146}
147
148/// Returns codec description for the provided codec short name if it is found.
149pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
150 CODEC_REGISTER.iter().find(|&reg| reg.name == name)
151}
152
153static CODEC_REGISTER: &[CodecDescription] = &[
154 desc!(audio-ll; "pcm", "PCM"),
155 desc!(audio; "alaw", "A-law PCM"),
156 desc!(audio; "ulaw", "mu-law PCM"),
157
158 desc!(video-im; "indeo1", "Intel Raw IF09"),
159 desc!(video; "indeo2", "Intel Indeo 2"),
160 desc!(video; "ima-rtv2", "Intel RTV 2 (Indeo 2)"),
161 desc!(video; "indeo3", "Intel Indeo 3"),
162 desc!(video; "indeo4", "Intel Indeo 4", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
163 desc!(video; "indeo5", "Intel Indeo 5", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
164 desc!(video; "indeo5s", "Intel Indeo 5 Scalable", CODEC_CAP_SCALABLE),
165 desc!(video; "intel263", "Intel I263", CODEC_CAP_REORDER),
166 desc!(video-im; "yv92", "Intel Indeo YVU9 Compressed"),
167 desc!(audio; "iac", "Intel Indeo audio"),
168 desc!(audio; "imc", "Intel Music Coder"),
169 desc!(audio; "dvi-adpcm", "Intel DVI ADPCM"),
170
171 desc!(video; "realvideo1", "Real Video 1"),
172 desc!(video; "realvideo2", "Real Video 2", CODEC_CAP_REORDER),
173 desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
174 desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
175 desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
176 desc!(video; "clearvideo", "ClearVideo"),
177 desc!(video; "clearvideo_rm", "ClearVideo"),
178 desc!(audio; "ra14.4", "RealAudio 14.4"),
179 desc!(audio; "ra28.8", "RealAudio 28.8"),
180 desc!(audio; "cook", "RealAudio Cooker"),
181 desc!(audio; "ralf", "RealAudio Lossless"),
182 desc!(audio; "aac", "AAC"),
183 desc!(audio; "ac3", "ETSI TS 102 366"),
184 desc!(audio; "ac3-multi", "ETSI TS 102 366 (multiple frames)"),
185 desc!(audio; "atrac3", "Sony Atrac3"),
186 desc!(audio; "sipro", "Sipro Labs ADPCM"),
187
188
189 desc!(video-ll; "rawvideo", "Raw video data"),
190 desc!(video-ll; "rawvideo-ms", "Raw video data"),
191
192 desc!(video; "cinepak", "Cinepak"),
193
194 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
195
196 desc!(video; "msvideo1", "MS Video 1"),
197 desc!(video; "msrle", "MS RLE"),
198 desc!(audio; "ms-adpcm", "MS ADPCM"),
199 desc!(audio; "ima-adpcm-ms", "IMA ADPCM (MS variant)"),
200
201 desc!(video-ll; "8bps", "Planar RGB"),
202 desc!(video; "qt-smc", "Apple Graphics"),
203 desc!(video; "qt-rle", "Apple Animation"),
204 desc!(video; "apple-video", "Apple video"),
205 desc!(video; "qdraw", "Apple QuickDraw"),
206 desc!(video; "sorenson-video", "Sorenson Video"),
207 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
208 desc!(video; "qt-cdvideo", "CD Video Codec"),
209 desc!(video-im; "qt-sivq", "SIVQ"),
210 desc!(video-ll; "qt-yuv2", "Raw YUV"),
211 desc!(video-ll; "qt-yuv4", "libquicktime YUV4"),
212 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
213 desc!(audio; "mace-3", "MACE 3:1"),
214 desc!(audio; "mace-6", "MACE 6:1"),
215 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
216 desc!(audio; "qdesign-music", "QDesign Music"),
217 desc!(audio; "qdesign-music2", "QDesign Music v2"),
218 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
219
220 desc!(video; "pixar-0", "Pixar Codec 0"),
221 desc!(video; "pixar-1", "Pixar Codec 1"),
222 desc!(video; "pixar-2", "Pixar Codec 2"),
223 desc!(video; "pixar-3", "Pixar Codec 3"),
224 desc!(video; "pixar-4", "Pixar Codec 4"),
225 desc!(video; "pixar-5", "Pixar Codec 5"),
226 desc!(video; "pixar-6", "Pixar Codec 6"),
227 desc!(video; "pixar-7", "Pixar Codec 7"),
228 desc!(video; "pixar-a", "Pixar Codec A"),
229
230 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
231 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
232 desc!(video; "movinglines", "Acorn Moving Lines"),
233 desc!(video; "movingblocks", "Acorn Moving Blocks"),
234 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
235 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
236 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
237 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
238 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
239 desc!(video; "escape100", "Eidos Escape 100"),
240 desc!(video; "escape102", "Eidos Escape 102"),
241 desc!(video; "escape122", "Eidos Escape 122"),
242 desc!(video; "escape124", "Eidos Escape 124"),
243 desc!(video; "escape130", "Eidos Escape 130"),
244 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
245 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
246 desc!(audio; "iota-sound", "IotaSound"),
247
248 desc!(video; "truemotion1", "TrueMotion 1"),
249 desc!(video-im; "truemotionrt", "TrueMotion RT"),
250 desc!(video; "truemotion2", "TrueMotion 2"),
251 desc!(video; "truemotion2x", "TrueMotion 2X"),
252 desc!(video; "vp3", "VP3"),
253 desc!(video; "vp4", "VP4"),
254 desc!(video; "vp5", "VP5"),
255 desc!(video; "vp6", "VP6"),
256 desc!(video; "vp6f", "VP6 (in Flash)"),
257 desc!(video; "vp6a", "VP6 with alpha"),
258 desc!(video; "vp7", "VP7"),
259 desc!(video; "vp8", "VP8"),
260 desc!(video; "vp9", "VP9"),
261 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
262 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
263 desc!(audio; "on2avc-500", "On2 AVC"),
264 desc!(audio; "on2avc-501", "On2 AVC"),
265
266 desc!(video; "flv263", "Sorenson H.263"),
267 desc!(video-llp; "flashsv", "Flash Screen Video"),
268 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
269 desc!(audio; "asao", "N*llym*s*r ASAO"),
270 desc!(audio; "flv-adpcm", "Flash ADPCM"),
271
272 desc!(audio; "mp1", "MPEG Audio Layer I"),
273 desc!(audio; "mp2", "MPEG Audio Layer II"),
274 desc!(audio; "mp3", "MPEG Audio Layer III"),
275 desc!(audio; "mp3-multi", "MPEG Audio Layer III (multiple frames)"),
276 desc!(audio; "speex", "Speex"),
277
278 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
279 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
280 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
281 desc!(video; "beam-fcp", "Beam Software Animation"),
282 desc!(video; "beam-video", "Beam Software Video"),
283 desc!(video; "bmv-video", "BMV video"),
284 desc!(audio; "bmv-audio", "BMV audio"),
285 desc!(video; "bmv3-video", "DW Noir BMV video"),
286 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
287 desc!(video; "dp-sga", "Digital Pictures SGA video"),
288 desc!(video; "fable-imax", "Fable IMAX video"),
289 desc!(video; "fst-video", "FutureVision video"),
290 desc!(audio; "fst-audio", "FutureVision audio"),
291 desc!(video; "hl-fmv-video", "Highlander FMV video"),
292 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
293 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
294 desc!(video; "kmvc", "Karl Morton's Video Codec"),
295 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
296 desc!(video; "midivid", "MidiVid"),
297 desc!(video; "midivid3", "MidiVid 3"),
298 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
299 desc!(video-llp; "pdq2", "PDQ2"),
300 desc!(video-ll; "rbt-video", "Sierra Robot video"),
301 desc!(audio; "rbt-audio", "Sierra Robot audio"),
302 desc!(video; "seq-video", "Sierra Sequence video"),
303 desc!(video; "smushv1", "SMUSH Video paletted"),
304 desc!(video; "smushv2", "SMUSH Video 16-bit"),
305 desc!(video; "smush-iact", "SMUSH IACT Audio"),
306 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
307 desc!(video; "vmd-video", "VMD video"),
308 desc!(audio; "vmd-audio", "VMD audio"),
309 desc!(video; "vxvideo", "Actimagine Vx"),
310 desc!(audio; "vxaudio", "Actimagine Sx"),
311
312 desc!(video; "smacker-video", "Smacker video"),
313 desc!(audio; "smacker-audio", "Smacker audio"),
314 desc!(video; "bink-video", "Bink video"),
315 desc!(video; "bink2-video", "Bink2 video"),
316 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
317 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
318
319 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
320 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
321 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
322 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
323
324 desc!(video; "vivo1", "VivoActive Video 1.0"),
325 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
326 desc!(audio; "g723.1", "ITU G.723.1"),
327 desc!(audio; "siren", "Polycom Siren"),
328
329 desc!(audio-ll; "ape", "Monkey's Audio"),
330 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
331 desc!(audio-ll; "tta", "True Audio codec"),
332 desc!(audio-hyb; "wavpack", "WavPack"),
333
334 desc!(video-ll; "gif", "GIF"),
335 desc!(video-im; "jpeg", "JPEG"),
336 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
337 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
338
339 desc!(video; "fif", "Fractal Codec"),
340
341 desc!(video-im; "mvi0", "MotionPixels (MVI)"),
342 desc!(video; "mvi1", "MotionPixels 1"),
343 desc!(video; "mvi2", "MotionPixels 2"),
344
345 desc!(video; "gryphon-arbc-vfw", "Gryphon Software ARBC in AVI"),
346 desc!(video; "gryphon-arbc-qt", "Gryphon Software ARBC in MOV"),
347
348 desc!(video-im; "mwv1", "Aware MotionWavelets"),
349
350 desc!(video-llp; "pivideo", "PI-Video"),
351
352 desc!(video-im; "adorage", "proDAD Adorage"),
353 desc!(video-im; "moviepak", "RasterOps MoviePak"),
354 desc!(video; "next-uwavelet", "NeXT Micro Wavelet"),
355 desc!(video-im; "pgvv", "Radius Studio Video"),
356
357 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
358
359 desc!(video; "teal-video", "TealMovie video"),
360 desc!(audio; "teal-audio", "TealMovie audio"),
361
362 desc!(video; "ultimotion", "IBM Ultimotion"),
363];
364
365static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
366 (&[1, 0, 0, 0], "msrle"),
367 (&[2, 0, 0, 0], "msrle"),
368
369 (b"CRAM", "msvideo1"),
370 (b"MSVC", "msvideo1"),
371 (b"WHAM", "msvideo1"),
372
373 (b"MJPG", "jpeg"),
374
375 (b"IF09", "indeo1"),
376 (b"RT21", "indeo2"),
377 (b"IV31", "indeo3"),
378 (b"IV32", "indeo3"),
379 (b"IV41", "indeo4"),
380 (b"IV50", "indeo5"),
381 (b"I263", "intel263"),
382 (b"YV92", "yv92"),
383
384 (b"UCOD", "clearvideo"),
385 (b"cvid", "cinepak"),
386 (b"savi", "cinepak"),
387 (b"tony", "cinepak"),
388 (b"ZMBV", "zmbv"),
389
390 (b"Ipma", "ipma"),
391 (b"Ip20", "ipma2"),
392 (b"KMVC", "kmvc"),
393
394 (b"MVDV", "midivid"),
395 (b"MV30", "midivid3"),
396 (b"MVLZ", "midivid-ll"),
397
398 (b"PDQ2", "pdq2"),
399
400 (b"tmot", "truemotion1"),
401 (b"DUCK", "truemotion1"),
402 (b"PVEZ", "truemotion1"),
403 (b"TR20", "truemotionrt"),
404 (b"TM20", "truemotion2"),
405 (b"TM2A", "truemotion2x"),
406 (b"TM2X", "truemotion2x"),
407 (b"VP30", "vp3"),
408 (b"VP31", "vp3"),
409 (b"VP40", "vp4"),
410 (b"VP50", "vp5"),
411 (b"VP60", "vp6"),
412 (b"VP61", "vp6"),
413 (b"VP62", "vp6"),
414 (b"VP6A", "vp6a"),
415 (b"VP70", "vp7"),
416
417 (b"MWV1", "mwv1"),
418
419 (b"MVI1", "mvi1"),
420
421 (b"FVF1", "fif"),
422
423 (b"pDAD", "adorage"),
424
425 (b"pivc", "pivideo"),
426
427 (b"ULTI", "ultimotion"),
428
429 (b"ARBC", "gryphon-arbc-vfw"),
430 (b"azpr", "apple-video"),
431 (b" elr", "qt-rle"),
432
433 (b"ESCP", "escape-any"),
434
435 (b"VXS1", "vxvideo"),
436
437 (b"DX50", "mpeg4asp"),
438 (b"DIVX", "mpeg4asp"),
439 (b"XVID", "mpeg4asp"),
440];
441
442static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
443 (0x0000, "unknown"),
444 (0x0001, "pcm"),
445 (0x0002, "ms-adpcm"),
446 (0x0003, "pcm"),
447 (0x0006, "alaw"),
448 (0x0007, "ulaw"),
449 (0x0011, "ima-adpcm-ms"),
450 (0x0055, "mp3-multi"),
451 (0x0061, "adpcm-dk4"),
452 (0x0062, "adpcm-dk3"),
453 (0x0401, "imc"),
454 (0x0402, "iac"),
455 (0x0500, "on2avc-500"),
456 (0x0501, "on2avc-501"),
457 (0x2000, "ac3-multi"),
458];
459
460static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
461 (b"8BPS", "8bps"),
462 (b"cvid", "cinepak"),
463 (b"jpeg", "jpeg"),
464 (b"raw ", "rawvideo"),
465 //(b"Yuv2", "raw"),
466 (b"smc ", "qt-smc"),
467 (b"rle ", "qt-rle"),
468 (b"rpza", "apple-video"),
469 (b"qdrw", "qdraw"),
470 (b"cdvc", "qt-cdvideo"),
471 (b"SIVQ", "qt-sivq"),
472 (b"kpcd", "kodak-photocd"),
473 //(b"mpeg", "mpeg-video"),
474 (b"mjpa", "mjpeg-a"),
475 (b"mjpb", "mjpeg-b"),
476 (b"jpgi", "jpeg"),
477 (b"SVQ1", "sorenson-video"),
478 (b"svqi", "sorenson-video"),
479 (b"SVQ3", "sorenson-video3"),
480 (b"svq3", "sorenson-video3"),
481
482 (b"msvc", "msvideo1"),
483
484 (b"rt21", "indeo2"),
485 (b"IV32", "indeo3"),
486 (b"iv32", "indeo3"),
487 (b"IV31", "indeo3"),
488
489 (b"arbc", "gryphon-arbc-qt"),
490 (b"MPAK", "moviepak"),
491 (b"PGVV", "pgvv"),
492 (b"UCOD", "clearvideo"),
493
494 (b"tmot", "truemotion1"),
495 (b"VP31", "vp3"),
496 (b"VP30", "vp3"),
497
498 (b"ESCP", "escape-any"),
499
500 (b"mp4v", "mpeg4asp"),
501 (b"avc1", "h264"),
502
503 (b"pix0", "pixar-0"),
504 (b"pix1", "pixar-1"),
505 (b"pix2", "pixar-2"),
506 (b"pix3", "pixar-3"),
507 (b"pix4", "pixar-4"),
508 (b"pix5", "pixar-5"),
509 (b"pix6", "pixar-6"),
510 (b"pix7", "pixar-7"),
511 (b"pixA", "pixar-a"),
512
513 (b"j420", "rawvideo"),
514 (b"yuv2", "qt-yuv2"),
515 (b"yuv4", "qt-yuv4"),
516
517 (b"uWav", "next-uwavelet"),
518];
519
520static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
521 (b"NONE", "pcm"),
522 (b"raw ", "pcm"),
523 (b"twos", "pcm"),
524 (b"sowt", "pcm"),
525 (b"fl32", "pcm"),
526 (b"fl64", "pcm"),
527 (b"in24", "pcm"),
528 (b"in32", "pcm"),
529 (b"MAC3", "mace-3"),
530 (b"MAC6", "mace-6"),
531 (b"ima4", "ima-adpcm-qt"),
532 (b"ulaw", "ulaw"),
533 (b"alaw", "alaw"),
534 (b"dvca", "dv-audio"),
535 (b"QDMC", "qdesign-music"),
536 (b"QDM2", "qdesign-music2"),
537 (b"Qclp", "qualcomm-purevoice"),
538 //(b".mp3", "mpeg-layer3"),
539
540 (b"mp4a", "aac"),
541
542 (b"ac-3", "ac3"),
543
544 (b"alac", "alac"),
545];
546
547/// Returns video codec short name for provided FOURCC (used in AVI format).
548pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
549 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
550 if *fourcc == fcc { return Some(name); }
551 }
552 None
553}
554
555/// Returns FOURCC (used in AVI format) for provided codec name.
556pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
557 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
558 if *name == codecname { return Some(**fourcc); }
559 }
560 None
561}
562
563/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
564pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
565 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
566 if *twocc == tcc { return Some(name); }
567 }
568 None
569}
570
571/// Returns TWOCC (used in WAV and AVI format for provided codec name.
572pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
573 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
574 if *name == codecname { return Some(*twocc); }
575 }
576 None
577}
578
579/// Returns video codec short name for provided FOURCC (used in MOV format).
580pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
581 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
582 if *fourcc == fcc { return Some(name); }
583 }
584 None
585}
586
587/// Returns known audio codec short name for provided FOURCC (used in MOV format).
588pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
589 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
590 if *fourcc == fcc { return Some(name); }
591 }
592 None
593}
594
595/// Returns FOURCC (used in MOV format) for provided video codec name.
596pub fn find_mov_video_fourcc(codecname: &str) -> Option<[u8; 4]> {
597 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
598 if *name == codecname { return Some(**fourcc); }
599 }
600 None
601}
602
603/// Returns FOURCC (used in MOV format) for provided audio codec name.
604pub fn find_mov_audio_fourcc(codecname: &str) -> Option<[u8; 4]> {
605 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
606 if *name == codecname { return Some(**fourcc); }
607 }
608 None
609}
610
611#[cfg(test)]
612mod test {
613 use super::*;
614
615 #[test]
616 fn test_register() {
617 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
618 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
619 println!("found {} and {}", c1, c2);
620 let cd1 = get_codec_description(c1).unwrap();
621 let cd2 = get_codec_description(c2).unwrap();
622 println!("got {} and {}", cd1, cd2);
623 }
624}