]> git.nihav.org Git - nihav.git/blame_incremental - nihav-registry/src/register.rs
nihav_indeo: rewrite some bits of Indeo 4/5 using more modern Rust
[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; "qt-smc", "Apple Graphics"),
202 desc!(video; "qt-rle", "Apple Animation"),
203 desc!(video; "apple-video", "Apple video"),
204 desc!(video; "qdraw", "Apple QuickDraw"),
205 desc!(video; "sorenson-video", "Sorenson Video"),
206 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
207 desc!(video; "qt-cdvideo", "CD Video Codec"),
208 desc!(video-im; "qt-sivq", "SIVQ"),
209 desc!(video-ll; "qt-yuv2", "Raw YUV"),
210 desc!(video-ll; "qt-yuv4", "libquicktime YUV4"),
211 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
212 desc!(audio; "mace-3", "MACE 3:1"),
213 desc!(audio; "mace-6", "MACE 6:1"),
214 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
215 desc!(audio; "qdesign-music", "QDesign Music"),
216 desc!(audio; "qdesign-music2", "QDesign Music v2"),
217 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
218
219 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
220 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
221 desc!(video; "movinglines", "Acorn Moving Lines"),
222 desc!(video; "movingblocks", "Acorn Moving Blocks"),
223 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
224 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
225 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
226 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
227 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
228 desc!(video; "escape100", "Eidos Escape 100"),
229 desc!(video; "escape102", "Eidos Escape 102"),
230 desc!(video; "escape122", "Eidos Escape 122"),
231 desc!(video; "escape124", "Eidos Escape 124"),
232 desc!(video; "escape130", "Eidos Escape 130"),
233 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
234 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
235 desc!(audio; "iota-sound", "IotaSound"),
236
237 desc!(video; "truemotion1", "TrueMotion 1"),
238 desc!(video-im; "truemotionrt", "TrueMotion RT"),
239 desc!(video; "truemotion2", "TrueMotion 2"),
240 desc!(video; "truemotion2x", "TrueMotion 2X"),
241 desc!(video; "vp3", "VP3"),
242 desc!(video; "vp4", "VP4"),
243 desc!(video; "vp5", "VP5"),
244 desc!(video; "vp6", "VP6"),
245 desc!(video; "vp6f", "VP6 (in Flash)"),
246 desc!(video; "vp6a", "VP6 with alpha"),
247 desc!(video; "vp7", "VP7"),
248 desc!(video; "vp8", "VP8"),
249 desc!(video; "vp9", "VP9"),
250 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
251 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
252 desc!(audio; "on2avc-500", "On2 AVC"),
253 desc!(audio; "on2avc-501", "On2 AVC"),
254
255 desc!(video; "flv263", "Sorenson H.263"),
256 desc!(video-llp; "flashsv", "Flash Screen Video"),
257 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
258 desc!(audio; "asao", "N*llym*s*r ASAO"),
259 desc!(audio; "flv-adpcm", "Flash ADPCM"),
260
261 desc!(audio; "mp1", "MPEG Audio Layer I"),
262 desc!(audio; "mp2", "MPEG Audio Layer II"),
263 desc!(audio; "mp3", "MPEG Audio Layer III"),
264 desc!(audio; "mp3-multi", "MPEG Audio Layer III (multiple frames)"),
265 desc!(audio; "speex", "Speex"),
266
267 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
268 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
269 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
270 desc!(video; "beam-fcp", "Beam Software Animation"),
271 desc!(video; "beam-video", "Beam Software Video"),
272 desc!(video; "bmv-video", "BMV video"),
273 desc!(audio; "bmv-audio", "BMV audio"),
274 desc!(video; "bmv3-video", "DW Noir BMV video"),
275 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
276 desc!(video; "dp-sga", "Digital Pictures SGA video"),
277 desc!(video; "fable-imax", "Fable IMAX video"),
278 desc!(video; "fst-video", "FutureVision video"),
279 desc!(audio; "fst-audio", "FutureVision audio"),
280 desc!(video; "hl-fmv-video", "Highlander FMV video"),
281 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
282 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
283 desc!(video; "kmvc", "Karl Morton's Video Codec"),
284 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
285 desc!(video; "midivid", "MidiVid"),
286 desc!(video; "midivid3", "MidiVid 3"),
287 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
288 desc!(video-llp; "pdq2", "PDQ2"),
289 desc!(video-ll; "rbt-video", "Sierra Robot video"),
290 desc!(audio; "rbt-audio", "Sierra Robot audio"),
291 desc!(video; "seq-video", "Sierra Sequence video"),
292 desc!(video; "smushv1", "SMUSH Video paletted"),
293 desc!(video; "smushv2", "SMUSH Video 16-bit"),
294 desc!(video; "smush-iact", "SMUSH IACT Audio"),
295 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
296 desc!(video; "vmd-video", "VMD video"),
297 desc!(audio; "vmd-audio", "VMD audio"),
298 desc!(video; "vxvideo", "Actimagine Vx"),
299 desc!(audio; "vxaudio", "Actimagine Sx"),
300
301 desc!(video; "smacker-video", "Smacker video"),
302 desc!(audio; "smacker-audio", "Smacker audio"),
303 desc!(video; "bink-video", "Bink video"),
304 desc!(video; "bink2-video", "Bink2 video"),
305 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
306 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
307
308 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
309 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
310 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
311 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
312
313 desc!(video; "vivo1", "VivoActive Video 1.0"),
314 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
315 desc!(audio; "g723.1", "ITU G.723.1"),
316 desc!(audio; "siren", "Polycom Siren"),
317
318 desc!(audio-ll; "ape", "Monkey's Audio"),
319 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
320 desc!(audio-ll; "tta", "True Audio codec"),
321 desc!(audio-hyb; "wavpack", "WavPack"),
322
323 desc!(video-ll; "gif", "GIF"),
324 desc!(video-im; "jpeg", "JPEG"),
325 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
326 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
327
328 desc!(video; "fif", "Fractal Codec"),
329
330 desc!(video-im; "mvi0", "MotionPixels (MVI)"),
331 desc!(video; "mvi1", "MotionPixels 1"),
332 desc!(video; "mvi2", "MotionPixels 2"),
333
334 desc!(video; "gryphon-arbc-vfw", "Gryphon Software ARBC in AVI"),
335 desc!(video; "gryphon-arbc-qt", "Gryphon Software ARBC in MOV"),
336
337 desc!(video-im; "mwv1", "Aware MotionWavelets"),
338
339 desc!(video-llp; "pivideo", "PI-Video"),
340
341 desc!(video-im; "adorage", "proDAD Adorage"),
342 desc!(video-im; "moviepak", "RasterOps MoviePak"),
343 desc!(video-im; "pgvv", "Radius Studio Video"),
344
345 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
346
347 desc!(video; "teal-video", "TealMovie video"),
348 desc!(audio; "teal-audio", "TealMovie audio"),
349
350 desc!(video; "ultimotion", "IBM Ultimotion"),
351];
352
353static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
354 (&[1, 0, 0, 0], "msrle"),
355 (&[2, 0, 0, 0], "msrle"),
356
357 (b"CRAM", "msvideo1"),
358 (b"MSVC", "msvideo1"),
359 (b"WHAM", "msvideo1"),
360
361 (b"MJPG", "jpeg"),
362
363 (b"IF09", "indeo1"),
364 (b"RT21", "indeo2"),
365 (b"IV31", "indeo3"),
366 (b"IV32", "indeo3"),
367 (b"IV41", "indeo4"),
368 (b"IV50", "indeo5"),
369 (b"I263", "intel263"),
370 (b"YV92", "yv92"),
371
372 (b"UCOD", "clearvideo"),
373 (b"cvid", "cinepak"),
374 (b"savi", "cinepak"),
375 (b"tony", "cinepak"),
376 (b"ZMBV", "zmbv"),
377
378 (b"Ipma", "ipma"),
379 (b"Ip20", "ipma2"),
380 (b"KMVC", "kmvc"),
381
382 (b"MVDV", "midivid"),
383 (b"MV30", "midivid3"),
384 (b"MVLZ", "midivid-ll"),
385
386 (b"PDQ2", "pdq2"),
387
388 (b"tmot", "truemotion1"),
389 (b"DUCK", "truemotion1"),
390 (b"PVEZ", "truemotion1"),
391 (b"TR20", "truemotionrt"),
392 (b"TM20", "truemotion2"),
393 (b"TM2A", "truemotion2x"),
394 (b"TM2X", "truemotion2x"),
395 (b"VP30", "vp3"),
396 (b"VP31", "vp3"),
397 (b"VP40", "vp4"),
398 (b"VP50", "vp5"),
399 (b"VP60", "vp6"),
400 (b"VP61", "vp6"),
401 (b"VP62", "vp6"),
402 (b"VP6A", "vp6a"),
403 (b"VP70", "vp7"),
404
405 (b"MWV1", "mwv1"),
406
407 (b"MVI1", "mvi1"),
408
409 (b"FVF1", "fif"),
410
411 (b"pDAD", "adorage"),
412
413 (b"pivc", "pivideo"),
414
415 (b"ULTI", "ultimotion"),
416
417 (b"ARBC", "gryphon-arbc-vfw"),
418 (b"azpr", "apple-video"),
419 (b" elr", "qt-rle"),
420
421 (b"ESCP", "escape-any"),
422
423 (b"VXS1", "vxvideo"),
424
425 (b"DX50", "mpeg4asp"),
426 (b"DIVX", "mpeg4asp"),
427 (b"XVID", "mpeg4asp"),
428];
429
430static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
431 (0x0000, "unknown"),
432 (0x0001, "pcm"),
433 (0x0002, "ms-adpcm"),
434 (0x0003, "pcm"),
435 (0x0006, "alaw"),
436 (0x0007, "ulaw"),
437 (0x0011, "ima-adpcm-ms"),
438 (0x0055, "mp3-multi"),
439 (0x0061, "adpcm-dk4"),
440 (0x0062, "adpcm-dk3"),
441 (0x0401, "imc"),
442 (0x0402, "iac"),
443 (0x0500, "on2avc-500"),
444 (0x0501, "on2avc-501"),
445 (0x2000, "ac3-multi"),
446];
447
448static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
449 (b"cvid", "cinepak"),
450 (b"jpeg", "jpeg"),
451 (b"raw ", "rawvideo"),
452 //(b"Yuv2", "raw"),
453 (b"smc ", "qt-smc"),
454 (b"rle ", "qt-rle"),
455 (b"rpza", "apple-video"),
456 (b"qdrw", "qdraw"),
457 (b"cdvc", "qt-cdvideo"),
458 (b"SIVQ", "qt-sivq"),
459 (b"kpcd", "kodak-photocd"),
460 //(b"mpeg", "mpeg-video"),
461 (b"mjpa", "mjpeg-a"),
462 (b"mjpb", "mjpeg-b"),
463 (b"SVQ1", "sorenson-video"),
464 (b"svqi", "sorenson-video"),
465 (b"SVQ3", "sorenson-video3"),
466 (b"svq3", "sorenson-video3"),
467
468 (b"msvc", "msvideo1"),
469
470 (b"rt21", "indeo2"),
471 (b"IV32", "indeo3"),
472 (b"iv32", "indeo3"),
473 (b"IV31", "indeo3"),
474
475 (b"arbc", "gryphon-arbc-qt"),
476 (b"MPAK", "moviepak"),
477 (b"PGVV", "pgvv"),
478 (b"UCOD", "clearvideo"),
479
480 (b"tmot", "truemotion1"),
481 (b"VP31", "vp3"),
482 (b"VP30", "vp3"),
483
484 (b"ESCP", "escape-any"),
485
486 (b"mp4v", "mpeg4asp"),
487 (b"avc1", "h264"),
488
489 (b"j420", "rawvideo"),
490 (b"yuv2", "qt-yuv2"),
491 (b"yuv4", "qt-yuv4"),
492];
493
494static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
495 (b"NONE", "pcm"),
496 (b"raw ", "pcm"),
497 (b"twos", "pcm"),
498 (b"sowt", "pcm"),
499 (b"fl32", "pcm"),
500 (b"fl64", "pcm"),
501 (b"in24", "pcm"),
502 (b"in32", "pcm"),
503 (b"MAC3", "mace-3"),
504 (b"MAC6", "mace-6"),
505 (b"ima4", "ima-adpcm-qt"),
506 (b"ulaw", "ulaw"),
507 (b"alaw", "alaw"),
508 (b"dvca", "dv-audio"),
509 (b"QDMC", "qdesign-music"),
510 (b"QDM2", "qdesign-music2"),
511 (b"Qclp", "qualcomm-purevoice"),
512 //(b".mp3", "mpeg-layer3"),
513
514 (b"mp4a", "aac"),
515
516 (b"ac-3", "ac3"),
517
518 (b"alac", "alac"),
519];
520
521/// Returns video codec short name for provided FOURCC (used in AVI format).
522pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
523 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
524 if *fourcc == fcc { return Some(name); }
525 }
526 None
527}
528
529/// Returns FOURCC (used in AVI format) for provided codec name.
530pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
531 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
532 if *name == codecname { return Some(**fourcc); }
533 }
534 None
535}
536
537/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
538pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
539 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
540 if *twocc == tcc { return Some(name); }
541 }
542 None
543}
544
545/// Returns TWOCC (used in WAV and AVI format for provided codec name.
546pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
547 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
548 if *name == codecname { return Some(*twocc); }
549 }
550 None
551}
552
553/// Returns video codec short name for provided FOURCC (used in MOV format).
554pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
555 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
556 if *fourcc == fcc { return Some(name); }
557 }
558 None
559}
560
561/// Returns known audio codec short name for provided FOURCC (used in MOV format).
562pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
563 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
564 if *fourcc == fcc { return Some(name); }
565 }
566 None
567}
568
569/// Returns FOURCC (used in MOV format) for provided video codec name.
570pub fn find_mov_video_fourcc(codecname: &str) -> Option<[u8; 4]> {
571 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
572 if *name == codecname { return Some(**fourcc); }
573 }
574 None
575}
576
577/// Returns FOURCC (used in MOV format) for provided audio codec name.
578pub fn find_mov_audio_fourcc(codecname: &str) -> Option<[u8; 4]> {
579 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
580 if *name == codecname { return Some(**fourcc); }
581 }
582 None
583}
584
585#[cfg(test)]
586mod test {
587 use super::*;
588
589 #[test]
590 fn test_register() {
591 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
592 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
593 println!("found {} and {}", c1, c2);
594 let cd1 = get_codec_description(c1).unwrap();
595 let cd2 = get_codec_description(c2).unwrap();
596 println!("got {} and {}", cd1, cd2);
597 }
598}