]> git.nihav.org Git - nihav.git/blame - nihav-registry/src/register.rs
add Fractal Codec (VfW version)
[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> {
e6aaad5c 150 CODEC_REGISTER.iter().find(|&reg| reg.name == name)
d48ee414
KS
151}
152
b7c882c1 153static CODEC_REGISTER: &[CodecDescription] = &[
e8e022f4 154 desc!(audio-ll; "pcm", "PCM"),
3d5fb08f
KS
155 desc!(audio; "alaw", "A-law PCM"),
156 desc!(audio; "ulaw", "mu-law PCM"),
e8e022f4 157
45e794c4 158 desc!(video-im; "indeo1", "Intel Raw IF09"),
dda9c899 159 desc!(video; "indeo2", "Intel Indeo 2"),
603abb86 160 desc!(video; "ima-rtv2", "Intel RTV 2 (Indeo 2)"),
45e794c4
KS
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),
f7686373 164 desc!(video; "indeo5s", "Intel Indeo 5 Scalable", CODEC_CAP_SCALABLE),
1a36a05d 165 desc!(video; "intel263", "Intel I263", CODEC_CAP_REORDER),
3a20ae8d 166 desc!(video-im; "yv92", "Intel Indeo YVU9 Compressed"),
45e794c4
KS
167 desc!(audio; "iac", "Intel Indeo audio"),
168 desc!(audio; "imc", "Intel Music Coder"),
84227adb 169 desc!(audio; "dvi-adpcm", "Intel DVI ADPCM"),
ce52b3b5
KS
170
171 desc!(video; "realvideo1", "Real Video 1"),
6b2cdc84 172 desc!(video; "realvideo2", "Real Video 2", CODEC_CAP_REORDER),
ce52b3b5
KS
173 desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
174 desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
0b791d5c 175 desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
ce52b3b5 176 desc!(video; "clearvideo", "ClearVideo"),
750b299c 177 desc!(video; "clearvideo_rm", "ClearVideo"),
ce52b3b5
KS
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"),
16dd4f44 183 desc!(audio; "ac3", "ETSI TS 102 366"),
cf74dc4b 184 desc!(audio; "ac3-multi", "ETSI TS 102 366 (multiple frames)"),
ce52b3b5
KS
185 desc!(audio; "atrac3", "Sony Atrac3"),
186 desc!(audio; "sipro", "Sipro Labs ADPCM"),
e8e022f4 187
a715e99f
KS
188
189 desc!(video-ll; "rawvideo", "Raw video data"),
9a59c451 190 desc!(video-ll; "rawvideo-ms", "Raw video data"),
a715e99f 191
57777a0a
KS
192 desc!(video; "cinepak", "Cinepak"),
193
19336baf
KS
194 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
195
4abcd842 196 desc!(video; "msvideo1", "MS Video 1"),
03c406ea 197 desc!(video; "msrle", "MS RLE"),
4abcd842
KS
198 desc!(audio; "ms-adpcm", "MS ADPCM"),
199 desc!(audio; "ima-adpcm-ms", "IMA ADPCM (MS variant)"),
200
3d5fb08f
KS
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"),
8251c0ab 205 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
40494a85 206 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
3d5fb08f
KS
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
722b2933 214 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
41a3a050 215 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
1dd1e506
KS
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"),
bd83136c 222 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
1dd1e506
KS
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"),
419d536b 228 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
9383afcb 229 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
030de989 230 desc!(audio; "iota-sound", "IotaSound"),
1dd1e506 231
d24468d9
KS
232 desc!(video; "truemotion1", "TrueMotion 1"),
233 desc!(video-im; "truemotionrt", "TrueMotion RT"),
234 desc!(video; "truemotion2", "TrueMotion 2"),
e8e022f4
KS
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"),
92d9fb69
KS
240 desc!(video; "vp6f", "VP6 (in Flash)"),
241 desc!(video; "vp6a", "VP6 with alpha"),
e8e022f4
KS
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"),
629a1025
KS
247 desc!(audio; "on2avc-500", "On2 AVC"),
248 desc!(audio; "on2avc-501", "On2 AVC"),
e8e022f4 249
92d9fb69
KS
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
9f9a08fb
KS
256 desc!(audio; "mp1", "MPEG Audio Layer I"),
257 desc!(audio; "mp2", "MPEG Audio Layer II"),
92d9fb69 258 desc!(audio; "mp3", "MPEG Audio Layer III"),
5a8871c8 259 desc!(audio; "mp3-multi", "MPEG Audio Layer III (multiple frames)"),
92d9fb69
KS
260 desc!(audio; "speex", "Speex"),
261
e8e022f4
KS
262 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
263 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
1991b7da 264 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
561d0f79
KS
265 desc!(video; "beam-fcp", "Beam Software Animation"),
266 desc!(video; "beam-video", "Beam Software Video"),
e8e022f4
KS
267 desc!(video; "bmv-video", "BMV video"),
268 desc!(audio; "bmv-audio", "BMV audio"),
ecda1cc1
KS
269 desc!(video; "bmv3-video", "DW Noir BMV video"),
270 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
fead60e3 271 desc!(video; "dp-sga", "Digital Pictures SGA video"),
3813fe8a 272 desc!(video; "fable-imax", "Fable IMAX video"),
8d91d85f
KS
273 desc!(video; "fst-video", "FutureVision video"),
274 desc!(audio; "fst-audio", "FutureVision audio"),
ff6a914f 275 desc!(video; "hl-fmv-video", "Highlander FMV video"),
d66e6055
KS
276 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
277 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
2eca5e8f 278 desc!(video; "kmvc", "Karl Morton's Video Codec"),
afe1e5ba 279 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
801bba83
KS
280 desc!(video; "midivid", "MidiVid"),
281 desc!(video; "midivid3", "MidiVid 3"),
282 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
f9fc73be
KS
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"),
c17769db
KS
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"),
9895bd7b
KS
290 desc!(video; "vmd-video", "VMD video"),
291 desc!(audio; "vmd-audio", "VMD audio"),
55d85231
KS
292 desc!(video; "vxvideo", "Actimagine Vx"),
293 desc!(audio; "vxaudio", "Actimagine Sx"),
e8e022f4
KS
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)"),
ed374345
KS
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"),
31cf33ac
KS
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"),
87927c57
KS
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"),
696e4e20 316
fc39649d 317 desc!(video-ll; "gif", "GIF"),
b5e49861 318 desc!(video-im; "jpeg", "JPEG"),
696e4e20 319 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
2260bfdc 320 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
54915296 321
738a33e8
KS
322 desc!(video; "fif", "Fractal Codec"),
323
6029cb61
KS
324 desc!(video-im; "mvi0", "MotionPixels (MVI)"),
325 desc!(video; "mvi1", "MotionPixels 1"),
326 desc!(video; "mvi2", "MotionPixels 2"),
327
c136aad6
KS
328 desc!(video; "gryphon-arbc-vfw", "Gryphon Software ARBC in AVI"),
329 desc!(video; "gryphon-arbc-qt", "Gryphon Software ARBC in MOV"),
330
54915296 331 desc!(video-im; "mwv1", "Aware MotionWavelets"),
f093f13a 332
c5ad9398
KS
333 desc!(video-llp; "pivideo", "PI-Video"),
334
f093f13a 335 desc!(video-im; "pgvv", "Radius Studio Video"),
bac0d858
KS
336
337 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
2d2f0127 338
2d2f0127
KS
339 desc!(video; "teal-video", "TealMovie video"),
340 desc!(audio; "teal-audio", "TealMovie audio"),
d48ee414
KS
341];
342
b7c882c1 343static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
423005dc
KS
344 (&[1, 0, 0, 0], "msrle"),
345 (&[2, 0, 0, 0], "msrle"),
346
4abcd842
KS
347 (b"CRAM", "msvideo1"),
348 (b"MSVC", "msvideo1"),
349 (b"WHAM", "msvideo1"),
350
b5e49861
KS
351 (b"MJPG", "jpeg"),
352
45e794c4
KS
353 (b"IF09", "indeo1"),
354 (b"RT21", "indeo2"),
355 (b"IV31", "indeo3"),
356 (b"IV32", "indeo3"),
357 (b"IV41", "indeo4"),
358 (b"IV50", "indeo5"),
836bf150 359 (b"I263", "intel263"),
3a20ae8d 360 (b"YV92", "yv92"),
ce52b3b5 361
750b299c 362 (b"UCOD", "clearvideo"),
57777a0a 363 (b"cvid", "cinepak"),
7f4cecdb 364 (b"savi", "cinepak"),
19336baf 365 (b"ZMBV", "zmbv"),
b2d656d0 366
d66e6055
KS
367 (b"Ipma", "ipma"),
368 (b"Ip20", "ipma2"),
2eca5e8f 369 (b"KMVC", "kmvc"),
d66e6055 370
801bba83
KS
371 (b"MVDV", "midivid"),
372 (b"MV30", "midivid3"),
373 (b"MVLZ", "midivid-ll"),
374
5120a019 375 (b"tmot", "truemotion1"),
b2d656d0
KS
376 (b"DUCK", "truemotion1"),
377 (b"TR20", "truemotionrt"),
378 (b"TM20", "truemotion2"),
379 (b"TM2A", "truemotion2x"),
380 (b"TM2X", "truemotion2x"),
40e95291
KS
381 (b"VP30", "vp3"),
382 (b"VP31", "vp3"),
383 (b"VP40", "vp4"),
384 (b"VP50", "vp5"),
385 (b"VP60", "vp6"),
386 (b"VP61", "vp6"),
387 (b"VP62", "vp6"),
1bf8e0fc 388 (b"VP6A", "vp6a"),
40e95291 389 (b"VP70", "vp7"),
54915296
KS
390
391 (b"MWV1", "mwv1"),
f67c7fb1 392
6029cb61
KS
393 (b"MVI1", "mvi1"),
394
738a33e8
KS
395 (b"FVF1", "fif"),
396
c5ad9398
KS
397 (b"pivc", "pivideo"),
398
c136aad6 399 (b"ARBC", "gryphon-arbc-vfw"),
f67c7fb1 400 (b"azpr", "apple-video"),
f093f13a 401 (b"PGVV", "pgvv"),
7542b753 402
bd83136c
KS
403 (b"ESCP", "escape-any"),
404
7542b753 405 (b"VXS1", "vxvideo"),
2260bfdc
KS
406
407 (b"DX50", "mpeg4asp"),
408 (b"DIVX", "mpeg4asp"),
409 (b"XVID", "mpeg4asp"),
d48ee414
KS
410];
411
b7c882c1 412static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
9d9c811b 413 (0x0000, "unknown"),
45e794c4 414 (0x0001, "pcm"),
4abcd842 415 (0x0002, "ms-adpcm"),
45e794c4 416 (0x0003, "pcm"),
7e5b21f2
KS
417 (0x0006, "alaw"),
418 (0x0007, "ulaw"),
4abcd842 419 (0x0011, "ima-adpcm-ms"),
5a8871c8 420 (0x0055, "mp3-multi"),
fadee95f
KS
421 (0x0061, "adpcm-dk4"),
422 (0x0062, "adpcm-dk3"),
45e794c4
KS
423 (0x0401, "imc"),
424 (0x0402, "iac"),
a38be6e4
KS
425 (0x0500, "on2avc-500"),
426 (0x0501, "on2avc-501"),
cf74dc4b 427 (0x2000, "ac3-multi"),
d48ee414
KS
428];
429
b7c882c1 430static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
431 (b"cvid", "cinepak"),
432 (b"jpeg", "jpeg"),
02c81924 433 (b"raw ", "rawvideo"),
646f4c43
KS
434 //(b"Yuv2", "raw"),
435 (b"smc ", "qt-smc"),
436 (b"rle ", "qt-rle"),
437 (b"rpza", "apple-video"),
438 (b"kpcd", "kodak-photocd"),
439 //(b"mpeg", "mpeg-video"),
440 (b"mjpa", "mjpeg-a"),
441 (b"mjpb", "mjpeg-b"),
442 (b"svqi", "sorenson-video"),
b2689495 443 (b"SVQ1", "sorenson-video"),
3d5fb08f 444 (b"svq3", "sorenson-video3"),
b2689495 445 (b"SVQ3", "sorenson-video3"),
646f4c43 446
578a2381 447 (b"rt21", "indeo2"),
646f4c43
KS
448 (b"IV31", "indeo3"),
449 (b"IV32", "indeo3"),
578a2381 450 (b"iv32", "indeo3"),
646f4c43 451
c136aad6 452 (b"arbc", "gryphon-arbc-qt"),
646f4c43
KS
453 (b"UCOD", "clearvideo"),
454
455 (b"VP30", "vp3"),
456 (b"VP31", "vp3"),
696e4e20 457
bd83136c
KS
458 (b"ESCP", "escape-any"),
459
2260bfdc 460 (b"mp4v", "mpeg4asp"),
696e4e20 461 (b"avc1", "h264"),
646f4c43
KS
462];
463
b7c882c1 464static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
465 (b"NONE", "pcm"),
466 (b"raw ", "pcm"),
467 (b"twos", "pcm"),
468 (b"sowt", "pcm"),
469 (b"fl32", "pcm"),
470 (b"fl64", "pcm"),
471 (b"in24", "pcm"),
472 (b"in32", "pcm"),
473 (b"MAC3", "mace-3"),
474 (b"MAC6", "mace-6"),
475 (b"ima4", "ima-adpcm-qt"),
476 (b"ulaw", "ulaw"),
477 (b"alaw", "alaw"),
478 (b"dvca", "dv-audio"),
479 (b"QDMC", "qdesign-music"),
480 (b"QDM2", "qdesign-music2"),
481 (b"Qclp", "qualcomm-purevoice"),
482 //(b".mp3", "mpeg-layer3"),
12881f89
KS
483
484 (b"mp4a", "aac"),
40494a85
KS
485
486 (b"alac", "alac"),
646f4c43
KS
487];
488
285f4c72 489/// Returns video codec short name for provided FOURCC (used in AVI format).
d48ee414 490pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
e243ceb4
KS
491 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
492 if *fourcc == fcc { return Some(name); }
d48ee414
KS
493 }
494 None
495}
496
9a3ce86c
KS
497/// Returns FOURCC (used in AVI format) for provided codec name.
498pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
499 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
500 if *name == codecname { return Some(**fourcc); }
501 }
502 None
503}
504
285f4c72 505/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
d48ee414 506pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
e243ceb4
KS
507 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
508 if *twocc == tcc { return Some(name); }
d48ee414
KS
509 }
510 None
511}
512
9a3ce86c
KS
513/// Returns TWOCC (used in WAV and AVI format for provided codec name.
514pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
515 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
516 if *name == codecname { return Some(*twocc); }
517 }
518 None
519}
520
646f4c43
KS
521/// Returns video codec short name for provided FOURCC (used in MOV format).
522pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
523 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
524 if *fourcc == fcc { return Some(name); }
525 }
526 None
527}
528
529/// Returns known audio codec short name for provided FOURCC (used in MOV format).
530pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
531 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
532 if *fourcc == fcc { return Some(name); }
533 }
534 None
535}
536
d48ee414
KS
537#[cfg(test)]
538mod test {
539 use super::*;
540
541 #[test]
542 fn test_register() {
543 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
544 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
545 println!("found {} and {}", c1, c2);
546 let cd1 = get_codec_description(c1).unwrap();
547 let cd2 = get_codec_description(c2).unwrap();
548 println!("got {} and {}", cd1, cd2);
549 }
b58d7656 550}