1 //! Global registry of codec information.
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.
7 #[derive(Debug,Clone,Copy,PartialEq)]
16 /// Some special codec (e.g. some event stream or separate timecodes stream).
22 impl fmt::Display for CodecType {
23 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
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, "-"),
34 /// Codec capability flag for intra-only codecs.
35 pub const CODEC_CAP_INTRAONLY:u32 = 0x0001;
36 /// Codec capability flag for lossless codecs.
37 pub const CODEC_CAP_LOSSLESS:u32 = 0x0002;
38 /// Codec capability flag for codecs with frame reordering.
39 pub const CODEC_CAP_REORDER:u32 = 0x0004;
40 /// Codec capability flag for codecs that can be both lossy and lossless.
41 pub const CODEC_CAP_HYBRID:u32 = 0x0008;
42 /// Codec capability flag for codecs with scalability features.
43 pub const CODEC_CAP_SCALABLE:u32 = 0x0010;
44 /// Codec capability flag for codecs with complex frame reordering.
45 pub const CODEC_CAP_COMPLEX_REORDER:u32 = 0x0020;
47 /// Codec description structure.
49 pub struct CodecDescription {
52 /// Short codec name is used inside NihAV as the unique identifier.
53 pub name: &'static str,
55 pub fname: &'static str,
58 /// Codec capabilities.
62 impl 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.
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 }
83 impl fmt::Display for CodecDescription {
84 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
85 let mut out = self.fname.to_string();
87 let mut capfmt = "".to_string();
88 if (self.caps & CODEC_CAP_INTRAONLY) != 0 {
89 capfmt = format!("{} Intra-only", capfmt);
91 if (self.caps & CODEC_CAP_LOSSLESS) != 0 {
92 capfmt = format!("{} Lossless", capfmt);
94 if (self.caps & CODEC_CAP_REORDER) != 0 {
95 capfmt = format!("{} Frame reorder", capfmt);
97 if (self.caps & CODEC_CAP_HYBRID) != 0 {
98 capfmt = format!("{} Can be lossy and lossless", capfmt);
100 if (self.caps & CODEC_CAP_SCALABLE) != 0 {
101 capfmt = format!("{} Scalable", capfmt);
103 out = format!("{} ({})", out, capfmt);
110 (video; $n:expr, $fn:expr) => ({
111 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
114 (video; $n:expr, $fn:expr, $c:expr) => ({
115 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
118 (video-ll; $n:expr, $fn:expr) => ({
119 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
120 caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
122 (video-llp; $n:expr, $fn:expr) => ({
123 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
124 caps: CODEC_CAP_LOSSLESS }
126 (video-im; $n:expr, $fn:expr) => ({
127 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
128 caps: CODEC_CAP_INTRAONLY }
130 (video-modern; $n:expr, $fn:expr) => ({
131 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Video,
132 caps: CODEC_CAP_REORDER | CODEC_CAP_HYBRID }
134 (audio; $n:expr, $fn:expr) => ({
135 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
138 (audio-ll; $n:expr, $fn:expr) => ({
139 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
140 caps: CODEC_CAP_LOSSLESS | CODEC_CAP_INTRAONLY }
142 (audio-hyb; $n:expr, $fn:expr) => ({
143 CodecDescription{ name: $n, fname: $fn, ctype: CodecType::Audio,
144 caps: CODEC_CAP_HYBRID }
148 /// Returns codec description for the provided codec short name if it is found.
149 pub fn get_codec_description(name: &str) -> Option<&'static CodecDescription> {
150 CODEC_REGISTER.iter().find(|®| reg.name == name)
153 static CODEC_REGISTER: &[CodecDescription] = &[
154 desc!(audio-ll; "pcm", "PCM"),
155 desc!(audio; "alaw", "A-law PCM"),
156 desc!(audio; "ulaw", "mu-law PCM"),
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"),
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"),
189 desc!(video-ll; "rawvideo", "Raw video data"),
190 desc!(video-ll; "rawvideo-ms", "Raw video data"),
192 desc!(video; "cinepak", "Cinepak"),
194 desc!(video-llp; "zmbv", "Zip Motion Blocks Video"),
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)"),
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; "qt-cdvideo", "CD Video Codec"),
208 desc!(video-im; "qt-sivq", "SIVQ"),
209 desc!(video-ll; "qt-yuv2", "Raw YUV"),
210 desc!(video-ll; "qt-yuv4", "libquicktime YUV4"),
211 desc!(audio-ll; "alac", "Apple Lossless Audio Codec"),
212 desc!(audio; "mace-3", "MACE 3:1"),
213 desc!(audio; "mace-6", "MACE 6:1"),
214 desc!(audio; "ima-adpcm-qt", "IMA ADPCM (Apple variant)"),
215 desc!(audio; "qdesign-music", "QDesign Music"),
216 desc!(audio; "qdesign-music2", "QDesign Music v2"),
217 desc!(audio; "qualcomm-purevoice", "Qualcomm PureVoice"),
219 desc!(video; "pixar-0", "Pixar Codec 0"),
220 desc!(video; "pixar-1", "Pixar Codec 1"),
221 desc!(video; "pixar-2", "Pixar Codec 2"),
222 desc!(video; "pixar-3", "Pixar Codec 3"),
223 desc!(video; "pixar-4", "Pixar Codec 4"),
224 desc!(video; "pixar-5", "Pixar Codec 5"),
225 desc!(video; "pixar-6", "Pixar Codec 6"),
226 desc!(video; "pixar-7", "Pixar Codec 7"),
227 desc!(video; "pixar-a", "Pixar Codec A"),
229 desc!(video-ll; "arm_rawvideo", "Acorn Replay Movie raw video formats"),
230 desc!(audio; "arm_rawaudio", "Acorn Replay Movie raw audio formats"),
231 desc!(video; "movinglines", "Acorn Moving Lines"),
232 desc!(video; "movingblocks", "Acorn Moving Blocks"),
233 desc!(video; "movingblockshq", "Acorn Moving Blocks HQ"),
234 desc!(video; "supermovingblocks", "Acorn Super Moving Blocks"),
235 desc!(video; "linepack", "Henrik Pedersen's LinePack"),
236 desc!(video; "movie16_3", "Henrik Pedersen's Movie 16:3"),
237 desc!(video; "escape-any", "wrapper for Eidos Escape codecs"),
238 desc!(video; "escape100", "Eidos Escape 100"),
239 desc!(video; "escape102", "Eidos Escape 102"),
240 desc!(video; "escape122", "Eidos Escape 122"),
241 desc!(video; "escape124", "Eidos Escape 124"),
242 desc!(video; "escape130", "Eidos Escape 130"),
243 desc!(audio; "escape-adpcm", "Eidos Escape ADPCM"),
244 desc!(video-llp; "euclid", "Iota Euclid / The Complete Animation"),
245 desc!(audio; "iota-sound", "IotaSound"),
247 desc!(video; "truemotion1", "TrueMotion 1"),
248 desc!(video-im; "truemotionrt", "TrueMotion RT"),
249 desc!(video; "truemotion2", "TrueMotion 2"),
250 desc!(video; "truemotion2x", "TrueMotion 2X"),
251 desc!(video; "vp3", "VP3"),
252 desc!(video; "vp4", "VP4"),
253 desc!(video; "vp5", "VP5"),
254 desc!(video; "vp6", "VP6"),
255 desc!(video; "vp6f", "VP6 (in Flash)"),
256 desc!(video; "vp6a", "VP6 with alpha"),
257 desc!(video; "vp7", "VP7"),
258 desc!(video; "vp8", "VP8"),
259 desc!(video; "vp9", "VP9"),
260 desc!(audio; "adpcm-dk3", "Duck DK3 ADPCM"),
261 desc!(audio; "adpcm-dk4", "Duck DK4 ADPCM"),
262 desc!(audio; "on2avc-500", "On2 AVC"),
263 desc!(audio; "on2avc-501", "On2 AVC"),
265 desc!(video; "flv263", "Sorenson H.263"),
266 desc!(video-llp; "flashsv", "Flash Screen Video"),
267 desc!(video-llp; "flashsv2", "Flash Screen Video 2"),
268 desc!(audio; "asao", "N*llym*s*r ASAO"),
269 desc!(audio; "flv-adpcm", "Flash ADPCM"),
271 desc!(audio; "mp1", "MPEG Audio Layer I"),
272 desc!(audio; "mp2", "MPEG Audio Layer II"),
273 desc!(audio; "mp3", "MPEG Audio Layer III"),
274 desc!(audio; "mp3-multi", "MPEG Audio Layer III (multiple frames)"),
275 desc!(audio; "speex", "Speex"),
277 desc!(video; "gdv-video", "Gremlin Digital Video - video"),
278 desc!(audio; "gdv-audio", "Gremlin Digital Video - audio"),
279 desc!(video-im; "arxel-video", "Arxel Tribe Video"),
280 desc!(video; "beam-fcp", "Beam Software Animation"),
281 desc!(video; "beam-video", "Beam Software Video"),
282 desc!(video; "bmv-video", "BMV video"),
283 desc!(audio; "bmv-audio", "BMV audio"),
284 desc!(video; "bmv3-video", "DW Noir BMV video"),
285 desc!(audio; "bmv3-audio", "DW Noir BMV audio"),
286 desc!(video; "dp-sga", "Digital Pictures SGA video"),
287 desc!(video; "fable-imax", "Fable IMAX video"),
288 desc!(video; "fst-video", "FutureVision video"),
289 desc!(audio; "fst-audio", "FutureVision audio"),
290 desc!(video; "hl-fmv-video", "Highlander FMV video"),
291 desc!(video-llp; "ipma", "Imagination Pilots Matte Animation"),
292 desc!(video-llp; "ipma2", "Imagination Pilots Matte Animation v2"),
293 desc!(video; "kmvc", "Karl Morton's Video Codec"),
294 desc!(video; "legend-q-video", "Legend Entertainment Q video"),
295 desc!(video; "midivid", "MidiVid"),
296 desc!(video; "midivid3", "MidiVid 3"),
297 desc!(video-ll; "midivid-ll", "MidiVid Lossless"),
298 desc!(video-llp; "pdq2", "PDQ2"),
299 desc!(video-ll; "rbt-video", "Sierra Robot video"),
300 desc!(audio; "rbt-audio", "Sierra Robot audio"),
301 desc!(video; "seq-video", "Sierra Sequence video"),
302 desc!(video; "smushv1", "SMUSH Video paletted"),
303 desc!(video; "smushv2", "SMUSH Video 16-bit"),
304 desc!(video; "smush-iact", "SMUSH IACT Audio"),
305 desc!(video; "smush-vima", "SMUSH VIMA Audio"),
306 desc!(video; "vmd-video", "VMD video"),
307 desc!(audio; "vmd-audio", "VMD audio"),
308 desc!(video; "vxvideo", "Actimagine Vx"),
309 desc!(audio; "vxaudio", "Actimagine Sx"),
311 desc!(video; "smacker-video", "Smacker video"),
312 desc!(audio; "smacker-audio", "Smacker audio"),
313 desc!(video; "bink-video", "Bink video"),
314 desc!(video; "bink2-video", "Bink2 video"),
315 desc!(audio; "bink-audio-dct", "Bink audio (DCT)"),
316 desc!(audio; "bink-audio-rdft", "Bink audio (RDFT)"),
318 desc!(audio; "lhst15f8", "L&H StreamTalk 15kbps at 8 kHz"),
319 desc!(audio; "lhst250f11", "L&H StreamTalk 25kbps at 11 kHz"),
320 desc!(audio; "lhst500f22", "L&H StreamTalk 50kpbs at 22 kHz"),
321 desc!(audio; "lhst48", "L&H StreamTalk CELP Codec 4.8kbps at 8 kHz"),
323 desc!(video; "vivo1", "VivoActive Video 1.0"),
324 desc!(video; "vivo2", "VivoActive Video 2.0", CODEC_CAP_REORDER),
325 desc!(audio; "g723.1", "ITU G.723.1"),
326 desc!(audio; "siren", "Polycom Siren"),
328 desc!(audio-ll; "ape", "Monkey's Audio"),
329 desc!(audio-ll; "flac", "Free Lossless Audio Codec"),
330 desc!(audio-ll; "tta", "True Audio codec"),
331 desc!(audio-hyb; "wavpack", "WavPack"),
333 desc!(video-ll; "gif", "GIF"),
334 desc!(video-im; "jpeg", "JPEG"),
335 desc!(video; "h264", "ITU H.264", CODEC_CAP_COMPLEX_REORDER | CODEC_CAP_HYBRID),
336 desc!(video-modern; "mpeg4asp", "MPEG-4 ASP"),
338 desc!(video; "fif", "Fractal Codec"),
340 desc!(video-im; "mvi0", "MotionPixels (MVI)"),
341 desc!(video; "mvi1", "MotionPixels 1"),
342 desc!(video; "mvi2", "MotionPixels 2"),
344 desc!(video; "gryphon-arbc-vfw", "Gryphon Software ARBC in AVI"),
345 desc!(video; "gryphon-arbc-qt", "Gryphon Software ARBC in MOV"),
347 desc!(video-im; "mwv1", "Aware MotionWavelets"),
349 desc!(video-llp; "pivideo", "PI-Video"),
351 desc!(video-im; "adorage", "proDAD Adorage"),
352 desc!(video-im; "moviepak", "RasterOps MoviePak"),
353 desc!(video; "next-uwavelet", "NeXT Micro Wavelet"),
354 desc!(video-im; "pgvv", "Radius Studio Video"),
356 desc!(video-llp; "qpeg-dvc", "QPEG video in DVC"),
358 desc!(video; "teal-video", "TealMovie video"),
359 desc!(audio; "teal-audio", "TealMovie audio"),
361 desc!(video; "ultimotion", "IBM Ultimotion"),
364 static AVI_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
365 (&[1, 0, 0, 0], "msrle"),
366 (&[2, 0, 0, 0], "msrle"),
368 (b"CRAM", "msvideo1"),
369 (b"MSVC", "msvideo1"),
370 (b"WHAM", "msvideo1"),
380 (b"I263", "intel263"),
383 (b"UCOD", "clearvideo"),
384 (b"cvid", "cinepak"),
385 (b"savi", "cinepak"),
386 (b"tony", "cinepak"),
393 (b"MVDV", "midivid"),
394 (b"MV30", "midivid3"),
395 (b"MVLZ", "midivid-ll"),
399 (b"tmot", "truemotion1"),
400 (b"DUCK", "truemotion1"),
401 (b"PVEZ", "truemotion1"),
402 (b"TR20", "truemotionrt"),
403 (b"TM20", "truemotion2"),
404 (b"TM2A", "truemotion2x"),
405 (b"TM2X", "truemotion2x"),
422 (b"pDAD", "adorage"),
424 (b"pivc", "pivideo"),
426 (b"ULTI", "ultimotion"),
428 (b"ARBC", "gryphon-arbc-vfw"),
429 (b"azpr", "apple-video"),
432 (b"ESCP", "escape-any"),
434 (b"VXS1", "vxvideo"),
436 (b"DX50", "mpeg4asp"),
437 (b"DIVX", "mpeg4asp"),
438 (b"XVID", "mpeg4asp"),
441 static WAV_CODEC_REGISTER: &[(u16, &str)] = &[
444 (0x0002, "ms-adpcm"),
448 (0x0011, "ima-adpcm-ms"),
449 (0x0055, "mp3-multi"),
450 (0x0061, "adpcm-dk4"),
451 (0x0062, "adpcm-dk3"),
454 (0x0500, "on2avc-500"),
455 (0x0501, "on2avc-501"),
456 (0x2000, "ac3-multi"),
459 static MOV_VIDEO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
460 (b"cvid", "cinepak"),
462 (b"raw ", "rawvideo"),
466 (b"rpza", "apple-video"),
468 (b"cdvc", "qt-cdvideo"),
469 (b"SIVQ", "qt-sivq"),
470 (b"kpcd", "kodak-photocd"),
471 //(b"mpeg", "mpeg-video"),
472 (b"mjpa", "mjpeg-a"),
473 (b"mjpb", "mjpeg-b"),
474 (b"SVQ1", "sorenson-video"),
475 (b"svqi", "sorenson-video"),
476 (b"SVQ3", "sorenson-video3"),
477 (b"svq3", "sorenson-video3"),
479 (b"msvc", "msvideo1"),
486 (b"arbc", "gryphon-arbc-qt"),
487 (b"MPAK", "moviepak"),
489 (b"UCOD", "clearvideo"),
491 (b"tmot", "truemotion1"),
495 (b"ESCP", "escape-any"),
497 (b"mp4v", "mpeg4asp"),
500 (b"pix0", "pixar-0"),
501 (b"pix1", "pixar-1"),
502 (b"pix2", "pixar-2"),
503 (b"pix3", "pixar-3"),
504 (b"pix4", "pixar-4"),
505 (b"pix5", "pixar-5"),
506 (b"pix6", "pixar-6"),
507 (b"pix7", "pixar-7"),
508 (b"pixA", "pixar-a"),
510 (b"j420", "rawvideo"),
511 (b"yuv2", "qt-yuv2"),
512 (b"yuv4", "qt-yuv4"),
514 (b"uWav", "next-uwavelet"),
517 static MOV_AUDIO_CODEC_REGISTER: &[(&[u8;4], &str)] = &[
528 (b"ima4", "ima-adpcm-qt"),
531 (b"dvca", "dv-audio"),
532 (b"QDMC", "qdesign-music"),
533 (b"QDM2", "qdesign-music2"),
534 (b"Qclp", "qualcomm-purevoice"),
535 //(b".mp3", "mpeg-layer3"),
544 /// Returns video codec short name for provided FOURCC (used in AVI format).
545 pub fn find_codec_from_avi_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
546 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
547 if *fourcc == fcc { return Some(name); }
552 /// Returns FOURCC (used in AVI format) for provided codec name.
553 pub fn find_avi_fourcc(codecname: &str) -> Option<[u8; 4]> {
554 for (fourcc, name) in AVI_VIDEO_CODEC_REGISTER.iter() {
555 if *name == codecname { return Some(**fourcc); }
560 /// Returns known audio codec short name for provided TWOCC (used in WAV and AVI format).
561 pub fn find_codec_from_wav_twocc(tcc: u16) -> Option<&'static str> {
562 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
563 if *twocc == tcc { return Some(name); }
568 /// Returns TWOCC (used in WAV and AVI format for provided codec name.
569 pub fn find_wav_twocc(codecname: &str) -> Option<u16> {
570 for (twocc, name) in WAV_CODEC_REGISTER.iter() {
571 if *name == codecname { return Some(*twocc); }
576 /// Returns video codec short name for provided FOURCC (used in MOV format).
577 pub fn find_codec_from_mov_video_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
578 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
579 if *fourcc == fcc { return Some(name); }
584 /// Returns known audio codec short name for provided FOURCC (used in MOV format).
585 pub fn find_codec_from_mov_audio_fourcc(fcc: &[u8;4]) -> Option<&'static str> {
586 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
587 if *fourcc == fcc { return Some(name); }
592 /// Returns FOURCC (used in MOV format) for provided video codec name.
593 pub fn find_mov_video_fourcc(codecname: &str) -> Option<[u8; 4]> {
594 for (fourcc, name) in MOV_VIDEO_CODEC_REGISTER.iter() {
595 if *name == codecname { return Some(**fourcc); }
600 /// Returns FOURCC (used in MOV format) for provided audio codec name.
601 pub fn find_mov_audio_fourcc(codecname: &str) -> Option<[u8; 4]> {
602 for (fourcc, name) in MOV_AUDIO_CODEC_REGISTER.iter() {
603 if *name == codecname { return Some(**fourcc); }
614 let c1 = find_codec_from_avi_fourcc(b"IV41").unwrap();
615 let c2 = find_codec_from_wav_twocc(0x401).unwrap();
616 println!("found {} and {}", c1, c2);
617 let cd1 = get_codec_description(c1).unwrap();
618 let cd2 = get_codec_description(c2).unwrap();
619 println!("got {} and {}", cd1, cd2);