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 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('D', 'I', 'V', '1') },
59 { AV_CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') },
60 { AV_CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') },
61 { AV_CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') },
62 { AV_CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') },
63 { AV_CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') },
64 { AV_CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') },
65 { AV_CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') },
66 { AV_CODEC_ID_MPEG4, MKTAG('W', 'A', 'W', 'V') }, /* WaWv MPEG-4 Video Codec */
67 { AV_CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') },
68 { AV_CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') },
69 { AV_CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') },
70 { AV_CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') },
71 { AV_CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') },
72 { AV_CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') },
73 { AV_CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') },
74 { AV_CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') },
75 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') },
76 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') },
77 { AV_CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') }, /* flipped video */
78 { AV_CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') },
79 { AV_CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') },
80 { AV_CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') },
81 { AV_CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */
82 { AV_CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') },
83 { AV_CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */
84 { AV_CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') },
85 { AV_CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') },
86 { AV_CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') },
87 { AV_CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') },
88 { AV_CODEC_ID_MPEG4, MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
89 { AV_CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'X') },
90 { AV_CODEC_ID_MPEG4, MKTAG('D', 'r', 'e', 'X') },
91 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') },
92 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') },
93 { AV_CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') },
94 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') },
95 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') },
96 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') },
97 { AV_CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') },
98 { AV_CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') },
99 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') },
100 { AV_CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') },
101 { AV_CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') },
102 { AV_CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') },
103 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') },
104 { AV_CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') },
105 { AV_CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') },
106 { AV_CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') },
107 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') },
108 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') },
109 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
110 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') },
111 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') },
112 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') },
113 { AV_CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */
114 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */
115 { AV_CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', '5') }, /* Canopus DV */
116 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') },
117 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') },
118 { AV_CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') },
119 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') },
120 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') },
121 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') },
122 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') },
123 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') },
124 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') },
125 { AV_CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') },
126 { AV_CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) },
127 { AV_CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) },
128 { AV_CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) },
129 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') },
130 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') },
131 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */
132 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') },
133 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') },
134 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
135 { AV_CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', 'v') },
136 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') },
137 { AV_CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') },
138 { AV_CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') },
139 { AV_CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') },
140 { AV_CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') },
141 { AV_CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */
142 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */
143 { AV_CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') },
144 { AV_CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
145 { AV_CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') },
146 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') },
147 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') },
148 { AV_CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') },
149 { AV_CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') },
150 { AV_CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
151 { AV_CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */
152 { AV_CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */
153 { AV_CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */
154 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') },
155 { AV_CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') },
156 { AV_CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') },
157 { AV_CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */
158 { AV_CODEC_ID_MJPEG, MKTAG('M', 'M', 'J', 'P') },
159 { AV_CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') },
160 { AV_CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') },
161 { AV_CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') },
162 { AV_CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) },
163 { AV_CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) },
164 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') },
165 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') },
166 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') },
167 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') },
168 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') },
169 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') },
170 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') },
171 { AV_CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') },
172 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') },
173 { AV_CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') },
174 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', 's') },
175 { AV_CODEC_ID_RAWVIDEO, MKTAG('y', 'u', 'v', '2') },
176 { AV_CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') },
177 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') },
178 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '6') },
179 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '2', '4') },
180 { AV_CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') },
181 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') },
182 { AV_CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') },
183 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') },
184 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '8', ' ', ' ') },
185 { AV_CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') },
186 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
187 { AV_CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */
188 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') },
189 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') },
190 { AV_CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') },
191 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', 'B') },
192 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', 'B') },
193 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
194 { AV_CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
195 { AV_CODEC_ID_RAWVIDEO, MKTAG('a', 'u', 'v', '2') },
196 { AV_CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
197 { AV_CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
198 { AV_CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
199 { AV_CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
200 { AV_CODEC_ID_V410, MKTAG('v', '4', '1', '0') },
201 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
202 { AV_CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') },
203 { AV_CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') },
204 { AV_CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') },
205 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
206 { AV_CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
207 { AV_CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
208 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
209 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
210 { AV_CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
211 { AV_CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') },
212 { AV_CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') },
213 { AV_CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') },
214 { AV_CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
215 { AV_CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
216 { AV_CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') },
217 { AV_CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') },
218 { AV_CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') },
219 { AV_CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') },
220 { AV_CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') },
221 { AV_CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) },
222 { AV_CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) },
223 { AV_CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') },
224 { AV_CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') },
225 { AV_CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') },
226 { AV_CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') },
227 { AV_CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') },
228 { AV_CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') },
229 { AV_CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') },
230 { AV_CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') },
231 { AV_CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') },
232 { AV_CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') },
233 { AV_CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') },
234 { AV_CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') },
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?
347 /* FIXME: All of the IDs below are not 16 bit and thus illegal. */
348 // for NuppelVideo (nuv.c)
349 { AV_CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') },
350 { AV_CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') },
351 { AV_CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') },
352 { AV_CODEC_ID_NONE, 0 },
355 const AVMetadataConv ff_riff_info_conv[] = {
356 { "IART", "artist" },
357 { "ICMT", "comment" },
358 { "ICOP", "copyright" },
361 { "ILNG", "language" },
365 { "ISFT", "encoder" },
366 { "ITCH", "encoded_by"},
371 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
373 ffio_wfourcc(pb, tag);
375 return avio_tell(pb);
378 void ff_end_tag(AVIOContext *pb, int64_t start)
383 avio_seek(pb, start - 4, SEEK_SET);
384 avio_wl32(pb, (uint32_t)(pos - start));
385 avio_seek(pb, pos, SEEK_SET);
388 /* WAVEFORMATEX header */
389 /* returns the size or -1 on error */
390 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
392 int bps, blkalign, bytespersec, frame_size;
394 int waveformatextensible;
396 uint8_t *riff_extradata= temp;
397 uint8_t *riff_extradata_start= temp;
399 if(!enc->codec_tag || enc->codec_tag > 0xffff)
402 /* We use the known constant frame size for the codec if known, otherwise
403 fallback to using AVCodecContext.frame_size, which is not as reliable
404 for indicating packet duration */
405 frame_size = av_get_audio_frame_duration(enc, 0);
407 frame_size = enc->frame_size;
409 waveformatextensible = (enc->channels > 2 && enc->channel_layout)
410 || enc->sample_rate > 48000
411 || av_get_bits_per_sample(enc->codec_id) > 16;
413 if (waveformatextensible) {
414 avio_wl16(pb, 0xfffe);
416 avio_wl16(pb, enc->codec_tag);
418 avio_wl16(pb, enc->channels);
419 avio_wl32(pb, enc->sample_rate);
420 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3 || enc->codec_id == AV_CODEC_ID_GSM_MS) {
423 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
424 if (enc->bits_per_coded_sample)
425 bps = enc->bits_per_coded_sample;
427 bps = 16; // default to 16
430 if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){
431 av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps);
434 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3) {
435 /* this is wrong, but it seems many demuxers do not work if this is set
437 blkalign = frame_size;
438 //blkalign = 144 * enc->bit_rate/enc->sample_rate;
439 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
440 blkalign = 3840; //maximum bytes per frame
441 } else if (enc->block_align != 0) { /* specified by the codec */
442 blkalign = enc->block_align;
444 blkalign = bps * enc->channels / av_gcd(8, bps);
445 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
446 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
447 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
448 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
449 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
450 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
451 bytespersec = enc->sample_rate * blkalign;
453 bytespersec = enc->bit_rate / 8;
455 avio_wl32(pb, bytespersec); /* bytes per second */
456 avio_wl16(pb, blkalign); /* block align */
457 avio_wl16(pb, bps); /* bits per sample */
458 if (enc->codec_id == AV_CODEC_ID_MP3) {
460 bytestream_put_le16(&riff_extradata, 1); /* wID */
461 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
462 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
463 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
464 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
465 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
467 bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */
468 bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */
469 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */
470 bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */
471 bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */
472 bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */
473 bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */
474 bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */
475 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
477 bytestream_put_le16(&riff_extradata, frame_size); /* wSamplesPerBlock */
478 } else if(enc->extradata_size){
479 riff_extradata_start= enc->extradata;
480 riff_extradata= enc->extradata + enc->extradata_size;
481 hdrsize += enc->extradata_size;
483 if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */
485 avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */
486 avio_wl16(pb, bps); /* ValidBitsPerSample || SamplesPerBlock || Reserved */
487 avio_wl32(pb, enc->channel_layout); /* dwChannelMask */
488 avio_wl32(pb, enc->codec_tag); /* GUID + next 3 */
489 avio_wl32(pb, 0x00100000);
490 avio_wl32(pb, 0xAA000080);
491 avio_wl32(pb, 0x719B3800);
493 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
495 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
504 /* BITMAPINFOHEADER header */
505 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf)
507 avio_wl32(pb, 40 + enc->extradata_size); /* size */
508 avio_wl32(pb, enc->width);
509 //We always store RGB TopDown
510 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
511 avio_wl16(pb, 1); /* planes */
513 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
514 /* compression type */
515 avio_wl32(pb, enc->codec_tag);
516 avio_wl32(pb, enc->width * enc->height * 3);
522 avio_write(pb, enc->extradata, enc->extradata_size);
524 if (!for_asf && enc->extradata_size & 1)
528 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
531 int audio_frame_size;
533 /* We use the known constant frame size for the codec if known, otherwise
534 fallback to using AVCodecContext.frame_size, which is not as reliable
535 for indicating packet duration */
536 audio_frame_size = av_get_audio_frame_duration(stream, 0);
537 if (!audio_frame_size)
538 audio_frame_size = stream->frame_size;
540 *au_ssize= stream->block_align;
541 if (audio_frame_size && stream->sample_rate) {
542 *au_scale = audio_frame_size;
543 *au_rate= stream->sample_rate;
544 }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO ||
545 stream->codec_type == AVMEDIA_TYPE_DATA ||
546 stream->codec_type == AVMEDIA_TYPE_SUBTITLE){
547 *au_scale= stream->time_base.num;
548 *au_rate = stream->time_base.den;
550 *au_scale= stream->block_align ? stream->block_align*8 : 8;
551 *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate;
553 gcd= av_gcd(*au_scale, *au_rate);
558 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
560 int len = strlen(str);
563 ffio_wfourcc(pb, tag);
565 avio_put_str(pb, str);
571 static const char riff_tags[][5] = {
572 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
573 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
574 "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
578 static int riff_has_valid_tags(AVFormatContext *s)
582 for (i = 0; *riff_tags[i]; i++) {
583 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
590 void ff_riff_write_info(AVFormatContext *s)
592 AVIOContext *pb = s->pb;
595 AVDictionaryEntry *t = NULL;
597 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
599 /* writing empty LIST is not nice and may cause problems */
600 if (!riff_has_valid_tags(s))
603 list_pos = ff_start_tag(pb, "LIST");
604 ffio_wfourcc(pb, "INFO");
605 for (i = 0; *riff_tags[i]; i++) {
606 if ((t = av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
607 ff_riff_write_info_tag(s->pb, t->key, t->value);
609 ff_end_tag(pb, list_pos);
611 #endif //CONFIG_MUXERS
614 /* We could be given one of the three possible structures here:
615 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
616 * is an expansion of the previous one with the fields added
617 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
618 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
619 * an openended structure.
621 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
626 codec->codec_type = AVMEDIA_TYPE_AUDIO;
627 codec->codec_tag = id;
628 codec->channels = avio_rl16(pb);
629 codec->sample_rate = avio_rl32(pb);
630 codec->bit_rate = avio_rl32(pb) * 8;
631 codec->block_align = avio_rl16(pb);
632 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
633 codec->bits_per_coded_sample = 8;
635 codec->bits_per_coded_sample = avio_rl16(pb);
636 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
637 int cbSize = avio_rl16(pb); /* cbSize */
639 cbSize = FFMIN(size, cbSize);
640 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
641 codec->bits_per_coded_sample = avio_rl16(pb);
642 codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
643 id = avio_rl32(pb); /* 4 first bytes of GUID */
644 avio_skip(pb, 12); /* skip end of GUID */
648 codec->extradata_size = cbSize;
650 av_free(codec->extradata);
651 codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
652 if (!codec->extradata)
653 return AVERROR(ENOMEM);
654 avio_read(pb, codec->extradata, codec->extradata_size);
658 /* It is possible for the chunk to contain garbage at the end */
662 codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
663 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
664 /* channels and sample_rate values are those prior to applying SBR and/or PS */
666 codec->sample_rate = 0;
668 /* override bits_per_coded_sample for G.726 */
669 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
670 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
676 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
679 id = ff_codec_get_id(ff_codec_wav_tags, tag);
682 /* handle specific u8 codec */
683 if (id == AV_CODEC_ID_PCM_S16LE && bps == 8)
684 id = AV_CODEC_ID_PCM_U8;
685 if (id == AV_CODEC_ID_PCM_S16LE && bps == 24)
686 id = AV_CODEC_ID_PCM_S24LE;
687 if (id == AV_CODEC_ID_PCM_S16LE && bps == 32)
688 id = AV_CODEC_ID_PCM_S32LE;
689 if (id == AV_CODEC_ID_PCM_F32LE && bps == 64)
690 id = AV_CODEC_ID_PCM_F64LE;
691 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
692 id = AV_CODEC_ID_PCM_ZORK;
696 int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
699 avio_rl32(pb); /* size */
700 st->codec->width = avio_rl32(pb);
701 st->codec->height = (int32_t)avio_rl32(pb);
702 avio_rl16(pb); /* planes */
703 st->codec->bits_per_coded_sample= avio_rl16(pb); /* depth */
704 tag1 = avio_rl32(pb);
705 avio_rl32(pb); /* ImageSize */
706 avio_rl32(pb); /* XPelsPerMeter */
707 avio_rl32(pb); /* YPelsPerMeter */
708 avio_rl32(pb); /* ClrUsed */
709 avio_rl32(pb); /* ClrImportant */
713 int ff_read_riff_info(AVFormatContext *s, int64_t size)
715 int64_t start, end, cur;
716 AVIOContext *pb = s->pb;
718 start = avio_tell(pb);
721 while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
727 chunk_code = avio_rl32(pb);
728 chunk_size = avio_rl32(pb);
729 if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
730 av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
731 return AVERROR_INVALIDDATA;
734 chunk_size += (chunk_size & 1);
736 value = av_malloc(chunk_size + 1);
738 av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
739 return AVERROR(ENOMEM);
742 AV_WL32(key, chunk_code);
744 if (avio_read(pb, value, chunk_size) != chunk_size) {
746 av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
747 return AVERROR_INVALIDDATA;
750 value[chunk_size] = 0;
752 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
757 #endif // CONFIG_DEMUXERS