]> git.nihav.org Git - nihav.git/blame - nihav-registry/src/register.rs
avimux: do not record palette change chunks in OpenDML index
[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),
45e794c4
KS
166 desc!(audio; "iac", "Intel Indeo audio"),
167 desc!(audio; "imc", "Intel Music Coder"),
ce52b3b5
KS
168
169 desc!(video; "realvideo1", "Real Video 1"),
6b2cdc84 170 desc!(video; "realvideo2", "Real Video 2", CODEC_CAP_REORDER),
ce52b3b5
KS
171 desc!(video; "realvideo3", "Real Video 3", CODEC_CAP_REORDER),
172 desc!(video; "realvideo4", "Real Video 4", CODEC_CAP_REORDER),
0b791d5c 173 desc!(video; "realvideo6", "Real Video 6", CODEC_CAP_REORDER),
ce52b3b5 174 desc!(video; "clearvideo", "ClearVideo"),
750b299c 175 desc!(video; "clearvideo_rm", "ClearVideo"),
ce52b3b5
KS
176 desc!(audio; "ra14.4", "RealAudio 14.4"),
177 desc!(audio; "ra28.8", "RealAudio 28.8"),
178 desc!(audio; "cook", "RealAudio Cooker"),
179 desc!(audio; "ralf", "RealAudio Lossless"),
180 desc!(audio; "aac", "AAC"),
16dd4f44 181 desc!(audio; "ac3", "ETSI TS 102 366"),
ce52b3b5
KS
182 desc!(audio; "atrac3", "Sony Atrac3"),
183 desc!(audio; "sipro", "Sipro Labs ADPCM"),
e8e022f4 184
a715e99f
KS
185
186 desc!(video-ll; "rawvideo", "Raw video data"),
9a59c451 187 desc!(video-ll; "rawvideo-ms", "Raw video data"),
a715e99f 188
57777a0a
KS
189 desc!(video; "cinepak", "Cinepak"),
190
19336baf
KS
191 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
192
4abcd842 193 desc!(video; "msvideo1", "MS Video 1"),
03c406ea 194 desc!(video; "msrle", "MS RLE"),
4abcd842
KS
195 desc!(audio; "ms-adpcm", "MS ADPCM"),
196 desc!(audio; "ima-adpcm-ms", "IMA ADPCM (MS variant)"),
197
3d5fb08f
KS
198 desc!(video; "qt-smc", "Apple Graphics"),
199 desc!(video; "qt-rle", "Apple Animation"),
200 desc!(video; "apple-video", "Apple video"),
201 desc!(video; "sorenson-video", "Sorenson Video"),
8251c0ab 202 desc!(video; "sorenson-video3", "Sorenson Video 3", CODEC_CAP_REORDER),
40494a85 203 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
3d5fb08f
KS
204 desc!(audio; "mace-3", "MACE 3:1"),
205 desc!(audio; "mace-6", "MACE 6:1"),
206 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
207 desc!(audio; "qdesign-music", "QDesign Music"),
208 desc!(audio; "qdesign-music2", "QDesign Music v2"),
209 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
210
722b2933 211 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
41a3a050 212 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
1dd1e506
KS
213 desc!(video; "movinglines", "Acorn Moving Lines"),
214 desc!(video; "movingblocks", "Acorn Moving Blocks"),
215 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
216 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
217 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
218 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
bd83136c 219 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
1dd1e506
KS
220 desc!(video; "escape100", "Eidos Escape 100"),
221 desc!(video; "escape102", "Eidos Escape 102"),
222 desc!(video; "escape122", "Eidos Escape 122"),
223 desc!(video; "escape124", "Eidos Escape 124"),
224 desc!(video; "escape130", "Eidos Escape 130"),
419d536b 225 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
9383afcb 226 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
030de989 227 desc!(audio; "iota-sound", "IotaSound"),
1dd1e506 228
d24468d9
KS
229 desc!(video; "truemotion1", "TrueMotion 1"),
230 desc!(video-im; "truemotionrt", "TrueMotion RT"),
231 desc!(video; "truemotion2", "TrueMotion 2"),
e8e022f4
KS
232 desc!(video; "truemotion2x", "TrueMotion 2X"),
233 desc!(video; "vp3", "VP3"),
234 desc!(video; "vp4", "VP4"),
235 desc!(video; "vp5", "VP5"),
236 desc!(video; "vp6", "VP6"),
92d9fb69
KS
237 desc!(video; "vp6f", "VP6 (in Flash)"),
238 desc!(video; "vp6a", "VP6 with alpha"),
e8e022f4
KS
239 desc!(video; "vp7", "VP7"),
240 desc!(video; "vp8", "VP8"),
241 desc!(video; "vp9", "VP9"),
242 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
243 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
629a1025
KS
244 desc!(audio; "on2avc-500", "On2 AVC"),
245 desc!(audio; "on2avc-501", "On2 AVC"),
e8e022f4 246
92d9fb69
KS
247 desc!(video; "flv263", "Sorenson H.263"),
248 desc!(video-llp; "flashsv", "Flash Screen Video"),
249 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
250 desc!(audio; "asao", "N*llym*s*r ASAO"),
251 desc!(audio; "flv-adpcm", "Flash ADPCM"),
252
9f9a08fb
KS
253 desc!(audio; "mp1", "MPEG Audio Layer I"),
254 desc!(audio; "mp2", "MPEG Audio Layer II"),
92d9fb69
KS
255 desc!(audio; "mp3", "MPEG Audio Layer III"),
256 desc!(audio; "speex", "Speex"),
257
e8e022f4
KS
258 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
259 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
1991b7da 260 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
561d0f79
KS
261 desc!(video; "beam-fcp", "Beam Software Animation"),
262 desc!(video; "beam-video", "Beam Software Video"),
e8e022f4
KS
263 desc!(video; "bmv-video", "BMV video"),
264 desc!(audio; "bmv-audio", "BMV audio"),
ecda1cc1
KS
265 desc!(video; "bmv3-video", "DW Noir BMV video"),
266 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
fead60e3 267 desc!(video; "dp-sga", "Digital Pictures SGA video"),
3813fe8a 268 desc!(video; "fable-imax", "Fable IMAX video"),
8d91d85f
KS
269 desc!(video; "fst-video", "FutureVision video"),
270 desc!(audio; "fst-audio", "FutureVision audio"),
ff6a914f 271 desc!(video; "hl-fmv-video", "Highlander FMV video"),
d66e6055
KS
272 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
273 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
2eca5e8f 274 desc!(video; "kmvc", "Karl Morton's Video Codec"),
afe1e5ba 275 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
801bba83
KS
276 desc!(video; "midivid", "MidiVid"),
277 desc!(video; "midivid3", "MidiVid 3"),
278 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
f9fc73be
KS
279 desc!(video-ll; "rbt-video", "Sierra Robot video"),
280 desc!(audio; "rbt-audio", "Sierra Robot audio"),
281 desc!(video; "seq-video", "Sierra Sequence video"),
c17769db
KS
282 desc!(video; "smushv1", "SMUSH Video paletted"),
283 desc!(video; "smushv2", "SMUSH Video 16-bit"),
284 desc!(video; "smush-iact", "SMUSH IACT Audio"),
285 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
9895bd7b
KS
286 desc!(video; "vmd-video", "VMD video"),
287 desc!(audio; "vmd-audio", "VMD audio"),
55d85231
KS
288 desc!(video; "vxvideo", "Actimagine Vx"),
289 desc!(audio; "vxaudio", "Actimagine Sx"),
e8e022f4
KS
290
291 desc!(video; "smacker-video", "Smacker video"),
292 desc!(audio; "smacker-audio", "Smacker audio"),
293 desc!(video; "bink-video", "Bink video"),
294 desc!(video; "bink2-video", "Bink2 video"),
295 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
296 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
ed374345
KS
297
298 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
299 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
300 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
301 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
31cf33ac
KS
302
303 desc!(video; "vivo1", "VivoActive Video 1.0"),
304 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
305 desc!(audio; "g723.1", "ITU G.723.1"),
306 desc!(audio; "siren", "Polycom Siren"),
87927c57
KS
307
308 desc!(audio-ll; "ape", "Monkey's Audio"),
309 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
310 desc!(audio-ll; "tta", "True Audio codec"),
311 desc!(audio-hyb; "wavpack", "WavPack"),
696e4e20 312
fc39649d 313 desc!(video-ll; "gif", "GIF"),
b5e49861 314 desc!(video-im; "jpeg", "JPEG"),
696e4e20 315 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
2260bfdc 316 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
54915296
KS
317
318 desc!(video-im; "mwv1", "Aware MotionWavelets"),
f093f13a 319
c5ad9398
KS
320 desc!(video-llp; "pivideo", "PI-Video"),
321
f093f13a 322 desc!(video-im; "pgvv", "Radius Studio Video"),
bac0d858
KS
323
324 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
2d2f0127 325
2d2f0127
KS
326 desc!(video; "teal-video", "TealMovie video"),
327 desc!(audio; "teal-audio", "TealMovie audio"),
d48ee414
KS
328];
329
b7c882c1 330static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
423005dc
KS
331 (&[1, 0, 0, 0], "msrle"),
332 (&[2, 0, 0, 0], "msrle"),
333
4abcd842
KS
334 (b"CRAM", "msvideo1"),
335 (b"MSVC", "msvideo1"),
336 (b"WHAM", "msvideo1"),
337
b5e49861
KS
338 (b"MJPG", "jpeg"),
339
45e794c4
KS
340 (b"IF09", "indeo1"),
341 (b"RT21", "indeo2"),
342 (b"IV31", "indeo3"),
343 (b"IV32", "indeo3"),
344 (b"IV41", "indeo4"),
345 (b"IV50", "indeo5"),
836bf150 346 (b"I263", "intel263"),
ce52b3b5 347
750b299c 348 (b"UCOD", "clearvideo"),
57777a0a 349 (b"cvid", "cinepak"),
7f4cecdb 350 (b"savi", "cinepak"),
19336baf 351 (b"ZMBV", "zmbv"),
b2d656d0 352
d66e6055
KS
353 (b"Ipma", "ipma"),
354 (b"Ip20", "ipma2"),
2eca5e8f 355 (b"KMVC", "kmvc"),
d66e6055 356
801bba83
KS
357 (b"MVDV", "midivid"),
358 (b"MV30", "midivid3"),
359 (b"MVLZ", "midivid-ll"),
360
5120a019 361 (b"tmot", "truemotion1"),
b2d656d0
KS
362 (b"DUCK", "truemotion1"),
363 (b"TR20", "truemotionrt"),
364 (b"TM20", "truemotion2"),
365 (b"TM2A", "truemotion2x"),
366 (b"TM2X", "truemotion2x"),
40e95291
KS
367 (b"VP30", "vp3"),
368 (b"VP31", "vp3"),
369 (b"VP40", "vp4"),
370 (b"VP50", "vp5"),
371 (b"VP60", "vp6"),
372 (b"VP61", "vp6"),
373 (b"VP62", "vp6"),
1bf8e0fc 374 (b"VP6A", "vp6a"),
40e95291 375 (b"VP70", "vp7"),
54915296
KS
376
377 (b"MWV1", "mwv1"),
f67c7fb1 378
c5ad9398
KS
379 (b"pivc", "pivideo"),
380
f67c7fb1 381 (b"azpr", "apple-video"),
f093f13a 382 (b"PGVV", "pgvv"),
7542b753 383
bd83136c
KS
384 (b"ESCP", "escape-any"),
385
7542b753 386 (b"VXS1", "vxvideo"),
2260bfdc
KS
387
388 (b"DX50", "mpeg4asp"),
389 (b"DIVX", "mpeg4asp"),
390 (b"XVID", "mpeg4asp"),
d48ee414
KS
391];
392
b7c882c1 393static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
9d9c811b 394 (0x0000, "unknown"),
45e794c4 395 (0x0001, "pcm"),
4abcd842 396 (0x0002, "ms-adpcm"),
45e794c4 397 (0x0003, "pcm"),
4abcd842 398 (0x0011, "ima-adpcm-ms"),
1f85167d 399 (0x0055, "mp3"),
fadee95f
KS
400 (0x0061, "adpcm-dk4"),
401 (0x0062, "adpcm-dk3"),
45e794c4
KS
402 (0x0401, "imc"),
403 (0x0402, "iac"),
a38be6e4
KS
404 (0x0500, "on2avc-500"),
405 (0x0501, "on2avc-501"),
d48ee414
KS
406];
407
b7c882c1 408static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
409 (b"cvid", "cinepak"),
410 (b"jpeg", "jpeg"),
411 //(b"raw ", "raw"),
412 //(b"Yuv2", "raw"),
413 (b"smc ", "qt-smc"),
414 (b"rle ", "qt-rle"),
415 (b"rpza", "apple-video"),
416 (b"kpcd", "kodak-photocd"),
417 //(b"mpeg", "mpeg-video"),
418 (b"mjpa", "mjpeg-a"),
419 (b"mjpb", "mjpeg-b"),
420 (b"svqi", "sorenson-video"),
b2689495 421 (b"SVQ1", "sorenson-video"),
3d5fb08f 422 (b"svq3", "sorenson-video3"),
b2689495 423 (b"SVQ3", "sorenson-video3"),
646f4c43
KS
424
425 (b"IV31", "indeo3"),
426 (b"IV32", "indeo3"),
427
428 (b"UCOD", "clearvideo"),
429
430 (b"VP30", "vp3"),
431 (b"VP31", "vp3"),
696e4e20 432
bd83136c
KS
433 (b"ESCP", "escape-any"),
434
2260bfdc 435 (b"mp4v", "mpeg4asp"),
696e4e20 436 (b"avc1", "h264"),
646f4c43
KS
437];
438
b7c882c1 439static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
646f4c43
KS
440 (b"NONE", "pcm"),
441 (b"raw ", "pcm"),
442 (b"twos", "pcm"),
443 (b"sowt", "pcm"),
444 (b"fl32", "pcm"),
445 (b"fl64", "pcm"),
446 (b"in24", "pcm"),
447 (b"in32", "pcm"),
448 (b"MAC3", "mace-3"),
449 (b"MAC6", "mace-6"),
450 (b"ima4", "ima-adpcm-qt"),
451 (b"ulaw", "ulaw"),
452 (b"alaw", "alaw"),
453 (b"dvca", "dv-audio"),
454 (b"QDMC", "qdesign-music"),
455 (b"QDM2", "qdesign-music2"),
456 (b"Qclp", "qualcomm-purevoice"),
457 //(b".mp3", "mpeg-layer3"),
12881f89
KS
458
459 (b"mp4a", "aac"),
40494a85
KS
460
461 (b"alac", "alac"),
646f4c43
KS
462];
463
285f4c72 464/// Returns video codec short name for provided FOURCC (used in AVI format).
d48ee414 465pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
e243ceb4
KS
466 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
467 if *fourcc == fcc { return Some(name); }
d48ee414
KS
468 }
469 None
470}
471
9a3ce86c
KS
472/// Returns FOURCC (used in AVI format) for provided codec name.
473pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
474 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
475 if *name == codecname { return Some(**fourcc); }
476 }
477 None
478}
479
285f4c72 480/// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
d48ee414 481pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
e243ceb4
KS
482 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
483 if *twocc == tcc { return Some(name); }
d48ee414
KS
484 }
485 None
486}
487
9a3ce86c
KS
488/// Returns TWOCC (used in WAV and AVI format for provided codec name.
489pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
490 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
491 if *name == codecname { return Some(*twocc); }
492 }
493 None
494}
495
646f4c43
KS
496/// Returns video codec short name for provided FOURCC (used in MOV format).
497pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
498 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
499 if *fourcc == fcc { return Some(name); }
500 }
501 None
502}
503
504/// Returns known audio codec short name for provided FOURCC (used in MOV format).
505pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
506 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
507 if *fourcc == fcc { return Some(name); }
508 }
509 None
510}
511
d48ee414
KS
512#[cfg(test)]
513mod test {
514 use super::*;
515
516 #[test]
517 fn test_register() {
518 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
519 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
520 println!("found {} and {}", c1, c2);
521 let cd1 = get_codec_description(c1).unwrap();
522 let cd2 = get_codec_description(c2).unwrap();
523 println!("got {} and {}", cd1, cd2);
524 }
b58d7656 525}