]> git.nihav.org Git - nihav.git/blob - nihav-registry/src/register.rs
09f53a3f3777132a24127710f7fd69c695aaf6b4
[nihav.git] / nihav-registry / src / register.rs
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.
4 use std::fmt;
5
6 /// Codec types.
7 #[derive(Debug,Clone,Copy,PartialEq)]
8 #[allow(dead_code)]
9 pub 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
22 impl 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.
35 pub const CODEC_CAP_INTRAONLY:u32 = 0x0001;
36 /// Codec capability flag for lossless codecs.
37 pub const CODEC_CAP_LOSSLESS:u32 = 0x0002;
38 /// Codec capability flag for codecs with frame reordering.
39 pub const CODEC_CAP_REORDER:u32 = 0x0004;
40 /// Codec capability flag for codecs that can be both lossy and lossless.
41 pub const CODEC_CAP_HYBRID:u32 = 0x0008;
42 /// Codec capability flag for codecs with scalability features.
43 pub const CODEC_CAP_SCALABLE:u32 = 0x0010;
44 /// Codec capability flag for codecs with complex frame reordering.
45 pub const CODEC_CAP_COMPLEX_REORDER:u32 = 0x0020;
46
47 /// Codec description structure.
48 #[derive(Clone)]
49 pub 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
62 impl 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
83 impl 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
109 macro_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.
149 pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
150 CODEC_REGISTER.iter().find(|&reg| reg.name == name)
151 }
152
153 static 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!(audio; "iac", "Intel Indeo audio"),
167 desc!(audio; "imc", "Intel Music Coder"),
168
169 desc!(video; "realvideo1", "Real Video 1"),
170 desc!(video; "realvideo2", "Real Video 2", CODEC_CAP_REORDER),
171 desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
172 desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
173 desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
174 desc!(video; "clearvideo", "ClearVideo"),
175 desc!(video; "clearvideo_rm", "ClearVideo"),
176 desc!(audio; "ra14.4", "RealAudio 14.4"),
177 desc!(audio; "ra28.8", "RealAudio 28.8"),
178 desc!(audio; "cook", "RealAudio Cooker"),
179 desc!(audio; "ralf", "RealAudio Lossless"),
180 desc!(audio; "aac", "AAC"),
181 desc!(audio; "ac3", "ETSI TS 102 366"),
182 desc!(audio; "atrac3", "Sony Atrac3"),
183 desc!(audio; "sipro", "Sipro Labs ADPCM"),
184
185
186 desc!(video-ll; "rawvideo", "Raw video data"),
187 desc!(video-ll; "rawvideo-ms", "Raw video data"),
188
189 desc!(video; "cinepak", "Cinepak"),
190
191 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
192
193 desc!(video; "msvideo1", "MS Video 1"),
194 desc!(video; "msrle", "MS RLE"),
195 desc!(audio; "ms-adpcm", "MS ADPCM"),
196 desc!(audio; "ima-adpcm-ms", "IMA ADPCM (MS variant)"),
197
198 desc!(video; "qt-smc", "Apple Graphics"),
199 desc!(video; "qt-rle", "Apple Animation"),
200 desc!(video; "apple-video", "Apple video"),
201 desc!(video; "sorenson-video", "Sorenson Video"),
202 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
203 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
204 desc!(audio; "mace-3", "MACE 3:1"),
205 desc!(audio; "mace-6", "MACE 6:1"),
206 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
207 desc!(audio; "qdesign-music", "QDesign Music"),
208 desc!(audio; "qdesign-music2", "QDesign Music v2"),
209 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
210
211 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
212 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
213 desc!(video; "movinglines", "Acorn Moving Lines"),
214 desc!(video; "movingblocks", "Acorn Moving Blocks"),
215 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
216 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
217 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
218 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
219 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
220 desc!(video; "escape100", "Eidos Escape 100"),
221 desc!(video; "escape102", "Eidos Escape 102"),
222 desc!(video; "escape122", "Eidos Escape 122"),
223 desc!(video; "escape124", "Eidos Escape 124"),
224 desc!(video; "escape130", "Eidos Escape 130"),
225 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
226 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
227 desc!(audio; "iota-sound", "IotaSound"),
228
229 desc!(video; "truemotion1", "TrueMotion 1"),
230 desc!(video-im; "truemotionrt", "TrueMotion RT"),
231 desc!(video; "truemotion2", "TrueMotion 2"),
232 desc!(video; "truemotion2x", "TrueMotion 2X"),
233 desc!(video; "vp3", "VP3"),
234 desc!(video; "vp4", "VP4"),
235 desc!(video; "vp5", "VP5"),
236 desc!(video; "vp6", "VP6"),
237 desc!(video; "vp6f", "VP6 (in Flash)"),
238 desc!(video; "vp6a", "VP6 with alpha"),
239 desc!(video; "vp7", "VP7"),
240 desc!(video; "vp8", "VP8"),
241 desc!(video; "vp9", "VP9"),
242 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
243 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
244 desc!(audio; "on2avc-500", "On2 AVC"),
245 desc!(audio; "on2avc-501", "On2 AVC"),
246
247 desc!(video; "flv263", "Sorenson H.263"),
248 desc!(video-llp; "flashsv", "Flash Screen Video"),
249 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
250 desc!(audio; "asao", "N*llym*s*r ASAO"),
251 desc!(audio; "flv-adpcm", "Flash ADPCM"),
252
253 desc!(audio; "mp1", "MPEG Audio Layer I"),
254 desc!(audio; "mp2", "MPEG Audio Layer II"),
255 desc!(audio; "mp3", "MPEG Audio Layer III"),
256 desc!(audio; "speex", "Speex"),
257
258 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
259 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
260 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
261 desc!(video; "beam-fcp", "Beam Software Animation"),
262 desc!(video; "beam-video", "Beam Software Video"),
263 desc!(video; "bmv-video", "BMV video"),
264 desc!(audio; "bmv-audio", "BMV audio"),
265 desc!(video; "bmv3-video", "DW Noir BMV video"),
266 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
267 desc!(video; "dp-sga", "Digital Pictures SGA video"),
268 desc!(video; "fable-imax", "Fable IMAX video"),
269 desc!(video; "fst-video", "FutureVision video"),
270 desc!(audio; "fst-audio", "FutureVision audio"),
271 desc!(video; "hl-fmv-video", "Highlander FMV video"),
272 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
273 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
274 desc!(video; "kmvc", "Karl Morton's Video Codec"),
275 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
276 desc!(video; "midivid", "MidiVid"),
277 desc!(video; "midivid3", "MidiVid 3"),
278 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
279 desc!(video-ll; "rbt-video", "Sierra Robot video"),
280 desc!(audio; "rbt-audio", "Sierra Robot audio"),
281 desc!(video; "seq-video", "Sierra Sequence video"),
282 desc!(video; "smushv1", "SMUSH Video paletted"),
283 desc!(video; "smushv2", "SMUSH Video 16-bit"),
284 desc!(video; "smush-iact", "SMUSH IACT Audio"),
285 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
286 desc!(video; "vmd-video", "VMD video"),
287 desc!(audio; "vmd-audio", "VMD audio"),
288 desc!(video; "vxvideo", "Actimagine Vx"),
289 desc!(audio; "vxaudio", "Actimagine Sx"),
290
291 desc!(video; "smacker-video", "Smacker video"),
292 desc!(audio; "smacker-audio", "Smacker audio"),
293 desc!(video; "bink-video", "Bink video"),
294 desc!(video; "bink2-video", "Bink2 video"),
295 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
296 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
297
298 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
299 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
300 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
301 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
302
303 desc!(video; "vivo1", "VivoActive Video 1.0"),
304 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
305 desc!(audio; "g723.1", "ITU G.723.1"),
306 desc!(audio; "siren", "Polycom Siren"),
307
308 desc!(audio-ll; "ape", "Monkey's Audio"),
309 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
310 desc!(audio-ll; "tta", "True Audio codec"),
311 desc!(audio-hyb; "wavpack", "WavPack"),
312
313 desc!(video-ll; "gif", "GIF"),
314 desc!(video-im; "jpeg", "JPEG"),
315 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
316 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
317
318 desc!(video-im; "mwv1", "Aware MotionWavelets"),
319
320 desc!(video-llp; "pivideo", "PI-Video"),
321
322 desc!(video-im; "pgvv", "Radius Studio Video"),
323
324 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
325
326 desc!(video; "teal-video", "TealMovie video"),
327 desc!(audio; "teal-audio", "TealMovie audio"),
328 ];
329
330 static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
331 (&[1, 0, 0, 0], "msrle"),
332 (&[2, 0, 0, 0], "msrle"),
333
334 (b"CRAM", "msvideo1"),
335 (b"MSVC", "msvideo1"),
336 (b"WHAM", "msvideo1"),
337
338 (b"MJPG", "jpeg"),
339
340 (b"IF09", "indeo1"),
341 (b"RT21", "indeo2"),
342 (b"IV31", "indeo3"),
343 (b"IV32", "indeo3"),
344 (b"IV41", "indeo4"),
345 (b"IV50", "indeo5"),
346 (b"I263", "intel263"),
347
348 (b"UCOD", "clearvideo"),
349 (b"cvid", "cinepak"),
350 (b"savi", "cinepak"),
351 (b"ZMBV", "zmbv"),
352
353 (b"Ipma", "ipma"),
354 (b"Ip20", "ipma2"),
355 (b"KMVC", "kmvc"),
356
357 (b"MVDV", "midivid"),
358 (b"MV30", "midivid3"),
359 (b"MVLZ", "midivid-ll"),
360
361 (b"tmot", "truemotion1"),
362 (b"DUCK", "truemotion1"),
363 (b"TR20", "truemotionrt"),
364 (b"TM20", "truemotion2"),
365 (b"TM2A", "truemotion2x"),
366 (b"TM2X", "truemotion2x"),
367 (b"VP30", "vp3"),
368 (b"VP31", "vp3"),
369 (b"VP40", "vp4"),
370 (b"VP50", "vp5"),
371 (b"VP60", "vp6"),
372 (b"VP61", "vp6"),
373 (b"VP62", "vp6"),
374 (b"VP6A", "vp6a"),
375 (b"VP70", "vp7"),
376
377 (b"MWV1", "mwv1"),
378
379 (b"pivc", "pivideo"),
380
381 (b"azpr", "apple-video"),
382 (b"PGVV", "pgvv"),
383
384 (b"ESCP", "escape-any"),
385
386 (b"VXS1", "vxvideo"),
387
388 (b"DX50", "mpeg4asp"),
389 (b"DIVX", "mpeg4asp"),
390 (b"XVID", "mpeg4asp"),
391 ];
392
393 static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
394 (0x0000, "unknown"),
395 (0x0001, "pcm"),
396 (0x0002, "ms-adpcm"),
397 (0x0003, "pcm"),
398 (0x0011, "ima-adpcm-ms"),
399 (0x0055, "mp3"),
400 (0x0061, "adpcm-dk4"),
401 (0x0062, "adpcm-dk3"),
402 (0x0401, "imc"),
403 (0x0402, "iac"),
404 (0x0500, "on2avc-500"),
405 (0x0501, "on2avc-501"),
406 ];
407
408 static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
409 (b"cvid", "cinepak"),
410 (b"jpeg", "jpeg"),
411 //(b"raw ", "raw"),
412 //(b"Yuv2", "raw"),
413 (b"smc ", "qt-smc"),
414 (b"rle ", "qt-rle"),
415 (b"rpza", "apple-video"),
416 (b"kpcd", "kodak-photocd"),
417 //(b"mpeg", "mpeg-video"),
418 (b"mjpa", "mjpeg-a"),
419 (b"mjpb", "mjpeg-b"),
420 (b"svqi", "sorenson-video"),
421 (b"SVQ1", "sorenson-video"),
422 (b"svq3", "sorenson-video3"),
423 (b"SVQ3", "sorenson-video3"),
424
425 (b"IV31", "indeo3"),
426 (b"IV32", "indeo3"),
427
428 (b"UCOD", "clearvideo"),
429
430 (b"VP30", "vp3"),
431 (b"VP31", "vp3"),
432
433 (b"ESCP", "escape-any"),
434
435 (b"mp4v", "mpeg4asp"),
436 (b"avc1", "h264"),
437 ];
438
439 static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
440 (b"NONE", "pcm"),
441 (b"raw ", "pcm"),
442 (b"twos", "pcm"),
443 (b"sowt", "pcm"),
444 (b"fl32", "pcm"),
445 (b"fl64", "pcm"),
446 (b"in24", "pcm"),
447 (b"in32", "pcm"),
448 (b"MAC3", "mace-3"),
449 (b"MAC6", "mace-6"),
450 (b"ima4", "ima-adpcm-qt"),
451 (b"ulaw", "ulaw"),
452 (b"alaw", "alaw"),
453 (b"dvca", "dv-audio"),
454 (b"QDMC", "qdesign-music"),
455 (b"QDM2", "qdesign-music2"),
456 (b"Qclp", "qualcomm-purevoice"),
457 //(b".mp3", "mpeg-layer3"),
458
459 (b"mp4a", "aac"),
460
461 (b"alac", "alac"),
462 ];
463
464 /// Returns video codec short name for provided FOURCC (used in AVI format).
465 pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
466 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
467 if *fourcc == fcc { return Some(name); }
468 }
469 None
470 }
471
472 /// Returns FOURCC (used in AVI format) for provided codec name.
473 pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
474 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
475 if *name == codecname { return Some(**fourcc); }
476 }
477 None
478 }
479
480 /// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
481 pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
482 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
483 if *twocc == tcc { return Some(name); }
484 }
485 None
486 }
487
488 /// Returns TWOCC (used in WAV and AVI format for provided codec name.
489 pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
490 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
491 if *name == codecname { return Some(*twocc); }
492 }
493 None
494 }
495
496 /// Returns video codec short name for provided FOURCC (used in MOV format).
497 pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
498 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
499 if *fourcc == fcc { return Some(name); }
500 }
501 None
502 }
503
504 /// Returns known audio codec short name for provided FOURCC (used in MOV format).
505 pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
506 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
507 if *fourcc == fcc { return Some(name); }
508 }
509 None
510 }
511
512 #[cfg(test)]
513 mod test {
514 use super::*;
515
516 #[test]
517 fn test_register() {
518 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
519 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
520 println!("found {} and {}", c1, c2);
521 let cd1 = get_codec_description(c1).unwrap();
522 let cd2 = get_codec_description(c2).unwrap();
523 println!("got {} and {}", cd1, cd2);
524 }
525 }