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