Mercurial > libavformat.hg
annotate isom.c @ 5984:55c714a8fb00 libavformat
Make the IFF demuxer a little more standards-compliant, e.g. respect the size
fields of common media header chunks (these can have different sizes depending
on the type of IFF file you read), better handle odd sizes (like RIFF, every
field is padded to word) and handle headerchunks after the BODY chunk.
Patch by Sebastian Vater <cdgs.basty googlemail com>.
author | rbultje |
---|---|
date | Tue, 27 Apr 2010 14:03:47 +0000 |
parents | 4f20f4db87f7 |
children | c7b98381ec2d |
rev | line source |
---|---|
1216 | 1 /* |
2 * ISO Media common code | |
4251
77e0c7511d41
cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents:
4193
diff
changeset
|
3 * Copyright (c) 2001 Fabrice Bellard |
1216 | 4 * Copyright (c) 2002 Francois Revol <revol@free.fr> |
5 * Copyright (c) 2006 Baptiste Coudurier <baptiste.coudurier@free.fr> | |
6 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
7 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
8 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
9 * FFmpeg is free software; you can redistribute it and/or |
1216 | 10 * modify it under the terms of the GNU Lesser General Public |
11 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
12 * version 2.1 of the License, or (at your option) any later version. |
1216 | 13 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
14 * FFmpeg is distributed in the hope that it will be useful, |
1216 | 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Lesser General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1259
diff
changeset
|
20 * License along with FFmpeg; if not, write to the Free Software |
1216 | 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 */ | |
23 | |
24 #include "avformat.h" | |
25 #include "riff.h" | |
26 #include "isom.h" | |
27 | |
1944 | 28 /* http://www.mp4ra.org */ |
2976 | 29 /* ordered by muxing preference */ |
1948 | 30 const AVCodecTag ff_mp4_obj_type[] = { |
4193
2d3be324c648
Add support for muxing mov/mp4/3gp timed text streams
conrad
parents:
4118
diff
changeset
|
31 { CODEC_ID_MOV_TEXT , 0x08 }, |
3883
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
32 { CODEC_ID_MPEG4 , 0x20 }, |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
33 { CODEC_ID_H264 , 0x21 }, |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
34 { CODEC_ID_AAC , 0x40 }, |
5379 | 35 { CODEC_ID_MP4ALS , 0x40 }, /* 14496-3 ALS */ |
3883
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
36 { CODEC_ID_MPEG2VIDEO, 0x61 }, /* MPEG2 Main */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
37 { CODEC_ID_MPEG2VIDEO, 0x60 }, /* MPEG2 Simple */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
38 { CODEC_ID_MPEG2VIDEO, 0x62 }, /* MPEG2 SNR */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
39 { CODEC_ID_MPEG2VIDEO, 0x63 }, /* MPEG2 Spatial */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
40 { CODEC_ID_MPEG2VIDEO, 0x64 }, /* MPEG2 High */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
41 { CODEC_ID_MPEG2VIDEO, 0x65 }, /* MPEG2 422 */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
42 { CODEC_ID_AAC , 0x66 }, /* MPEG2 AAC Main */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
43 { CODEC_ID_AAC , 0x67 }, /* MPEG2 AAC Low */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
44 { CODEC_ID_AAC , 0x68 }, /* MPEG2 AAC SSR */ |
3887
c8ab0676bba6
change the logic to mux 13818-3 and 11172-3 in mp4, less code
bcoudurier
parents:
3885
diff
changeset
|
45 { CODEC_ID_MP3 , 0x69 }, /* 13818-3 */ |
c8ab0676bba6
change the logic to mux 13818-3 and 11172-3 in mp4, less code
bcoudurier
parents:
3885
diff
changeset
|
46 { CODEC_ID_MP2 , 0x69 }, /* 11172-3 */ |
3884 | 47 { CODEC_ID_MPEG1VIDEO, 0x6A }, /* 11172-2 */ |
3883
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
48 { CODEC_ID_MP3 , 0x6B }, /* 11172-3 */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
49 { CODEC_ID_MJPEG , 0x6C }, /* 10918-1 */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
50 { CODEC_ID_PNG , 0x6D }, |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
51 { CODEC_ID_JPEG2000 , 0x6E }, /* 15444-1 */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
52 { CODEC_ID_VC1 , 0xA3 }, |
3885 | 53 { CODEC_ID_DIRAC , 0xA4 }, |
3883
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
54 { CODEC_ID_AC3 , 0xA5 }, |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
55 { CODEC_ID_VORBIS , 0xDD }, /* non standard, gpac uses it */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
56 { CODEC_ID_DVD_SUBTITLE, 0xE0 }, /* non standard, see unsupported-embedded-subs-2.mp4 */ |
1a8a1a651b30
cosmetics, change values to hex since mp4ra use hex
bcoudurier
parents:
3881
diff
changeset
|
57 { CODEC_ID_QCELP , 0xE1 }, |
5290
0d5653941bf9
Make AVCodecTag.id enum CodecID and use CODEC_ID_NONE instead of 0.
cehoyos
parents:
5039
diff
changeset
|
58 { CODEC_ID_NONE , 0 }, |
1216 | 59 }; |
60 | |
1843 | 61 const AVCodecTag codec_movvideo_tags[] = { |
62 /* { CODEC_ID_, MKTAG('I', 'V', '5', '0') }, *//* Indeo 5.0 */ | |
63 | |
64 { CODEC_ID_RAWVIDEO, MKTAG('r', 'a', 'w', ' ') }, /* Uncompressed RGB */ | |
4808 | 65 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') }, /* Uncompressed YUV422 */ |
1843 | 66 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'U', 'I') }, /* YUV with alpha-channel (AVID Uncompressed) */ |
67 { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, /* UNCOMPRESSED 8BIT 4:2:2 */ | |
5341
09ae9d168949
add yuvs fourcc to raw.c and isom.c, fixes samples/mov/yuvs.mov
compn
parents:
5290
diff
changeset
|
68 { CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') }, /* same as 2vuy but byte swapped */ |
1843 | 69 |
5470
3f4dbd1e6548
Add decoder for R210 (uncompressed 10-bit RGB) codec.
reimar
parents:
5390
diff
changeset
|
70 { CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, /* UNCOMPRESSED 10BIT RGB */ |
4926 | 71 { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, /* UNCOMPRESSED 10BIT 4:2:2 */ |
72 | |
1843 | 73 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, /* PhotoJPEG */ |
74 { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, /* Motion-JPEG (format A) */ | |
75 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'D', 'J') }, /* MJPEG with alpha-channel (AVID JFIF meridien compressed) */ | |
76 /* { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, *//* MJPEG with alpha-channel (AVID ABVB/Truevision NuVista) */ | |
2081 | 77 { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') }, /* Motion JPEG OpenDML */ |
1843 | 78 { CODEC_ID_MJPEGB, MKTAG('m', 'j', 'p', 'b') }, /* Motion-JPEG (format B) */ |
79 | |
80 { CODEC_ID_SVQ1, MKTAG('S', 'V', 'Q', '1') }, /* Sorenson Video v1 */ | |
81 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, /* Sorenson Video v1 */ | |
82 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', 'i') }, /* Sorenson Video v1 (from QT specs)*/ | |
83 { CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') }, /* Sorenson Video v3 */ | |
84 | |
85 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, | |
86 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, /* OpenDiVX *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */ | |
87 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') }, | |
88 { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, /* experimental: 3IVX files before ivx D4 4.5.1 */ | |
89 | |
90 { CODEC_ID_H263, MKTAG('h', '2', '6', '3') }, /* H263 */ | |
91 { CODEC_ID_H263, MKTAG('s', '2', '6', '3') }, /* H263 ?? works */ | |
92 | |
93 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 'p') }, /* DV PAL */ | |
94 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, /* DV NTSC */ | |
95 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'p', 'p') }, /* DVCPRO PAL produced by FCP */ | |
96 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'p') }, /* DVCPRO50 PAL produced by FCP */ | |
97 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', 'n') }, /* DVCPRO50 NTSC produced by FCP */ | |
98 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', 'v') }, /* AVID DV */ | |
3875 | 99 { CODEC_ID_DVVIDEO, MKTAG('A', 'V', 'd', '1') }, /* AVID DV100 */ |
3790
a8a70ae19206
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
3738
diff
changeset
|
100 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'q') }, /* DVCPRO HD 720p50 */ |
a8a70ae19206
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
3738
diff
changeset
|
101 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'p') }, /* DVCPRO HD 720p60 */ |
4907 | 102 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') }, |
103 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '2') }, | |
104 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '4') }, | |
3790
a8a70ae19206
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
3738
diff
changeset
|
105 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '5') }, /* DVCPRO HD 50i produced by FCP */ |
a8a70ae19206
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
3738
diff
changeset
|
106 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '6') }, /* DVCPRO HD 60i produced by FCP */ |
a8a70ae19206
Intial implementation of the DV100 (AKA DVCPRO HD) decoder and demuxer as
romansh
parents:
3738
diff
changeset
|
107 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '3') }, /* DVCPRO HD 30p produced by FCP */ |
1843 | 108 |
109 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, /* On2 VP3 */ | |
110 { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') }, /* Apple Video (RPZA) */ | |
111 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, /* Cinepak */ | |
112 { CODEC_ID_8BPS, MKTAG('8', 'B', 'P', 'S') }, /* Planar RGB (8BPS) */ | |
113 { CODEC_ID_SMC, MKTAG('s', 'm', 'c', ' ') }, /* Apple Graphics (SMC) */ | |
114 { CODEC_ID_QTRLE, MKTAG('r', 'l', 'e', ' ') }, /* Apple Animation (RLE) */ | |
115 { CODEC_ID_MSRLE, MKTAG('W', 'R', 'L', 'E') }, | |
116 { CODEC_ID_QDRAW, MKTAG('q', 'd', 'r', 'w') }, /* QuickDraw */ | |
117 | |
4063 | 118 { CODEC_ID_RAWVIDEO, MKTAG('W', 'R', 'A', 'W') }, |
119 | |
1843 | 120 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, /* AVC-1/H.264 */ |
121 | |
122 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'e', 'g') }, /* MPEG */ | |
5029
b811d7012aaa
Analysis of logs show that there are in fact some files with m1v1 too (not just m2v2),
darkshikari
parents:
5027
diff
changeset
|
123 { CODEC_ID_MPEG1VIDEO, MKTAG('m', '1', 'v', '1') }, |
3606 | 124 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '1') }, /* MPEG2 HDV 720p30 */ |
125 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '2') }, /* MPEG2 HDV 1080i60 */ | |
126 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '3') }, /* MPEG2 HDV 1080i50 */ | |
127 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '5') }, /* MPEG2 HDV 720p25 */ | |
3607 | 128 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '6') }, /* MPEG2 HDV 1080p24 */ |
129 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '7') }, /* MPEG2 HDV 1080p25 */ | |
130 { CODEC_ID_MPEG2VIDEO, MKTAG('h', 'd', 'v', '8') }, /* MPEG2 HDV 1080p30 */ | |
1843 | 131 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'n') }, /* MPEG2 IMX NTSC 525/60 50mb/s produced by FCP */ |
132 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '5', 'p') }, /* MPEG2 IMX PAL 625/50 50mb/s produced by FCP */ | |
3028 | 133 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'n') }, /* MPEG2 IMX NTSC 525/60 40mb/s produced by FCP */ |
134 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '4', 'p') }, /* MPEG2 IMX PAL 625/50 40mb/s produced by FCP */ | |
1843 | 135 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'n') }, /* MPEG2 IMX NTSC 525/60 30mb/s produced by FCP */ |
136 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'x', '3', 'p') }, /* MPEG2 IMX PAL 625/50 30mb/s produced by FCP */ | |
3608 | 137 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', '9') }, /* XDCAM HD422 720p60 CBR */ |
138 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'a') }, /* XDCAM HD422 720p50 CBR */ | |
139 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'b') }, /* XDCAM HD422 1080i60 CBR */ | |
140 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'c') }, /* XDCAM HD422 1080i50 CBR */ | |
141 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'd') }, /* XDCAM HD422 1080p24 CBR */ | |
142 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'e') }, /* XDCAM HD422 1080p25 CBR */ | |
143 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', '5', 'f') }, /* XDCAM HD422 1080p30 CBR */ | |
144 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '1') }, /* XDCAM EX 720p30 VBR */ | |
2040
91dc0ed52efa
add xdv2 xdcam hd tag, decode xdcam_hd_1080i60.mov
bcoudurier
parents:
1985
diff
changeset
|
145 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '2') }, /* XDCAM HD 1080i60 */ |
3608 | 146 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '3') }, /* XDCAM HD 1080i50 VBR */ |
147 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '4') }, /* XDCAM EX 720p24 VBR */ | |
148 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '5') }, /* XDCAM EX 720p25 VBR */ | |
149 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '6') }, /* XDCAM HD 1080p24 VBR */ | |
150 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '7') }, /* XDCAM HD 1080p25 VBR */ | |
151 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '8') }, /* XDCAM HD 1080p30 VBR */ | |
152 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', '9') }, /* XDCAM EX 720p60 VBR */ | |
153 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'a') }, /* XDCAM EX 720p50 VBR */ | |
154 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'b') }, /* XDCAM EX 1080i60 VBR */ | |
155 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'c') }, /* XDCAM EX 1080i50 VBR */ | |
156 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'd') }, /* XDCAM EX 1080p24 VBR */ | |
157 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'e') }, /* XDCAM EX 1080p25 VBR */ | |
158 { CODEC_ID_MPEG2VIDEO, MKTAG('x', 'd', 'v', 'f') }, /* XDCAM EX 1080p30 VBR */ | |
1843 | 159 { CODEC_ID_MPEG2VIDEO, MKTAG('A', 'V', 'm', 'p') }, /* AVID IMX PAL */ |
5020
807d6116fa70
Add "m2v1" to fourccs for MPEG-2 video; fixes some MOV files.
darkshikari
parents:
5019
diff
changeset
|
160 { CODEC_ID_MPEG2VIDEO, MKTAG('m', '2', 'v', '1') }, |
1843 | 161 |
4118 | 162 { CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') }, /* JPEG 2000 produced by FCP */ |
1843 | 163 |
164 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, /* Truevision Targa */ | |
165 { CODEC_ID_TIFF, MKTAG('t', 'i', 'f', 'f') }, /* TIFF embedded in MOV */ | |
166 { CODEC_ID_GIF, MKTAG('g', 'i', 'f', ' ') }, /* embedded gif files as frames (usually one "click to play movie" frame) */ | |
167 { CODEC_ID_PNG, MKTAG('p', 'n', 'g', ' ') }, | |
168 | |
169 { CODEC_ID_VC1, MKTAG('v', 'c', '-', '1') }, /* SMPTE RP 2025 */ | |
3496
cdbf302a3c00
chinese avs demuxing support, demux AVSFileFormat.mp4
bcoudurier
parents:
3244
diff
changeset
|
170 { CODEC_ID_CAVS, MKTAG('a', 'v', 's', '2') }, |
1843 | 171 |
3885 | 172 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') }, |
1932 | 173 { CODEC_ID_DNXHD, MKTAG('A', 'V', 'd', 'n') }, /* AVID DNxHD */ |
5549
7fc464450d8c
Support decoding Avid 1:1x codec, (partially) fixes issue1684.
cehoyos
parents:
5470
diff
changeset
|
174 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', '1', 'x') }, /* AVID 1:1x */ |
5550
133a0ee142a8
Support decoding of Avid uncompressed mov files, fixes issue 1685.
cehoyos
parents:
5549
diff
changeset
|
175 { CODEC_ID_RAWVIDEO, MKTAG('A', 'V', 'u', 'p') }, |
1985 | 176 { CODEC_ID_SGI, MKTAG('s', 'g', 'i', ' ') }, /* SGI */ |
5022 | 177 { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') }, /* DPX */ |
1932 | 178 |
1843 | 179 { CODEC_ID_NONE, 0 }, |
180 }; | |
181 | |
182 const AVCodecTag codec_movaudio_tags[] = { | |
183 { CODEC_ID_PCM_S32BE, MKTAG('i', 'n', '3', '2') }, | |
184 { CODEC_ID_PCM_S32LE, MKTAG('i', 'n', '3', '2') }, | |
185 { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4') }, | |
186 { CODEC_ID_PCM_S24LE, MKTAG('i', 'n', '2', '4') }, | |
187 { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's') }, /* 16 bits */ | |
188 { CODEC_ID_PCM_S16LE, MKTAG('s', 'o', 'w', 't') }, /* */ | |
189 { CODEC_ID_PCM_S16LE, MKTAG('l', 'p', 'c', 'm') }, | |
3738
0c46eb1cd9b3
Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents:
3608
diff
changeset
|
190 { CODEC_ID_PCM_F32BE, MKTAG('f', 'l', '3', '2') }, |
5390 | 191 { CODEC_ID_PCM_F32LE, MKTAG('f', 'l', '3', '2') }, |
3738
0c46eb1cd9b3
Make MOV demuxer handle F32BE, F32LE, F64BE and F64LE PCM audio.
pross
parents:
3608
diff
changeset
|
192 { CODEC_ID_PCM_F64BE, MKTAG('f', 'l', '6', '4') }, |
5390 | 193 { CODEC_ID_PCM_F64LE, MKTAG('f', 'l', '6', '4') }, |
1851 | 194 { CODEC_ID_PCM_S8, MKTAG('s', 'o', 'w', 't') }, |
1843 | 195 { CODEC_ID_PCM_U8, MKTAG('r', 'a', 'w', ' ') }, /* 8 bits unsigned */ |
2293
9aea08e128f9
treat NONE as U8 to fix qtNONE/000_0032.MOV, this should not any have side effect since if bps is 16 in stsd, codec will be changed to s16be, just yell if this breaks any sample
bcoudurier
parents:
2081
diff
changeset
|
196 { CODEC_ID_PCM_U8, MKTAG('N', 'O', 'N', 'E') }, /* uncompressed */ |
1843 | 197 { CODEC_ID_PCM_MULAW, MKTAG('u', 'l', 'a', 'w') }, /* */ |
198 { CODEC_ID_PCM_ALAW, MKTAG('a', 'l', 'a', 'w') }, /* */ | |
199 | |
200 { CODEC_ID_ADPCM_IMA_QT, MKTAG('i', 'm', 'a', '4') }, /* IMA-4 ADPCM */ | |
201 | |
202 { CODEC_ID_MACE3, MKTAG('M', 'A', 'C', '3') }, /* Macintosh Audio Compression and Expansion 3:1 */ | |
203 { CODEC_ID_MACE6, MKTAG('M', 'A', 'C', '6') }, /* Macintosh Audio Compression and Expansion 6:1 */ | |
204 | |
5039 | 205 { CODEC_ID_MP1, MKTAG('.', 'm', 'p', '1') }, /* MPEG layer 1 */ |
5038
db3908414396
Add ".mp2" as a fourcc for mp2 audio in MOV. Fixes a problematic MOV file.
darkshikari
parents:
5029
diff
changeset
|
206 { CODEC_ID_MP2, MKTAG('.', 'm', 'p', '2') }, /* MPEG layer 2 */ |
db3908414396
Add ".mp2" as a fourcc for mp2 audio in MOV. Fixes a problematic MOV file.
darkshikari
parents:
5029
diff
changeset
|
207 |
1843 | 208 { CODEC_ID_MP3, MKTAG('.', 'm', 'p', '3') }, /* MPEG layer 3 */ /* sample files at http://www.3ivx.com/showcase.html use this tag */ |
1952 | 209 { CODEC_ID_MP3, 0x6D730055 }, /* MPEG layer 3 */ |
1843 | 210 |
211 /* { CODEC_ID_OGG_VORBIS, MKTAG('O', 'g', 'g', 'S') }, *//* sample files at http://heroinewarrior.com/xmovie.php3 use this tag */ | |
212 | |
213 { CODEC_ID_AAC, MKTAG('m', 'p', '4', 'a') }, /* MPEG-4 AAC */ | |
3881 | 214 { CODEC_ID_AC3, MKTAG('a', 'c', '-', '3') }, /* ETSI TS 102 366 Annex F */ |
5021
bf22df10d085
Add sac3 to mp4 fourccs for mov+h264+aac-sac3+mp4s+ETERNAL_cut.mp4
conrad
parents:
5020
diff
changeset
|
215 { CODEC_ID_AC3, MKTAG('s', 'a', 'c', '3') }, /* Nero Recode */ |
1843 | 216 |
217 { CODEC_ID_AMR_NB, MKTAG('s', 'a', 'm', 'r') }, /* AMR-NB 3gp */ | |
218 { CODEC_ID_AMR_WB, MKTAG('s', 'a', 'w', 'b') }, /* AMR-WB 3gp */ | |
219 | |
3187 | 220 { CODEC_ID_GSM, MKTAG('a', 'g', 's', 'm') }, |
1843 | 221 { CODEC_ID_ALAC, MKTAG('a', 'l', 'a', 'c') }, /* Apple Lossless */ |
3244 | 222 |
223 { CODEC_ID_QCELP, MKTAG('Q','c','l','p') }, | |
5019
54007c06cf7c
Add alternate fourcc for QCELP audio (qclq). Fixes a problematic MOV file.
darkshikari
parents:
4926
diff
changeset
|
224 { CODEC_ID_QCELP, MKTAG('Q','c','l','q') }, |
3244 | 225 { CODEC_ID_QCELP, MKTAG('s','q','c','p') }, /* ISO Media fourcc */ |
226 | |
1843 | 227 { CODEC_ID_QDM2, MKTAG('Q', 'D', 'M', '2') }, /* QDM2 */ |
228 | |
229 { CODEC_ID_DVAUDIO, MKTAG('v', 'd', 'v', 'a') }, | |
230 { CODEC_ID_DVAUDIO, MKTAG('d', 'v', 'c', 'a') }, | |
231 | |
3223 | 232 { CODEC_ID_WMAV2, MKTAG('W', 'M', 'A', '2') }, |
233 | |
1843 | 234 { CODEC_ID_NONE, 0 }, |
235 }; | |
236 | |
2969 | 237 const AVCodecTag ff_codec_movsubtitle_tags[] = { |
2974
4b6a9b61e9dd
Add CODEC_ID_MOV_TEXT and use it instead of modifying the stream in the mov demuxer.
reimar
parents:
2971
diff
changeset
|
238 { CODEC_ID_MOV_TEXT, MKTAG('t', 'e', 'x', 't') }, |
2985 | 239 { CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') }, |
2969 | 240 { CODEC_ID_NONE, 0 }, |
241 }; | |
242 | |
1216 | 243 /* map numeric codes from mdhd atom to ISO 639 */ |
244 /* cf. QTFileFormat.pdf p253, qtff.pdf p205 */ | |
245 /* http://developer.apple.com/documentation/mac/Text/Text-368.html */ | |
246 /* deprecated by putting the code as 3*5bit ascii */ | |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
247 static const char mov_mdhd_language_map[][4] = { |
1216 | 248 /* 0-9 */ |
249 "eng", "fra", "ger", "ita", "dut", "sve", "spa", "dan", "por", "nor", | |
250 "heb", "jpn", "ara", "fin", "gre", "ice", "mlt", "tur", "hr "/*scr*/, "chi"/*ace?*/, | |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
251 "urd", "hin", "tha", "kor", "lit", "pol", "hun", "est", "lav", "", |
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
252 "fo ", "", "rus", "chi", "", "iri", "alb", "ron", "ces", "slk", |
1216 | 253 "slv", "yid", "sr ", "mac", "bul", "ukr", "bel", "uzb", "kaz", "aze", |
254 /*?*/ | |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
255 "aze", "arm", "geo", "mol", "kir", "tgk", "tuk", "mon", "", "pus", |
1216 | 256 "kur", "kas", "snd", "tib", "nep", "san", "mar", "ben", "asm", "guj", |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
257 "pa ", "ori", "mal", "kan", "tam", "tel", "", "bur", "khm", "lao", |
1216 | 258 /* roman? arabic? */ |
259 "vie", "ind", "tgl", "may", "may", "amh", "tir", "orm", "som", "swa", | |
260 /*==rundi?*/ | |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
261 "", "run", "", "mlg", "epo", "", "", "", "", "", |
1216 | 262 /* 100 */ |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
263 "", "", "", "", "", "", "", "", "", "", |
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
264 "", "", "", "", "", "", "", "", "", "", |
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
265 "", "", "", "", "", "", "", "", "wel", "baq", |
1216 | 266 "cat", "lat", "que", "grn", "aym", "tat", "uig", "dzo", "jav" |
267 }; | |
268 | |
5611
1338a4972dd4
Always consider the mov language code as 4 bytes fixed size and change the
reimar
parents:
5610
diff
changeset
|
269 int ff_mov_iso639_to_lang(const char lang[4], int mp4) |
1216 | 270 { |
271 int i, code = 0; | |
272 | |
273 /* old way, only for QT? */ | |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
274 for (i = 0; lang[0] && !mp4 && i < FF_ARRAY_ELEMS(mov_mdhd_language_map); i++) { |
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
275 if (!strcmp(lang, mov_mdhd_language_map[i])) |
1216 | 276 return i; |
277 } | |
278 /* XXX:can we do that in mov too? */ | |
279 if (!mp4) | |
4586
674bf341b7e3
return -1 for errors in ff_mov_iso639_to_lang() to allow for error checking
aurel
parents:
4269
diff
changeset
|
280 return -1; |
1216 | 281 /* handle undefined as such */ |
282 if (lang[0] == '\0') | |
283 lang = "und"; | |
284 /* 5bit ascii */ | |
285 for (i = 0; i < 3; i++) { | |
5610 | 286 uint8_t c = lang[i]; |
287 c -= 0x60; | |
288 if (c > 0x1f) | |
4586
674bf341b7e3
return -1 for errors in ff_mov_iso639_to_lang() to allow for error checking
aurel
parents:
4269
diff
changeset
|
289 return -1; |
1216 | 290 code <<= 5; |
5610 | 291 code |= c; |
1216 | 292 } |
293 return code; | |
294 } | |
295 | |
5611
1338a4972dd4
Always consider the mov language code as 4 bytes fixed size and change the
reimar
parents:
5610
diff
changeset
|
296 int ff_mov_lang_to_iso639(unsigned code, char to[4]) |
1216 | 297 { |
298 int i; | |
5611
1338a4972dd4
Always consider the mov language code as 4 bytes fixed size and change the
reimar
parents:
5610
diff
changeset
|
299 memset(to, 0, 4); |
1216 | 300 /* is it the mangled iso code? */ |
301 /* see http://www.geocities.com/xhelmboyx/quicktime/formats/mp4-layout.txt */ | |
302 if (code > 138) { | |
303 for (i = 2; i >= 0; i--) { | |
304 to[i] = 0x60 + (code & 0x1f); | |
305 code >>= 5; | |
306 } | |
307 return 1; | |
308 } | |
309 /* old fashion apple lang code */ | |
4001 | 310 if (code >= FF_ARRAY_ELEMS(mov_mdhd_language_map)) |
1216 | 311 return 0; |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
312 if (!mov_mdhd_language_map[code][0]) |
1216 | 313 return 0; |
5612
4f20f4db87f7
Store strings directly in mov_mdhd_language_map instead of using pointers,
reimar
parents:
5611
diff
changeset
|
314 memcpy(to, mov_mdhd_language_map[code], 4); |
1216 | 315 return 1; |
316 } |