Mercurial > libavformat.hg
annotate riff.c @ 3233:e2bdb989f7da libavformat
Decrease returning probe score for WAV demuxer to avoid
probe conflict between WAV and future ACT demuxer.
This is necessary because ACT has standard WAV header
at top of it's own.
author | voroshil |
---|---|
date | Sat, 19 Apr 2008 14:52:19 +0000 |
parents | 8207e7600a4b |
children | 6f61c3b36632 |
rev | line source |
---|---|
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
1 /* |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
2 * RIFF codec tags |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
3 * Copyright (c) 2000 Fabrice Bellard. |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
4 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
8 * modify it under the terms of the GNU Lesser General Public |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
9 * License as published by the Free Software Foundation; either |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
15 * Lesser General Public License for more details. |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
16 * |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
17 * You should have received a copy of the GNU Lesser General Public |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
1356
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
20 */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
21 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
22 #include "avformat.h" |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
23 #include "avcodec.h" |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
24 #include "riff.h" |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
25 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
26 /* Note: when encoding, the first matching tag is used, so order is |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
27 important if multiple tags possible for a given codec. */ |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1593
diff
changeset
|
28 const AVCodecTag codec_bmp_tags[] = { |
3131 | 29 { CODEC_ID_H264, MKTAG('H', '2', '6', '4') }, |
30 { CODEC_ID_H264, MKTAG('h', '2', '6', '4') }, | |
31 { CODEC_ID_H264, MKTAG('X', '2', '6', '4') }, | |
32 { CODEC_ID_H264, MKTAG('x', '2', '6', '4') }, | |
33 { CODEC_ID_H264, MKTAG('a', 'v', 'c', '1') }, | |
34 { CODEC_ID_H264, MKTAG('V', 'S', 'S', 'H') }, | |
35 { CODEC_ID_H263, MKTAG('H', '2', '6', '3') }, | |
36 { CODEC_ID_H263P, MKTAG('H', '2', '6', '3') }, | |
37 { CODEC_ID_H263I, MKTAG('I', '2', '6', '3') }, /* intel h263 */ | |
38 { CODEC_ID_H261, MKTAG('H', '2', '6', '1') }, | |
39 { CODEC_ID_H263P, MKTAG('U', '2', '6', '3') }, | |
40 { CODEC_ID_H263P, MKTAG('v', 'i', 'v', '1') }, | |
41 { CODEC_ID_MPEG4, MKTAG('F', 'M', 'P', '4') }, | |
42 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', 'X') }, | |
43 { CODEC_ID_MPEG4, MKTAG('D', 'X', '5', '0') }, | |
44 { CODEC_ID_MPEG4, MKTAG('X', 'V', 'I', 'D') }, | |
45 { CODEC_ID_MPEG4, MKTAG('M', 'P', '4', 'S') }, | |
46 { CODEC_ID_MPEG4, MKTAG('M', '4', 'S', '2') }, | |
3132
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
47 { CODEC_ID_MPEG4, MKTAG( 4 , 0 , 0 , 0 ) }, /* some broken avi use this */ |
3131 | 48 { CODEC_ID_MPEG4, MKTAG('D', 'I', 'V', '1') }, |
49 { CODEC_ID_MPEG4, MKTAG('B', 'L', 'Z', '0') }, | |
50 { CODEC_ID_MPEG4, MKTAG('m', 'p', '4', 'v') }, | |
51 { CODEC_ID_MPEG4, MKTAG('U', 'M', 'P', '4') }, | |
52 { CODEC_ID_MPEG4, MKTAG('W', 'V', '1', 'F') }, | |
53 { CODEC_ID_MPEG4, MKTAG('S', 'E', 'D', 'G') }, | |
54 { CODEC_ID_MPEG4, MKTAG('R', 'M', 'P', '4') }, | |
55 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */ | |
56 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') }, | |
57 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') }, | |
58 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') }, | |
59 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') }, | |
60 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') }, | |
61 { CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') }, | |
62 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') }, | |
63 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') }, | |
64 { CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') }, | |
65 { CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') }, | |
66 { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') }, | |
67 { CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') }, | |
68 { CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') }, | |
69 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') }, | |
70 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') }, | |
71 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') }, | |
72 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') }, | |
73 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') }, | |
74 { CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */ | |
75 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') }, | |
76 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
77 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
78 { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') }, | |
79 { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, | |
80 { CODEC_ID_MPEG1VIDEO, MKTAG('V', 'C', 'R', '2') }, | |
3132
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
81 { CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) }, |
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
82 { CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) }, |
3131 | 83 { CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') }, |
84 { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') }, | |
85 { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, | |
86 { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
87 { CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
88 { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */ | |
89 { CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */ | |
90 { CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */ | |
91 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, | |
92 { CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') }, | |
93 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, | |
94 { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') }, | |
95 { CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') }, | |
96 { CODEC_ID_CYUV, MKTAG('C', 'Y', 'U', 'V') }, | |
3132
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
97 { CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) }, |
3131 | 98 { CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') }, |
99 { CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') }, | |
100 { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') }, | |
101 { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') }, | |
102 { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') }, | |
103 { CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') }, | |
104 { CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') }, | |
105 { CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') }, | |
106 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') }, | |
107 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, | |
108 { CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') }, | |
109 { CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') }, | |
110 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, | |
111 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, | |
112 { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, | |
113 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, | |
114 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, | |
115 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, | |
116 { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, | |
117 { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') }, | |
118 { CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') }, | |
119 { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') }, | |
120 { CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') }, | |
121 { CODEC_ID_MSRLE, MKTAG('m', 'r', 'l', 'e') }, | |
3132
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
122 { CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) }, |
3131 | 123 { CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') }, |
124 { CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') }, | |
125 { CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') }, | |
126 { CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') }, | |
127 { CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') }, | |
128 { CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') }, | |
129 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, | |
130 { CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') }, | |
131 { CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') }, | |
132 { CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') }, | |
133 { CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') }, | |
134 { CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') }, | |
135 { CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') }, | |
136 { CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') }, | |
137 { CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') }, | |
138 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, | |
139 { CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') }, | |
140 { CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') }, | |
141 { CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') }, | |
142 { CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') }, | |
143 { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') }, | |
144 { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') }, | |
145 { CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') }, | |
146 { CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') }, | |
147 { CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') }, | |
148 { CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') }, | |
149 { CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') }, | |
150 { CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') }, | |
151 { CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') }, | |
152 { CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') }, | |
153 { CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') }, | |
154 { CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') }, | |
155 { CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') }, | |
156 { CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') }, | |
157 { CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') }, | |
158 { CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') }, | |
159 { CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') }, | |
160 { CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') }, | |
161 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, | |
162 { CODEC_ID_CLJR, MKTAG('c', 'l', 'j', 'r') }, | |
163 { CODEC_ID_NONE, 0 } | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
164 }; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
165 |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1593
diff
changeset
|
166 const AVCodecTag codec_wav_tags[] = { |
3064 | 167 { CODEC_ID_PCM_S16LE, 0x0001 }, |
168 { CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */ | |
169 { CODEC_ID_PCM_S24LE, 0x0001 }, | |
170 { CODEC_ID_PCM_S32LE, 0x0001 }, | |
171 { CODEC_ID_ADPCM_MS, 0x0002 }, | |
172 { CODEC_ID_PCM_ALAW, 0x0006 }, | |
173 { CODEC_ID_PCM_MULAW, 0x0007 }, | |
174 { CODEC_ID_WMAVOICE, 0x000A }, | |
175 { CODEC_ID_ADPCM_IMA_WAV, 0x0011 }, | |
176 { CODEC_ID_ADPCM_YAMAHA, 0x0020 }, | |
177 { CODEC_ID_TRUESPEECH, 0x0022 }, | |
178 { CODEC_ID_GSM_MS, 0x0031 }, | |
179 { CODEC_ID_ADPCM_G726, 0x0045 }, | |
180 { CODEC_ID_MP2, 0x0050 }, | |
181 { CODEC_ID_MP3, 0x0055 }, | |
182 { CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */ | |
183 { CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */ | |
184 { CODEC_ID_VOXWARE, 0x0075 }, | |
185 { CODEC_ID_AAC, 0x00ff }, | |
186 { CODEC_ID_WMAV1, 0x0160 }, | |
187 { CODEC_ID_WMAV2, 0x0161 }, | |
188 { CODEC_ID_WMAPRO, 0x0162 }, | |
3094 | 189 { CODEC_ID_WMALOSSLESS, 0x0163 }, |
3064 | 190 { CODEC_ID_ADPCM_CT, 0x0200 }, |
191 { CODEC_ID_ATRAC3, 0x0270 }, | |
192 { CODEC_ID_IMC, 0x0401 }, | |
193 { CODEC_ID_AC3, 0x2000 }, | |
194 { CODEC_ID_DTS, 0x2001 }, | |
195 { CODEC_ID_SONIC, 0x2048 }, | |
196 { CODEC_ID_SONIC_LS, 0x2048 }, | |
197 { CODEC_ID_AAC, 0x706d }, | |
198 { CODEC_ID_FLAC, 0xF1AC }, | |
199 { CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' }, | |
200 { CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id? | |
1383 | 201 |
202 /* FIXME: All of the IDs below are not 16 bit and thus illegal. */ | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
203 // for NuppelVideo (nuv.c) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
204 { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') }, |
3064 | 205 { CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') }, |
206 { CODEC_ID_MP3, MKTAG('M', 'P', '3', ' ') }, | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
207 { 0, 0 }, |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
208 }; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
209 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
210 #ifdef CONFIG_MUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
211 offset_t start_tag(ByteIOContext *pb, const char *tag) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
212 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
213 put_tag(pb, tag); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
214 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
215 return url_ftell(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
216 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
217 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
218 void end_tag(ByteIOContext *pb, offset_t start) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
219 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
220 offset_t pos; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
221 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
222 pos = url_ftell(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
223 url_fseek(pb, start - 4, SEEK_SET); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
224 put_le32(pb, (uint32_t)(pos - start)); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
225 url_fseek(pb, pos, SEEK_SET); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
226 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
227 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
228 /* WAVEFORMATEX header */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
229 /* returns the size or -1 on error */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
230 int put_wav_header(ByteIOContext *pb, AVCodecContext *enc) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
231 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
232 int bps, blkalign, bytespersec; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
233 int hdrsize = 18; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
234 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
235 if(!enc->codec_tag || enc->codec_tag > 0xffff) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
236 return -1; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
237 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
238 put_le16(pb, enc->codec_tag); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
239 put_le16(pb, enc->channels); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
240 put_le32(pb, enc->sample_rate); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
241 if (enc->codec_id == CODEC_ID_PCM_U8 || |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
242 enc->codec_id == CODEC_ID_PCM_ALAW || |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
243 enc->codec_id == CODEC_ID_PCM_MULAW) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
244 bps = 8; |
1802 | 245 } else if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) { |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
246 bps = 0; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
247 } 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) { // |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
248 bps = 4; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
249 } else if (enc->codec_id == CODEC_ID_PCM_S24LE) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
250 bps = 24; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
251 } else if (enc->codec_id == CODEC_ID_PCM_S32LE) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
252 bps = 32; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
253 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
254 bps = 16; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
255 } |
1814 | 256 if(bps != enc->bits_per_sample && enc->bits_per_sample){ |
1805
2c2e787782bb
warn if bps from user and what will be stored missmatches
michael
parents:
1803
diff
changeset
|
257 av_log(enc, AV_LOG_WARNING, "requested bits_per_sample (%d) and actually stored (%d) differ\n", enc->bits_per_sample, bps); |
2c2e787782bb
warn if bps from user and what will be stored missmatches
michael
parents:
1803
diff
changeset
|
258 } |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
259 |
1802 | 260 if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS) { |
2164 | 261 blkalign = enc->frame_size; //this is wrong, but it seems many demuxers do not work if this is set correctly |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
262 //blkalign = 144 * enc->bit_rate/enc->sample_rate; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
263 } else if (enc->codec_id == CODEC_ID_ADPCM_G726) { // |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
264 blkalign = 1; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
265 } else if (enc->block_align != 0) { /* specified by the codec */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
266 blkalign = enc->block_align; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
267 } else |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
268 blkalign = enc->channels*bps >> 3; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
269 if (enc->codec_id == CODEC_ID_PCM_U8 || |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
270 enc->codec_id == CODEC_ID_PCM_S24LE || |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
271 enc->codec_id == CODEC_ID_PCM_S32LE || |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
272 enc->codec_id == CODEC_ID_PCM_S16LE) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
273 bytespersec = enc->sample_rate * blkalign; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
274 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
275 bytespersec = enc->bit_rate / 8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
276 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
277 put_le32(pb, bytespersec); /* bytes per second */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
278 put_le16(pb, blkalign); /* block align */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
279 put_le16(pb, bps); /* bits per sample */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
280 if (enc->codec_id == CODEC_ID_MP3) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
281 put_le16(pb, 12); /* wav_extra_size */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
282 hdrsize += 12; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
283 put_le16(pb, 1); /* wID */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
284 put_le32(pb, 2); /* fdwFlags */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
285 put_le16(pb, 1152); /* nBlockSize */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
286 put_le16(pb, 1); /* nFramesPerBlock */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
287 put_le16(pb, 1393); /* nCodecDelay */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
288 } else if (enc->codec_id == CODEC_ID_MP2) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
289 put_le16(pb, 22); /* wav_extra_size */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
290 hdrsize += 22; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
291 put_le16(pb, 2); /* fwHeadLayer */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
292 put_le32(pb, enc->bit_rate); /* dwHeadBitrate */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
293 put_le16(pb, enc->channels == 2 ? 1 : 8); /* fwHeadMode */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
294 put_le16(pb, 0); /* fwHeadModeExt */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
295 put_le16(pb, 1); /* wHeadEmphasis */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
296 put_le16(pb, 16); /* fwHeadFlags */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
297 put_le32(pb, 0); /* dwPTSLow */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
298 put_le32(pb, 0); /* dwPTSHigh */ |
1802 | 299 } else if (enc->codec_id == CODEC_ID_GSM_MS) { |
300 put_le16(pb, 2); /* wav_extra_size */ | |
301 hdrsize += 2; | |
302 put_le16(pb, enc->frame_size); /* wSamplesPerBlock */ | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
303 } else if (enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
304 put_le16(pb, 2); /* wav_extra_size */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
305 hdrsize += 2; |
1803
f05a4a9b1d19
Remove code duplicated between adpcm.c and riff.c
mbardiaux
parents:
1802
diff
changeset
|
306 put_le16(pb, enc->frame_size); /* wSamplesPerBlock */ |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
307 } else if(enc->extradata_size){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
308 put_le16(pb, enc->extradata_size); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
309 put_buffer(pb, enc->extradata, enc->extradata_size); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
310 hdrsize += enc->extradata_size; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
311 if(hdrsize&1){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
312 hdrsize++; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
313 put_byte(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
314 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
315 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
316 hdrsize -= 2; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
317 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
318 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
319 return hdrsize; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
320 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
321 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
322 /* BITMAPINFOHEADER header */ |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1593
diff
changeset
|
323 void put_bmp_header(ByteIOContext *pb, AVCodecContext *enc, const AVCodecTag *tags, int for_asf) |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
324 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
325 put_le32(pb, 40 + enc->extradata_size); /* size */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
326 put_le32(pb, enc->width); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
327 put_le32(pb, enc->height); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
328 put_le16(pb, 1); /* planes */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
329 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
330 put_le16(pb, enc->bits_per_sample ? enc->bits_per_sample : 24); /* depth */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
331 /* compression type */ |
1683
8b062c65fe0d
remove now useless codec_tag setting code in muxers
michael
parents:
1679
diff
changeset
|
332 put_le32(pb, enc->codec_tag); |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
333 put_le32(pb, enc->width * enc->height * 3); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
334 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
335 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
336 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
337 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
338 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
339 put_buffer(pb, enc->extradata, enc->extradata_size); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
340 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
341 if (enc->extradata_size & 1) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
342 put_byte(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
343 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
344 #endif //CONFIG_MUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
345 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
346 #ifdef CONFIG_DEMUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
347 /* We could be given one of the three possible structures here: |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
348 * WAVEFORMAT, PCMWAVEFORMAT or WAVEFORMATEX. Each structure |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
349 * is an expansion of the previous one with the fields added |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
350 * at the bottom. PCMWAVEFORMAT adds 'WORD wBitsPerSample' and |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
351 * WAVEFORMATEX adds 'WORD cbSize' and basically makes itself |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
352 * an openended structure. |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
353 */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
354 void get_wav_header(ByteIOContext *pb, AVCodecContext *codec, int size) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
355 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
356 int id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
357 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
358 id = get_le16(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
359 codec->codec_type = CODEC_TYPE_AUDIO; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
360 codec->codec_tag = id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
361 codec->channels = get_le16(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
362 codec->sample_rate = get_le32(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
363 codec->bit_rate = get_le32(pb) * 8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
364 codec->block_align = get_le16(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
365 if (size == 14) { /* We're dealing with plain vanilla WAVEFORMAT */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
366 codec->bits_per_sample = 8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
367 }else |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
368 codec->bits_per_sample = get_le16(pb); |
1738 | 369 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */ |
370 int cbSize = get_le16(pb); /* cbSize */ | |
371 size -= 18; | |
372 cbSize = FFMIN(size, cbSize); | |
373 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ | |
374 codec->bits_per_sample = get_le16(pb); | |
375 get_le32(pb); /* dwChannelMask */ | |
376 id = get_le32(pb); /* 4 first bytes of GUID */ | |
377 url_fskip(pb, 12); /* skip end of GUID */ | |
378 cbSize -= 22; | |
379 size -= 22; | |
380 } | |
381 codec->extradata_size = cbSize; | |
382 if (cbSize > 0) { | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
383 codec->extradata = av_mallocz(codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
384 get_buffer(pb, codec->extradata, codec->extradata_size); |
1738 | 385 size -= cbSize; |
386 } | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
387 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
388 /* It is possible for the chunk to contain garbage at the end */ |
1738 | 389 if (size > 0) |
390 url_fskip(pb, size); | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
391 } |
1738 | 392 codec->codec_id = wav_codec_get_id(id, codec->bits_per_sample); |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
393 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
394 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
395 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
396 int wav_codec_get_id(unsigned int tag, int bps) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
397 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
398 int id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
399 id = codec_get_id(codec_wav_tags, tag); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
400 if (id <= 0) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
401 return id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
402 /* handle specific u8 codec */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
403 if (id == CODEC_ID_PCM_S16LE && bps == 8) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
404 id = CODEC_ID_PCM_U8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
405 if (id == CODEC_ID_PCM_S16LE && bps == 24) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
406 id = CODEC_ID_PCM_S24LE; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
407 if (id == CODEC_ID_PCM_S16LE && bps == 32) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
408 id = CODEC_ID_PCM_S32LE; |
2292 | 409 if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8) |
410 id = CODEC_ID_PCM_ZORK; | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
411 return id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
412 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
413 #endif // CONFIG_DEMUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
414 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
415 void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssize, int *au_scale) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
416 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
417 int gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
418 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
419 *au_ssize= stream->block_align; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
420 if(stream->frame_size && stream->sample_rate){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
421 *au_scale=stream->frame_size; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
422 *au_rate= stream->sample_rate; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
423 }else if(stream->codec_type == CODEC_TYPE_VIDEO){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
424 *au_scale= stream->time_base.num; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
425 *au_rate = stream->time_base.den; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
426 }else{ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
427 *au_scale= stream->block_align ? stream->block_align*8 : 8; |
3103
137e1fc7d16b
Fallback to sample rate if bit rate is 0. This avoids 0 timebases in nut.
michael
parents:
3096
diff
changeset
|
428 *au_rate = stream->bit_rate ? stream->bit_rate : 8*stream->sample_rate; |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
429 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
430 gcd= ff_gcd(*au_scale, *au_rate); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
431 *au_scale /= gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
432 *au_rate /= gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
433 } |