2 * RIFF common functions and data
3 * Copyright (c) 2000 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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"
28 #include "libavutil/avassert.h"
30 /* Note: When encoding, the first matching tag is used, so order is
31 * important if multiple tags are possible for a given codec.
32 * Note also that this list is used for more than just riff, other
33 * files use it as well.
35 const AVCodecTag ff_codec_bmp_tags[] = {
36 { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
37 { AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
38 { AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
39 { AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
40 { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
41 { AV_CODEC_ID_H264, MKTAG('D', 'A', 'V', 'C') },
42 { AV_CODEC_ID_H264, MKTAG('S', 'M', 'V', '2') },
43 { AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
44 { AV_CODEC_ID_H264, MKTAG('Q', '2', '6', '4') }, /* QNAP surveillance system */
45 { AV_CODEC_ID_H264, MKTAG('V', '2', '6', '4') },
46 { AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
47 { AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') },
48 { AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') },
49 { AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') },
50 { AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') },
51 { AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') },
52 { AV_CODEC_ID_H263, MKTAG('M', '2', '6', '3') },
53 { AV_CODEC_ID_H263, MKTAG('l', 's', 'v', 'm') },
54 { AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
55 { AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* Intel H.263 */
56 { AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
57 { AV_CODEC_ID_H263, MKTAG('U', '2', '6', '3') },
58 { AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
59 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
60 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
61 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
62 { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
63 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
64 /* some broken AVIs use this */
65 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) },
66 /* some broken AVIs use this */
67 { AV_CODEC_ID_MPEG4, MKTAG('Z', 'M', 'P', '4') },
68 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
69 { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
70 { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
71 { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
72 { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
73 { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
74 { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
75 { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
76 /* WaWv MPEG-4 Video Codec */
77 { AV_CODEC_ID_MPEG4, MKTAG('W', 'A', 'W', 'V') },
78 { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
79 { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
80 { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
81 { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
82 { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
83 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
84 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
85 { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
86 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
87 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
89 { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') },
90 { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
91 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
92 { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
94 { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') },
95 { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
97 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') },
98 { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
99 { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
100 { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
101 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
102 /* Samsung SHR-6040 */
103 { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') },
104 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', '4', 'V') },
105 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
106 { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
107 { AV_CODEC_ID_MPEG4, MKTAG('Q', 'M', 'P', '4') }, /* QNAP Systems */
108 { AV_CODEC_ID_MPEG4, MKTAG('P', 'L', 'V', '1') }, /* Pelco DVR MPEG-4 */
109 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
110 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
111 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
112 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
113 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
114 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
115 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
116 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
117 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
118 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
119 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
120 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
121 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
122 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
123 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
124 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
125 { AV_CODEC_ID_WMV2, MKTAG('G', 'X', 'V', 'E') },
126 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
127 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
128 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
129 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
130 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
131 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
133 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') },
135 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') },
137 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') },
138 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
139 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
140 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
141 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'i', 's') },
142 { AV_CODEC_ID_DVVIDEO, MKTAG('p', 'd', 'v', 'c') },
143 { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', '2', '5') },
144 { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', 'D', 'V') },
145 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
146 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
147 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
148 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
149 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
150 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
151 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
152 { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
153 { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
154 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
155 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
156 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
157 /* Lead MPEG-2 in AVI */
158 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') },
159 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
160 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
161 /* Matrox MPEG-2 intra-only */
162 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') },
163 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
164 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('B', 'W', '1', '0') },
165 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('X', 'M', 'P', 'G') }, /* Xing MPEG intra only */
166 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
167 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
168 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
169 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
170 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
171 /* Pegasus lossless JPEG */
172 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') },
173 /* JPEG-LS custom FOURCC for AVI - encoder */
174 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') },
175 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
176 /* JPEG-LS custom FOURCC for AVI - decoder */
177 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') },
178 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
179 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
180 { AV_CODEC_ID_AVRN, MKTAG('A', 'V', 'R', 'n') },
181 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
182 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
184 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') },
185 /* Creative Webcam JPEG */
186 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') },
187 /* Intel JPEG Library Video Codec */
188 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') },
189 /* Midvid JPEG Video Codec */
190 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') },
191 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
192 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
193 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
194 /* Paradigm Matrix M-JPEG Codec */
195 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') },
196 { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
197 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
198 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
199 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
200 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
201 { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
202 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
203 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
204 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
205 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
206 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
207 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
208 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
209 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
210 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
211 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
212 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
213 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
214 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
215 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
216 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
217 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
218 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
219 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
220 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
221 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
222 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
223 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
224 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
225 /* SoftLab-NSK VideoTizer */
226 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') },
227 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
228 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
229 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
230 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
231 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
232 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
233 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
234 { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
235 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'Y', 'U') },
236 { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
237 { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
238 { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
239 { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
240 { AV_CODEC_ID_V308, MKTAG('v', '3', '0', '8') },
241 { AV_CODEC_ID_V408, MKTAG('v', '4', '0', '8') },
242 { AV_CODEC_ID_AYUV, MKTAG('A', 'Y', 'U', 'V') },
243 { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
244 { AV_CODEC_ID_YUV4, MKTAG('y', 'u', 'v', '4') },
245 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
246 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
247 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
248 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
249 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
250 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
251 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
252 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
253 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
254 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
255 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
256 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
257 { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
258 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
259 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
260 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
261 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
262 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
263 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
264 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
265 { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
266 { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
267 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
268 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
269 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
270 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
271 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
272 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
273 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
274 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
275 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
276 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
277 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
278 { AV_CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
279 { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
280 { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
281 { AV_CODEC_ID_FLV1, MKTAG('S', '2', '6', '3') },
282 { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
283 { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
284 { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
285 { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
286 { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
287 { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
288 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
289 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
290 { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
291 { AV_CODEC_ID_WMV3IMAGE, MKTAG('W', 'M', 'V', 'P') },
292 { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
293 { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
294 { AV_CODEC_ID_VC1IMAGE, MKTAG('W', 'V', 'P', '2') },
295 { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
296 { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
297 { AV_CODEC_ID_WNV1, MKTAG('Y', 'U', 'V', '8') },
298 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', '4') },
299 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
300 { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
301 { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
302 { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
303 { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
304 { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
305 { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
306 { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
307 { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
308 { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
309 { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
310 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'C') },
311 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'K') },
312 { AV_CODEC_ID_JPEG2000, MKTAG('I', 'P', 'J', '2') },
313 { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
314 { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
315 { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
316 { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
317 { AV_CODEC_ID_CLJR, MKTAG('C', 'L', 'J', 'R') },
318 { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
319 { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
320 { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
321 { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
322 { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
323 { AV_CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') },
324 { AV_CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') },
325 { AV_CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
326 { AV_CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') },
327 { AV_CODEC_ID_LAGARITH, MKTAG('L', 'A', 'G', 'S') },
328 { AV_CODEC_ID_AMV, MKTAG('A', 'M', 'V', 'F') },
329 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'A') },
330 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'G') },
331 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '0') },
332 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
333 /* Ut Video version 13.0.1 BT.709 codecs */
334 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'H', '0') },
335 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'H', '2') },
336 { AV_CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
337 { AV_CODEC_ID_ESCAPE130, MKTAG('E', '1', '3', '0') },
338 { AV_CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
339 { AV_CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') },
340 { AV_CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') },
341 { AV_CODEC_ID_FLIC, MKTAG('A', 'F', 'L', 'C') },
342 { AV_CODEC_ID_EXR, MKTAG('e', 'x', 'r', ' ') },
343 { AV_CODEC_ID_MSS1, MKTAG('M', 'S', 'S', '1') },
344 { AV_CODEC_ID_MSA1, MKTAG('M', 'S', 'A', '1') },
345 { AV_CODEC_ID_TSCC2, MKTAG('T', 'S', 'C', '2') },
346 { AV_CODEC_ID_MTS2, MKTAG('M', 'T', 'S', '2') },
347 { AV_CODEC_ID_CLLC, MKTAG('C', 'L', 'L', 'C') },
348 { AV_CODEC_ID_MSS2, MKTAG('M', 'S', 'S', '2') },
349 { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
350 { AV_CODEC_ID_012V, MKTAG('0', '1', '2', 'v') },
351 { AV_CODEC_ID_012V, MKTAG('a', '1', '2', 'v') },
352 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '2') },
353 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '3') },
354 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '4') },
355 { AV_CODEC_ID_NONE, 0 }
358 const AVCodecTag ff_codec_wav_tags[] = {
359 { AV_CODEC_ID_PCM_S16LE, 0x0001 },
360 /* must come after s16le in this list */
361 { AV_CODEC_ID_PCM_U8, 0x0001 },
362 { AV_CODEC_ID_PCM_S24LE, 0x0001 },
363 { AV_CODEC_ID_PCM_S32LE, 0x0001 },
364 { AV_CODEC_ID_ADPCM_MS, 0x0002 },
365 { AV_CODEC_ID_PCM_F32LE, 0x0003 },
366 /* must come after f32le in this list */
367 { AV_CODEC_ID_PCM_F64LE, 0x0003 },
368 { AV_CODEC_ID_PCM_ALAW, 0x0006 },
369 { AV_CODEC_ID_PCM_MULAW, 0x0007 },
370 { AV_CODEC_ID_WMAVOICE, 0x000A },
371 { AV_CODEC_ID_ADPCM_IMA_OKI, 0x0010 },
372 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0011 },
373 /* must come after adpcm_ima_wav in this list */
374 { AV_CODEC_ID_PCM_ZORK, 0x0011 },
375 { AV_CODEC_ID_ADPCM_IMA_OKI, 0x0017 },
376 { AV_CODEC_ID_ADPCM_YAMAHA, 0x0020 },
377 { AV_CODEC_ID_TRUESPEECH, 0x0022 },
378 { AV_CODEC_ID_GSM_MS, 0x0031 },
379 { AV_CODEC_ID_AMR_NB, 0x0038 }, /* rogue format number */
380 { AV_CODEC_ID_G723_1, 0x0042 },
381 { AV_CODEC_ID_ADPCM_G726, 0x0045 },
382 { AV_CODEC_ID_MP2, 0x0050 },
383 { AV_CODEC_ID_MP3, 0x0055 },
384 { AV_CODEC_ID_AMR_NB, 0x0057 },
385 { AV_CODEC_ID_AMR_WB, 0x0058 },
386 /* rogue format number */
387 { AV_CODEC_ID_ADPCM_IMA_DK4, 0x0061 },
388 /* rogue format number */
389 { AV_CODEC_ID_ADPCM_IMA_DK3, 0x0062 },
390 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0069 },
391 { AV_CODEC_ID_VOXWARE, 0x0075 },
392 { AV_CODEC_ID_AAC, 0x00ff },
393 { AV_CODEC_ID_SIPR, 0x0130 },
394 { AV_CODEC_ID_WMAV1, 0x0160 },
395 { AV_CODEC_ID_WMAV2, 0x0161 },
396 { AV_CODEC_ID_WMAPRO, 0x0162 },
397 { AV_CODEC_ID_WMALOSSLESS, 0x0163 },
398 { AV_CODEC_ID_ADPCM_CT, 0x0200 },
399 { AV_CODEC_ID_ATRAC3, 0x0270 },
400 { AV_CODEC_ID_ADPCM_G722, 0x028F },
401 { AV_CODEC_ID_IMC, 0x0401 },
402 { AV_CODEC_ID_IAC, 0x0402 },
403 { AV_CODEC_ID_GSM_MS, 0x1500 },
404 { AV_CODEC_ID_TRUESPEECH, 0x1501 },
406 { AV_CODEC_ID_AAC, 0x1600 },
407 { AV_CODEC_ID_AAC_LATM, 0x1602 },
408 { AV_CODEC_ID_AC3, 0x2000 },
409 { AV_CODEC_ID_DTS, 0x2001 },
410 { AV_CODEC_ID_SONIC, 0x2048 },
411 { AV_CODEC_ID_SONIC_LS, 0x2048 },
412 { AV_CODEC_ID_PCM_MULAW, 0x6c75 },
413 { AV_CODEC_ID_AAC, 0x706d },
414 { AV_CODEC_ID_AAC, 0x4143 },
415 { AV_CODEC_ID_G723_1, 0xA100 },
416 { AV_CODEC_ID_AAC, 0xA106 },
417 { AV_CODEC_ID_SPEEX, 0xA109 },
418 { AV_CODEC_ID_FLAC, 0xF1AC },
419 { AV_CODEC_ID_ADPCM_SWF, ('S' << 8) + 'F' },
420 /* HACK/FIXME: Does Vorbis in WAV/AVI have an (in)official ID? */
421 { AV_CODEC_ID_VORBIS, ('V' << 8) + 'o' },
422 { AV_CODEC_ID_NONE, 0 },
425 const AVCodecGuid ff_codec_wav_guids[] = {
426 { AV_CODEC_ID_AC3, { 0x2C, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
427 { AV_CODEC_ID_ATRAC3P, { 0xBF, 0xAA, 0x23, 0xE9, 0x58, 0xCB, 0x71, 0x44, 0xA1, 0x19, 0xFF, 0xFA, 0x01, 0xE4, 0xCE, 0x62 } },
428 { AV_CODEC_ID_EAC3, { 0xAF, 0x87, 0xFB, 0xA7, 0x02, 0x2D, 0xFB, 0x42, 0xA4, 0xD4, 0x05, 0xCD, 0x93, 0x84, 0x3B, 0xDD } },
429 { AV_CODEC_ID_MP2, { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
433 const AVMetadataConv ff_riff_info_conv[] = {
434 { "IART", "artist" },
435 { "ICMT", "comment" },
436 { "ICOP", "copyright" },
439 { "ILNG", "language" },
443 { "ISFT", "encoder" },
444 { "ISMP", "timecode" },
445 { "ITCH", "encoded_by" },
449 void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
451 av_assert0(sizeof(*g) == 16); //compiler will optimize this out
452 if (avio_read(s, *g, sizeof(*g)) < (int)sizeof(*g))
453 memset(*g, 0, sizeof(*g));
456 enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
459 for (i = 0; guids[i].id != AV_CODEC_ID_NONE; i++)
460 if (!ff_guidcmp(guids[i].guid, guid))
462 return AV_CODEC_ID_NONE;
466 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
468 ffio_wfourcc(pb, tag);
470 return avio_tell(pb);
473 void ff_end_tag(AVIOContext *pb, int64_t start)
477 av_assert0((start&1) == 0);
482 avio_seek(pb, start - 4, SEEK_SET);
483 avio_wl32(pb, (uint32_t)(pos - start));
484 avio_seek(pb, FFALIGN(pos, 2), SEEK_SET);
487 /* WAVEFORMATEX header */
488 /* returns the size or -1 on error */
489 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
491 int bps, blkalign, bytespersec, frame_size;
493 int waveformatextensible;
495 uint8_t *riff_extradata = temp;
496 uint8_t *riff_extradata_start = temp;
498 if (!enc->codec_tag || enc->codec_tag > 0xffff)
501 /* We use the known constant frame size for the codec if known, otherwise
502 * fall back on using AVCodecContext.frame_size, which is not as reliable
503 * for indicating packet duration. */
504 frame_size = av_get_audio_frame_duration(enc, 0);
506 frame_size = enc->frame_size;
508 waveformatextensible = (enc->channels > 2 && enc->channel_layout) ||
509 enc->sample_rate > 48000 ||
510 av_get_bits_per_sample(enc->codec_id) > 16;
512 if (waveformatextensible)
513 avio_wl16(pb, 0xfffe);
515 avio_wl16(pb, enc->codec_tag);
517 avio_wl16(pb, enc->channels);
518 avio_wl32(pb, enc->sample_rate);
519 if (enc->codec_id == AV_CODEC_ID_ATRAC3 ||
520 enc->codec_id == AV_CODEC_ID_G723_1 ||
521 enc->codec_id == AV_CODEC_ID_MP2 ||
522 enc->codec_id == AV_CODEC_ID_MP3 ||
523 enc->codec_id == AV_CODEC_ID_GSM_MS) {
526 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
527 if (enc->bits_per_coded_sample)
528 bps = enc->bits_per_coded_sample;
530 bps = 16; // default to 16
533 if (bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample) {
534 av_log(enc, AV_LOG_WARNING,
535 "requested bits_per_coded_sample (%d) "
536 "and actually stored (%d) differ\n",
537 enc->bits_per_coded_sample, bps);
540 if (enc->codec_id == AV_CODEC_ID_MP2 ||
541 enc->codec_id == AV_CODEC_ID_MP3) {
542 /* This is wrong, but it seems many demuxers do not work if this
543 * is set correctly. */
544 blkalign = frame_size;
545 // blkalign = 144 * enc->bit_rate/enc->sample_rate;
546 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
547 blkalign = 3840; /* maximum bytes per frame */
548 } else if (enc->codec_id == AV_CODEC_ID_AAC) {
549 blkalign = 768 * enc->channels; /* maximum bytes per frame */
550 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
552 } else if (enc->block_align != 0) { /* specified by the codec */
553 blkalign = enc->block_align;
555 blkalign = bps * enc->channels / av_gcd(8, bps);
556 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
557 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
558 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
559 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
560 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
561 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
562 bytespersec = enc->sample_rate * blkalign;
563 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
566 bytespersec = enc->bit_rate / 8;
568 avio_wl32(pb, bytespersec); /* bytes per second */
569 avio_wl16(pb, blkalign); /* block align */
570 avio_wl16(pb, bps); /* bits per sample */
571 if (enc->codec_id == AV_CODEC_ID_MP3) {
573 bytestream_put_le16(&riff_extradata, 1); /* wID */
574 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
575 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
576 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
577 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
578 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
581 bytestream_put_le16(&riff_extradata, 2);
583 bytestream_put_le32(&riff_extradata, enc->bit_rate);
585 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8);
587 bytestream_put_le16(&riff_extradata, 0);
589 bytestream_put_le16(&riff_extradata, 1);
591 bytestream_put_le16(&riff_extradata, 16);
593 bytestream_put_le32(&riff_extradata, 0);
595 bytestream_put_le32(&riff_extradata, 0);
596 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
598 bytestream_put_le32(&riff_extradata, 0x9ace0002); /* extradata needed for msacm g723.1 codec */
599 bytestream_put_le32(&riff_extradata, 0xaea2f732);
600 bytestream_put_le16(&riff_extradata, 0xacde);
601 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS ||
602 enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
604 /* wSamplesPerBlock */
605 bytestream_put_le16(&riff_extradata, frame_size);
606 } else if (enc->extradata_size) {
607 riff_extradata_start = enc->extradata;
608 riff_extradata = enc->extradata + enc->extradata_size;
609 hdrsize += enc->extradata_size;
611 /* write WAVEFORMATEXTENSIBLE extensions */
612 if (waveformatextensible) {
614 /* 22 is WAVEFORMATEXTENSIBLE size */
615 avio_wl16(pb, riff_extradata - riff_extradata_start + 22);
616 /* ValidBitsPerSample || SamplesPerBlock || Reserved */
619 avio_wl32(pb, enc->channel_layout);
621 avio_wl32(pb, enc->codec_tag);
622 avio_wl32(pb, 0x00100000);
623 avio_wl32(pb, 0xAA000080);
624 avio_wl32(pb, 0x719B3800);
626 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
628 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
637 /* BITMAPINFOHEADER header */
638 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc,
639 const AVCodecTag *tags, int for_asf)
642 avio_wl32(pb, 40 + enc->extradata_size);
643 avio_wl32(pb, enc->width);
644 //We always store RGB TopDown
645 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
649 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24);
650 /* compression type */
651 avio_wl32(pb, enc->codec_tag);
652 avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8);
658 avio_write(pb, enc->extradata, enc->extradata_size);
660 if (!for_asf && enc->extradata_size & 1)
664 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate,
665 int *au_ssize, int *au_scale)
668 int audio_frame_size;
670 /* We use the known constant frame size for the codec if known, otherwise
671 * fall back on using AVCodecContext.frame_size, which is not as reliable
672 * for indicating packet duration. */
673 audio_frame_size = av_get_audio_frame_duration(stream, 0);
674 if (!audio_frame_size)
675 audio_frame_size = stream->frame_size;
677 *au_ssize = stream->block_align;
678 if (audio_frame_size && stream->sample_rate) {
679 *au_scale = audio_frame_size;
680 *au_rate = stream->sample_rate;
681 } else if (stream->codec_type == AVMEDIA_TYPE_VIDEO ||
682 stream->codec_type == AVMEDIA_TYPE_DATA ||
683 stream->codec_type == AVMEDIA_TYPE_SUBTITLE) {
684 *au_scale = stream->time_base.num;
685 *au_rate = stream->time_base.den;
687 *au_scale = stream->block_align ? stream->block_align * 8 : 8;
688 *au_rate = stream->bit_rate ? stream->bit_rate :
689 8 * stream->sample_rate;
691 gcd = av_gcd(*au_scale, *au_rate);
696 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
698 int len = strlen(str);
701 ffio_wfourcc(pb, tag);
703 avio_put_str(pb, str);
709 static const char riff_tags[][5] = {
710 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
711 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
712 "IPRT", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
716 static int riff_has_valid_tags(AVFormatContext *s)
720 for (i = 0; *riff_tags[i]; i++)
721 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
727 void ff_riff_write_info(AVFormatContext *s)
729 AVIOContext *pb = s->pb;
732 AVDictionaryEntry *t = NULL;
734 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
736 /* writing empty LIST is not nice and may cause problems */
737 if (!riff_has_valid_tags(s))
740 list_pos = ff_start_tag(pb, "LIST");
741 ffio_wfourcc(pb, "INFO");
742 for (i = 0; *riff_tags[i]; i++)
743 if ((t = av_dict_get(s->metadata, riff_tags[i],
744 NULL, AV_DICT_MATCH_CASE)))
745 ff_riff_write_info_tag(s->pb, t->key, t->value);
746 ff_end_tag(pb, list_pos);
748 #endif /* CONFIG_MUXERS */
751 /* We could be given one of the three possible structures here:
752 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
753 * is an expansion of the previous one with the fields added
754 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
755 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
756 * an openended structure.
759 static void parse_waveformatex(AVIOContext *pb, AVCodecContext *c)
761 ff_asf_guid subformat;
762 int bps = avio_rl16(pb);
764 c->bits_per_coded_sample = bps;
766 c->channel_layout = avio_rl32(pb); /* dwChannelMask */
768 ff_get_guid(pb, &subformat);
769 if (!memcmp(subformat + 4,
770 (const uint8_t[]){ FF_MEDIASUBTYPE_BASE_GUID }, 12)) {
771 c->codec_tag = AV_RL32(subformat);
772 c->codec_id = ff_wav_codec_get_id(c->codec_tag,
773 c->bits_per_coded_sample);
775 c->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
777 av_log(c, AV_LOG_WARNING,
778 "unknown subformat:"FF_PRI_GUID"\n",
779 FF_ARG_GUID(subformat));
783 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
788 codec->codec_type = AVMEDIA_TYPE_AUDIO;
789 codec->channels = avio_rl16(pb);
790 codec->sample_rate = avio_rl32(pb);
791 codec->bit_rate = avio_rl32(pb) * 8;
792 codec->block_align = avio_rl16(pb);
793 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
794 codec->bits_per_coded_sample = 8;
796 codec->bits_per_coded_sample = avio_rl16(pb);
798 codec->codec_tag = 0;
800 codec->codec_tag = id;
801 codec->codec_id = ff_wav_codec_get_id(id,
802 codec->bits_per_coded_sample);
804 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
805 int cbSize = avio_rl16(pb); /* cbSize */
807 cbSize = FFMIN(size, cbSize);
808 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
809 parse_waveformatex(pb, codec);
813 codec->extradata_size = cbSize;
815 av_free(codec->extradata);
816 codec->extradata = av_mallocz(codec->extradata_size +
817 FF_INPUT_BUFFER_PADDING_SIZE);
818 if (!codec->extradata)
819 return AVERROR(ENOMEM);
820 avio_read(pb, codec->extradata, codec->extradata_size);
824 /* It is possible for the chunk to contain garbage at the end */
828 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
829 /* Channels and sample_rate values are those prior to applying SBR
832 codec->sample_rate = 0;
834 /* override bits_per_coded_sample for G.726 */
835 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726 && codec->sample_rate)
836 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
841 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
844 id = ff_codec_get_id(ff_codec_wav_tags, tag);
848 if (id == AV_CODEC_ID_PCM_S16LE)
849 id = ff_get_pcm_codec_id(bps, 0, 0, ~1);
850 else if (id == AV_CODEC_ID_PCM_F32LE)
851 id = ff_get_pcm_codec_id(bps, 1, 0, 0);
853 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
854 id = AV_CODEC_ID_PCM_ZORK;
858 int ff_get_bmp_header(AVIOContext *pb, AVStream *st, unsigned *esize)
861 if(esize) *esize = avio_rl32(pb);
863 st->codec->width = avio_rl32(pb);
864 st->codec->height = (int32_t)avio_rl32(pb);
865 avio_rl16(pb); /* planes */
866 st->codec->bits_per_coded_sample = avio_rl16(pb); /* depth */
867 tag1 = avio_rl32(pb);
868 avio_rl32(pb); /* ImageSize */
869 avio_rl32(pb); /* XPelsPerMeter */
870 avio_rl32(pb); /* YPelsPerMeter */
871 avio_rl32(pb); /* ClrUsed */
872 avio_rl32(pb); /* ClrImportant */
876 int ff_read_riff_info(AVFormatContext *s, int64_t size)
878 int64_t start, end, cur;
879 AVIOContext *pb = s->pb;
881 start = avio_tell(pb);
884 while ((cur = avio_tell(pb)) >= 0 &&
885 cur <= end - 8 /* = tag + size */) {
891 chunk_code = avio_rl32(pb);
892 chunk_size = avio_rl32(pb);
894 if (chunk_code || chunk_size) {
895 av_log(s, AV_LOG_WARNING, "INFO subchunk truncated\n");
896 return AVERROR_INVALIDDATA;
900 if (chunk_size > end ||
901 end - chunk_size < cur ||
902 chunk_size == UINT_MAX) {
903 avio_seek(pb, -9, SEEK_CUR);
904 chunk_code = avio_rl32(pb);
905 chunk_size = avio_rl32(pb);
906 if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
907 av_log(s, AV_LOG_WARNING, "too big INFO subchunk\n");
908 return AVERROR_INVALIDDATA;
912 chunk_size += (chunk_size & 1);
916 avio_skip(pb, chunk_size);
917 else if (pb->eof_reached) {
918 av_log(s, AV_LOG_WARNING, "truncated file\n");
924 value = av_mallocz(chunk_size + 1);
926 av_log(s, AV_LOG_ERROR,
927 "out of memory, unable to read INFO tag\n");
928 return AVERROR(ENOMEM);
931 AV_WL32(key, chunk_code);
933 if (avio_read(pb, value, chunk_size) != chunk_size) {
934 av_log(s, AV_LOG_WARNING,
935 "premature end of file while reading INFO tag\n");
938 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
943 #endif /* CONFIG_DEMUXERS */