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. */ | |
7caf0cc6 | 29 | const AVCodecTag 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') }, |
ab0b2e55 AJ |
80 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */ |
81 | { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') }, | |
ab0b2e55 AJ |
82 | { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') }, |
83 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') }, | |
84 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') }, | |
85 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') }, | |
4a49a5fd | 86 | { CODEC_ID_MSMPEG4V3, MKTAG('D', 'V', 'X', '3') }, |
ab0b2e55 AJ |
87 | { CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') }, |
88 | { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') }, | |
89 | { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') }, | |
ab0b2e55 | 90 | { CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') }, |
ab0b2e55 | 91 | { CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') }, |
ab0b2e55 | 92 | { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') }, |
26e8d342 | 93 | { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', '4', '1') }, |
ab0b2e55 | 94 | { CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') }, |
ab0b2e55 AJ |
95 | { CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') }, |
96 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') }, | |
97 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') }, | |
f9928b7e | 98 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') }, |
ab0b2e55 AJ |
99 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') }, |
100 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') }, | |
101 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') }, | |
102 | { CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */ | |
13b47b40 | 103 | { CODEC_ID_DVVIDEO, MKTAG('C', 'D', 'V', 'H') }, /* Canopus DV */ |
26e8d342 | 104 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'c', ' ') }, |
c20a305b | 105 | { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', '1') }, |
ab0b2e55 AJ |
106 | { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') }, |
107 | { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
108 | { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
109 | { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') }, | |
110 | { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, | |
26e8d342 | 111 | { CODEC_ID_MPEG2VIDEO, MKTAG('P', 'I', 'M', '2') }, |
ab0b2e55 | 112 | { CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') }, |
36b0782e AJ |
113 | { CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) }, |
114 | { CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) }, | |
bc7ea1e5 | 115 | { CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 16) }, |
ab0b2e55 AJ |
116 | { CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') }, |
117 | { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') }, | |
6cffaea8 | 118 | { CODEC_ID_MPEG2VIDEO, MKTAG('L', 'M', 'P', '2') }, /* Lead MPEG2 in avi */ |
ab0b2e55 AJ |
119 | { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, |
120 | { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
26e8d342 | 121 | { CODEC_ID_MJPEG, MKTAG('d', 'm', 'b', '1') }, |
ab0b2e55 AJ |
122 | { CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') }, |
123 | { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */ | |
124 | { CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */ | |
125 | { CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */ | |
126 | { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, | |
127 | { CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') }, | |
128 | { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, | |
65fec2d9 | 129 | { CODEC_ID_MJPEG, MKTAG('A', 'C', 'D', 'V') }, |
a9cf309b | 130 | { CODEC_ID_MJPEG, MKTAG('Q', 'I', 'V', 'G') }, |
ed0879ed | 131 | { CODEC_ID_MJPEG, MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */ |
54f8abde | 132 | { CODEC_ID_MJPEG, MKTAG('C', 'J', 'P', 'G') }, /* Creative Webcam JPEG */ |
ab0b2e55 AJ |
133 | { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') }, |
134 | { CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') }, | |
135 | { CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') }, | |
36b0782e | 136 | { CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) }, |
fc3fc029 | 137 | { CODEC_ID_RAWVIDEO, MKTAG( 3 , 0 , 0 , 0 ) }, |
ab0b2e55 AJ |
138 | { CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') }, |
139 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') }, | |
140 | { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') }, | |
141 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') }, | |
142 | { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') }, | |
143 | { CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') }, | |
144 | { CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') }, | |
145 | { CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') }, | |
71b0654c | 146 | { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') }, |
9c4e266c | 147 | { CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, |
ab0b2e55 AJ |
148 | { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') }, |
149 | { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, | |
150 | { CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') }, | |
151 | { CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') }, | |
152 | { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, | |
153 | { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, | |
154 | { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, | |
155 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, | |
156 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, | |
157 | { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, | |
158 | { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, | |
159 | { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') }, | |
160 | { CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') }, | |
161 | { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') }, | |
162 | { CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') }, | |
e2260faa | 163 | { CODEC_ID_MIMIC, MKTAG('L', 'M', '2', '0') }, |
ab0b2e55 | 164 | { CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') }, |
36b0782e | 165 | { CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) }, |
b30cb420 | 166 | { CODEC_ID_MSRLE, MKTAG( 2 , 0 , 0 , 0 ) }, |
ab0b2e55 AJ |
167 | { CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') }, |
168 | { CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') }, | |
169 | { CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') }, | |
170 | { CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') }, | |
171 | { CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') }, | |
172 | { CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') }, | |
173 | { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, | |
174 | { CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') }, | |
bf23f6dc | 175 | { CODEC_ID_TRUEMOTION1, MKTAG('P', 'V', 'E', 'Z') }, |
ab0b2e55 AJ |
176 | { CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') }, |
177 | { CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') }, | |
178 | { CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') }, | |
179 | { CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') }, | |
180 | { CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') }, | |
181 | { CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') }, | |
182 | { CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') }, | |
183 | { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, | |
184 | { CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') }, | |
185 | { CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') }, | |
186 | { CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') }, | |
187 | { CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') }, | |
188 | { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') }, | |
189 | { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') }, | |
190 | { CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') }, | |
191 | { CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') }, | |
192 | { CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') }, | |
193 | { CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') }, | |
194 | { CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') }, | |
195 | { CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') }, | |
196 | { CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') }, | |
197 | { CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') }, | |
198 | { CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') }, | |
199 | { CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') }, | |
200 | { CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') }, | |
201 | { CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') }, | |
202 | { CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') }, | |
203 | { CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') }, | |
204 | { CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') }, | |
205 | { CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') }, | |
206 | { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, | |
f86cd761 | 207 | { CODEC_ID_PNG, MKTAG('M', 'P', 'N', 'G') }, |
0dccbba0 | 208 | { CODEC_ID_PNG, MKTAG('P', 'N', 'G', '1') }, |
ab0b2e55 | 209 | { CODEC_ID_CLJR, MKTAG('c', 'l', 'j', 'r') }, |
eb64714c | 210 | { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') }, |
65fec2d9 | 211 | { CODEC_ID_RPZA, MKTAG('a', 'z', 'p', 'r') }, |
c6340f86 BL |
212 | { CODEC_ID_RPZA, MKTAG('R', 'P', 'Z', 'A') }, |
213 | { CODEC_ID_RPZA, MKTAG('r', 'p', 'z', 'a') }, | |
e80c73b3 | 214 | { CODEC_ID_SP5X, MKTAG('S', 'P', '5', '4') }, |
c21fbefb KS |
215 | { CODEC_ID_AURA, MKTAG('A', 'U', 'R', 'A') }, |
216 | { CODEC_ID_AURA2, MKTAG('A', 'U', 'R', '2') }, | |
94d3d6a4 | 217 | { CODEC_ID_DPX, MKTAG('d', 'p', 'x', ' ') }, |
ab0b2e55 | 218 | { CODEC_ID_NONE, 0 } |
9d9f4119 MR |
219 | }; |
220 | ||
7caf0cc6 | 221 | const AVCodecTag codec_wav_tags[] = { |
8af9090f DB |
222 | { CODEC_ID_PCM_S16LE, 0x0001 }, |
223 | { CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */ | |
224 | { CODEC_ID_PCM_S24LE, 0x0001 }, | |
225 | { CODEC_ID_PCM_S32LE, 0x0001 }, | |
226 | { CODEC_ID_ADPCM_MS, 0x0002 }, | |
57406d8e PR |
227 | { CODEC_ID_PCM_F32LE, 0x0003 }, |
228 | { CODEC_ID_PCM_F64LE, 0x0003 }, /* must come after f32le in this list */ | |
8af9090f DB |
229 | { CODEC_ID_PCM_ALAW, 0x0006 }, |
230 | { CODEC_ID_PCM_MULAW, 0x0007 }, | |
231 | { CODEC_ID_WMAVOICE, 0x000A }, | |
232 | { CODEC_ID_ADPCM_IMA_WAV, 0x0011 }, | |
4e0e6888 | 233 | { CODEC_ID_PCM_ZORK, 0x0011 }, /* must come after adpcm_ima_wav in this list */ |
8af9090f DB |
234 | { CODEC_ID_ADPCM_YAMAHA, 0x0020 }, |
235 | { CODEC_ID_TRUESPEECH, 0x0022 }, | |
236 | { CODEC_ID_GSM_MS, 0x0031 }, | |
237 | { CODEC_ID_ADPCM_G726, 0x0045 }, | |
238 | { CODEC_ID_MP2, 0x0050 }, | |
239 | { CODEC_ID_MP3, 0x0055 }, | |
c26436ec BL |
240 | { CODEC_ID_AMR_NB, 0x0057 }, |
241 | { CODEC_ID_AMR_WB, 0x0058 }, | |
8af9090f DB |
242 | { CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */ |
243 | { CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */ | |
4becee23 | 244 | { CODEC_ID_ADPCM_IMA_WAV, 0x0069 }, |
8af9090f DB |
245 | { CODEC_ID_VOXWARE, 0x0075 }, |
246 | { CODEC_ID_AAC, 0x00ff }, | |
faeedbbb | 247 | { CODEC_ID_SIPR, 0x0130 }, |
8af9090f DB |
248 | { CODEC_ID_WMAV1, 0x0160 }, |
249 | { CODEC_ID_WMAV2, 0x0161 }, | |
250 | { CODEC_ID_WMAPRO, 0x0162 }, | |
800b9c24 | 251 | { CODEC_ID_WMALOSSLESS, 0x0163 }, |
8af9090f DB |
252 | { CODEC_ID_ADPCM_CT, 0x0200 }, |
253 | { CODEC_ID_ATRAC3, 0x0270 }, | |
254 | { CODEC_ID_IMC, 0x0401 }, | |
255 | { CODEC_ID_AC3, 0x2000 }, | |
256 | { CODEC_ID_DTS, 0x2001 }, | |
257 | { CODEC_ID_SONIC, 0x2048 }, | |
258 | { CODEC_ID_SONIC_LS, 0x2048 }, | |
8e6e9bac | 259 | { CODEC_ID_PCM_MULAW, 0x6c75 }, |
8af9090f | 260 | { CODEC_ID_AAC, 0x706d }, |
6cffaea8 | 261 | { CODEC_ID_AAC, 0x4143 }, |
8af9090f DB |
262 | { CODEC_ID_FLAC, 0xF1AC }, |
263 | { CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' }, | |
264 | { CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id? | |
6ae177aa DB |
265 | |
266 | /* FIXME: All of the IDs below are not 16 bit and thus illegal. */ | |
9d9f4119 MR |
267 | // for NuppelVideo (nuv.c) |
268 | { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') }, | |
8af9090f DB |
269 | { CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') }, |
270 | { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') }, | |
9d9f4119 MR |
271 | { 0, 0 }, |
272 | }; | |
273 | ||
b250f9c6 | 274 | #if CONFIG_MUXERS |
bc5c918e | 275 | int64_t start_tag(ByteIOContext *pb, const char *tag) |
9d9f4119 MR |
276 | { |
277 | put_tag(pb, tag); | |
278 | put_le32(pb, 0); | |
279 | return url_ftell(pb); | |
280 | } | |
281 | ||
bc5c918e | 282 | void end_tag(ByteIOContext *pb, int64_t start) |
9d9f4119 | 283 | { |
bc5c918e | 284 | int64_t pos; |
9d9f4119 MR |
285 | |
286 | pos = url_ftell(pb); | |
287 | url_fseek(pb, start - 4, SEEK_SET); | |
288 | put_le32(pb, (uint32_t)(pos - start)); | |
289 | url_fseek(pb, pos, SEEK_SET); | |
290 | } | |
291 | ||
292 | /* WAVEFORMATEX header */ | |
293 | /* returns the size or -1 on error */ | |
294 | int put_wav_header(ByteIOContext *pb, AVCodecContext *enc) | |
295 | { | |
296 | int bps, blkalign, bytespersec; | |
297 | int hdrsize = 18; | |
6e9f56c1 RB |
298 | int waveformatextensible; |
299 | uint8_t temp[256]; | |
300 | uint8_t *riff_extradata= temp; | |
301 | uint8_t *riff_extradata_start= temp; | |
9d9f4119 MR |
302 | |
303 | if(!enc->codec_tag || enc->codec_tag > 0xffff) | |
9d9f4119 | 304 | return -1; |
6e9f56c1 | 305 | waveformatextensible = enc->channels > 2 && enc->channel_layout; |
9d9f4119 | 306 | |
6e9f56c1 RB |
307 | if (waveformatextensible) { |
308 | put_le16(pb, 0xfffe); | |
309 | } else { | |
4bce3ba4 | 310 | put_le16(pb, enc->codec_tag); |
6e9f56c1 | 311 | } |
9d9f4119 MR |
312 | put_le16(pb, enc->channels); |
313 | put_le32(pb, enc->sample_rate); | |
235a51ad | 314 | if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) { |
9d9f4119 MR |
315 | bps = 0; |
316 | } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV || enc->codec_id == CODEC_ID_ADPCM_MS || enc->codec_id == CODEC_ID_ADPCM_G726 || enc->codec_id == CODEC_ID_ADPCM_YAMAHA) { // | |
317 | bps = 4; | |
9d9f4119 | 318 | } else { |
24b8aa84 BC |
319 | if (!(bps = av_get_bits_per_sample(enc->codec_id))) |
320 | bps = 16; // default to 16 | |
9d9f4119 | 321 | } |
dd1c8f3e LA |
322 | if(bps != enc->bits_per_coded_sample && enc->bits_per_coded_sample){ |
323 | 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 | 324 | } |
9d9f4119 | 325 | |
52cf3954 | 326 | if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_AC3) { |
755bfeab | 327 | blkalign = enc->frame_size; //this is wrong, but it seems many demuxers do not work if this is set correctly |
9d9f4119 MR |
328 | //blkalign = 144 * enc->bit_rate/enc->sample_rate; |
329 | } else if (enc->codec_id == CODEC_ID_ADPCM_G726) { // | |
330 | blkalign = 1; | |
331 | } else if (enc->block_align != 0) { /* specified by the codec */ | |
332 | blkalign = enc->block_align; | |
333 | } else | |
334 | blkalign = enc->channels*bps >> 3; | |
335 | if (enc->codec_id == CODEC_ID_PCM_U8 || | |
336 | enc->codec_id == CODEC_ID_PCM_S24LE || | |
337 | enc->codec_id == CODEC_ID_PCM_S32LE || | |
57406d8e PR |
338 | enc->codec_id == CODEC_ID_PCM_F32LE || |
339 | enc->codec_id == CODEC_ID_PCM_F64LE || | |
9d9f4119 MR |
340 | enc->codec_id == CODEC_ID_PCM_S16LE) { |
341 | bytespersec = enc->sample_rate * blkalign; | |
342 | } else { | |
343 | bytespersec = enc->bit_rate / 8; | |
344 | } | |
345 | put_le32(pb, bytespersec); /* bytes per second */ | |
346 | put_le16(pb, blkalign); /* block align */ | |
347 | put_le16(pb, bps); /* bits per sample */ | |
348 | if (enc->codec_id == CODEC_ID_MP3) { | |
9d9f4119 | 349 | hdrsize += 12; |
6e9f56c1 RB |
350 | bytestream_put_le16(&riff_extradata, 1); /* wID */ |
351 | bytestream_put_le32(&riff_extradata, 2); /* fdwFlags */ | |
352 | bytestream_put_le16(&riff_extradata, 1152); /* nBlockSize */ | |
353 | bytestream_put_le16(&riff_extradata, 1); /* nFramesPerBlock */ | |
354 | bytestream_put_le16(&riff_extradata, 1393); /* nCodecDelay */ | |
9d9f4119 | 355 | } else if (enc->codec_id == CODEC_ID_MP2) { |
9d9f4119 | 356 | hdrsize += 22; |
6e9f56c1 RB |
357 | bytestream_put_le16(&riff_extradata, 2); /* fwHeadLayer */ |
358 | bytestream_put_le32(&riff_extradata, enc->bit_rate); /* dwHeadBitrate */ | |
359 | bytestream_put_le16(&riff_extradata, enc->channels == 2 ? 1 : 8); /* fwHeadMode */ | |
360 | bytestream_put_le16(&riff_extradata, 0); /* fwHeadModeExt */ | |
361 | bytestream_put_le16(&riff_extradata, 1); /* wHeadEmphasis */ | |
362 | bytestream_put_le16(&riff_extradata, 16); /* fwHeadFlags */ | |
363 | bytestream_put_le32(&riff_extradata, 0); /* dwPTSLow */ | |
364 | bytestream_put_le32(&riff_extradata, 0); /* dwPTSHigh */ | |
c81604f8 | 365 | } else if (enc->codec_id == CODEC_ID_GSM_MS || enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { |
9d9f4119 | 366 | hdrsize += 2; |
6e9f56c1 | 367 | bytestream_put_le16(&riff_extradata, enc->frame_size); /* wSamplesPerBlock */ |
9d9f4119 | 368 | } else if(enc->extradata_size){ |
6e9f56c1 RB |
369 | riff_extradata_start= enc->extradata; |
370 | riff_extradata= enc->extradata + enc->extradata_size; | |
9d9f4119 | 371 | hdrsize += enc->extradata_size; |
6e9f56c1 RB |
372 | } else if (!waveformatextensible){ |
373 | hdrsize -= 2; | |
374 | } | |
375 | if(waveformatextensible) { /* write WAVEFORMATEXTENSIBLE extensions */ | |
376 | hdrsize += 22; | |
377 | put_le16(pb, riff_extradata - riff_extradata_start + 22); /* 22 is WAVEFORMATEXTENSIBLE size */ | |
378 | put_le16(pb, enc->bits_per_coded_sample); /* ValidBitsPerSample || SamplesPerBlock || Reserved */ | |
379 | put_le32(pb, enc->channel_layout); /* dwChannelMask */ | |
380 | put_le32(pb, enc->codec_tag); /* GUID + next 3 */ | |
381 | put_le32(pb, 0x00100000); | |
382 | put_le32(pb, 0xAA000080); | |
383 | put_le32(pb, 0x719B3800); | |
384 | } else if(riff_extradata - riff_extradata_start) { | |
385 | put_le16(pb, riff_extradata - riff_extradata_start); | |
386 | } | |
387 | put_buffer(pb, riff_extradata_start, riff_extradata - riff_extradata_start); | |
4bce3ba4 RB |
388 | if(hdrsize&1){ |
389 | hdrsize++; | |
390 | put_byte(pb, 0); | |
391 | } | |
9d9f4119 MR |
392 | |
393 | return hdrsize; | |
394 | } | |
395 | ||
396 | /* BITMAPINFOHEADER header */ | |
7caf0cc6 | 397 | void put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf) |
9d9f4119 MR |
398 | { |
399 | put_le32(pb, 40 + enc->extradata_size); /* size */ | |
400 | put_le32(pb, enc->width); | |
31f2616d MN |
401 | //We always store RGB TopDown |
402 | put_le32(pb, enc->codec_tag ? enc->height : -enc->height); | |
9d9f4119 MR |
403 | put_le16(pb, 1); /* planes */ |
404 | ||
dd1c8f3e | 405 | put_le16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */ |
9d9f4119 | 406 | /* compression type */ |
bb85077f | 407 | put_le32(pb, enc->codec_tag); |
9d9f4119 MR |
408 | put_le32(pb, enc->width * enc->height * 3); |
409 | put_le32(pb, 0); | |
410 | put_le32(pb, 0); | |
411 | put_le32(pb, 0); | |
412 | put_le32(pb, 0); | |
413 | ||
414 | put_buffer(pb, enc->extradata, enc->extradata_size); | |
415 | ||
416 | if (enc->extradata_size & 1) | |
417 | put_byte(pb, 0); | |
418 | } | |
419 | #endif //CONFIG_MUXERS | |
420 | ||
b250f9c6 | 421 | #if CONFIG_DEMUXERS |
9d9f4119 MR |
422 | /* We could be given one of the three possible structures here: |
423 | * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure | |
424 | * is an expansion of the previous one with the fields added | |
425 | * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and | |
426 | * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself | |
427 | * an openended structure. | |
428 | */ | |
429 | void get_wav_header(ByteIOContext *pb, AVCodecContext *codec, int size) | |
430 | { | |
431 | int id; | |
432 | ||
433 | id = get_le16(pb); | |
434 | codec->codec_type = CODEC_TYPE_AUDIO; | |
435 | codec->codec_tag = id; | |
436 | codec->channels = get_le16(pb); | |
437 | codec->sample_rate = get_le32(pb); | |
438 | codec->bit_rate = get_le32(pb) * 8; | |
439 | codec->block_align = get_le16(pb); | |
440 | if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */ | |
dd1c8f3e | 441 | codec->bits_per_coded_sample = 8; |
9d9f4119 | 442 | }else |
dd1c8f3e | 443 | codec->bits_per_coded_sample = get_le16(pb); |
72fd40bd BC |
444 | if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */ |
445 | int cbSize = get_le16(pb); /* cbSize */ | |
446 | size -= 18; | |
447 | cbSize = FFMIN(size, cbSize); | |
448 | if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ | |
dd1c8f3e | 449 | codec->bits_per_coded_sample = get_le16(pb); |
4fd71a0e | 450 | codec->channel_layout = get_le32(pb); /* dwChannelMask */ |
72fd40bd BC |
451 | id = get_le32(pb); /* 4 first bytes of GUID */ |
452 | url_fskip(pb, 12); /* skip end of GUID */ | |
453 | cbSize -= 22; | |
454 | size -= 22; | |
455 | } | |
456 | codec->extradata_size = cbSize; | |
457 | if (cbSize > 0) { | |
9d9f4119 MR |
458 | codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
459 | get_buffer(pb, codec->extradata, codec->extradata_size); | |
72fd40bd BC |
460 | size -= cbSize; |
461 | } | |
9d9f4119 MR |
462 | |
463 | /* It is possible for the chunk to contain garbage at the end */ | |
72fd40bd BC |
464 | if (size > 0) |
465 | url_fskip(pb, size); | |
9d9f4119 | 466 | } |
dd1c8f3e | 467 | codec->codec_id = wav_codec_get_id(id, codec->bits_per_coded_sample); |
9d9f4119 MR |
468 | } |
469 | ||
470 | ||
9f2ace74 | 471 | enum CodecID wav_codec_get_id(unsigned int tag, int bps) |
9d9f4119 | 472 | { |
9f2ace74 | 473 | enum CodecID id; |
9d9f4119 MR |
474 | id = codec_get_id(codec_wav_tags, tag); |
475 | if (id <= 0) | |
476 | return id; | |
477 | /* handle specific u8 codec */ | |
478 | if (id == CODEC_ID_PCM_S16LE && bps == 8) | |
479 | id = CODEC_ID_PCM_U8; | |
480 | if (id == CODEC_ID_PCM_S16LE && bps == 24) | |
481 | id = CODEC_ID_PCM_S24LE; | |
482 | if (id == CODEC_ID_PCM_S16LE && bps == 32) | |
483 | id = CODEC_ID_PCM_S32LE; | |
57406d8e PR |
484 | if (id == CODEC_ID_PCM_F32LE && bps == 64) |
485 | id = CODEC_ID_PCM_F64LE; | |
a11c2a2c MN |
486 | if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8) |
487 | id = CODEC_ID_PCM_ZORK; | |
9d9f4119 MR |
488 | return id; |
489 | } | |
490 | #endif // CONFIG_DEMUXERS | |
491 | ||
492 | void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale) | |
493 | { | |
494 | int gcd; | |
495 | ||
496 | *au_ssize= stream->block_align; | |
497 | if(stream->frame_size && stream->sample_rate){ | |
498 | *au_scale=stream->frame_size; | |
499 | *au_rate= stream->sample_rate; | |
500 | }else if(stream->codec_type == CODEC_TYPE_VIDEO){ | |
501 | *au_scale= stream->time_base.num; | |
502 | *au_rate = stream->time_base.den; | |
503 | }else{ | |
504 | *au_scale= stream->block_align ? stream->block_align*8 : 8; | |
a7805e29 | 505 | *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate; |
9d9f4119 | 506 | } |
9ce6c138 | 507 | gcd= av_gcd(*au_scale, *au_rate); |
9d9f4119 MR |
508 | *au_scale /= gcd; |
509 | *au_rate /= gcd; | |
510 | } |