Commit | Line | Data |
---|---|---|
9d9f4119 MR |
1 | /* |
2 | * RIFF codec tags | |
406792e7 | 3 | * Copyright (c) 2000 Fabrice Bellard |
9d9f4119 | 4 | * |
b78e7197 DB |
5 | * This file is part of FFmpeg. |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
9d9f4119 MR |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
b78e7197 | 10 | * version 2.1 of the License, or (at your option) any later version. |
9d9f4119 | 11 | * |
b78e7197 | 12 | * FFmpeg is distributed in the hope that it will be useful, |
9d9f4119 MR |
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. | |
16 | * | |
17 | * You should have received a copy of the GNU Lesser General Public | |
b78e7197 | 18 | * License along with FFmpeg; if not, write to the Free Software |
9d9f4119 MR |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | */ | |
21 | ||
245976da | 22 | #include "libavcodec/avcodec.h" |
9d9f4119 | 23 | #include "avformat.h" |
9d9f4119 | 24 | #include "riff.h" |
6e9f56c1 | 25 | #include "libavcodec/bytestream.h" |
9d9f4119 MR |
26 | |
27 | /* Note: when encoding, the first matching tag is used, so order is | |
28 | important if multiple tags possible for a given codec. */ | |
1a40491e | 29 | const AVCodecTag ff_codec_bmp_tags[] = { |
ab0b2e55 AJ |
30 | { CODEC_ID_H264, MKTAG('H', '2', '6', '4') }, |
31 | { CODEC_ID_H264, MKTAG('h', '2', '6', '4') }, | |
32 | { CODEC_ID_H264, MKTAG('X', '2', '6', '4') }, | |
33 | { CODEC_ID_H264, MKTAG('x', '2', '6', '4') }, | |
34 | { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, | |
35 | { CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') }, | |
ab0b2e55 | 36 | { CODEC_ID_H263, MKTAG('H', '2', '6', '3') }, |
26e8d342 | 37 | { CODEC_ID_H263, MKTAG('X', '2', '6', '3') }, |
d7c6552c | 38 | { CODEC_ID_H263, MKTAG('T', '2', '6', '3') }, |
26e8d342 | 39 | { CODEC_ID_H263, MKTAG('L', '2', '6', '3') }, |
62d6f73e | 40 | { CODEC_ID_H263, MKTAG('V', 'X', '1', 'K') }, |
5aef8462 | 41 | { CODEC_ID_H263, MKTAG('Z', 'y', 'G', 'o') }, |
ab0b2e55 AJ |
42 | { CODEC_ID_H263P, MKTAG('H', '2', '6', '3') }, |
43 | { CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */ | |
44 | { CODEC_ID_H261, MKTAG('H', '2', '6', '1') }, | |
ab0b2e55 AJ |
45 | { CODEC_ID_H263P, MKTAG('U', '2', '6', '3') }, |
46 | { CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') }, | |
ab0b2e55 AJ |
47 | { CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') }, |
48 | { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, | |
49 | { CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') }, | |
50 | { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') }, | |
51 | { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') }, | |
52 | { CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') }, | |
36b0782e | 53 | { CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) }, /* some broken avi use this */ |
ab0b2e55 AJ |
54 | { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') }, |
55 | { CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') }, | |
56 | { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, | |
57 | { CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') }, | |
58 | { CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') }, | |
59 | { CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') }, | |
ab0b2e55 | 60 | { CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') }, |
1b46683c | 61 | { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, |
26ae363e | 62 | { CODEC_ID_MPEG4, MKTAG('F', 'F', 'D', 'S') }, |
4a49a5fd | 63 | { CODEC_ID_MPEG4, MKTAG('F', 'V', 'F', 'W') }, |
26e8d342 BL |
64 | { CODEC_ID_MPEG4, MKTAG('D', 'C', 'O', 'D') }, |
65 | { CODEC_ID_MPEG4, MKTAG('M', 'V', 'X', 'M') }, | |
66 | { CODEC_ID_MPEG4, MKTAG('P', 'M', '4', 'V') }, | |
67 | { CODEC_ID_MPEG4, MKTAG('S', 'M', 'P', '4') }, | |
68 | { CODEC_ID_MPEG4, MKTAG('D', 'X', 'G', 'M') }, | |
69 | { CODEC_ID_MPEG4, MKTAG('V', 'I', 'D', 'M') }, | |
70 | { CODEC_ID_MPEG4, MKTAG('M', '4', 'T', '3') }, | |
b8cf645b | 71 | { CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'X') }, |
26e8d342 | 72 | { CODEC_ID_MPEG4, MKTAG('H', 'D', 'X', '4') }, /* flipped video */ |
62d6f73e | 73 | { CODEC_ID_MPEG4, MKTAG('D', 'M', 'K', '2') }, |
41b0534a | 74 | { CODEC_ID_MPEG4, MKTAG('D', 'I', 'G', 'I') }, |
4a49a5fd | 75 | { CODEC_ID_MPEG4, MKTAG('I', 'N', 'M', 'C') }, |
5823e4b8 | 76 | { CODEC_ID_MPEG4, MKTAG('E', 'P', 'H', 'V') }, /* Ephv MPEG-4 */ |
76af2edc | 77 | { CODEC_ID_MPEG4, MKTAG('E', 'M', '4', 'A') }, |
52837498 | 78 | { CODEC_ID_MPEG4, MKTAG('M', '4', 'C', 'C') }, /* Divio MPEG-4 */ |
3596f4e0 | 79 | { CODEC_ID_MPEG4, MKTAG('S', 'N', '4', '0') }, |
6667d5a5 | 80 | { CODEC_ID_MPEG4, MKTAG('V', 'S', 'P', 'X') }, |
5bc3fc21 | 81 | { CODEC_ID_MPEG4, MKTAG('U', 'L', 'D', 'X') }, |
86d58bcf | 82 | { CODEC_ID_MPEG4, MKTAG('G', 'E', 'O', 'V') }, |
ab0b2e55 AJ |
83 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */ |
84 | { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') }, | |
ab0b2e55 AJ |
85 | { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') }, |
86 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') }, | |
87 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') }, | |
88 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') }, | |
4a49a5fd | 89 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') }, |
ab0b2e55 AJ |
90 | { CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') }, |
91 | { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') }, | |
92 | { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') }, | |
ab0b2e55 | 93 | { CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') }, |
ab0b2e55 | 94 | { CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') }, |
ab0b2e55 | 95 | { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') }, |
26e8d342 | 96 | { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') }, |
ab0b2e55 | 97 | { CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') }, |
ab0b2e55 AJ |
98 | { CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') }, |
99 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') }, | |
100 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') }, | |
f9928b7e | 101 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') }, |
ab0b2e55 AJ |
102 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') }, |
103 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') }, | |
104 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') }, | |
105 | { CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */ | |
13b47b40 | 106 | { CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */ |
26e8d342 | 107 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, |
4bae2251 | 108 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', 's') }, |
c20a305b | 109 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') }, |
ab0b2e55 AJ |
110 | { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') }, |
111 | { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
112 | { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
113 | { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') }, | |
114 | { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, | |
26e8d342 | 115 | { CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') }, |
ab0b2e55 | 116 | { CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') }, |
36b0782e AJ |
117 | { CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) }, |
118 | { CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) }, | |
bc7ea1e5 | 119 | { CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) }, |
ab0b2e55 AJ |
120 | { CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') }, |
121 | { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') }, | |
6cffaea8 | 122 | { CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */ |
483aad71 | 123 | { CODEC_ID_MPEG2VIDEO, MKTAG('s', 'l', 'i', 'f') }, |
f63e5a74 | 124 | { CODEC_ID_MPEG2VIDEO, MKTAG('E', 'M', '2', 'V') }, |
ab0b2e55 AJ |
125 | { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, |
126 | { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
26e8d342 | 127 | { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') }, |
94ec3aca | 128 | { CODEC_ID_MJPEG, MKTAG('m', 'j', 'p', 'a') }, |
ab0b2e55 AJ |
129 | { CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') }, |
130 | { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */ | |
131 | { CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */ | |
f10d3d34 | 132 | { CODEC_ID_JPEGLS, MKTAG('M', 'J', 'P', 'G') }, |
ab0b2e55 AJ |
133 | { CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */ |
134 | { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, | |
135 | { CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') }, | |
136 | { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, | |
65fec2d9 | 137 | { CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') }, |
a9cf309b | 138 | { CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') }, |
ed0879ed | 139 | { CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */ |
54f8abde | 140 | { CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */ |
54089ecd | 141 | { CODEC_ID_MJPEG, MKTAG('I', 'J', 'L', 'V') }, /* Intel JPEG Library Video Codec */ |
dd9d5a1e | 142 | { CODEC_ID_MJPEG, MKTAG('M', 'V', 'J', 'P') }, /* Midvid JPEG Video Codec */ |
4b86926b CEH |
143 | { CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '1') }, |
144 | { CODEC_ID_MJPEG, MKTAG('A', 'V', 'I', '2') }, | |
ab176fdf | 145 | { CODEC_ID_MJPEG, MKTAG('M', 'T', 'S', 'J') }, |
418a287c | 146 | { CODEC_ID_MJPEG, MKTAG('Z', 'J', 'P', 'G') }, /* Paradigm Matrix M-JPEG Codec */ |
ab0b2e55 AJ |
147 | { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') }, |
148 | { CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') }, | |
149 | { CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') }, | |
36b0782e | 150 | { CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) }, |
fc3fc029 | 151 | { CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) }, |
ab0b2e55 AJ |
152 | { CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') }, |
153 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') }, | |
154 | { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') }, | |
9853bbb2 BL |
155 | { CODEC_ID_RAWVIDEO, MKTAG('V', '4', '2', '2') }, |
156 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'N', 'V') }, | |
157 | { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'V') }, | |
158 | { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'N', 'Y') }, | |
159 | { CODEC_ID_RAWVIDEO, MKTAG('u', 'y', 'v', '1') }, | |
160 | { CODEC_ID_RAWVIDEO, MKTAG('2', 'V', 'u', '1') }, | |
13547dd1 | 161 | { CODEC_ID_RAWVIDEO, MKTAG('2', 'v', 'u', 'y') }, |
9853bbb2 | 162 | { CODEC_ID_RAWVIDEO, MKTAG('P', '4', '2', '2') }, |
ab0b2e55 AJ |
163 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') }, |
164 | { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') }, | |
e47ca4f7 | 165 | { CODEC_ID_RAWVIDEO, MKTAG('V', 'Y', 'U', 'Y') }, |
ab0b2e55 AJ |
166 | { CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') }, |
167 | { CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') }, | |
168 | { CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') }, | |
71b0654c | 169 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') }, |
8be7ac98 | 170 | { CODEC_ID_RAWVIDEO, MKTAG('V', 'D', 'T', 'Z') }, /* SoftLab-NSK VideoTizer */ |
b43f432c | 171 | { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '1', '1') }, |
73762de1 SS |
172 | { CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '1', '2') }, |
173 | { CODEC_ID_RAWVIDEO, MKTAG('N', 'V', '2', '1') }, | |
d8b35b85 | 174 | { CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') }, |
4aaab0a3 | 175 | { CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, |
9c4e266c | 176 | { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, |
ab0b2e55 AJ |
177 | { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') }, |
178 | { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, | |
179 | { CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') }, | |
180 | { CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') }, | |
181 | { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, | |
182 | { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, | |
183 | { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, | |
184 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, | |
185 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, | |
186 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, | |
337104ac | 187 | { CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') }, |
03cb8458 | 188 | { CODEC_ID_VP6F, MKTAG('F', 'L', 'V', '4') }, |
6c7c6293 | 189 | { CODEC_ID_VP8, MKTAG('V', 'P', '8', '0') }, |
ab0b2e55 AJ |
190 | { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, |
191 | { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') }, | |
192 | { CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') }, | |
193 | { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') }, | |
194 | { CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') }, | |
e2260faa | 195 | { CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') }, |
ab0b2e55 | 196 | { CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') }, |
36b0782e | 197 | { CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) }, |
b30cb420 | 198 | { CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) }, |
ab0b2e55 AJ |
199 | { CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') }, |
200 | { CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') }, | |
201 | { CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') }, | |
202 | { CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') }, | |
203 | { CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') }, | |
204 | { CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') }, | |
205 | { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, | |
206 | { CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') }, | |
bf23f6dc | 207 | { CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') }, |
ab0b2e55 AJ |
208 | { CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') }, |
209 | { CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') }, | |
210 | { CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') }, | |
211 | { CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') }, | |
212 | { CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') }, | |
213 | { CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') }, | |
ab0b2e55 AJ |
214 | { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, |
215 | { CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') }, | |
216 | { CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') }, | |
217 | { CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') }, | |
218 | { CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') }, | |
219 | { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') }, | |
220 | { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') }, | |
221 | { CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') }, | |
222 | { CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') }, | |
223 | { CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') }, | |
224 | { CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') }, | |
225 | { CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') }, | |
226 | { CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') }, | |
227 | { CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') }, | |
228 | { CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') }, | |
229 | { CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') }, | |
230 | { CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') }, | |
231 | { CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') }, | |
232 | { CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') }, | |
233 | { CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') }, | |
234 | { CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') }, | |
235 | { CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') }, | |
236 | { CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') }, | |
237 | { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, | |
f86cd761 | 238 | { CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') }, |
0dccbba0 | 239 | { CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') }, |
ab0b2e55 | 240 | { CODEC_ID_CLJR, MKTAG('c', 'l', 'j', 'r') }, |
eb64714c | 241 | { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') }, |
65fec2d9 | 242 | { CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') }, |
c6340f86 BL |
243 | { CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') }, |
244 | { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') }, | |
e80c73b3 | 245 | { CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') }, |
c21fbefb KS |
246 | { CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') }, |
247 | { CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') }, | |
94d3d6a4 | 248 | { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') }, |
bf354122 | 249 | { CODEC_ID_KGV1, MKTAG('K', 'G', 'V', '1') }, |
ab0b2e55 | 250 | { CODEC_ID_NONE, 0 } |
9d9f4119 MR |
251 | }; |
252 | ||
1a40491e | 253 | const AVCodecTag ff_codec_wav_tags[] = { |
8af9090f DB |
254 | { CODEC_ID_PCM_S16LE, 0x0001 }, |
255 | { CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */ | |
256 | { CODEC_ID_PCM_S24LE, 0x0001 }, | |
257 | { CODEC_ID_PCM_S32LE, 0x0001 }, | |
258 | { CODEC_ID_ADPCM_MS, 0x0002 }, | |
57406d8e PR |
259 | { CODEC_ID_PCM_F32LE, 0x0003 }, |
260 | { CODEC_ID_PCM_F64LE, 0x0003 }, /* must come after f32le in this list */ | |
8af9090f DB |
261 | { CODEC_ID_PCM_ALAW, 0x0006 }, |
262 | { CODEC_ID_PCM_MULAW, 0x0007 }, | |
263 | { CODEC_ID_WMAVOICE, 0x000A }, | |
264 | { CODEC_ID_ADPCM_IMA_WAV, 0x0011 }, | |
4e0e6888 | 265 | { CODEC_ID_PCM_ZORK, 0x0011 }, /* must come after adpcm_ima_wav in this list */ |
8af9090f DB |
266 | { CODEC_ID_ADPCM_YAMAHA, 0x0020 }, |
267 | { CODEC_ID_TRUESPEECH, 0x0022 }, | |
268 | { CODEC_ID_GSM_MS, 0x0031 }, | |
269 | { CODEC_ID_ADPCM_G726, 0x0045 }, | |
270 | { CODEC_ID_MP2, 0x0050 }, | |
271 | { CODEC_ID_MP3, 0x0055 }, | |
c26436ec BL |
272 | { CODEC_ID_AMR_NB, 0x0057 }, |
273 | { CODEC_ID_AMR_WB, 0x0058 }, | |
8af9090f DB |
274 | { CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */ |
275 | { CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */ | |
4becee23 | 276 | { CODEC_ID_ADPCM_IMA_WAV, 0x0069 }, |
8af9090f DB |
277 | { CODEC_ID_VOXWARE, 0x0075 }, |
278 | { CODEC_ID_AAC, 0x00ff }, | |
faeedbbb | 279 | { CODEC_ID_SIPR, 0x0130 }, |
8af9090f DB |
280 | { CODEC_ID_WMAV1, 0x0160 }, |
281 | { CODEC_ID_WMAV2, 0x0161 }, | |
282 | { CODEC_ID_WMAPRO, 0x0162 }, | |
800b9c24 | 283 | { CODEC_ID_WMALOSSLESS, 0x0163 }, |
8af9090f DB |
284 | { CODEC_ID_ADPCM_CT, 0x0200 }, |
285 | { CODEC_ID_ATRAC3, 0x0270 }, | |
286 | { CODEC_ID_IMC, 0x0401 }, | |
4bf2b9e8 BL |
287 | { CODEC_ID_GSM_MS, 0x1500 }, |
288 | { CODEC_ID_TRUESPEECH, 0x1501 }, | |
8af9090f DB |
289 | { CODEC_ID_AC3, 0x2000 }, |
290 | { CODEC_ID_DTS, 0x2001 }, | |
291 | { CODEC_ID_SONIC, 0x2048 }, | |
292 | { CODEC_ID_SONIC_LS, 0x2048 }, | |
8e6e9bac | 293 | { CODEC_ID_PCM_MULAW, 0x6c75 }, |
8af9090f | 294 | { CODEC_ID_AAC, 0x706d }, |
6cffaea8 | 295 | { CODEC_ID_AAC, 0x4143 }, |
8af9090f DB |
296 | { CODEC_ID_FLAC, 0xF1AC }, |
297 | { CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' }, | |
298 | { CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id? | |
6ae177aa DB |
299 | |
300 | /* FIXME: All of the IDs below are not 16 bit and thus illegal. */ | |
9d9f4119 MR |
301 | // for NuppelVideo (nuv.c) |
302 | { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') }, | |
8af9090f DB |
303 | { CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') }, |
304 | { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') }, | |
bc2d2a07 | 305 | { CODEC_ID_NONE, 0 }, |
9d9f4119 MR |
306 | }; |
307 | ||
b250f9c6 | 308 | #if CONFIG_MUXERS |
1a40491e | 309 | int64_t ff_start_tag(ByteIOContext *pb, const char *tag) |
9d9f4119 MR |
310 | { |
311 | put_tag(pb, tag); | |
312 | put_le32(pb, 0); | |
313 | return url_ftell(pb); | |
314 | } | |
315 | ||
1a40491e | 316 | void ff_end_tag(ByteIOContext *pb, int64_t start) |
9d9f4119 | 317 | { |
bc5c918e | 318 | int64_t pos; |
9d9f4119 MR |
319 | |
320 | pos = url_ftell(pb); | |
321 | url_fseek(pb, start - 4, SEEK_SET); | |
322 | put_le32(pb, (uint32_t)(pos - start)); | |
323 | url_fseek(pb, pos, SEEK_SET); | |
324 | } | |
325 | ||
326 | /* WAVEFORMATEX header */ | |
327 | /* returns the size or -1 on error */ | |
1a40491e | 328 | int ff_put_wav_header(ByteIOContext *pb, AVCodecContext *enc) |
9d9f4119 MR |
329 | { |
330 | int bps, blkalign, bytespersec; | |
331 | int hdrsize = 18; | |
6e9f56c1 RB |
332 | int waveformatextensible; |
333 | uint8_t temp[256]; | |
334 | uint8_t *riff_extradata= temp; | |
335 | uint8_t *riff_extradata_start= temp; | |
9d9f4119 MR |
336 | |
337 | if(!enc->codec_tag || enc->codec_tag > 0xffff) | |
9d9f4119 | 338 | return -1; |
2c2a167c MN |
339 | waveformatextensible = (enc->channels > 2 && enc->channel_layout) |
340 | || enc->sample_rate > 48000 | |
341 | || av_get_bits_per_sample(enc->codec_id) > 16; | |
9d9f4119 | 342 | |
6e9f56c1 RB |
343 | if (waveformatextensible) { |
344 | put_le16(pb, 0xfffe); | |
345 | } else { | |
4bce3ba4 | 346 | put_le16(pb, enc->codec_tag); |
6e9f56c1 | 347 | } |
9d9f4119 MR |
348 | put_le16(pb, enc->channels); |
349 | put_le32(pb, enc->sample_rate); | |
235a51ad | 350 | if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) { |
9d9f4119 | 351 | bps = 0; |
9df9b810 | 352 | } else if (enc->codec_id == CODEC_ID_ADPCM_G726) { |
9d9f4119 | 353 | bps = 4; |
9d9f4119 | 354 | } else { |
24b8aa84 BC |
355 | if (!(bps = av_get_bits_per_sample(enc->codec_id))) |
356 | bps = 16; // default to 16 | |
9d9f4119 | 357 | } |
dd1c8f3e LA |
358 | if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){ |
359 | av_log(enc, AV_LOG_WARNING, "requested bits_per_coded_sample (%d) and actually stored (%d) differ\n", enc->bits_per_coded_sample, bps); | |
9376710d | 360 | } |
9d9f4119 | 361 | |
52cf3954 | 362 | if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_AC3) { |
755bfeab | 363 | blkalign = enc->frame_size; //this is wrong, but it seems many demuxers do not work if this is set correctly |
9d9f4119 MR |
364 | //blkalign = 144 * enc->bit_rate/enc->sample_rate; |
365 | } else if (enc->codec_id == CODEC_ID_ADPCM_G726) { // | |
366 | blkalign = 1; | |
367 | } else if (enc->block_align != 0) { /* specified by the codec */ | |
368 | blkalign = enc->block_align; | |
369 | } else | |
370 | blkalign = enc->channels*bps >> 3; | |
371 | if (enc->codec_id == CODEC_ID_PCM_U8 || | |
372 | enc->codec_id == CODEC_ID_PCM_S24LE || | |
373 | enc->codec_id == CODEC_ID_PCM_S32LE || | |
57406d8e PR |
374 | enc->codec_id == CODEC_ID_PCM_F32LE || |
375 | enc->codec_id == CODEC_ID_PCM_F64LE || | |
9d9f4119 MR |
376 | enc->codec_id == CODEC_ID_PCM_S16LE) { |
377 | bytespersec = enc->sample_rate * blkalign; | |
378 | } else { | |
379 | bytespersec = enc->bit_rate / 8; | |
380 | } | |
381 | put_le32(pb, bytespersec); /* bytes per second */ | |
382 | put_le16(pb, blkalign); /* block align */ | |
383 | put_le16(pb, bps); /* bits per sample */ | |
384 | if (enc->codec_id == CODEC_ID_MP3) { | |
9d9f4119 | 385 | hdrsize += 12; |
6e9f56c1 RB |
386 | bytestream_put_le16(&riff_extradata, 1); /* wID */ |
387 | bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */ | |
388 | bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */ | |
389 | bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */ | |
390 | bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */ | |
9d9f4119 | 391 | } else if (enc->codec_id == CODEC_ID_MP2) { |
9d9f4119 | 392 | hdrsize += 22; |
6e9f56c1 RB |
393 | bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */ |
394 | bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */ | |
395 | bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */ | |
396 | bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */ | |
397 | bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */ | |
398 | bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */ | |
399 | bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */ | |
400 | bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */ | |
c81604f8 | 401 | } else if (enc->codec_id == CODEC_ID_GSM_MS || enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { |
9d9f4119 | 402 | hdrsize += 2; |
6e9f56c1 | 403 | bytestream_put_le16(&riff_extradata, enc->frame_size); /* wSamplesPerBlock */ |
9d9f4119 | 404 | } else if(enc->extradata_size){ |
6e9f56c1 RB |
405 | riff_extradata_start= enc->extradata; |
406 | riff_extradata= enc->extradata + enc->extradata_size; | |
9d9f4119 | 407 | hdrsize += enc->extradata_size; |
6e9f56c1 RB |
408 | } else if (!waveformatextensible){ |
409 | hdrsize -= 2; | |
410 | } | |
411 | if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */ | |
412 | hdrsize += 22; | |
413 | put_le16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */ | |
414 | put_le16(pb, enc->bits_per_coded_sample); /* ValidBitsPerSample || SamplesPerBlock || Reserved */ | |
415 | put_le32(pb, enc->channel_layout); /* dwChannelMask */ | |
416 | put_le32(pb, enc->codec_tag); /* GUID + next 3 */ | |
417 | put_le32(pb, 0x00100000); | |
418 | put_le32(pb, 0xAA000080); | |
419 | put_le32(pb, 0x719B3800); | |
420 | } else if(riff_extradata - riff_extradata_start) { | |
421 | put_le16(pb, riff_extradata - riff_extradata_start); | |
422 | } | |
423 | put_buffer(pb, riff_extradata_start, riff_extradata - riff_extradata_start); | |
4bce3ba4 RB |
424 | if(hdrsize&1){ |
425 | hdrsize++; | |
426 | put_byte(pb, 0); | |
427 | } | |
9d9f4119 MR |
428 | |
429 | return hdrsize; | |
430 | } | |
431 | ||
432 | /* BITMAPINFOHEADER header */ | |
1a40491e | 433 | void ff_put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf) |
9d9f4119 MR |
434 | { |
435 | put_le32(pb, 40 + enc->extradata_size); /* size */ | |
436 | put_le32(pb, enc->width); | |
31f2616d MN |
437 | //We always store RGB TopDown |
438 | put_le32(pb, enc->codec_tag ? enc->height : -enc->height); | |
9d9f4119 MR |
439 | put_le16(pb, 1); /* planes */ |
440 | ||
dd1c8f3e | 441 | put_le16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */ |
9d9f4119 | 442 | /* compression type */ |
bb85077f | 443 | put_le32(pb, enc->codec_tag); |
9d9f4119 MR |
444 | put_le32(pb, enc->width * enc->height * 3); |
445 | put_le32(pb, 0); | |
446 | put_le32(pb, 0); | |
447 | put_le32(pb, 0); | |
448 | put_le32(pb, 0); | |
449 | ||
450 | put_buffer(pb, enc->extradata, enc->extradata_size); | |
451 | ||
63100f58 | 452 | if (!for_asf && enc->extradata_size & 1) |
9d9f4119 MR |
453 | put_byte(pb, 0); |
454 | } | |
455 | #endif //CONFIG_MUXERS | |
456 | ||
b250f9c6 | 457 | #if CONFIG_DEMUXERS |
9d9f4119 MR |
458 | /* We could be given one of the three possible structures here: |
459 | * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure | |
460 | * is an expansion of the previous one with the fields added | |
461 | * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and | |
462 | * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself | |
463 | * an openended structure. | |
464 | */ | |
1a40491e | 465 | void ff_get_wav_header(ByteIOContext *pb, AVCodecContext *codec, int size) |
9d9f4119 MR |
466 | { |
467 | int id; | |
468 | ||
469 | id = get_le16(pb); | |
72415b2a | 470 | codec->codec_type = AVMEDIA_TYPE_AUDIO; |
9d9f4119 MR |
471 | codec->codec_tag = id; |
472 | codec->channels = get_le16(pb); | |
473 | codec->sample_rate = get_le32(pb); | |
474 | codec->bit_rate = get_le32(pb) * 8; | |
475 | codec->block_align = get_le16(pb); | |
476 | if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */ | |
dd1c8f3e | 477 | codec->bits_per_coded_sample = 8; |
9d9f4119 | 478 | }else |
dd1c8f3e | 479 | codec->bits_per_coded_sample = get_le16(pb); |
72fd40bd BC |
480 | if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */ |
481 | int cbSize = get_le16(pb); /* cbSize */ | |
482 | size -= 18; | |
483 | cbSize = FFMIN(size, cbSize); | |
484 | if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ | |
dd1c8f3e | 485 | codec->bits_per_coded_sample = get_le16(pb); |
4fd71a0e | 486 | codec->channel_layout = get_le32(pb); /* dwChannelMask */ |
72fd40bd BC |
487 | id = get_le32(pb); /* 4 first bytes of GUID */ |
488 | url_fskip(pb, 12); /* skip end of GUID */ | |
489 | cbSize -= 22; | |
490 | size -= 22; | |
491 | } | |
492 | codec->extradata_size = cbSize; | |
493 | if (cbSize > 0) { | |
9d9f4119 MR |
494 | codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
495 | get_buffer(pb, codec->extradata, codec->extradata_size); | |
72fd40bd BC |
496 | size -= cbSize; |
497 | } | |
9d9f4119 MR |
498 | |
499 | /* It is possible for the chunk to contain garbage at the end */ | |
72fd40bd BC |
500 | if (size > 0) |
501 | url_fskip(pb, size); | |
9d9f4119 | 502 | } |
1a40491e | 503 | codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample); |
9d9f4119 MR |
504 | } |
505 | ||
506 | ||
1a40491e | 507 | enum CodecID ff_wav_codec_get_id(unsigned int tag, int bps) |
9d9f4119 | 508 | { |
9f2ace74 | 509 | enum CodecID id; |
1a40491e | 510 | id = ff_codec_get_id(ff_codec_wav_tags, tag); |
9d9f4119 MR |
511 | if (id <= 0) |
512 | return id; | |
513 | /* handle specific u8 codec */ | |
514 | if (id == CODEC_ID_PCM_S16LE && bps == 8) | |
515 | id = CODEC_ID_PCM_U8; | |
516 | if (id == CODEC_ID_PCM_S16LE && bps == 24) | |
517 | id = CODEC_ID_PCM_S24LE; | |
518 | if (id == CODEC_ID_PCM_S16LE && bps == 32) | |
519 | id = CODEC_ID_PCM_S32LE; | |
57406d8e PR |
520 | if (id == CODEC_ID_PCM_F32LE && bps == 64) |
521 | id = CODEC_ID_PCM_F64LE; | |
a11c2a2c MN |
522 | if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8) |
523 | id = CODEC_ID_PCM_ZORK; | |
9d9f4119 MR |
524 | return id; |
525 | } | |
526 | #endif // CONFIG_DEMUXERS | |
527 | ||
528 | void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale) | |
529 | { | |
530 | int gcd; | |
531 | ||
532 | *au_ssize= stream->block_align; | |
533 | if(stream->frame_size && stream->sample_rate){ | |
534 | *au_scale=stream->frame_size; | |
535 | *au_rate= stream->sample_rate; | |
72415b2a SS |
536 | }else if(stream->codec_type == AVMEDIA_TYPE_VIDEO || |
537 | stream->codec_type == AVMEDIA_TYPE_SUBTITLE){ | |
9d9f4119 MR |
538 | *au_scale= stream->time_base.num; |
539 | *au_rate = stream->time_base.den; | |
540 | }else{ | |
541 | *au_scale= stream->block_align ? stream->block_align*8 : 8; | |
a7805e29 | 542 | *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate; |
9d9f4119 | 543 | } |
9ce6c138 | 544 | gcd= av_gcd(*au_scale, *au_rate); |
9d9f4119 MR |
545 | *au_scale /= gcd; |
546 | *au_rate /= gcd; | |
547 | } |