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_NONE, 0 },
354 const AVMetadataConv ff_riff_info_conv[] = {
355 { "IART", "artist" },
356 { "ICMT", "comment" },
357 { "ICOP", "copyright" },
360 { "ILNG", "language" },
364 { "ISFT", "encoder" },
365 { "ITCH", "encoded_by"},
370 int64_t ff_start_tag(AVIOContext *pb, const char *tag)
372 ffio_wfourcc(pb, tag);
374 return avio_tell(pb);
377 void ff_end_tag(AVIOContext *pb, int64_t start)
382 avio_seek(pb, start - 4, SEEK_SET);
383 avio_wl32(pb, (uint32_t)(pos - start));
384 avio_seek(pb, pos, SEEK_SET);
387 /* WAVEFORMATEX header */
388 /* returns the size or -1 on error */
389 int ff_put_wav_header(AVIOContext *pb, AVCodecContext *enc)
391 int bps, blkalign, bytespersec, frame_size;
393 int waveformatextensible;
395 uint8_t *riff_extradata= temp;
396 uint8_t *riff_extradata_start= temp;
398 if(!enc->codec_tag || enc->codec_tag > 0xffff)
401 /* We use the known constant frame size for the codec if known, otherwise
402 fallback to using AVCodecContext.frame_size, which is not as reliable
403 for indicating packet duration */
404 frame_size = av_get_audio_frame_duration(enc, 0);
406 frame_size = enc->frame_size;
408 waveformatextensible = (enc->channels > 2 && enc->channel_layout)
409 || enc->sample_rate > 48000
410 || av_get_bits_per_sample(enc->codec_id) > 16;
412 if (waveformatextensible) {
413 avio_wl16(pb, 0xfffe);
415 avio_wl16(pb, enc->codec_tag);
417 avio_wl16(pb, enc->channels);
418 avio_wl32(pb, enc->sample_rate);
419 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3 || enc->codec_id == AV_CODEC_ID_GSM_MS) {
422 if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
423 if (enc->bits_per_coded_sample)
424 bps = enc->bits_per_coded_sample;
426 bps = 16; // default to 16
429 if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){
430 av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps);
433 if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3) {
434 /* this is wrong, but it seems many demuxers do not work if this is set
436 blkalign = frame_size;
437 //blkalign = 144 * enc->bit_rate/enc->sample_rate;
438 } else if (enc->codec_id == AV_CODEC_ID_AC3) {
439 blkalign = 3840; //maximum bytes per frame
440 } else if (enc->block_align != 0) { /* specified by the codec */
441 blkalign = enc->block_align;
443 blkalign = bps * enc->channels / av_gcd(8, bps);
444 if (enc->codec_id == AV_CODEC_ID_PCM_U8 ||
445 enc->codec_id == AV_CODEC_ID_PCM_S24LE ||
446 enc->codec_id == AV_CODEC_ID_PCM_S32LE ||
447 enc->codec_id == AV_CODEC_ID_PCM_F32LE ||
448 enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
449 enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
450 bytespersec = enc->sample_rate * blkalign;
452 bytespersec = enc->bit_rate / 8;
454 avio_wl32(pb, bytespersec); /* bytes per second */
455 avio_wl16(pb, blkalign); /* block align */
456 avio_wl16(pb, bps); /* bits per sample */
457 if (enc->codec_id == AV_CODEC_ID_MP3) {
459 bytestream_put_le16(&riff_extradata, 1); /* wID */
460 bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */
461 bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */
462 bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */
463 bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */
464 } else if (enc->codec_id == AV_CODEC_ID_MP2) {
466 bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */
467 bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */
468 bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */
469 bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */
470 bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */
471 bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */
472 bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */
473 bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */
474 } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
476 bytestream_put_le16(&riff_extradata, frame_size); /* wSamplesPerBlock */
477 } else if(enc->extradata_size){
478 riff_extradata_start= enc->extradata;
479 riff_extradata= enc->extradata + enc->extradata_size;
480 hdrsize += enc->extradata_size;
482 if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */
484 avio_wl16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */
485 avio_wl16(pb, bps); /* ValidBitsPerSample || SamplesPerBlock || Reserved */
486 avio_wl32(pb, enc->channel_layout); /* dwChannelMask */
487 avio_wl32(pb, enc->codec_tag); /* GUID + next 3 */
488 avio_wl32(pb, 0x00100000);
489 avio_wl32(pb, 0xAA000080);
490 avio_wl32(pb, 0x719B3800);
492 avio_wl16(pb, riff_extradata - riff_extradata_start); /* cbSize */
494 avio_write(pb, riff_extradata_start, riff_extradata - riff_extradata_start);
503 /* BITMAPINFOHEADER header */
504 void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf)
506 avio_wl32(pb, 40 + enc->extradata_size); /* size */
507 avio_wl32(pb, enc->width);
508 //We always store RGB TopDown
509 avio_wl32(pb, enc->codec_tag ? enc->height : -enc->height);
510 avio_wl16(pb, 1); /* planes */
512 avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
513 /* compression type */
514 avio_wl32(pb, enc->codec_tag);
515 avio_wl32(pb, enc->width * enc->height * 3);
521 avio_write(pb, enc->extradata, enc->extradata_size);
523 if (!for_asf && enc->extradata_size & 1)
527 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale)
530 int audio_frame_size;
532 /* We use the known constant frame size for the codec if known, otherwise
533 fallback to using AVCodecContext.frame_size, which is not as reliable
534 for indicating packet duration */
535 audio_frame_size = av_get_audio_frame_duration(stream, 0);
536 if (!audio_frame_size)
537 audio_frame_size = stream->frame_size;
539 *au_ssize= stream->block_align;
540 if (audio_frame_size && stream->sample_rate) {
541 *au_scale = audio_frame_size;
542 *au_rate= stream->sample_rate;
543 }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO ||
544 stream->codec_type == AVMEDIA_TYPE_DATA ||
545 stream->codec_type == AVMEDIA_TYPE_SUBTITLE){
546 *au_scale= stream->time_base.num;
547 *au_rate = stream->time_base.den;
549 *au_scale= stream->block_align ? stream->block_align*8 : 8;
550 *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate;
552 gcd= av_gcd(*au_scale, *au_rate);
557 void ff_riff_write_info_tag(AVIOContext *pb, const char *tag, const char *str)
559 int len = strlen(str);
562 ffio_wfourcc(pb, tag);
564 avio_put_str(pb, str);
570 static const char riff_tags[][5] = {
571 "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
572 "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
573 "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
577 static int riff_has_valid_tags(AVFormatContext *s)
581 for (i = 0; *riff_tags[i]; i++) {
582 if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
589 void ff_riff_write_info(AVFormatContext *s)
591 AVIOContext *pb = s->pb;
594 AVDictionaryEntry *t = NULL;
596 ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
598 /* writing empty LIST is not nice and may cause problems */
599 if (!riff_has_valid_tags(s))
602 list_pos = ff_start_tag(pb, "LIST");
603 ffio_wfourcc(pb, "INFO");
604 for (i = 0; *riff_tags[i]; i++) {
605 if ((t = av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
606 ff_riff_write_info_tag(s->pb, t->key, t->value);
608 ff_end_tag(pb, list_pos);
610 #endif //CONFIG_MUXERS
613 /* We could be given one of the three possible structures here:
614 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure
615 * is an expansion of the previous one with the fields added
616 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and
617 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself
618 * an openended structure.
620 int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
625 codec->codec_type = AVMEDIA_TYPE_AUDIO;
626 codec->codec_tag = id;
627 codec->channels = avio_rl16(pb);
628 codec->sample_rate = avio_rl32(pb);
629 codec->bit_rate = avio_rl32(pb) * 8;
630 codec->block_align = avio_rl16(pb);
631 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */
632 codec->bits_per_coded_sample = 8;
634 codec->bits_per_coded_sample = avio_rl16(pb);
635 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */
636 int cbSize = avio_rl16(pb); /* cbSize */
638 cbSize = FFMIN(size, cbSize);
639 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
640 codec->bits_per_coded_sample = avio_rl16(pb);
641 codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
642 id = avio_rl32(pb); /* 4 first bytes of GUID */
643 avio_skip(pb, 12); /* skip end of GUID */
647 codec->extradata_size = cbSize;
649 av_free(codec->extradata);
650 codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
651 if (!codec->extradata)
652 return AVERROR(ENOMEM);
653 avio_read(pb, codec->extradata, codec->extradata_size);
657 /* It is possible for the chunk to contain garbage at the end */
661 codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
662 if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
663 /* channels and sample_rate values are those prior to applying SBR and/or PS */
665 codec->sample_rate = 0;
667 /* override bits_per_coded_sample for G.726 */
668 if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
669 codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
675 enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
678 id = ff_codec_get_id(ff_codec_wav_tags, tag);
681 /* handle specific u8 codec */
682 if (id == AV_CODEC_ID_PCM_S16LE && bps == 8)
683 id = AV_CODEC_ID_PCM_U8;
684 if (id == AV_CODEC_ID_PCM_S16LE && bps == 24)
685 id = AV_CODEC_ID_PCM_S24LE;
686 if (id == AV_CODEC_ID_PCM_S16LE && bps == 32)
687 id = AV_CODEC_ID_PCM_S32LE;
688 if (id == AV_CODEC_ID_PCM_F32LE && bps == 64)
689 id = AV_CODEC_ID_PCM_F64LE;
690 if (id == AV_CODEC_ID_ADPCM_IMA_WAV && bps == 8)
691 id = AV_CODEC_ID_PCM_ZORK;
695 int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
698 avio_rl32(pb); /* size */
699 st->codec->width = avio_rl32(pb);
700 st->codec->height = (int32_t)avio_rl32(pb);
701 avio_rl16(pb); /* planes */
702 st->codec->bits_per_coded_sample= avio_rl16(pb); /* depth */
703 tag1 = avio_rl32(pb);
704 avio_rl32(pb); /* ImageSize */
705 avio_rl32(pb); /* XPelsPerMeter */
706 avio_rl32(pb); /* YPelsPerMeter */
707 avio_rl32(pb); /* ClrUsed */
708 avio_rl32(pb); /* ClrImportant */
712 int ff_read_riff_info(AVFormatContext *s, int64_t size)
714 int64_t start, end, cur;
715 AVIOContext *pb = s->pb;
717 start = avio_tell(pb);
720 while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
726 chunk_code = avio_rl32(pb);
727 chunk_size = avio_rl32(pb);
729 if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
730 av_log(s, AV_LOG_WARNING, "too big INFO subchunk\n");
734 chunk_size += (chunk_size & 1);
738 avio_skip(pb, chunk_size);
742 value = av_malloc(chunk_size + 1);
744 av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
745 return AVERROR(ENOMEM);
748 AV_WL32(key, chunk_code);
750 if (avio_read(pb, value, chunk_size) != chunk_size) {
752 av_log(s, AV_LOG_WARNING, "premature end of file while reading INFO tag\n");
756 value[chunk_size] = 0;
758 av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
763 #endif // CONFIG_DEMUXERS