add Arxel Tribe video support
[nihav.git] / nihav-registry / src / register.rs
CommitLineData
285f4c72
KS
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.
d48ee414
KS
4use std::fmt;
5
285f4c72 6/// Codec types.
34829caa 7#[derive(Debug,Clone,Copy,PartialEq)]
d48ee414
KS
8#[allow(dead_code)]
9pub enum CodecType {
285f4c72 10 /// Video codec.
d48ee414 11 Video,
285f4c72 12 /// Audio codec.
d48ee414 13 Audio,
285f4c72 14 /// Subtitle codec.
d48ee414 15 Subtitles,
285f4c72 16 /// Some special codec (e.g. some event stream or separate timecodes stream).
d48ee414 17 Data,
285f4c72 18 /// Dummy codec.
d48ee414
KS
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
2793026b
KS
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;
8480761d
KS
44/// Codec capability flag for codecs with complex frame reordering.
45pub const CODEC_CAP_COMPLEX_REORDER:u32 = 0x0020;
d48ee414 46
285f4c72 47/// Codec description structure.
34829caa 48#[derive(Clone)]
d48ee414 49pub struct CodecDescription {
285f4c72
KS
50 /// Short codec name.
51 ///
52 /// Short codec name is used inside NihAV as the unique identifier.
5641dccf 53 pub name: &'static str,
285f4c72 54 /// Full codec name.
5641dccf 55 pub fname: &'static str,
285f4c72 56 /// Codec type.
5641dccf 57 pub ctype: CodecType,
285f4c72 58 /// Codec capabilities.
5641dccf 59 pub caps: u32,
d48ee414
KS
60}
61
62impl CodecDescription {
285f4c72 63 /// Returns short codec name.
d48ee414 64 pub fn get_name(&self) -> &'static str { self.name }
285f4c72 65 /// Returns full codec name.
d48ee414 66 pub fn get_full_name(&self) -> &'static str { self.fname }
285f4c72 67 /// Returns codec type.
d48ee414 68 pub fn get_codec_type(&self) -> CodecType { self.ctype }
285f4c72 69 /// Reports whether the codec has only intra frames or not.
d48ee414 70 pub fn is_intraonly(&self) -> bool { (self.caps & CODEC_CAP_INTRAONLY) != 0 }
285f4c72 71 /// Reports whether the codec is lossless.
d48ee414 72 pub fn is_lossless(&self) -> bool { (self.caps & CODEC_CAP_LOSSLESS) != 0 }
285f4c72 73 /// Reports whether the codec requires frame reordering.
d48ee414 74 pub fn has_reorder(&self) -> bool { (self.caps & CODEC_CAP_REORDER) != 0 }
285f4c72 75 /// Reports whether the codec can be either lossless or lossy.
d48ee414 76 pub fn is_hybrid(&self) -> bool { (self.caps & CODEC_CAP_HYBRID) != 0 }
285f4c72
KS
77 /// Reports whether codec supports scalability.
78 ///
79 /// Scalability means that codec can be decoded in reduced resolution by design.
d48ee414
KS
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 {
e243ceb4 85 let mut out = self.fname.to_string();
d48ee414
KS
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 });
87927c57
KS
142 (audio-hyb; $n:expr, $fn:expr) => ({
143 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
144 caps: CODEC_CAP_HYBRID }
145 });
d48ee414
KS
146}
147
285f4c72 148/// Returns codec description for the provided codec short name if it is found.
d48ee414 149pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
34829caa
KS
150 for reg in CODEC_REGISTER {
151 if reg.name == name {
152 return Some(reg);
d48ee414
KS
153 }
154 }
155 None
156}
157
b7c882c1 158static CODEC_REGISTER: &[CodecDescription] = &[
e8e022f4 159 desc!(audio-ll; "pcm", "PCM"),
3d5fb08f
KS
160 desc!(audio; "alaw", "A-law PCM"),
161 desc!(audio; "ulaw", "mu-law PCM"),
e8e022f4 162
45e794c4
KS
163 desc!(video-im; "indeo1", "Intel Raw IF09"),
164 desc!(video-im; "indeo2", "Intel Indeo 2"),
165 desc!(video; "indeo3", "Intel Indeo 3"),
166 desc!(video; "indeo4", "Intel Indeo 4", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
167 desc!(video; "indeo5", "Intel Indeo 5", CODEC_CAP_REORDER | CODEC_CAP_SCALABLE),
f7686373 168 desc!(video; "indeo5s", "Intel Indeo 5 Scalable", CODEC_CAP_SCALABLE),
1a36a05d 169 desc!(video; "intel263", "Intel I263", CODEC_CAP_REORDER),
45e794c4
KS
170 desc!(audio; "iac", "Intel Indeo audio"),
171 desc!(audio; "imc", "Intel Music Coder"),
ce52b3b5
KS
172
173 desc!(video; "realvideo1", "Real Video 1"),
6b2cdc84 174 desc!(video; "realvideo2", "Real Video 2", CODEC_CAP_REORDER),
ce52b3b5
KS
175 desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
176 desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
0b791d5c 177 desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
ce52b3b5 178 desc!(video; "clearvideo", "ClearVideo"),
750b299c 179 desc!(video; "clearvideo_rm", "ClearVideo"),
ce52b3b5
KS
180 desc!(audio; "ra14.4", "RealAudio 14.4"),
181 desc!(audio; "ra28.8", "RealAudio 28.8"),
182 desc!(audio; "cook", "RealAudio Cooker"),
183 desc!(audio; "ralf", "RealAudio Lossless"),
184 desc!(audio; "aac", "AAC"),
16dd4f44 185 desc!(audio; "ac3", "ETSI TS 102 366"),
ce52b3b5
KS
186 desc!(audio; "atrac3", "Sony Atrac3"),
187 desc!(audio; "sipro", "Sipro Labs ADPCM"),
e8e022f4 188
a715e99f
KS
189
190 desc!(video-ll; "rawvideo", "Raw video data"),
9a59c451 191 desc!(video-ll; "rawvideo-ms", "Raw video data"),
a715e99f 192
57777a0a
KS
193 desc!(video; "cinepak", "Cinepak"),
194
19336baf
KS
195 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
196
4abcd842 197 desc!(video; "msvideo1", "MS Video 1"),
03c406ea 198 desc!(video; "msrle", "MS RLE"),
4abcd842
KS
199 desc!(audio; "ms-adpcm", "MS ADPCM"),
200 desc!(audio; "ima-adpcm-ms", "IMA ADPCM (MS variant)"),
201
3d5fb08f
KS
202 desc!(video; "qt-smc", "Apple Graphics"),
203 desc!(video; "qt-rle", "Apple Animation"),
204 desc!(video; "apple-video", "Apple video"),
205 desc!(video; "sorenson-video", "Sorenson Video"),
8251c0ab 206 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
40494a85 207 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
3d5fb08f
KS
208 desc!(audio; "mace-3", "MACE 3:1"),
209 desc!(audio; "mace-6", "MACE 6:1"),
210 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
211 desc!(audio; "qdesign-music", "QDesign Music"),
212 desc!(audio; "qdesign-music2", "QDesign Music v2"),
213 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
214
d24468d9
KS
215 desc!(video; "truemotion1", "TrueMotion 1"),
216 desc!(video-im; "truemotionrt", "TrueMotion RT"),
217 desc!(video; "truemotion2", "TrueMotion 2"),
e8e022f4
KS
218 desc!(video; "truemotion2x", "TrueMotion 2X"),
219 desc!(video; "vp3", "VP3"),
220 desc!(video; "vp4", "VP4"),
221 desc!(video; "vp5", "VP5"),
222 desc!(video; "vp6", "VP6"),
92d9fb69
KS
223 desc!(video; "vp6f", "VP6 (in Flash)"),
224 desc!(video; "vp6a", "VP6 with alpha"),
e8e022f4
KS
225 desc!(video; "vp7", "VP7"),
226 desc!(video; "vp8", "VP8"),
227 desc!(video; "vp9", "VP9"),
228 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
229 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
629a1025
KS
230 desc!(audio; "on2avc-500", "On2 AVC"),
231 desc!(audio; "on2avc-501", "On2 AVC"),
e8e022f4 232
92d9fb69
KS
233 desc!(video; "flv263", "Sorenson H.263"),
234 desc!(video-llp; "flashsv", "Flash Screen Video"),
235 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
236 desc!(audio; "asao", "N*llym*s*r ASAO"),
237 desc!(audio; "flv-adpcm", "Flash ADPCM"),
238
9f9a08fb
KS
239 desc!(audio; "mp1", "MPEG Audio Layer I"),
240 desc!(audio; "mp2", "MPEG Audio Layer II"),
92d9fb69
KS
241 desc!(audio; "mp3", "MPEG Audio Layer III"),
242 desc!(audio; "speex", "Speex"),
243
e8e022f4
KS
244 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
245 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
1991b7da 246 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
561d0f79
KS
247 desc!(video; "beam-fcp", "Beam Software Animation"),
248 desc!(video; "beam-video", "Beam Software Video"),
e8e022f4
KS
249 desc!(video; "bmv-video", "BMV video"),
250 desc!(audio; "bmv-audio", "BMV audio"),
ecda1cc1
KS
251 desc!(video; "bmv3-video", "DW Noir BMV video"),
252 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
3813fe8a 253 desc!(video; "fable-imax", "Fable IMAX video"),
8d91d85f
KS
254 desc!(video; "fst-video", "FutureVision video"),
255 desc!(audio; "fst-audio", "FutureVision audio"),
ff6a914f 256 desc!(video; "hl-fmv-video", "Highlander FMV video"),
d66e6055
KS
257 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
258 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
afe1e5ba 259 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
801bba83
KS
260 desc!(video; "midivid", "MidiVid"),
261 desc!(video; "midivid3", "MidiVid 3"),
262 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
c17769db
KS
263 desc!(video; "smushv1", "SMUSH Video paletted"),
264 desc!(video; "smushv2", "SMUSH Video 16-bit"),
265 desc!(video; "smush-iact", "SMUSH IACT Audio"),
266 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
9895bd7b
KS
267 desc!(video; "vmd-video", "VMD video"),
268 desc!(audio; "vmd-audio", "VMD audio"),
55d85231
KS
269 desc!(video; "vxvideo", "Actimagine Vx"),
270 desc!(audio; "vxaudio", "Actimagine Sx"),
e8e022f4
KS
271
272 desc!(video; "smacker-video", "Smacker video"),
273 desc!(audio; "smacker-audio", "Smacker audio"),
274 desc!(video; "bink-video", "Bink video"),
275 desc!(video; "bink2-video", "Bink2 video"),
276 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
277 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
ed374345
KS
278
279 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
280 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
281 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
282 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
31cf33ac
KS
283
284 desc!(video; "vivo1", "VivoActive Video 1.0"),
285 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
286 desc!(audio; "g723.1", "ITU G.723.1"),
287 desc!(audio; "siren", "Polycom Siren"),
87927c57
KS
288
289 desc!(audio-ll; "ape", "Monkey's Audio"),
290 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
291 desc!(audio-ll; "tta", "True Audio codec"),
292 desc!(audio-hyb; "wavpack", "WavPack"),
696e4e20 293
b5e49861 294 desc!(video-im; "jpeg", "JPEG"),
696e4e20 295 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
54915296
KS
296
297 desc!(video-im; "mwv1", "Aware MotionWavelets"),
d48ee414
KS
298];
299
b7c882c1 300static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
423005dc
KS
301 (&[1, 0, 0, 0], "msrle"),
302 (&[2, 0, 0, 0], "msrle"),
303
4abcd842
KS
304 (b"CRAM", "msvideo1"),
305 (b"MSVC", "msvideo1"),
306 (b"WHAM", "msvideo1"),
307
b5e49861
KS
308 (b"MJPG", "jpeg"),
309
45e794c4
KS
310 (b"IF09", "indeo1"),
311 (b"RT21", "indeo2"),
312 (b"IV31", "indeo3"),
313 (b"IV32", "indeo3"),
314 (b"IV41", "indeo4"),
315 (b"IV50", "indeo5"),
836bf150 316 (b"I263", "intel263"),
ce52b3b5 317
750b299c 318 (b"UCOD", "clearvideo"),
57777a0a 319 (b"cvid", "cinepak"),
19336baf 320 (b"ZMBV", "zmbv"),
b2d656d0 321
d66e6055
KS
322 (b"Ipma", "ipma"),
323 (b"Ip20", "ipma2"),
324
801bba83
KS
325 (b"MVDV", "midivid"),
326 (b"MV30", "midivid3"),
327 (b"MVLZ", "midivid-ll"),
328
b2d656d0
KS
329 (b"DUCK", "truemotion1"),
330 (b"TR20", "truemotionrt"),
331 (b"TM20", "truemotion2"),
332 (b"TM2A", "truemotion2x"),
333 (b"TM2X", "truemotion2x"),
40e95291
KS
334 (b"VP30", "vp3"),
335 (b"VP31", "vp3"),
336 (b"VP40", "vp4"),
337 (b"VP50", "vp5"),
338 (b"VP60", "vp6"),
339 (b"VP61", "vp6"),
340 (b"VP62", "vp6"),
1bf8e0fc 341 (b"VP6A", "vp6a"),
40e95291 342 (b"VP70", "vp7"),
54915296
KS
343
344 (b"MWV1", "mwv1"),
d48ee414
KS
345];
346
b7c882c1 347static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
9d9c811b 348 (0x0000, "unknown"),
45e794c4 349 (0x0001, "pcm"),
4abcd842 350 (0x0002, "ms-adpcm"),
45e794c4 351 (0x0003, "pcm"),
4abcd842 352 (0x0011, "ima-adpcm-ms"),
fadee95f
KS
353 (0x0061, "adpcm-dk4"),
354 (0x0062, "adpcm-dk3"),
45e794c4
KS
355 (0x0401, "imc"),
356 (0x0402, "iac"),
a38be6e4
KS
357 (0x0500, "on2avc-500"),
358 (0x0501, "on2avc-501"),
d48ee414
KS
359];
360
b7c882c1 361static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
362 (b"cvid", "cinepak"),
363 (b"jpeg", "jpeg"),
364 //(b"raw ", "raw"),
365 //(b"Yuv2", "raw"),
366 (b"smc ", "qt-smc"),
367 (b"rle ", "qt-rle"),
368 (b"rpza", "apple-video"),
369 (b"kpcd", "kodak-photocd"),
370 //(b"mpeg", "mpeg-video"),
371 (b"mjpa", "mjpeg-a"),
372 (b"mjpb", "mjpeg-b"),
373 (b"svqi", "sorenson-video"),
b2689495 374 (b"SVQ1", "sorenson-video"),
3d5fb08f 375 (b"svq3", "sorenson-video3"),
b2689495 376 (b"SVQ3", "sorenson-video3"),
646f4c43
KS
377
378 (b"IV31", "indeo3"),
379 (b"IV32", "indeo3"),
380
381 (b"UCOD", "clearvideo"),
382
383 (b"VP30", "vp3"),
384 (b"VP31", "vp3"),
696e4e20
KS
385
386 (b"avc1", "h264"),
646f4c43
KS
387];
388
b7c882c1 389static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
390 (b"NONE", "pcm"),
391 (b"raw ", "pcm"),
392 (b"twos", "pcm"),
393 (b"sowt", "pcm"),
394 (b"fl32", "pcm"),
395 (b"fl64", "pcm"),
396 (b"in24", "pcm"),
397 (b"in32", "pcm"),
398 (b"MAC3", "mace-3"),
399 (b"MAC6", "mace-6"),
400 (b"ima4", "ima-adpcm-qt"),
401 (b"ulaw", "ulaw"),
402 (b"alaw", "alaw"),
403 (b"dvca", "dv-audio"),
404 (b"QDMC", "qdesign-music"),
405 (b"QDM2", "qdesign-music2"),
406 (b"Qclp", "qualcomm-purevoice"),
407 //(b".mp3", "mpeg-layer3"),
12881f89
KS
408
409 (b"mp4a", "aac"),
40494a85
KS
410
411 (b"alac", "alac"),
646f4c43
KS
412];
413
285f4c72 414/// Returns video codec short name for provided FOURCC (used in AVI format).
d48ee414 415pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
e243ceb4
KS
416 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
417 if *fourcc == fcc { return Some(name); }
d48ee414
KS
418 }
419 None
420}
421
9a3ce86c
KS
422/// Returns FOURCC (used in AVI format) for provided codec name.
423pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
424 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
425 if *name == codecname { return Some(**fourcc); }
426 }
427 None
428}
429
285f4c72 430/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
d48ee414 431pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
e243ceb4
KS
432 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
433 if *twocc == tcc { return Some(name); }
d48ee414
KS
434 }
435 None
436}
437
9a3ce86c
KS
438/// Returns TWOCC (used in WAV and AVI format for provided codec name.
439pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
440 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
441 if *name == codecname { return Some(*twocc); }
442 }
443 None
444}
445
646f4c43
KS
446/// Returns video codec short name for provided FOURCC (used in MOV format).
447pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
448 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
449 if *fourcc == fcc { return Some(name); }
450 }
451 None
452}
453
454/// Returns known audio codec short name for provided FOURCC (used in MOV format).
455pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
456 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
457 if *fourcc == fcc { return Some(name); }
458 }
459 None
460}
461
d48ee414
KS
462#[cfg(test)]
463mod test {
464 use super::*;
465
466 #[test]
467 fn test_register() {
468 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
469 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
470 println!("found {} and {}", c1, c2);
471 let cd1 = get_codec_description(c1).unwrap();
472 let cd2 = get_codec_description(c2).unwrap();
473 println!("got {} and {}", cd1, cd2);
474 }
b58d7656 475}