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 possible for a given codec. */
32 const AVCodecTag ff_codec_bmp_tags[] = {
33 { AV_CODEC_ID_H264, MKTAG('H', '2', '6', '4') },
34 { AV_CODEC_ID_H264, MKTAG('h', '2', '6', '4') },
35 { AV_CODEC_ID_H264, MKTAG('X', '2', '6', '4') },
36 { AV_CODEC_ID_H264, MKTAG('x', '2', '6', '4') },
37 { AV_CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') },
38 { AV_CODEC_ID_H264, MKTAG('D', 'A', 'V', 'C') },
39 { AV_CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') },
40 { AV_CODEC_ID_H264, MKTAG('Q', '2', '6', '4') }, /* QNAP surveillance system */
41 { AV_CODEC_ID_H263, MKTAG('H', '2', '6', '3') },
42 { AV_CODEC_ID_H263, MKTAG('X', '2', '6', '3') },
43 { AV_CODEC_ID_H263, MKTAG('T', '2', '6', '3') },
44 { AV_CODEC_ID_H263, MKTAG('L', '2', '6', '3') },
45 { AV_CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') },
46 { AV_CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') },
47 { AV_CODEC_ID_H263, MKTAG('M', '2', '6', '3') },
48 { AV_CODEC_ID_H263P, MKTAG('H', '2', '6', '3') },
49 { AV_CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */
50 { AV_CODEC_ID_H261, MKTAG('H', '2', '6', '1') },
51 { AV_CODEC_ID_H263, MKTAG('U', '2', '6', '3') },
52 { AV_CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') },
53 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') },
54 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') },
55 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') },
56 { AV_CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') },
57 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') },
58 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) }, /* 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('S', 'M', '4', 'V') },
91 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
92 { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
93 { AV_CODEC_ID_MPEG4, MKTAG('Q', 'M', 'P', '4') }, /* QNAP Systems */
94 { AV_CODEC_ID_MPEG4, MKTAG('P', 'L', 'V', '1') }, /* Pelco DVR MPEG-4 */
95 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
96 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
97 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
98 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
99 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
100 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
101 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
102 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
103 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
104 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
105 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
106 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
107 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
108 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
109 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
110 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
111 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
112 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
113 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
114 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
115 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
116 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
117 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
118 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
119 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') }, /* Canopus DV */
120 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
121 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
122 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
123 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'i', 's') },
124 { AV_CODEC_ID_DVVIDEO, MKTAG('p', 'd', 'v', 'c') },
125 { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', '2', '5') },
126 { AV_CODEC_ID_DVVIDEO, MKTAG('S', 'L', 'D', 'V') },
127 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
128 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
129 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
130 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
131 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
132 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
133 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
134 { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
135 { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
136 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
137 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
138 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
139 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
140 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
141 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
142 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
143 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
144 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('B', 'W', '1', '0') },
145 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('X', 'M', 'P', 'G') }, /* Xing MPEG intra only */
146 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
147 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
148 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
149 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
150 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
151 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
152 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
153 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
154 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
155 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
156 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
157 { AV_CODEC_ID_AVRN, MKTAG('A', 'V', 'R', 'n') },
158 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
159 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
160 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
161 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
162 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
163 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
164 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
165 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
166 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
167 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
168 { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
169 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
170 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
171 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
172 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
173 { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
174 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
175 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
176 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
177 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
178 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
179 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
180 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
181 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
182 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
183 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
184 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
185 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
186 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
187 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
188 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
189 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
190 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
191 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
192 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
193 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
194 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
195 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
196 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
197 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
198 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
199 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
200 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
201 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
202 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
203 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
204 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
205 { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
206 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'Y', 'U') },
207 { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
208 { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
209 { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
210 { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
211 { AV_CODEC_ID_V308, MKTAG('v', '3', '0', '8') },
212 { AV_CODEC_ID_V408, MKTAG('v', '4', '0', '8') },
213 { AV_CODEC_ID_AYUV, MKTAG('A', 'Y', 'U', 'V') },
214 { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
215 { AV_CODEC_ID_YUV4, MKTAG('y', 'u', 'v', '4') },
216 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
217 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
218 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
219 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
220 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
221 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
222 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
223 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
224 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
225 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
226 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
227 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
228 { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
229 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
230 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
231 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
232 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
233 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
234 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
235 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
236 { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
237 { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
238 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
239 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
240 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
241 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
242 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
243 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
244 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
245 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
246 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
247 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
248 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
249 { AV_CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
250 { AV_CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') },
251 { AV_CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') },
252 { AV_CODEC_ID_FLV1, MKTAG('S', '2', '6', '3') },
253 { AV_CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') },
254 { AV_CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') },
255 { AV_CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') },
256 { AV_CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') },
257 { AV_CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') },
258 { AV_CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') },
259 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') },
260 { AV_CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') },
261 { AV_CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') },
262 { AV_CODEC_ID_WMV3IMAGE, MKTAG('W', 'M', 'V', 'P') },
263 { AV_CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') },
264 { AV_CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') },
265 { AV_CODEC_ID_VC1IMAGE, MKTAG('W', 'V', 'P', '2') },
266 { AV_CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') },
267 { AV_CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') },
268 { AV_CODEC_ID_WNV1, MKTAG('Y', 'U', 'V', '8') },
269 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', '4') },
270 { AV_CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') },
271 { AV_CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') },
272 { AV_CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') },
273 { AV_CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') },
274 { AV_CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') },
275 { AV_CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') },
276 { AV_CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') },
277 { AV_CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') },
278 { AV_CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') },
279 { AV_CODEC_ID_JPEG2000, MKTAG('m', 'j', 'p', '2') },
280 { AV_CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') },
281 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'C') },
282 { AV_CODEC_ID_JPEG2000, MKTAG('L', 'J', '2', 'K') },
283 { AV_CODEC_ID_JPEG2000, MKTAG('I', 'P', 'J', '2') },
284 { AV_CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') },
285 { AV_CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') },
286 { AV_CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') },
287 { AV_CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') },
288 { AV_CODEC_ID_CLJR, MKTAG('C', 'L', 'J', 'R') },
289 { AV_CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') },
290 { AV_CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') },
291 { AV_CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') },
292 { AV_CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') },
293 { AV_CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') },
294 { AV_CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') },
295 { AV_CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') },
296 { AV_CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') },
297 { AV_CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') },
298 { AV_CODEC_ID_LAGARITH, MKTAG('L', 'A', 'G', 'S') },
299 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '2') },
300 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '3') },
301 { AV_CODEC_ID_G2M, MKTAG('G', '2', 'M', '4') },
302 { AV_CODEC_ID_AMV, MKTAG('A', 'M', 'V', 'F') },
303 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'A') },
304 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'R', 'G') },
305 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '0') },
306 { AV_CODEC_ID_UTVIDEO, MKTAG('U', 'L', 'Y', '2') },
307 { AV_CODEC_ID_VBLE, MKTAG('V', 'B', 'L', 'E') },
308 { AV_CODEC_ID_ESCAPE130, MKTAG('E', '1', '3', '0') },
309 { AV_CODEC_ID_DXTORY, MKTAG('x', 't', 'o', 'r') },
310 { AV_CODEC_ID_ZEROCODEC, MKTAG('Z', 'E', 'C', 'O') },
311 { AV_CODEC_ID_Y41P, MKTAG('Y', '4', '1', 'P') },
312 { AV_CODEC_ID_FLIC, MKTAG('A', 'F', 'L', 'C') },
313 { AV_CODEC_ID_EXR, MKTAG('e', 'x', 'r', ' ') },
314 { AV_CODEC_ID_MSS1, MKTAG('M', 'S', 'S', '1') },
315 { AV_CODEC_ID_MSA1, MKTAG('M', 'S', 'A', '1') },
316 { AV_CODEC_ID_TSCC2, MKTAG('T', 'S', 'C', '2') },
317 { AV_CODEC_ID_MTS2, MKTAG('M', 'T', 'S', '2') },
318 { AV_CODEC_ID_CLLC, MKTAG('C', 'L', 'L', 'C') },
319 { AV_CODEC_ID_MSS2, MKTAG('M', 'S', 'S', '2') },
320 { AV_CODEC_ID_SVQ3, MKTAG('S', 'V', 'Q', '3') },
321 { AV_CODEC_ID_NONE, 0 }
324 const AVCodecTag ff_codec_wav_tags[] = {
325 { AV_CODEC_ID_PCM_S16LE, 0x0001 },
326 { AV_CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */
327 { AV_CODEC_ID_PCM_S24LE, 0x0001 },
328 { AV_CODEC_ID_PCM_S32LE, 0x0001 },
329 { AV_CODEC_ID_ADPCM_MS, 0x0002 },
330 { AV_CODEC_ID_PCM_F32LE, 0x0003 },
331 { AV_CODEC_ID_PCM_F64LE, 0x0003 }, /* must come after f32le in this list */
332 { AV_CODEC_ID_PCM_ALAW, 0x0006 },
333 { AV_CODEC_ID_PCM_MULAW, 0x0007 },
334 { AV_CODEC_ID_WMAVOICE, 0x000A },
335 { AV_CODEC_ID_ADPCM_IMA_WAV, 0x0011 },
336 { AV_CODEC_ID_PCM_ZORK, 0x0011 }, /* must come after adpcm_ima_wav in this list */
337 { AV_CODEC_ID_ADPCM_YAMAHA, 0x0020 },
338 { AV_CODEC_ID_TRUESPEECH, 0x0022 },
339 { AV_CODEC_ID_GSM_MS, 0x0031 },
340 { AV_CODEC_ID_AMR_NB, 0x0038 }, /* rogue format number */
341 { AV_CODEC_ID_G723_1, 0x0042 },
342 { AV_CODEC_ID_ADPCM_G726, 0x0045 },
343 { AV_CODEC_ID_MP2, 0x0050 },
344 { AV_CODEC_ID_MP3, 0x0055 },
345 { AV_CODEC_ID_AMR_NB, 0x0057 },
346 { AV_CODEC_ID_AMR_WB, 0x0058 },
347 { AV_CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */
348 { AV_CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */
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 },
364 { AV_CODEC_ID_AAC, 0x1600 }, /* ADTS AAC */
365 { AV_CODEC_ID_AAC_LATM, 0x1602 },
366 { AV_CODEC_ID_AC3, 0x2000 },
367 { AV_CODEC_ID_DTS, 0x2001 },
368 { AV_CODEC_ID_SONIC, 0x2048 },
369 { AV_CODEC_ID_SONIC_LS, 0x2048 },
370 { AV_CODEC_ID_PCM_MULAW, 0x6c75 },
371 { AV_CODEC_ID_AAC, 0x706d },
372 { AV_CODEC_ID_AAC, 0x4143 },
373 { AV_CODEC_ID_SPEEX, 0xA109 },
374 { AV_CODEC_ID_FLAC, 0xF1AC },
375 { AV_CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' },
376 { AV_CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id?
378 /* FIXME: All of the IDs below are not 16 bit and thus illegal. */
379 // for NuppelVideo (nuv.c)
380 { AV_CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') },
381 { AV_CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') },
382 { AV_CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') },
383 { AV_CODEC_ID_NONE, 0 },
386 const AVCodecGuid ff_codec_wav_guids[] = {
387 {AV_CODEC_ID_AC3, {0x2C,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
388 {AV_CODEC_ID_ATRAC3P, {0xBF,0xAA,0x23,0xE9,0x58,0xCB,0x71,0x44,0xA1,0x19,0xFF,0xFA,0x01,0xE4,0xCE,0x62}},
389 {AV_CODEC_ID_EAC3, {0xAF,0x87,0xFB,0xA7,0x02,0x2D,0xFB,0x42,0xA4,0xD4,0x05,0xCD,0x93,0x84,0x3B,0xDD}},
390 {AV_CODEC_ID_MP2, {0x2B,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
394 const AVMetadataConv ff_riff_info_conv[] = {
395 { "IART", "artist" },
396 { "ICMT", "comment" },
397 { "ICOP", "copyright" },
400 { "ILNG", "language" },
404 { "ISFT", "encoder" },
405 { "ISMP", "timecode" },
406 { "ITCH", "encoded_by"},
410 const char ff_riff_tags[][5] = {
411 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
412 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
413 "IPRT", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
418 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
420 ffio_wfourcc(pb, tag);
422 return avio_tell(pb);
425 void ff_end_tag(AVIOContext *pb, int64_t start)
430 avio_seek(pb, start - 4, SEEK_SET);
431 avio_wl32(pb, (uint32_t)(pos - start));
432 avio_seek(pb, pos, SEEK_SET);
435 /* WAVEFORMATEX header */
436 /* returns the size or -1 on error */
437 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
439 int bps, blkalign, bytespersec, frame_size;
441 int waveformatextensible;
443 uint8_t *riff_extradata= temp;
444 uint8_t *riff_extradata_start= temp;
446 if(!enc->codec_tag || enc->codec_tag > 0xffff)
449 /* We use the known constant frame size for the codec if known, otherwise
450 fallback to using AVCodecContext.frame_size, which is not as reliable
451 for indicating packet duration */
452 frame_size = av_get_audio_frame_duration(enc, 0);
454 frame_size = enc->frame_size;
456 waveformatextensible = (enc->channels > 2 && enc->channel_layout)
457 || enc->sample_rate > 48000
458 || av_get_bits_per_sample(enc->codec_id) > 16;
460 if (waveformatextensible) {
461 avio_wl16(pb, 0xfffe);
463 avio_wl16(pb, enc->codec_tag);
465 avio_wl16(pb, enc->channels);
466 avio_wl32(pb, enc->sample_rate);
467 if (enc->codec_id == CODEC_ID_ATRAC3 ||
468 enc->codec_id == CODEC_ID_G723_1 ||
469 enc->codec_id == CODEC_ID_GSM_MS ||
470 enc->codec_id == CODEC_ID_MP2 ||
471 enc->codec_id == CODEC_ID_MP3) {
474 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
475 if (enc->bits_per_coded_sample)
476 bps = enc->bits_per_coded_sample;
478 bps = 16; // default to 16
481 if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){
482 av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps);
485 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3) {
486 /* this is wrong, but it seems many demuxers do not work if this is set
488 blkalign = frame_size;
489 //blkalign = 144 * enc->bit_rate/enc->sample_rate;
490 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
491 blkalign = 3840; //maximum bytes per frame
492 } else if (enc->codec_id == AV_CODEC_ID_AAC) {
493 blkalign = 768 * enc->channels; //maximum bytes per frame
494 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
496 } else if (enc->block_align != 0) { /* specified by the codec */
497 blkalign = enc->block_align;
499 blkalign = bps * enc->channels / av_gcd(8, bps);
500 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
501 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
502 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
503 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
504 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
505 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
506 bytespersec = enc->sample_rate * blkalign;
507 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
510 bytespersec = enc->bit_rate / 8;
512 avio_wl32(pb, bytespersec); /* bytes per second */
513 avio_wl16(pb, blkalign); /* block align */
514 avio_wl16(pb, bps); /* bits per sample */
515 if (enc->codec_id == AV_CODEC_ID_MP3) {
517 bytestream_put_le16(&riff_extradata, 1); /* wID */
518 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
519 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
520 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
521 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
522 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
524 bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */
525 bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */
526 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */
527 bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */
528 bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */
529 bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */
530 bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */
531 bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */
532 } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
534 bytestream_put_le32(&riff_extradata, 0x9ace0002); /* extradata needed for msacm g723.1 codec */
535 bytestream_put_le32(&riff_extradata, 0xaea2f732);
536 bytestream_put_le16(&riff_extradata, 0xacde);
537 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
539 bytestream_put_le16(&riff_extradata, frame_size); /* wSamplesPerBlock */
540 } else if(enc->extradata_size){
541 riff_extradata_start= enc->extradata;
542 riff_extradata= enc->extradata + enc->extradata_size;
543 hdrsize += enc->extradata_size;
545 if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */
547 avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */
548 avio_wl16(pb, bps); /* ValidBitsPerSample || SamplesPerBlock || Reserved */
549 avio_wl32(pb, enc->channel_layout); /* dwChannelMask */
550 avio_wl32(pb, enc->codec_tag); /* GUID + next 3 */
551 avio_wl32(pb, 0x00100000);
552 avio_wl32(pb, 0xAA000080);
553 avio_wl32(pb, 0x719B3800);
555 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
557 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
566 /* BITMAPINFOHEADER header */
567 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf)
569 avio_wl32(pb, 40 + enc->extradata_size); /* size */
570 avio_wl32(pb, enc->width);
571 //We always store RGB TopDown
572 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
573 avio_wl16(pb, 1); /* planes */
575 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
576 /* compression type */
577 avio_wl32(pb, enc->codec_tag);
578 avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8);
584 avio_write(pb, enc->extradata, enc->extradata_size);
586 if (!for_asf && enc->extradata_size & 1)
589 #endif //CONFIG_MUXERS
592 /* We could be given one of the three possible structures here:
593 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
594 * is an expansion of the previous one with the fields added
595 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
596 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
597 * an openended structure.
599 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
604 codec->codec_type = AVMEDIA_TYPE_AUDIO;
605 codec->channels = avio_rl16(pb);
606 codec->sample_rate = avio_rl32(pb);
607 codec->bit_rate = avio_rl32(pb) * 8;
608 codec->block_align = avio_rl16(pb);
609 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
610 codec->bits_per_coded_sample = 8;
612 codec->bits_per_coded_sample = avio_rl16(pb);
614 codec->codec_tag = 0;
616 codec->codec_tag = id;
617 codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
619 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
620 int cbSize = avio_rl16(pb); /* cbSize */
622 cbSize = FFMIN(size, cbSize);
623 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
624 ff_asf_guid subformat;
625 int bps = avio_rl16(pb);
627 codec->bits_per_coded_sample = bps;
628 codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
629 ff_get_guid(pb, &subformat);
630 if (!memcmp(subformat + 4, (const uint8_t[]){FF_MEDIASUBTYPE_BASE_GUID}, 12)) {
631 codec->codec_tag = AV_RL32(subformat);
632 codec->codec_id = ff_wav_codec_get_id(codec->codec_tag, codec->bits_per_coded_sample);
634 codec->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
635 if (!codec->codec_id)
636 av_log(codec, AV_LOG_WARNING, "unknown subformat:"FF_PRI_GUID"\n", FF_ARG_GUID(subformat));
641 codec->extradata_size = cbSize;
643 av_free(codec->extradata);
644 codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
645 if (!codec->extradata)
646 return AVERROR(ENOMEM);
647 avio_read(pb, codec->extradata, codec->extradata_size);
651 /* It is possible for the chunk to contain garbage at the end */
655 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
656 /* channels and sample_rate values are those prior to applying SBR and/or PS */
658 codec->sample_rate = 0;
660 /* override bits_per_coded_sample for G.726 */
661 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
662 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
668 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
671 id = ff_codec_get_id(ff_codec_wav_tags, tag);
674 /* handle specific u8 codec */
675 if (id == AV_CODEC_ID_PCM_S16LE && bps == 8)
676 id = AV_CODEC_ID_PCM_U8;
677 if (id == AV_CODEC_ID_PCM_S16LE && bps == 24)
678 id = AV_CODEC_ID_PCM_S24LE;
679 if (id == AV_CODEC_ID_PCM_S16LE && bps == 32)
680 id = AV_CODEC_ID_PCM_S32LE;
681 if (id == AV_CODEC_ID_PCM_F32LE && bps == 64)
682 id = AV_CODEC_ID_PCM_F64LE;
683 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
684 id = AV_CODEC_ID_PCM_ZORK;
688 int ff_get_bmp_header(AVIOContext *pb, AVStream *st, unsigned *esize)
691 if(esize) *esize = avio_rl32(pb);
693 st->codec->width = avio_rl32(pb);
694 st->codec->height = (int32_t)avio_rl32(pb);
695 avio_rl16(pb); /* planes */
696 st->codec->bits_per_coded_sample= avio_rl16(pb); /* depth */
697 tag1 = avio_rl32(pb);
698 avio_rl32(pb); /* ImageSize */
699 avio_rl32(pb); /* XPelsPerMeter */
700 avio_rl32(pb); /* YPelsPerMeter */
701 avio_rl32(pb); /* ClrUsed */
702 avio_rl32(pb); /* ClrImportant */
705 #endif // CONFIG_DEMUXERS
707 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
710 int audio_frame_size;
712 /* We use the known constant frame size for the codec if known, otherwise
713 fallback to using AVCodecContext.frame_size, which is not as reliable
714 for indicating packet duration */
715 audio_frame_size = av_get_audio_frame_duration(stream, 0);
716 if (!audio_frame_size)
717 audio_frame_size = stream->frame_size;
719 *au_ssize= stream->block_align;
720 if (audio_frame_size && stream->sample_rate) {
721 *au_scale = audio_frame_size;
722 *au_rate= stream->sample_rate;
723 }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO ||
724 stream->codec_type == AVMEDIA_TYPE_DATA ||
725 stream->codec_type == AVMEDIA_TYPE_SUBTITLE){
726 *au_scale= stream->time_base.num;
727 *au_rate = stream->time_base.den;
729 *au_scale= stream->block_align ? stream->block_align*8 : 8;
730 *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate;
732 gcd= av_gcd(*au_scale, *au_rate);
737 void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
739 av_assert0(sizeof(*g) == 16); //compiler will optimize this out
740 if (avio_read(s, *g, sizeof(*g)) < (int)sizeof(*g))
741 memset(*g, 0, sizeof(*g));
744 enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
747 for (i = 0; guids[i].id != AV_CODEC_ID_NONE; i++) {
748 if (!ff_guidcmp(guids[i].guid, guid))
751 return AV_CODEC_ID_NONE;
754 int ff_read_riff_info(AVFormatContext *s, int64_t size)
756 int64_t start, end, cur;
757 AVIOContext *pb = s->pb;
759 start = avio_tell(pb);
762 while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
768 chunk_code = avio_rl32(pb);
769 chunk_size = avio_rl32(pb);
770 if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
771 av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
772 return AVERROR_INVALIDDATA;
775 chunk_size += (chunk_size & 1);
777 value = av_malloc(chunk_size + 1);
779 av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
780 return AVERROR(ENOMEM);
783 AV_WL32(key, chunk_code);
785 if (avio_read(pb, value, chunk_size) != chunk_size) {
787 av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
788 return AVERROR_INVALIDDATA;
791 value[chunk_size] = 0;
793 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);