]> git.nihav.org Git - nihav.git/blame - nihav-registry/src/register.rs
mov: recognise and export navigable data
[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
70f7513f 201 desc!(video-ll; "8bps", "Planar RGB"),
3d5fb08f
KS
202 desc!(video; "qt-smc", "Apple Graphics"),
203 desc!(video; "qt-rle", "Apple Animation"),
204 desc!(video; "apple-video", "Apple video"),
6c23044e 205 desc!(video; "qdraw", "Apple QuickDraw"),
3d5fb08f 206 desc!(video; "sorenson-video", "Sorenson Video"),
8251c0ab 207 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
b74889e5 208 desc!(video; "qt-cdvideo", "CD Video Codec"),
cf767ae5 209 desc!(video-im; "qt-sivq", "SIVQ"),
cde65a55
KS
210 desc!(video-ll; "qt-yuv2", "Raw YUV"),
211 desc!(video-ll; "qt-yuv4", "libquicktime YUV4"),
40494a85 212 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
3d5fb08f
KS
213 desc!(audio; "mace-3", "MACE 3:1"),
214 desc!(audio; "mace-6", "MACE 6:1"),
215 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
216 desc!(audio; "qdesign-music", "QDesign Music"),
217 desc!(audio; "qdesign-music2", "QDesign Music v2"),
218 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
219
0dc4130a
KS
220 desc!(video; "pixar-0", "Pixar Codec 0"),
221 desc!(video; "pixar-1", "Pixar Codec 1"),
222 desc!(video; "pixar-2", "Pixar Codec 2"),
223 desc!(video; "pixar-3", "Pixar Codec 3"),
224 desc!(video; "pixar-4", "Pixar Codec 4"),
225 desc!(video; "pixar-5", "Pixar Codec 5"),
226 desc!(video; "pixar-6", "Pixar Codec 6"),
227 desc!(video; "pixar-7", "Pixar Codec 7"),
228 desc!(video; "pixar-a", "Pixar Codec A"),
229
722b2933 230 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
41a3a050 231 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
1dd1e506
KS
232 desc!(video; "movinglines", "Acorn Moving Lines"),
233 desc!(video; "movingblocks", "Acorn Moving Blocks"),
234 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
235 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
236 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
237 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
bd83136c 238 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
1dd1e506
KS
239 desc!(video; "escape100", "Eidos Escape 100"),
240 desc!(video; "escape102", "Eidos Escape 102"),
241 desc!(video; "escape122", "Eidos Escape 122"),
242 desc!(video; "escape124", "Eidos Escape 124"),
243 desc!(video; "escape130", "Eidos Escape 130"),
419d536b 244 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
9383afcb 245 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
030de989 246 desc!(audio; "iota-sound", "IotaSound"),
1dd1e506 247
d24468d9
KS
248 desc!(video; "truemotion1", "TrueMotion 1"),
249 desc!(video-im; "truemotionrt", "TrueMotion RT"),
250 desc!(video; "truemotion2", "TrueMotion 2"),
e8e022f4
KS
251 desc!(video; "truemotion2x", "TrueMotion 2X"),
252 desc!(video; "vp3", "VP3"),
253 desc!(video; "vp4", "VP4"),
254 desc!(video; "vp5", "VP5"),
255 desc!(video; "vp6", "VP6"),
92d9fb69
KS
256 desc!(video; "vp6f", "VP6 (in Flash)"),
257 desc!(video; "vp6a", "VP6 with alpha"),
e8e022f4
KS
258 desc!(video; "vp7", "VP7"),
259 desc!(video; "vp8", "VP8"),
260 desc!(video; "vp9", "VP9"),
261 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
262 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
629a1025
KS
263 desc!(audio; "on2avc-500", "On2 AVC"),
264 desc!(audio; "on2avc-501", "On2 AVC"),
e8e022f4 265
92d9fb69
KS
266 desc!(video; "flv263", "Sorenson H.263"),
267 desc!(video-llp; "flashsv", "Flash Screen Video"),
268 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
269 desc!(audio; "asao", "N*llym*s*r ASAO"),
270 desc!(audio; "flv-adpcm", "Flash ADPCM"),
271
9f9a08fb
KS
272 desc!(audio; "mp1", "MPEG Audio Layer I"),
273 desc!(audio; "mp2", "MPEG Audio Layer II"),
92d9fb69 274 desc!(audio; "mp3", "MPEG Audio Layer III"),
5a8871c8 275 desc!(audio; "mp3-multi", "MPEG Audio Layer III (multiple frames)"),
92d9fb69
KS
276 desc!(audio; "speex", "Speex"),
277
e8e022f4
KS
278 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
279 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
1991b7da 280 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
561d0f79
KS
281 desc!(video; "beam-fcp", "Beam Software Animation"),
282 desc!(video; "beam-video", "Beam Software Video"),
e8e022f4
KS
283 desc!(video; "bmv-video", "BMV video"),
284 desc!(audio; "bmv-audio", "BMV audio"),
ecda1cc1
KS
285 desc!(video; "bmv3-video", "DW Noir BMV video"),
286 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
fead60e3 287 desc!(video; "dp-sga", "Digital Pictures SGA video"),
3813fe8a 288 desc!(video; "fable-imax", "Fable IMAX video"),
8d91d85f
KS
289 desc!(video; "fst-video", "FutureVision video"),
290 desc!(audio; "fst-audio", "FutureVision audio"),
ff6a914f 291 desc!(video; "hl-fmv-video", "Highlander FMV video"),
d66e6055
KS
292 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
293 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
2eca5e8f 294 desc!(video; "kmvc", "Karl Morton's Video Codec"),
afe1e5ba 295 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
801bba83
KS
296 desc!(video; "midivid", "MidiVid"),
297 desc!(video; "midivid3", "MidiVid 3"),
298 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
3f3ed930 299 desc!(video-llp; "pdq2", "PDQ2"),
f9fc73be
KS
300 desc!(video-ll; "rbt-video", "Sierra Robot video"),
301 desc!(audio; "rbt-audio", "Sierra Robot audio"),
302 desc!(video; "seq-video", "Sierra Sequence video"),
c17769db
KS
303 desc!(video; "smushv1", "SMUSH Video paletted"),
304 desc!(video; "smushv2", "SMUSH Video 16-bit"),
305 desc!(video; "smush-iact", "SMUSH IACT Audio"),
306 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
9895bd7b
KS
307 desc!(video; "vmd-video", "VMD video"),
308 desc!(audio; "vmd-audio", "VMD audio"),
55d85231
KS
309 desc!(video; "vxvideo", "Actimagine Vx"),
310 desc!(audio; "vxaudio", "Actimagine Sx"),
e8e022f4
KS
311
312 desc!(video; "smacker-video", "Smacker video"),
313 desc!(audio; "smacker-audio", "Smacker audio"),
314 desc!(video; "bink-video", "Bink video"),
315 desc!(video; "bink2-video", "Bink2 video"),
316 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
317 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
ed374345
KS
318
319 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
320 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
321 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
322 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
31cf33ac
KS
323
324 desc!(video; "vivo1", "VivoActive Video 1.0"),
325 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
326 desc!(audio; "g723.1", "ITU G.723.1"),
327 desc!(audio; "siren", "Polycom Siren"),
87927c57
KS
328
329 desc!(audio-ll; "ape", "Monkey's Audio"),
330 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
331 desc!(audio-ll; "tta", "True Audio codec"),
332 desc!(audio-hyb; "wavpack", "WavPack"),
696e4e20 333
fc39649d 334 desc!(video-ll; "gif", "GIF"),
b5e49861 335 desc!(video-im; "jpeg", "JPEG"),
696e4e20 336 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
2260bfdc 337 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
54915296 338
738a33e8
KS
339 desc!(video; "fif", "Fractal Codec"),
340
6029cb61
KS
341 desc!(video-im; "mvi0", "MotionPixels (MVI)"),
342 desc!(video; "mvi1", "MotionPixels 1"),
343 desc!(video; "mvi2", "MotionPixels 2"),
344
c136aad6
KS
345 desc!(video; "gryphon-arbc-vfw", "Gryphon Software ARBC in AVI"),
346 desc!(video; "gryphon-arbc-qt", "Gryphon Software ARBC in MOV"),
347
54915296 348 desc!(video-im; "mwv1", "Aware MotionWavelets"),
f093f13a 349
c5ad9398
KS
350 desc!(video-llp; "pivideo", "PI-Video"),
351
2cf7006d 352 desc!(video-im; "adorage", "proDAD Adorage"),
26cfc7f7 353 desc!(video-im; "moviepak", "RasterOps MoviePak"),
0b89c5ab 354 desc!(video; "next-uwavelet", "NeXT Micro Wavelet"),
f093f13a 355 desc!(video-im; "pgvv", "Radius Studio Video"),
bac0d858
KS
356
357 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
2d2f0127 358
2d2f0127
KS
359 desc!(video; "teal-video", "TealMovie video"),
360 desc!(audio; "teal-audio", "TealMovie audio"),
ee3fa8d4
KS
361
362 desc!(video; "ultimotion", "IBM Ultimotion"),
d48ee414
KS
363];
364
b7c882c1 365static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
423005dc
KS
366 (&[1, 0, 0, 0], "msrle"),
367 (&[2, 0, 0, 0], "msrle"),
368
4abcd842
KS
369 (b"CRAM", "msvideo1"),
370 (b"MSVC", "msvideo1"),
371 (b"WHAM", "msvideo1"),
372
b5e49861
KS
373 (b"MJPG", "jpeg"),
374
45e794c4
KS
375 (b"IF09", "indeo1"),
376 (b"RT21", "indeo2"),
377 (b"IV31", "indeo3"),
378 (b"IV32", "indeo3"),
379 (b"IV41", "indeo4"),
380 (b"IV50", "indeo5"),
836bf150 381 (b"I263", "intel263"),
3a20ae8d 382 (b"YV92", "yv92"),
ce52b3b5 383
750b299c 384 (b"UCOD", "clearvideo"),
57777a0a 385 (b"cvid", "cinepak"),
7f4cecdb 386 (b"savi", "cinepak"),
813eb9dd 387 (b"tony", "cinepak"),
19336baf 388 (b"ZMBV", "zmbv"),
b2d656d0 389
d66e6055
KS
390 (b"Ipma", "ipma"),
391 (b"Ip20", "ipma2"),
2eca5e8f 392 (b"KMVC", "kmvc"),
d66e6055 393
801bba83
KS
394 (b"MVDV", "midivid"),
395 (b"MV30", "midivid3"),
396 (b"MVLZ", "midivid-ll"),
397
3f3ed930
KS
398 (b"PDQ2", "pdq2"),
399
5120a019 400 (b"tmot", "truemotion1"),
b2d656d0 401 (b"DUCK", "truemotion1"),
aa8f35d1 402 (b"PVEZ", "truemotion1"),
b2d656d0
KS
403 (b"TR20", "truemotionrt"),
404 (b"TM20", "truemotion2"),
405 (b"TM2A", "truemotion2x"),
406 (b"TM2X", "truemotion2x"),
40e95291
KS
407 (b"VP30", "vp3"),
408 (b"VP31", "vp3"),
409 (b"VP40", "vp4"),
410 (b"VP50", "vp5"),
411 (b"VP60", "vp6"),
412 (b"VP61", "vp6"),
413 (b"VP62", "vp6"),
1bf8e0fc 414 (b"VP6A", "vp6a"),
40e95291 415 (b"VP70", "vp7"),
54915296
KS
416
417 (b"MWV1", "mwv1"),
f67c7fb1 418
6029cb61
KS
419 (b"MVI1", "mvi1"),
420
738a33e8
KS
421 (b"FVF1", "fif"),
422
2cf7006d
KS
423 (b"pDAD", "adorage"),
424
c5ad9398
KS
425 (b"pivc", "pivideo"),
426
ee3fa8d4
KS
427 (b"ULTI", "ultimotion"),
428
c136aad6 429 (b"ARBC", "gryphon-arbc-vfw"),
f67c7fb1 430 (b"azpr", "apple-video"),
c858db61 431 (b" elr", "qt-rle"),
7542b753 432
bd83136c
KS
433 (b"ESCP", "escape-any"),
434
7542b753 435 (b"VXS1", "vxvideo"),
2260bfdc
KS
436
437 (b"DX50", "mpeg4asp"),
438 (b"DIVX", "mpeg4asp"),
439 (b"XVID", "mpeg4asp"),
d48ee414
KS
440];
441
b7c882c1 442static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
9d9c811b 443 (0x0000, "unknown"),
45e794c4 444 (0x0001, "pcm"),
4abcd842 445 (0x0002, "ms-adpcm"),
45e794c4 446 (0x0003, "pcm"),
7e5b21f2
KS
447 (0x0006, "alaw"),
448 (0x0007, "ulaw"),
4abcd842 449 (0x0011, "ima-adpcm-ms"),
5a8871c8 450 (0x0055, "mp3-multi"),
fadee95f
KS
451 (0x0061, "adpcm-dk4"),
452 (0x0062, "adpcm-dk3"),
45e794c4
KS
453 (0x0401, "imc"),
454 (0x0402, "iac"),
a38be6e4
KS
455 (0x0500, "on2avc-500"),
456 (0x0501, "on2avc-501"),
cf74dc4b 457 (0x2000, "ac3-multi"),
d48ee414
KS
458];
459
b7c882c1 460static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
70f7513f 461 (b"8BPS", "8bps"),
646f4c43
KS
462 (b"cvid", "cinepak"),
463 (b"jpeg", "jpeg"),
02c81924 464 (b"raw ", "rawvideo"),
646f4c43
KS
465 //(b"Yuv2", "raw"),
466 (b"smc ", "qt-smc"),
467 (b"rle ", "qt-rle"),
468 (b"rpza", "apple-video"),
6c23044e 469 (b"qdrw", "qdraw"),
b74889e5 470 (b"cdvc", "qt-cdvideo"),
cf767ae5 471 (b"SIVQ", "qt-sivq"),
646f4c43
KS
472 (b"kpcd", "kodak-photocd"),
473 //(b"mpeg", "mpeg-video"),
474 (b"mjpa", "mjpeg-a"),
475 (b"mjpb", "mjpeg-b"),
3b3059de 476 (b"jpgi", "jpeg"),
b2689495 477 (b"SVQ1", "sorenson-video"),
51e3e583 478 (b"svqi", "sorenson-video"),
b2689495 479 (b"SVQ3", "sorenson-video3"),
51e3e583 480 (b"svq3", "sorenson-video3"),
646f4c43 481
6e3c858f
KS
482 (b"msvc", "msvideo1"),
483
578a2381 484 (b"rt21", "indeo2"),
646f4c43 485 (b"IV32", "indeo3"),
578a2381 486 (b"iv32", "indeo3"),
51e3e583 487 (b"IV31", "indeo3"),
646f4c43 488
c136aad6 489 (b"arbc", "gryphon-arbc-qt"),
26cfc7f7 490 (b"MPAK", "moviepak"),
3696882c 491 (b"PGVV", "pgvv"),
646f4c43
KS
492 (b"UCOD", "clearvideo"),
493
4acb9b7c 494 (b"tmot", "truemotion1"),
646f4c43 495 (b"VP31", "vp3"),
51e3e583 496 (b"VP30", "vp3"),
696e4e20 497
bd83136c
KS
498 (b"ESCP", "escape-any"),
499
2260bfdc 500 (b"mp4v", "mpeg4asp"),
696e4e20 501 (b"avc1", "h264"),
ad547ff9 502
0dc4130a
KS
503 (b"pix0", "pixar-0"),
504 (b"pix1", "pixar-1"),
505 (b"pix2", "pixar-2"),
506 (b"pix3", "pixar-3"),
507 (b"pix4", "pixar-4"),
508 (b"pix5", "pixar-5"),
509 (b"pix6", "pixar-6"),
510 (b"pix7", "pixar-7"),
511 (b"pixA", "pixar-a"),
512
ad547ff9 513 (b"j420", "rawvideo"),
cde65a55
KS
514 (b"yuv2", "qt-yuv2"),
515 (b"yuv4", "qt-yuv4"),
0b89c5ab
KS
516
517 (b"uWav", "next-uwavelet"),
646f4c43
KS
518];
519
b7c882c1 520static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
521 (b"NONE", "pcm"),
522 (b"raw ", "pcm"),
523 (b"twos", "pcm"),
524 (b"sowt", "pcm"),
525 (b"fl32", "pcm"),
526 (b"fl64", "pcm"),
527 (b"in24", "pcm"),
528 (b"in32", "pcm"),
529 (b"MAC3", "mace-3"),
530 (b"MAC6", "mace-6"),
531 (b"ima4", "ima-adpcm-qt"),
532 (b"ulaw", "ulaw"),
533 (b"alaw", "alaw"),
534 (b"dvca", "dv-audio"),
535 (b"QDMC", "qdesign-music"),
536 (b"QDM2", "qdesign-music2"),
537 (b"Qclp", "qualcomm-purevoice"),
538 //(b".mp3", "mpeg-layer3"),
12881f89
KS
539
540 (b"mp4a", "aac"),
40494a85 541
4b3b962c
KS
542 (b"ac-3", "ac3"),
543
40494a85 544 (b"alac", "alac"),
646f4c43
KS
545];
546
285f4c72 547/// Returns video codec short name for provided FOURCC (used in AVI format).
d48ee414 548pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
e243ceb4
KS
549 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
550 if *fourcc == fcc { return Some(name); }
d48ee414
KS
551 }
552 None
553}
554
9a3ce86c
KS
555/// Returns FOURCC (used in AVI format) for provided codec name.
556pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
557 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
558 if *name == codecname { return Some(**fourcc); }
559 }
560 None
561}
562
285f4c72 563/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
d48ee414 564pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
e243ceb4
KS
565 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
566 if *twocc == tcc { return Some(name); }
d48ee414
KS
567 }
568 None
569}
570
9a3ce86c
KS
571/// Returns TWOCC (used in WAV and AVI format for provided codec name.
572pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
573 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
574 if *name == codecname { return Some(*twocc); }
575 }
576 None
577}
578
646f4c43
KS
579/// Returns video codec short name for provided FOURCC (used in MOV format).
580pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
581 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
582 if *fourcc == fcc { return Some(name); }
583 }
584 None
585}
586
587/// Returns known audio codec short name for provided FOURCC (used in MOV format).
588pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
589 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
590 if *fourcc == fcc { return Some(name); }
591 }
592 None
593}
594
01f5e2b7
KS
595/// Returns FOURCC (used in MOV format) for provided video codec name.
596pub fn find_mov_video_fourcc(codecname: &str) -> Option<[u8; 4]> {
597 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
598 if *name == codecname { return Some(**fourcc); }
599 }
600 None
601}
602
603/// Returns FOURCC (used in MOV format) for provided audio codec name.
604pub fn find_mov_audio_fourcc(codecname: &str) -> Option<[u8; 4]> {
605 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
606 if *name == codecname { return Some(**fourcc); }
607 }
608 None
609}
610
d48ee414
KS
611#[cfg(test)]
612mod test {
613 use super::*;
614
615 #[test]
616 fn test_register() {
617 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
618 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
619 println!("found {} and {}", c1, c2);
620 let cd1 = get_codec_description(c1).unwrap();
621 let cd2 = get_codec_description(c2).unwrap();
622 println!("got {} and {}", cd1, cd2);
623 }
b58d7656 624}