Merge remote-tracking branch 'libav/master'
[FFMpeg-mirror/mplayer-patches.git] / libavformat / riff.c
blobd24231a50bf1ccf9e1d64ad5d9573aacfc329177
1 /*
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"
24 #include "avformat.h"
25 #include "avio_internal.h"
26 #include "riff.h"
27 #include "libavcodec/bytestream.h"
29 /* Note: when encoding, the first matching tag is used, so order is
30 important if multiple tags 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 h263 */
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 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) }, /* some broken avi use this */
58 { AV_CODEC_ID_MPEG4, MKTAG('Z', 'M', 'P', '4') }, /* some broken avi use this */
59 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') },
60 { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
61 { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
62 { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
63 { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
64 { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
65 { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
66 { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
67 { AV_CODEC_ID_MPEG4, MKTAG('W', 'A', 'W', 'V') }, /* WaWv MPEG-4 Video Codec */
68 { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
69 { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
70 { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
71 { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
72 { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
73 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
74 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
75 { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
76 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
77 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
78 { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') }, /* flipped video */
79 { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
80 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
81 { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
82 { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */
83 { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
84 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */
85 { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
86 { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
87 { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
88 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
89 { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
90 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
91 { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
92 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
93 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
94 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
95 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
96 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
97 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
98 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
99 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
100 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
101 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
102 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
103 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
104 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
105 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
106 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
107 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
108 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
109 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
110 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
111 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
112 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
113 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
114 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
115 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
116 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') }, /* Canopus DV */
117 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
118 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
119 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
120 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
121 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
122 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
123 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
124 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
125 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
126 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
127 { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
128 { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
129 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
130 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
131 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
132 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
133 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
134 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
135 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
136 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
137 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
138 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
139 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
140 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
141 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
142 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
143 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
144 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
145 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
146 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
147 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
148 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
149 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
150 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
151 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
152 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
153 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
154 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
155 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
156 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
157 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
158 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
159 { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
160 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
161 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
162 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
163 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
164 { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
165 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
166 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
167 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
168 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
169 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
170 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
171 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
172 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
173 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
174 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
175 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
176 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
177 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
178 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
179 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
180 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
181 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
182 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
183 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
184 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
185 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
186 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
187 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
188 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
189 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
190 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
191 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
192 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
193 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
194 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
195 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
196 { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
197 { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
198 { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
199 { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
200 { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
201 { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
202 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
203 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
204 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
205 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
206 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
207 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
208 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
209 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
210 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
211 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
212 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
213 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
214 { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
215 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
216 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
217 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
218 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
219 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
220 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
221 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
222 { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
223 { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
224 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
225 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
226 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
227 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
228 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
229 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
230 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
231 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
232 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
233 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
234 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
235 { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
236 { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
237 { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
238 { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
239 { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
240 { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
241 { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
242 { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
243 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
244 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
245 { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
246 { AV_CODEC_ID_WMV3IMAGE, MKTAG('W', 'M', 'V', 'P') },
247 { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
248 { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
249 { AV_CODEC_ID_VC1IMAGE, MKTAG('W', 'V', 'P', '2') },
250 { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
251 { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
252 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
253 { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
254 { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
255 { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
256 { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
257 { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
258 { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
259 { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
260 { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
261 { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
262 { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
263 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'C') },
264 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'K') },
265 { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
266 { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
267 { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
268 { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
269 { AV_CODEC_ID_CLJR, MKTAG('C', 'L', 'J', 'R') },
270 { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
271 { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
272 { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
273 { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
274 { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
275 { AV_CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') },
276 { AV_CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') },
277 { AV_CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
278 { AV_CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') },
279 { AV_CODEC_ID_LAGARITH, MKTAG('L', 'A', 'G', 'S') },
280 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'A') },
281 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'G') },
282 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '0') },
283 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
284 { AV_CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
285 { AV_CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
286 { AV_CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') },
287 { AV_CODEC_ID_MSS1, MKTAG('M', 'S', 'S', '1') },
288 { AV_CODEC_ID_MSA1, MKTAG('M', 'S', 'A', '1') },
289 { AV_CODEC_ID_TSCC2, MKTAG('T', 'S', 'C', '2') },
290 { AV_CODEC_ID_MTS2, MKTAG('M', 'T', 'S', '2') },
291 { AV_CODEC_ID_CLLC, MKTAG('C', 'L', 'L', 'C') },
292 { AV_CODEC_ID_MSS2, MKTAG('M', 'S', 'S', '2') },
293 { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
294 { AV_CODEC_ID_NONE, 0 }
297 const AVCodecTag ff_codec_wav_tags[] = {
298 { AV_CODEC_ID_PCM_S16LE, 0x0001 },
299 { AV_CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */
300 { AV_CODEC_ID_PCM_S24LE, 0x0001 },
301 { AV_CODEC_ID_PCM_S32LE, 0x0001 },
302 { AV_CODEC_ID_ADPCM_MS, 0x0002 },
303 { AV_CODEC_ID_PCM_F32LE, 0x0003 },
304 { AV_CODEC_ID_PCM_F64LE, 0x0003 }, /* must come after f32le in this list */
305 { AV_CODEC_ID_PCM_ALAW, 0x0006 },
306 { AV_CODEC_ID_PCM_MULAW, 0x0007 },
307 { AV_CODEC_ID_WMAVOICE, 0x000A },
308 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0011 },
309 { AV_CODEC_ID_PCM_ZORK, 0x0011 }, /* must come after adpcm_ima_wav in this list */
310 { AV_CODEC_ID_ADPCM_YAMAHA, 0x0020 },
311 { AV_CODEC_ID_TRUESPEECH, 0x0022 },
312 { AV_CODEC_ID_GSM_MS, 0x0031 },
313 { AV_CODEC_ID_ADPCM_G726, 0x0045 },
314 { AV_CODEC_ID_MP2, 0x0050 },
315 { AV_CODEC_ID_MP3, 0x0055 },
316 { AV_CODEC_ID_AMR_NB, 0x0057 },
317 { AV_CODEC_ID_AMR_WB, 0x0058 },
318 { AV_CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */
319 { AV_CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */
320 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0069 },
321 { AV_CODEC_ID_VOXWARE, 0x0075 },
322 { AV_CODEC_ID_AAC, 0x00ff },
323 { AV_CODEC_ID_SIPR, 0x0130 },
324 { AV_CODEC_ID_WMAV1, 0x0160 },
325 { AV_CODEC_ID_WMAV2, 0x0161 },
326 { AV_CODEC_ID_WMAPRO, 0x0162 },
327 { AV_CODEC_ID_WMALOSSLESS, 0x0163 },
328 { AV_CODEC_ID_ADPCM_CT, 0x0200 },
329 { AV_CODEC_ID_ATRAC3, 0x0270 },
330 { AV_CODEC_ID_ADPCM_G722, 0x028F },
331 { AV_CODEC_ID_IMC, 0x0401 },
332 { AV_CODEC_ID_IAC, 0x0402 },
333 { AV_CODEC_ID_GSM_MS, 0x1500 },
334 { AV_CODEC_ID_TRUESPEECH, 0x1501 },
335 { AV_CODEC_ID_AAC, 0x1600 }, /* ADTS AAC */
336 { AV_CODEC_ID_AAC_LATM, 0x1602 },
337 { AV_CODEC_ID_AC3, 0x2000 },
338 { AV_CODEC_ID_DTS, 0x2001 },
339 { AV_CODEC_ID_PCM_MULAW, 0x6c75 },
340 { AV_CODEC_ID_AAC, 0x706d },
341 { AV_CODEC_ID_AAC, 0x4143 },
342 { AV_CODEC_ID_SPEEX, 0xA109 },
343 { AV_CODEC_ID_FLAC, 0xF1AC },
344 { AV_CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' },
345 { AV_CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id?
346 { AV_CODEC_ID_NONE, 0 },
349 const AVMetadataConv ff_riff_info_conv[] = {
350 { "IART", "artist" },
351 { "ICMT", "comment" },
352 { "ICOP", "copyright" },
353 { "ICRD", "date" },
354 { "IGNR", "genre" },
355 { "ILNG", "language" },
356 { "INAM", "title" },
357 { "IPRD", "album" },
358 { "IPRT", "track" },
359 { "ISFT", "encoder" },
360 { "ITCH", "encoded_by"},
361 { 0 },
364 #if CONFIG_MUXERS
365 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
367 ffio_wfourcc(pb, tag);
368 avio_wl32(pb, 0);
369 return avio_tell(pb);
372 void ff_end_tag(AVIOContext *pb, int64_t start)
374 int64_t pos;
376 pos = avio_tell(pb);
377 avio_seek(pb, start - 4, SEEK_SET);
378 avio_wl32(pb, (uint32_t)(pos - start));
379 avio_seek(pb, pos, SEEK_SET);
382 /* WAVEFORMATEX header */
383 /* returns the size or -1 on error */
384 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
386 int bps, blkalign, bytespersec, frame_size;
387 int hdrsize = 18;
388 int waveformatextensible;
389 uint8_t temp[256];
390 uint8_t *riff_extradata= temp;
391 uint8_t *riff_extradata_start= temp;
393 if(!enc->codec_tag || enc->codec_tag > 0xffff)
394 return -1;
396 /* We use the known constant frame size for the codec if known, otherwise
397 fallback to using AVCodecContext.frame_size, which is not as reliable
398 for indicating packet duration */
399 frame_size = av_get_audio_frame_duration(enc, 0);
400 if (!frame_size)
401 frame_size = enc->frame_size;
403 waveformatextensible = (enc->channels > 2 && enc->channel_layout)
404 || enc->sample_rate > 48000
405 || av_get_bits_per_sample(enc->codec_id) > 16;
407 if (waveformatextensible) {
408 avio_wl16(pb, 0xfffe);
409 } else {
410 avio_wl16(pb, enc->codec_tag);
412 avio_wl16(pb, enc->channels);
413 avio_wl32(pb, enc->sample_rate);
414 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3 || enc->codec_id == AV_CODEC_ID_GSM_MS) {
415 bps = 0;
416 } else {
417 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
418 if (enc->bits_per_coded_sample)
419 bps = enc->bits_per_coded_sample;
420 else
421 bps = 16; // default to 16
424 if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){
425 av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps);
428 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3) {
429 /* this is wrong, but it seems many demuxers do not work if this is set
430 correctly */
431 blkalign = frame_size;
432 //blkalign = 144 * enc->bit_rate/enc->sample_rate;
433 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
434 blkalign = 3840; //maximum bytes per frame
435 } else if (enc->block_align != 0) { /* specified by the codec */
436 blkalign = enc->block_align;
437 } else
438 blkalign = bps * enc->channels / av_gcd(8, bps);
439 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
440 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
441 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
442 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
443 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
444 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
445 bytespersec = enc->sample_rate * blkalign;
446 } else {
447 bytespersec = enc->bit_rate / 8;
449 avio_wl32(pb, bytespersec); /* bytes per second */
450 avio_wl16(pb, blkalign); /* block align */
451 avio_wl16(pb, bps); /* bits per sample */
452 if (enc->codec_id == AV_CODEC_ID_MP3) {
453 hdrsize += 12;
454 bytestream_put_le16(&riff_extradata, 1); /* wID */
455 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
456 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
457 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
458 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
459 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
460 hdrsize += 22;
461 bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */
462 bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */
463 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */
464 bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */
465 bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */
466 bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */
467 bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */
468 bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */
469 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
470 hdrsize += 2;
471 bytestream_put_le16(&riff_extradata, frame_size); /* wSamplesPerBlock */
472 } else if(enc->extradata_size){
473 riff_extradata_start= enc->extradata;
474 riff_extradata= enc->extradata + enc->extradata_size;
475 hdrsize += enc->extradata_size;
477 if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */
478 hdrsize += 22;
479 avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */
480 avio_wl16(pb, bps); /* ValidBitsPerSample || SamplesPerBlock || Reserved */
481 avio_wl32(pb, enc->channel_layout); /* dwChannelMask */
482 avio_wl32(pb, enc->codec_tag); /* GUID + next 3 */
483 avio_wl32(pb, 0x00100000);
484 avio_wl32(pb, 0xAA000080);
485 avio_wl32(pb, 0x719B3800);
486 } else {
487 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
489 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
490 if(hdrsize&1){
491 hdrsize++;
492 avio_w8(pb, 0);
495 return hdrsize;
498 /* BITMAPINFOHEADER header */
499 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf)
501 avio_wl32(pb, 40 + enc->extradata_size); /* size */
502 avio_wl32(pb, enc->width);
503 //We always store RGB TopDown
504 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
505 avio_wl16(pb, 1); /* planes */
507 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
508 /* compression type */
509 avio_wl32(pb, enc->codec_tag);
510 avio_wl32(pb, enc->width * enc->height * 3);
511 avio_wl32(pb, 0);
512 avio_wl32(pb, 0);
513 avio_wl32(pb, 0);
514 avio_wl32(pb, 0);
516 avio_write(pb, enc->extradata, enc->extradata_size);
518 if (!for_asf && enc->extradata_size & 1)
519 avio_w8(pb, 0);
522 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
524 int gcd;
525 int audio_frame_size;
527 /* We use the known constant frame size for the codec if known, otherwise
528 fallback to using AVCodecContext.frame_size, which is not as reliable
529 for indicating packet duration */
530 audio_frame_size = av_get_audio_frame_duration(stream, 0);
531 if (!audio_frame_size)
532 audio_frame_size = stream->frame_size;
534 *au_ssize= stream->block_align;
535 if (audio_frame_size && stream->sample_rate) {
536 *au_scale = audio_frame_size;
537 *au_rate= stream->sample_rate;
538 }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO ||
539 stream->codec_type == AVMEDIA_TYPE_DATA ||
540 stream->codec_type == AVMEDIA_TYPE_SUBTITLE){
541 *au_scale= stream->time_base.num;
542 *au_rate = stream->time_base.den;
543 }else{
544 *au_scale= stream->block_align ? stream->block_align*8 : 8;
545 *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate;
547 gcd= av_gcd(*au_scale, *au_rate);
548 *au_scale /= gcd;
549 *au_rate /= gcd;
552 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
554 int len = strlen(str);
555 if (len > 0) {
556 len++;
557 ffio_wfourcc(pb, tag);
558 avio_wl32(pb, len);
559 avio_put_str(pb, str);
560 if (len & 1)
561 avio_w8(pb, 0);
565 static const char riff_tags[][5] = {
566 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
567 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
568 "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
572 static int riff_has_valid_tags(AVFormatContext *s)
574 int i;
576 for (i = 0; *riff_tags[i]; i++) {
577 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
578 return 1;
581 return 0;
584 void ff_riff_write_info(AVFormatContext *s)
586 AVIOContext *pb = s->pb;
587 int i;
588 int64_t list_pos;
589 AVDictionaryEntry *t = NULL;
591 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
593 /* writing empty LIST is not nice and may cause problems */
594 if (!riff_has_valid_tags(s))
595 return;
597 list_pos = ff_start_tag(pb, "LIST");
598 ffio_wfourcc(pb, "INFO");
599 for (i = 0; *riff_tags[i]; i++) {
600 if ((t = av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
601 ff_riff_write_info_tag(s->pb, t->key, t->value);
603 ff_end_tag(pb, list_pos);
605 #endif //CONFIG_MUXERS
607 #if CONFIG_DEMUXERS
608 /* We could be given one of the three possible structures here:
609 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
610 * is an expansion of the previous one with the fields added
611 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
612 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
613 * an openended structure.
615 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
617 int id;
619 id = avio_rl16(pb);
620 codec->codec_type = AVMEDIA_TYPE_AUDIO;
621 codec->codec_tag = id;
622 codec->channels = avio_rl16(pb);
623 codec->sample_rate = avio_rl32(pb);
624 codec->bit_rate = avio_rl32(pb) * 8;
625 codec->block_align = avio_rl16(pb);
626 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
627 codec->bits_per_coded_sample = 8;
628 }else
629 codec->bits_per_coded_sample = avio_rl16(pb);
630 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
631 int cbSize = avio_rl16(pb); /* cbSize */
632 size -= 18;
633 cbSize = FFMIN(size, cbSize);
634 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
635 codec->bits_per_coded_sample = avio_rl16(pb);
636 codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
637 id = avio_rl32(pb); /* 4 first bytes of GUID */
638 avio_skip(pb, 12); /* skip end of GUID */
639 cbSize -= 22;
640 size -= 22;
642 codec->extradata_size = cbSize;
643 if (cbSize > 0) {
644 av_free(codec->extradata);
645 codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
646 if (!codec->extradata)
647 return AVERROR(ENOMEM);
648 avio_read(pb, codec->extradata, codec->extradata_size);
649 size -= cbSize;
652 /* It is possible for the chunk to contain garbage at the end */
653 if (size > 0)
654 avio_skip(pb, size);
656 codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
657 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
658 /* channels and sample_rate values are those prior to applying SBR and/or PS */
659 codec->channels = 0;
660 codec->sample_rate = 0;
662 /* override bits_per_coded_sample for G.726 */
663 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
664 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
666 return 0;
670 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
672 enum AVCodecID id;
673 id = ff_codec_get_id(ff_codec_wav_tags, tag);
674 if (id <= 0)
675 return id;
677 if (id == AV_CODEC_ID_PCM_S16LE)
678 id = ff_get_pcm_codec_id(bps, 0, 0, ~1);
679 else if (id == AV_CODEC_ID_PCM_F32LE)
680 id = ff_get_pcm_codec_id(bps, 1, 0, 0);
682 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
683 id = AV_CODEC_ID_PCM_ZORK;
684 return id;
687 int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
689 int tag1;
690 avio_rl32(pb); /* size */
691 st->codec->width = avio_rl32(pb);
692 st->codec->height = (int32_t)avio_rl32(pb);
693 avio_rl16(pb); /* planes */
694 st->codec->bits_per_coded_sample= avio_rl16(pb); /* depth */
695 tag1 = avio_rl32(pb);
696 avio_rl32(pb); /* ImageSize */
697 avio_rl32(pb); /* XPelsPerMeter */
698 avio_rl32(pb); /* YPelsPerMeter */
699 avio_rl32(pb); /* ClrUsed */
700 avio_rl32(pb); /* ClrImportant */
701 return tag1;
704 int ff_read_riff_info(AVFormatContext *s, int64_t size)
706 int64_t start, end, cur;
707 AVIOContext *pb = s->pb;
709 start = avio_tell(pb);
710 end = start + size;
712 while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
713 uint32_t chunk_code;
714 int64_t chunk_size;
715 char key[5] = {0};
716 char *value;
718 chunk_code = avio_rl32(pb);
719 chunk_size = avio_rl32(pb);
721 if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
722 av_log(s, AV_LOG_WARNING, "too big INFO subchunk\n");
723 break;
726 chunk_size += (chunk_size & 1);
728 if (!chunk_code) {
729 if (chunk_size)
730 avio_skip(pb, chunk_size);
731 continue;
734 value = av_malloc(chunk_size + 1);
735 if (!value) {
736 av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
737 return AVERROR(ENOMEM);
740 AV_WL32(key, chunk_code);
742 if (avio_read(pb, value, chunk_size) != chunk_size) {
743 av_free(value);
744 av_log(s, AV_LOG_WARNING, "premature end of file while reading INFO tag\n");
745 break;
748 value[chunk_size] = 0;
750 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
753 return 0;
755 #endif // CONFIG_DEMUXERS