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_G2M, MKTAG('G', '2', 'M', '2') },
316 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '3') },
317 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '4') },
318 { AV_CODEC_ID_NONE, 0 }
321 const AVCodecTag ff_codec_wav_tags[] = {
322 { AV_CODEC_ID_PCM_S16LE, 0x0001 },
323 /* must come after s16le in this list */
324 { AV_CODEC_ID_PCM_U8, 0x0001 },
325 { AV_CODEC_ID_PCM_S24LE, 0x0001 },
326 { AV_CODEC_ID_PCM_S32LE, 0x0001 },
327 { AV_CODEC_ID_ADPCM_MS, 0x0002 },
328 { AV_CODEC_ID_PCM_F32LE, 0x0003 },
329 /* must come after f32le in this list */
330 { AV_CODEC_ID_PCM_F64LE, 0x0003 },
331 { AV_CODEC_ID_PCM_ALAW, 0x0006 },
332 { AV_CODEC_ID_PCM_MULAW, 0x0007 },
333 { AV_CODEC_ID_WMAVOICE, 0x000A },
334 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0011 },
335 /* must come after adpcm_ima_wav in this list */
336 { AV_CODEC_ID_PCM_ZORK, 0x0011 },
337 { AV_CODEC_ID_ADPCM_YAMAHA, 0x0020 },
338 { AV_CODEC_ID_TRUESPEECH, 0x0022 },
339 { AV_CODEC_ID_GSM_MS, 0x0031 },
340 { AV_CODEC_ID_ADPCM_G726, 0x0045 },
341 { AV_CODEC_ID_MP2, 0x0050 },
342 { AV_CODEC_ID_MP3, 0x0055 },
343 { AV_CODEC_ID_AMR_NB, 0x0057 },
344 { AV_CODEC_ID_AMR_WB, 0x0058 },
345 /* rogue format number */
346 { AV_CODEC_ID_ADPCM_IMA_DK4, 0x0061 },
347 /* rogue format number */
348 { AV_CODEC_ID_ADPCM_IMA_DK3, 0x0062 },
349 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0069 },
350 { AV_CODEC_ID_VOXWARE, 0x0075 },
351 { AV_CODEC_ID_AAC, 0x00ff },
352 { AV_CODEC_ID_SIPR, 0x0130 },
353 { AV_CODEC_ID_WMAV1, 0x0160 },
354 { AV_CODEC_ID_WMAV2, 0x0161 },
355 { AV_CODEC_ID_WMAPRO, 0x0162 },
356 { AV_CODEC_ID_WMALOSSLESS, 0x0163 },
357 { AV_CODEC_ID_ADPCM_CT, 0x0200 },
358 { AV_CODEC_ID_ATRAC3, 0x0270 },
359 { AV_CODEC_ID_ADPCM_G722, 0x028F },
360 { AV_CODEC_ID_IMC, 0x0401 },
361 { AV_CODEC_ID_IAC, 0x0402 },
362 { AV_CODEC_ID_GSM_MS, 0x1500 },
363 { AV_CODEC_ID_TRUESPEECH, 0x1501 },
365 { AV_CODEC_ID_AAC, 0x1600 },
366 { AV_CODEC_ID_AAC_LATM, 0x1602 },
367 { AV_CODEC_ID_AC3, 0x2000 },
368 { AV_CODEC_ID_DTS, 0x2001 },
369 { AV_CODEC_ID_PCM_MULAW, 0x6c75 },
370 { AV_CODEC_ID_AAC, 0x706d },
371 { AV_CODEC_ID_AAC, 0x4143 },
372 { AV_CODEC_ID_SPEEX, 0xA109 },
373 { AV_CODEC_ID_FLAC, 0xF1AC },
374 { AV_CODEC_ID_ADPCM_SWF, ('S' << 8) + 'F' },
375 /* HACK/FIXME: Does Vorbis in WAV/AVI have an (in)official ID? */
376 { AV_CODEC_ID_VORBIS, ('V' << 8) + 'o' },
377 { AV_CODEC_ID_NONE, 0 },
380 const AVCodecGuid ff_codec_wav_guids[] = {
381 { AV_CODEC_ID_AC3, { 0x2C, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
382 { AV_CODEC_ID_ATRAC3P, { 0xBF, 0xAA, 0x23, 0xE9, 0x58, 0xCB, 0x71, 0x44, 0xA1, 0x19, 0xFF, 0xFA, 0x01, 0xE4, 0xCE, 0x62 } },
383 { AV_CODEC_ID_EAC3, { 0xAF, 0x87, 0xFB, 0xA7, 0x02, 0x2D, 0xFB, 0x42, 0xA4, 0xD4, 0x05, 0xCD, 0x93, 0x84, 0x3B, 0xDD } },
384 { AV_CODEC_ID_MP2, { 0x2B, 0x80, 0x6D, 0xE0, 0x46, 0xDB, 0xCF, 0x11, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA } },
388 const AVMetadataConv ff_riff_info_conv[] = {
389 { "IART", "artist" },
390 { "ICMT", "comment" },
391 { "ICOP", "copyright" },
394 { "ILNG", "language" },
398 { "ISFT", "encoder" },
399 { "ITCH", "encoded_by" },
403 enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
406 for (i = 0; guids[i].id != AV_CODEC_ID_NONE; i++)
407 if (!ff_guidcmp(guids[i].guid, guid))
409 return AV_CODEC_ID_NONE;
413 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
415 ffio_wfourcc(pb, tag);
417 return avio_tell(pb);
420 void ff_end_tag(AVIOContext *pb, int64_t start)
425 avio_seek(pb, start - 4, SEEK_SET);
426 avio_wl32(pb, (uint32_t)(pos - start));
427 avio_seek(pb, pos, SEEK_SET);
430 /* WAVEFORMATEX header */
431 /* returns the size or -1 on error */
432 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
434 int bps, blkalign, bytespersec, frame_size;
436 int waveformatextensible;
438 uint8_t *riff_extradata = temp;
439 uint8_t *riff_extradata_start = temp;
441 if (!enc->codec_tag || enc->codec_tag > 0xffff)
444 /* We use the known constant frame size for the codec if known, otherwise
445 * fall back on using AVCodecContext.frame_size, which is not as reliable
446 * for indicating packet duration. */
447 frame_size = av_get_audio_frame_duration(enc, 0);
449 frame_size = enc->frame_size;
451 waveformatextensible = (enc->channels > 2 && enc->channel_layout) ||
452 enc->sample_rate > 48000 ||
453 av_get_bits_per_sample(enc->codec_id) > 16;
455 if (waveformatextensible)
456 avio_wl16(pb, 0xfffe);
458 avio_wl16(pb, enc->codec_tag);
460 avio_wl16(pb, enc->channels);
461 avio_wl32(pb, enc->sample_rate);
462 if (enc->codec_id == AV_CODEC_ID_MP2 ||
463 enc->codec_id == AV_CODEC_ID_MP3 ||
464 enc->codec_id == AV_CODEC_ID_GSM_MS) {
467 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
468 if (enc->bits_per_coded_sample)
469 bps = enc->bits_per_coded_sample;
471 bps = 16; // default to 16
474 if (bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample) {
475 av_log(enc, AV_LOG_WARNING,
476 "requested bits_per_coded_sample (%d) "
477 "and actually stored (%d) differ\n",
478 enc->bits_per_coded_sample, bps);
481 if (enc->codec_id == AV_CODEC_ID_MP2 ||
482 enc->codec_id == AV_CODEC_ID_MP3) {
483 /* This is wrong, but it seems many demuxers do not work if this
484 * is set correctly. */
485 blkalign = frame_size;
486 // blkalign = 144 * enc->bit_rate/enc->sample_rate;
487 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
488 blkalign = 3840; /* maximum bytes per frame */
489 } else if (enc->block_align != 0) { /* specified by the codec */
490 blkalign = enc->block_align;
492 blkalign = bps * enc->channels / av_gcd(8, bps);
493 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
494 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
495 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
496 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
497 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
498 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
499 bytespersec = enc->sample_rate * blkalign;
501 bytespersec = enc->bit_rate / 8;
503 avio_wl32(pb, bytespersec); /* bytes per second */
504 avio_wl16(pb, blkalign); /* block align */
505 avio_wl16(pb, bps); /* bits per sample */
506 if (enc->codec_id == AV_CODEC_ID_MP3) {
508 bytestream_put_le16(&riff_extradata, 1); /* wID */
509 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
510 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
511 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
512 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
513 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
516 bytestream_put_le16(&riff_extradata, 2);
518 bytestream_put_le32(&riff_extradata, enc->bit_rate);
520 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8);
522 bytestream_put_le16(&riff_extradata, 0);
524 bytestream_put_le16(&riff_extradata, 1);
526 bytestream_put_le16(&riff_extradata, 16);
528 bytestream_put_le32(&riff_extradata, 0);
530 bytestream_put_le32(&riff_extradata, 0);
531 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS ||
532 enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
534 /* wSamplesPerBlock */
535 bytestream_put_le16(&riff_extradata, frame_size);
536 } else if (enc->extradata_size) {
537 riff_extradata_start = enc->extradata;
538 riff_extradata = enc->extradata + enc->extradata_size;
539 hdrsize += enc->extradata_size;
541 /* write WAVEFORMATEXTENSIBLE extensions */
542 if (waveformatextensible) {
544 /* 22 is WAVEFORMATEXTENSIBLE size */
545 avio_wl16(pb, riff_extradata - riff_extradata_start + 22);
546 /* ValidBitsPerSample || SamplesPerBlock || Reserved */
549 avio_wl32(pb, enc->channel_layout);
551 avio_wl32(pb, enc->codec_tag);
552 avio_wl32(pb, 0x00100000);
553 avio_wl32(pb, 0xAA000080);
554 avio_wl32(pb, 0x719B3800);
556 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
558 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
567 /* BITMAPINFOHEADER header */
568 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc,
569 const AVCodecTag *tags, int for_asf)
572 avio_wl32(pb, 40 + enc->extradata_size);
573 avio_wl32(pb, enc->width);
574 //We always store RGB TopDown
575 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
579 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24);
580 /* compression type */
581 avio_wl32(pb, enc->codec_tag);
582 avio_wl32(pb, enc->width * enc->height * 3);
588 avio_write(pb, enc->extradata, enc->extradata_size);
590 if (!for_asf && enc->extradata_size & 1)
594 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate,
595 int *au_ssize, int *au_scale)
598 int audio_frame_size;
600 /* We use the known constant frame size for the codec if known, otherwise
601 * fall back on using AVCodecContext.frame_size, which is not as reliable
602 * for indicating packet duration. */
603 audio_frame_size = av_get_audio_frame_duration(stream, 0);
604 if (!audio_frame_size)
605 audio_frame_size = stream->frame_size;
607 *au_ssize = stream->block_align;
608 if (audio_frame_size && stream->sample_rate) {
609 *au_scale = audio_frame_size;
610 *au_rate = stream->sample_rate;
611 } else if (stream->codec_type == AVMEDIA_TYPE_VIDEO ||
612 stream->codec_type == AVMEDIA_TYPE_DATA ||
613 stream->codec_type == AVMEDIA_TYPE_SUBTITLE) {
614 *au_scale = stream->time_base.num;
615 *au_rate = stream->time_base.den;
617 *au_scale = stream->block_align ? stream->block_align * 8 : 8;
618 *au_rate = stream->bit_rate ? stream->bit_rate :
619 8 * stream->sample_rate;
621 gcd = av_gcd(*au_scale, *au_rate);
626 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
628 int len = strlen(str);
631 ffio_wfourcc(pb, tag);
633 avio_put_str(pb, str);
639 static const char riff_tags[][5] = {
640 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
641 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
642 "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
646 static int riff_has_valid_tags(AVFormatContext *s)
650 for (i = 0; *riff_tags[i]; i++)
651 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
657 void ff_riff_write_info(AVFormatContext *s)
659 AVIOContext *pb = s->pb;
662 AVDictionaryEntry *t = NULL;
664 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
666 /* writing empty LIST is not nice and may cause problems */
667 if (!riff_has_valid_tags(s))
670 list_pos = ff_start_tag(pb, "LIST");
671 ffio_wfourcc(pb, "INFO");
672 for (i = 0; *riff_tags[i]; i++)
673 if ((t = av_dict_get(s->metadata, riff_tags[i],
674 NULL, AV_DICT_MATCH_CASE)))
675 ff_riff_write_info_tag(s->pb, t->key, t->value);
676 ff_end_tag(pb, list_pos);
678 #endif /* CONFIG_MUXERS */
681 /* We could be given one of the three possible structures here:
682 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
683 * is an expansion of the previous one with the fields added
684 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
685 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
686 * an openended structure.
689 static void parse_waveformatex(AVIOContext *pb, AVCodecContext *c)
691 ff_asf_guid subformat;
692 c->bits_per_coded_sample = avio_rl16(pb);
693 c->channel_layout = avio_rl32(pb); /* dwChannelMask */
695 ff_get_guid(pb, &subformat);
696 if (!memcmp(subformat + 4,
697 (const uint8_t[]){ FF_MEDIASUBTYPE_BASE_GUID }, 12)) {
698 c->codec_tag = AV_RL32(subformat);
699 c->codec_id = ff_wav_codec_get_id(c->codec_tag,
700 c->bits_per_coded_sample);
702 c->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
704 av_log(c, AV_LOG_WARNING,
705 "unknown subformat:"FF_PRI_GUID"\n",
706 FF_ARG_GUID(subformat));
710 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
715 codec->codec_type = AVMEDIA_TYPE_AUDIO;
716 codec->channels = avio_rl16(pb);
717 codec->sample_rate = avio_rl32(pb);
718 codec->bit_rate = avio_rl32(pb) * 8;
719 codec->block_align = avio_rl16(pb);
720 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
721 codec->bits_per_coded_sample = 8;
723 codec->bits_per_coded_sample = avio_rl16(pb);
725 codec->codec_tag = 0;
727 codec->codec_tag = id;
728 codec->codec_id = ff_wav_codec_get_id(id,
729 codec->bits_per_coded_sample);
731 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
732 int cbSize = avio_rl16(pb); /* cbSize */
734 cbSize = FFMIN(size, cbSize);
735 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
736 parse_waveformatex(pb, codec);
740 codec->extradata_size = cbSize;
742 av_free(codec->extradata);
743 codec->extradata = av_mallocz(codec->extradata_size +
744 FF_INPUT_BUFFER_PADDING_SIZE);
745 if (!codec->extradata)
746 return AVERROR(ENOMEM);
747 avio_read(pb, codec->extradata, codec->extradata_size);
751 /* It is possible for the chunk to contain garbage at the end */
755 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
756 /* Channels and sample_rate values are those prior to applying SBR
759 codec->sample_rate = 0;
761 /* override bits_per_coded_sample for G.726 */
762 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
763 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
768 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
771 id = ff_codec_get_id(ff_codec_wav_tags, tag);
775 if (id == AV_CODEC_ID_PCM_S16LE)
776 id = ff_get_pcm_codec_id(bps, 0, 0, ~1);
777 else if (id == AV_CODEC_ID_PCM_F32LE)
778 id = ff_get_pcm_codec_id(bps, 1, 0, 0);
780 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
781 id = AV_CODEC_ID_PCM_ZORK;
785 int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
788 avio_rl32(pb); /* size */
789 st->codec->width = avio_rl32(pb);
790 st->codec->height = (int32_t)avio_rl32(pb);
791 avio_rl16(pb); /* planes */
792 st->codec->bits_per_coded_sample = avio_rl16(pb); /* depth */
793 tag1 = avio_rl32(pb);
794 avio_rl32(pb); /* ImageSize */
795 avio_rl32(pb); /* XPelsPerMeter */
796 avio_rl32(pb); /* YPelsPerMeter */
797 avio_rl32(pb); /* ClrUsed */
798 avio_rl32(pb); /* ClrImportant */
802 int ff_read_riff_info(AVFormatContext *s, int64_t size)
804 int64_t start, end, cur;
805 AVIOContext *pb = s->pb;
807 start = avio_tell(pb);
810 while ((cur = avio_tell(pb)) >= 0 &&
811 cur <= end - 8 /* = tag + size */) {
817 chunk_code = avio_rl32(pb);
818 chunk_size = avio_rl32(pb);
820 if (chunk_size > end ||
821 end - chunk_size < cur ||
822 chunk_size == UINT_MAX) {
823 av_log(s, AV_LOG_WARNING, "too big INFO subchunk\n");
827 chunk_size += (chunk_size & 1);
831 avio_skip(pb, chunk_size);
832 else if (pb->eof_reached) {
833 av_log(s, AV_LOG_WARNING, "truncated file\n");
839 value = av_malloc(chunk_size + 1);
841 av_log(s, AV_LOG_ERROR,
842 "out of memory, unable to read INFO tag\n");
843 return AVERROR(ENOMEM);
846 AV_WL32(key, chunk_code);
848 if (avio_read(pb, value, chunk_size) != chunk_size) {
850 av_log(s, AV_LOG_WARNING,
851 "premature end of file while reading INFO tag\n");
855 value[chunk_size] = 0;
857 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
862 #endif /* CONFIG_DEMUXERS */