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