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