2 * RIFF common functions and data
3 * Copyright (c) 2000 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/mathematics.h"
23 #include "libavcodec/avcodec.h"
25 #include "avio_internal.h"
27 #include "libavcodec/bytestream.h"
29 /* Note: When encoding, the first matching tag is used, so order is
30 * important if multiple tags are possible for a given codec. */
31 const AVCodecTag ff_codec_bmp_tags[] = {
32 { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
33 { AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
34 { AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
35 { AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
36 { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
37 { AV_CODEC_ID_H264, MKTAG('D', 'A', 'V', 'C') },
38 { AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
39 { AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
40 { AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') },
41 { AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') },
42 { AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') },
43 { AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') },
44 { AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') },
45 { AV_CODEC_ID_H263, MKTAG('M', '2', '6', '3') },
46 { AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
47 { AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* Intel H.263 */
48 { AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
49 { AV_CODEC_ID_H263P, MKTAG('U', '2', '6', '3') },
50 { AV_CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') },
51 { AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
52 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
53 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
54 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
55 { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
56 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
57 /* some broken AVIs use this */
58 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) },
59 /* some broken AVIs use this */
60 { AV_CODEC_ID_MPEG4, MKTAG('Z', 'M', 'P', '4') },
61 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
62 { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
63 { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
64 { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
65 { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
66 { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
67 { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
68 { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
69 /* WaWv MPEG-4 Video Codec */
70 { AV_CODEC_ID_MPEG4, MKTAG('W', 'A', 'W', 'V') },
71 { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
72 { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
73 { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
74 { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
75 { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
76 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
77 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
78 { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
79 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
80 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
82 { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') },
83 { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
84 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
85 { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
87 { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') },
88 { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
90 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') },
91 { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
92 { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
93 { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
94 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
95 /* Samsung SHR-6040 */
96 { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') },
97 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
98 { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
99 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
100 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
101 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
102 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
103 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
104 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
105 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
106 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
107 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
108 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
109 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
110 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
111 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
112 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
113 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
114 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
115 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
116 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
117 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
118 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
119 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
120 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
122 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') },
124 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') },
126 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') },
127 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
128 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
129 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
130 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
131 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
132 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
133 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
134 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
135 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
136 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
137 { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
138 { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
139 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
140 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
141 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
142 /* Lead MPEG-2 in AVI */
143 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') },
144 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
145 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
146 /* Matrox MPEG-2 intra-only */
147 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') },
148 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
149 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
150 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
151 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
152 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
153 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
154 /* Pegasus lossless JPEG */
155 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') },
156 /* JPEG-LS custom FOURCC for AVI - encoder */
157 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') },
158 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
159 /* JPEG-LS custom FOURCC for AVI - decoder */
160 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') },
161 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
162 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
163 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
164 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
165 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
167 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') },
168 /* Creative Webcam JPEG */
169 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') },
170 /* Intel JPEG Library Video Codec */
171 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') },
172 /* Midvid JPEG Video Codec */
173 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') },
174 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
175 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
176 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
177 /* Paradigm Matrix M-JPEG Codec */
178 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') },
179 { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
180 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
181 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
182 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
183 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
184 { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
185 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
186 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
187 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
188 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
189 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
190 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
191 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
192 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
193 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
194 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
195 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
196 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
197 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
198 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
199 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
200 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
201 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
202 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
203 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
204 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
205 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
206 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
207 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
208 /* SoftLab-NSK VideoTizer */
209 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') },
210 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
211 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
212 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
213 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
214 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
215 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
216 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
217 { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
218 { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
219 { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
220 { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
221 { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
222 { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
223 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
224 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
225 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
226 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
227 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
228 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
229 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
230 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
231 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
232 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
233 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
234 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
235 { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
236 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
237 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
238 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
239 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
240 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
241 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
242 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
243 { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
244 { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
245 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
246 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
247 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
248 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
249 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
250 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
251 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
252 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
253 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
254 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
255 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
256 { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
257 { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
258 { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
259 { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
260 { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
261 { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
262 { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
263 { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
264 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
265 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
266 { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
267 { AV_CODEC_ID_WMV3IMAGE, MKTAG('W', 'M', 'V', 'P') },
268 { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
269 { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
270 { AV_CODEC_ID_VC1IMAGE, MKTAG('W', 'V', 'P', '2') },
271 { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
272 { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
273 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
274 { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
275 { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
276 { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
277 { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
278 { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
279 { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
280 { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
281 { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
282 { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
283 { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
284 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'C') },
285 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'K') },
286 { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
287 { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
288 { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
289 { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
290 { AV_CODEC_ID_CLJR, MKTAG('C', 'L', 'J', 'R') },
291 { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
292 { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
293 { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
294 { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
295 { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
296 { AV_CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') },
297 { AV_CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') },
298 { AV_CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
299 { AV_CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') },
300 { AV_CODEC_ID_LAGARITH, MKTAG('L', 'A', 'G', 'S') },
301 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'A') },
302 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'G') },
303 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '0') },
304 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
305 { AV_CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
306 { AV_CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
307 { AV_CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') },
308 { AV_CODEC_ID_MSS1, MKTAG('M', 'S', 'S', '1') },
309 { AV_CODEC_ID_MSA1, MKTAG('M', 'S', 'A', '1') },
310 { AV_CODEC_ID_TSCC2, MKTAG('T', 'S', 'C', '2') },
311 { AV_CODEC_ID_MTS2, MKTAG('M', 'T', 'S', '2') },
312 { AV_CODEC_ID_CLLC, MKTAG('C', 'L', 'L', 'C') },
313 { AV_CODEC_ID_MSS2, MKTAG('M', 'S', 'S', '2') },
314 { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
315 { AV_CODEC_ID_NONE, 0 }
318 const AVCodecTag ff_codec_wav_tags[] = {
319 { AV_CODEC_ID_PCM_S16LE, 0x0001 },
320 /* must come after s16le in this list */
321 { AV_CODEC_ID_PCM_U8, 0x0001 },
322 { AV_CODEC_ID_PCM_S24LE, 0x0001 },
323 { AV_CODEC_ID_PCM_S32LE, 0x0001 },
324 { AV_CODEC_ID_ADPCM_MS, 0x0002 },
325 { AV_CODEC_ID_PCM_F32LE, 0x0003 },
326 /* must come after f32le in this list */
327 { AV_CODEC_ID_PCM_F64LE, 0x0003 },
328 { AV_CODEC_ID_PCM_ALAW, 0x0006 },
329 { AV_CODEC_ID_PCM_MULAW, 0x0007 },
330 { AV_CODEC_ID_WMAVOICE, 0x000A },
331 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0011 },
332 /* must come after adpcm_ima_wav in this list */
333 { AV_CODEC_ID_PCM_ZORK, 0x0011 },
334 { AV_CODEC_ID_ADPCM_YAMAHA, 0x0020 },
335 { AV_CODEC_ID_TRUESPEECH, 0x0022 },
336 { AV_CODEC_ID_GSM_MS, 0x0031 },
337 { AV_CODEC_ID_ADPCM_G726, 0x0045 },
338 { AV_CODEC_ID_MP2, 0x0050 },
339 { AV_CODEC_ID_MP3, 0x0055 },
340 { AV_CODEC_ID_AMR_NB, 0x0057 },
341 { AV_CODEC_ID_AMR_WB, 0x0058 },
342 /* rogue format number */
343 { AV_CODEC_ID_ADPCM_IMA_DK4, 0x0061 },
344 /* rogue format number */
345 { AV_CODEC_ID_ADPCM_IMA_DK3, 0x0062 },
346 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0069 },
347 { AV_CODEC_ID_VOXWARE, 0x0075 },
348 { AV_CODEC_ID_AAC, 0x00ff },
349 { AV_CODEC_ID_SIPR, 0x0130 },
350 { AV_CODEC_ID_WMAV1, 0x0160 },
351 { AV_CODEC_ID_WMAV2, 0x0161 },
352 { AV_CODEC_ID_WMAPRO, 0x0162 },
353 { AV_CODEC_ID_WMALOSSLESS, 0x0163 },
354 { AV_CODEC_ID_ADPCM_CT, 0x0200 },
355 { AV_CODEC_ID_ATRAC3, 0x0270 },
356 { AV_CODEC_ID_ADPCM_G722, 0x028F },
357 { AV_CODEC_ID_IMC, 0x0401 },
358 { AV_CODEC_ID_IAC, 0x0402 },
359 { AV_CODEC_ID_GSM_MS, 0x1500 },
360 { AV_CODEC_ID_TRUESPEECH, 0x1501 },
362 { AV_CODEC_ID_AAC, 0x1600 },
363 { AV_CODEC_ID_AAC_LATM, 0x1602 },
364 { AV_CODEC_ID_AC3, 0x2000 },
365 { AV_CODEC_ID_DTS, 0x2001 },
366 { AV_CODEC_ID_PCM_MULAW, 0x6c75 },
367 { AV_CODEC_ID_AAC, 0x706d },
368 { AV_CODEC_ID_AAC, 0x4143 },
369 { AV_CODEC_ID_SPEEX, 0xA109 },
370 { AV_CODEC_ID_FLAC, 0xF1AC },
371 { AV_CODEC_ID_ADPCM_SWF, ('S' << 8) + 'F' },
372 /* HACK/FIXME: Does Vorbis in WAV/AVI have an (in)official ID? */
373 { AV_CODEC_ID_VORBIS, ('V' << 8) + 'o' },
374 { AV_CODEC_ID_NONE, 0 },
377 const AVCodecGuid ff_codec_wav_guids[] = {
378 { AV_CODEC_ID_AC3, { 0x2C, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
379 { AV_CODEC_ID_ATRAC3P, { 0xBF, 0xAA, 0x23, 0xE9, 0x58, 0xCB, 0x71, 0x44, 0xA1, 0x19, 0xFF, 0xFA, 0x01, 0xE4, 0xCE, 0x62 } },
380 { AV_CODEC_ID_EAC3, { 0xAF, 0x87, 0xFB, 0xA7, 0x02, 0x2D, 0xFB, 0x42, 0xA4, 0xD4, 0x05, 0xCD, 0x93, 0x84, 0x3B, 0xDD } },
381 { AV_CODEC_ID_MP2, { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
385 const AVMetadataConv ff_riff_info_conv[] = {
386 { "IART", "artist" },
387 { "ICMT", "comment" },
388 { "ICOP", "copyright" },
391 { "ILNG", "language" },
395 { "ISFT", "encoder" },
396 { "ITCH", "encoded_by" },
400 enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
403 for (i = 0; guids[i].id != AV_CODEC_ID_NONE; i++)
404 if (!ff_guidcmp(guids[i].guid, guid))
406 return AV_CODEC_ID_NONE;
410 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
412 ffio_wfourcc(pb, tag);
414 return avio_tell(pb);
417 void ff_end_tag(AVIOContext *pb, int64_t start)
422 avio_seek(pb, start - 4, SEEK_SET);
423 avio_wl32(pb, (uint32_t)(pos - start));
424 avio_seek(pb, pos, SEEK_SET);
427 /* WAVEFORMATEX header */
428 /* returns the size or -1 on error */
429 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
431 int bps, blkalign, bytespersec, frame_size;
433 int waveformatextensible;
435 uint8_t *riff_extradata = temp;
436 uint8_t *riff_extradata_start = temp;
438 if (!enc->codec_tag || enc->codec_tag > 0xffff)
441 /* We use the known constant frame size for the codec if known, otherwise
442 * fall back on using AVCodecContext.frame_size, which is not as reliable
443 * for indicating packet duration. */
444 frame_size = av_get_audio_frame_duration(enc, 0);
446 frame_size = enc->frame_size;
448 waveformatextensible = (enc->channels > 2 && enc->channel_layout) ||
449 enc->sample_rate > 48000 ||
450 av_get_bits_per_sample(enc->codec_id) > 16;
452 if (waveformatextensible)
453 avio_wl16(pb, 0xfffe);
455 avio_wl16(pb, enc->codec_tag);
457 avio_wl16(pb, enc->channels);
458 avio_wl32(pb, enc->sample_rate);
459 if (enc->codec_id == AV_CODEC_ID_MP2 ||
460 enc->codec_id == AV_CODEC_ID_MP3 ||
461 enc->codec_id == AV_CODEC_ID_GSM_MS) {
464 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
465 if (enc->bits_per_coded_sample)
466 bps = enc->bits_per_coded_sample;
468 bps = 16; // default to 16
471 if (bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample) {
472 av_log(enc, AV_LOG_WARNING,
473 "requested bits_per_coded_sample (%d) "
474 "and actually stored (%d) differ\n",
475 enc->bits_per_coded_sample, bps);
478 if (enc->codec_id == AV_CODEC_ID_MP2 ||
479 enc->codec_id == AV_CODEC_ID_MP3) {
480 /* This is wrong, but it seems many demuxers do not work if this
481 * is set correctly. */
482 blkalign = frame_size;
483 // blkalign = 144 * enc->bit_rate/enc->sample_rate;
484 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
485 blkalign = 3840; /* maximum bytes per frame */
486 } else if (enc->block_align != 0) { /* specified by the codec */
487 blkalign = enc->block_align;
489 blkalign = bps * enc->channels / av_gcd(8, bps);
490 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
491 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
492 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
493 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
494 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
495 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
496 bytespersec = enc->sample_rate * blkalign;
498 bytespersec = enc->bit_rate / 8;
500 avio_wl32(pb, bytespersec); /* bytes per second */
501 avio_wl16(pb, blkalign); /* block align */
502 avio_wl16(pb, bps); /* bits per sample */
503 if (enc->codec_id == AV_CODEC_ID_MP3) {
505 bytestream_put_le16(&riff_extradata, 1); /* wID */
506 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
507 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
508 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
509 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
510 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
513 bytestream_put_le16(&riff_extradata, 2);
515 bytestream_put_le32(&riff_extradata, enc->bit_rate);
517 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8);
519 bytestream_put_le16(&riff_extradata, 0);
521 bytestream_put_le16(&riff_extradata, 1);
523 bytestream_put_le16(&riff_extradata, 16);
525 bytestream_put_le32(&riff_extradata, 0);
527 bytestream_put_le32(&riff_extradata, 0);
528 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS ||
529 enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
531 /* wSamplesPerBlock */
532 bytestream_put_le16(&riff_extradata, frame_size);
533 } else if (enc->extradata_size) {
534 riff_extradata_start = enc->extradata;
535 riff_extradata = enc->extradata + enc->extradata_size;
536 hdrsize += enc->extradata_size;
538 /* write WAVEFORMATEXTENSIBLE extensions */
539 if (waveformatextensible) {
541 /* 22 is WAVEFORMATEXTENSIBLE size */
542 avio_wl16(pb, riff_extradata - riff_extradata_start + 22);
543 /* ValidBitsPerSample || SamplesPerBlock || Reserved */
546 avio_wl32(pb, enc->channel_layout);
548 avio_wl32(pb, enc->codec_tag);
549 avio_wl32(pb, 0x00100000);
550 avio_wl32(pb, 0xAA000080);
551 avio_wl32(pb, 0x719B3800);
553 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
555 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
564 /* BITMAPINFOHEADER header */
565 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc,
566 const AVCodecTag *tags, int for_asf)
569 avio_wl32(pb, 40 + enc->extradata_size);
570 avio_wl32(pb, enc->width);
571 //We always store RGB TopDown
572 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
576 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24);
577 /* compression type */
578 avio_wl32(pb, enc->codec_tag);
579 avio_wl32(pb, enc->width * enc->height * 3);
585 avio_write(pb, enc->extradata, enc->extradata_size);
587 if (!for_asf && enc->extradata_size & 1)
591 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate,
592 int *au_ssize, int *au_scale)
595 int audio_frame_size;
597 /* We use the known constant frame size for the codec if known, otherwise
598 * fall back on using AVCodecContext.frame_size, which is not as reliable
599 * for indicating packet duration. */
600 audio_frame_size = av_get_audio_frame_duration(stream, 0);
601 if (!audio_frame_size)
602 audio_frame_size = stream->frame_size;
604 *au_ssize = stream->block_align;
605 if (audio_frame_size && stream->sample_rate) {
606 *au_scale = audio_frame_size;
607 *au_rate = stream->sample_rate;
608 } else if (stream->codec_type == AVMEDIA_TYPE_VIDEO ||
609 stream->codec_type == AVMEDIA_TYPE_DATA ||
610 stream->codec_type == AVMEDIA_TYPE_SUBTITLE) {
611 *au_scale = stream->time_base.num;
612 *au_rate = stream->time_base.den;
614 *au_scale = stream->block_align ? stream->block_align * 8 : 8;
615 *au_rate = stream->bit_rate ? stream->bit_rate :
616 8 * stream->sample_rate;
618 gcd = av_gcd(*au_scale, *au_rate);
623 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
625 int len = strlen(str);
628 ffio_wfourcc(pb, tag);
630 avio_put_str(pb, str);
636 static const char riff_tags[][5] = {
637 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
638 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
639 "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
643 static int riff_has_valid_tags(AVFormatContext *s)
647 for (i = 0; *riff_tags[i]; i++)
648 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
654 void ff_riff_write_info(AVFormatContext *s)
656 AVIOContext *pb = s->pb;
659 AVDictionaryEntry *t = NULL;
661 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
663 /* writing empty LIST is not nice and may cause problems */
664 if (!riff_has_valid_tags(s))
667 list_pos = ff_start_tag(pb, "LIST");
668 ffio_wfourcc(pb, "INFO");
669 for (i = 0; *riff_tags[i]; i++)
670 if ((t = av_dict_get(s->metadata, riff_tags[i],
671 NULL, AV_DICT_MATCH_CASE)))
672 ff_riff_write_info_tag(s->pb, t->key, t->value);
673 ff_end_tag(pb, list_pos);
675 #endif /* CONFIG_MUXERS */
678 /* We could be given one of the three possible structures here:
679 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
680 * is an expansion of the previous one with the fields added
681 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
682 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
683 * an openended structure.
686 static void parse_waveformatex(AVIOContext *pb, AVCodecContext *c)
688 ff_asf_guid subformat;
689 c->bits_per_coded_sample = avio_rl16(pb);
690 c->channel_layout = avio_rl32(pb); /* dwChannelMask */
692 ff_get_guid(pb, &subformat);
693 if (!memcmp(subformat + 4,
694 (const uint8_t[]){ FF_MEDIASUBTYPE_BASE_GUID }, 12)) {
695 c->codec_tag = AV_RL32(subformat);
696 c->codec_id = ff_wav_codec_get_id(c->codec_tag,
697 c->bits_per_coded_sample);
699 c->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
701 av_log(c, AV_LOG_WARNING,
702 "unknown subformat:"FF_PRI_GUID"\n",
703 FF_ARG_GUID(subformat));
707 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
712 codec->codec_type = AVMEDIA_TYPE_AUDIO;
713 codec->channels = avio_rl16(pb);
714 codec->sample_rate = avio_rl32(pb);
715 codec->bit_rate = avio_rl32(pb) * 8;
716 codec->block_align = avio_rl16(pb);
717 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
718 codec->bits_per_coded_sample = 8;
720 codec->bits_per_coded_sample = avio_rl16(pb);
722 codec->codec_tag = 0;
724 codec->codec_tag = id;
725 codec->codec_id = ff_wav_codec_get_id(id,
726 codec->bits_per_coded_sample);
728 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
729 int cbSize = avio_rl16(pb); /* cbSize */
731 cbSize = FFMIN(size, cbSize);
732 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
733 parse_waveformatex(pb, codec);
737 codec->extradata_size = cbSize;
739 av_free(codec->extradata);
740 codec->extradata = av_mallocz(codec->extradata_size +
741 FF_INPUT_BUFFER_PADDING_SIZE);
742 if (!codec->extradata)
743 return AVERROR(ENOMEM);
744 avio_read(pb, codec->extradata, codec->extradata_size);
748 /* It is possible for the chunk to contain garbage at the end */
752 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
753 /* Channels and sample_rate values are those prior to applying SBR
756 codec->sample_rate = 0;
758 /* override bits_per_coded_sample for G.726 */
759 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
760 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
765 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
768 id = ff_codec_get_id(ff_codec_wav_tags, tag);
772 if (id == AV_CODEC_ID_PCM_S16LE)
773 id = ff_get_pcm_codec_id(bps, 0, 0, ~1);
774 else if (id == AV_CODEC_ID_PCM_F32LE)
775 id = ff_get_pcm_codec_id(bps, 1, 0, 0);
777 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
778 id = AV_CODEC_ID_PCM_ZORK;
782 int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
785 avio_rl32(pb); /* size */
786 st->codec->width = avio_rl32(pb);
787 st->codec->height = (int32_t)avio_rl32(pb);
788 avio_rl16(pb); /* planes */
789 st->codec->bits_per_coded_sample = avio_rl16(pb); /* depth */
790 tag1 = avio_rl32(pb);
791 avio_rl32(pb); /* ImageSize */
792 avio_rl32(pb); /* XPelsPerMeter */
793 avio_rl32(pb); /* YPelsPerMeter */
794 avio_rl32(pb); /* ClrUsed */
795 avio_rl32(pb); /* ClrImportant */
799 int ff_read_riff_info(AVFormatContext *s, int64_t size)
801 int64_t start, end, cur;
802 AVIOContext *pb = s->pb;
804 start = avio_tell(pb);
807 while ((cur = avio_tell(pb)) >= 0 &&
808 cur <= end - 8 /* = tag + size */) {
814 chunk_code = avio_rl32(pb);
815 chunk_size = avio_rl32(pb);
817 if (chunk_size > end ||
818 end - chunk_size < cur ||
819 chunk_size == UINT_MAX) {
820 av_log(s, AV_LOG_WARNING, "too big INFO subchunk\n");
824 chunk_size += (chunk_size & 1);
828 avio_skip(pb, chunk_size);
829 else if (pb->eof_reached) {
830 av_log(s, AV_LOG_WARNING, "truncated file\n");
836 value = av_malloc(chunk_size + 1);
838 av_log(s, AV_LOG_ERROR,
839 "out of memory, unable to read INFO tag\n");
840 return AVERROR(ENOMEM);
843 AV_WL32(key, chunk_code);
845 if (avio_read(pb, value, chunk_size) != chunk_size) {
847 av_log(s, AV_LOG_WARNING,
848 "premature end of file while reading INFO tag\n");
852 value[chunk_size] = 0;
854 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
859 #endif /* CONFIG_DEMUXERS */