Mercurial > libavformat.hg
annotate riff.c @ 3754:8d267b43eaba libavformat
Move malloc() down until after all initializations, so that the resource is
only allocated if initialization worked. This means that on failure, we
don't have to deallocate it.
author | rbultje |
---|---|
date | Sat, 23 Aug 2008 18:46:30 +0000 |
parents | 704c20dd52a4 |
children | 8e7b2616e1ad |
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 |
3286 | 22 #include "libavcodec/avcodec.h" |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
23 #include "avformat.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') }, | |
3705
98156a539790
FOURCC addition: added 3IV2, another mpeg4 id. incoming/video_3iv2/video_3iv2.avi
banan
parents:
3693
diff
changeset
|
55 { CODEC_ID_MPEG4, MKTAG('3', 'I', 'V', '2') }, |
3131 | 56 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '3') }, /* default signature when using MSMPEG4 */ |
57 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', '4', '3') }, | |
58 { CODEC_ID_MSMPEG4V3, MKTAG('M', 'P', 'G', '3') }, | |
59 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '5') }, | |
60 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '6') }, | |
61 { CODEC_ID_MSMPEG4V3, MKTAG('D', 'I', 'V', '4') }, | |
62 { CODEC_ID_MSMPEG4V3, MKTAG('A', 'P', '4', '1') }, | |
63 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '1') }, | |
64 { CODEC_ID_MSMPEG4V3, MKTAG('C', 'O', 'L', '0') }, | |
65 { CODEC_ID_MSMPEG4V2, MKTAG('M', 'P', '4', '2') }, | |
66 { CODEC_ID_MSMPEG4V2, MKTAG('D', 'I', 'V', '2') }, | |
67 { CODEC_ID_MSMPEG4V1, MKTAG('M', 'P', 'G', '4') }, | |
68 { CODEC_ID_WMV1, MKTAG('W', 'M', 'V', '1') }, | |
69 { CODEC_ID_WMV2, MKTAG('W', 'M', 'V', '2') }, | |
70 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'd') }, | |
71 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 'h', 'd') }, | |
72 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', 's', 'l') }, | |
73 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '2', '5') }, | |
74 { CODEC_ID_DVVIDEO, MKTAG('d', 'v', '5', '0') }, | |
75 { CODEC_ID_DVVIDEO, MKTAG('c', 'd', 'v', 'c') }, /* Canopus DV */ | |
76 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '1') }, | |
77 { CODEC_ID_MPEG1VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
78 { CODEC_ID_MPEG2VIDEO, MKTAG('m', 'p', 'g', '2') }, | |
79 { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'P', 'E', 'G') }, | |
80 { CODEC_ID_MPEG1VIDEO, MKTAG('P', 'I', 'M', '1') }, | |
81 { 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
|
82 { CODEC_ID_MPEG1VIDEO, MKTAG( 1 , 0 , 0 , 16) }, |
2014993e4399
consistent use of MKTAG() in the codec_bmp_tags table
aurel
parents:
3131
diff
changeset
|
83 { CODEC_ID_MPEG2VIDEO, MKTAG( 2 , 0 , 0 , 16) }, |
3131 | 84 { CODEC_ID_MPEG2VIDEO, MKTAG('D', 'V', 'R', ' ') }, |
85 { CODEC_ID_MPEG2VIDEO, MKTAG('M', 'M', 'E', 'S') }, | |
86 { CODEC_ID_MJPEG, MKTAG('M', 'J', 'P', 'G') }, | |
87 { CODEC_ID_MJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
88 { CODEC_ID_LJPEG, MKTAG('L', 'J', 'P', 'G') }, | |
89 { CODEC_ID_MJPEG, MKTAG('J', 'P', 'G', 'L') }, /* Pegasus lossless JPEG */ | |
90 { CODEC_ID_JPEGLS, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - encoder */ | |
91 { CODEC_ID_MJPEG, MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */ | |
92 { CODEC_ID_MJPEG, MKTAG('j', 'p', 'e', 'g') }, | |
93 { CODEC_ID_MJPEG, MKTAG('I', 'J', 'P', 'G') }, | |
94 { CODEC_ID_MJPEG, MKTAG('A', 'V', 'R', 'n') }, | |
95 { CODEC_ID_HUFFYUV, MKTAG('H', 'F', 'Y', 'U') }, | |
96 { CODEC_ID_FFVHUFF, MKTAG('F', 'F', 'V', 'H') }, | |
97 { 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
|
98 { CODEC_ID_RAWVIDEO, MKTAG( 0 , 0 , 0 , 0 ) }, |
3131 | 99 { CODEC_ID_RAWVIDEO, MKTAG('I', '4', '2', '0') }, |
100 { CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'Y', '2') }, | |
101 { CODEC_ID_RAWVIDEO, MKTAG('Y', '4', '2', '2') }, | |
102 { CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', '1', '2') }, | |
103 { CODEC_ID_RAWVIDEO, MKTAG('U', 'Y', 'V', 'Y') }, | |
104 { CODEC_ID_RAWVIDEO, MKTAG('I', 'Y', 'U', 'V') }, | |
105 { CODEC_ID_RAWVIDEO, MKTAG('Y', '8', '0', '0') }, | |
106 { CODEC_ID_RAWVIDEO, MKTAG('H', 'D', 'Y', 'C') }, | |
107 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') }, | |
108 { CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '2') }, | |
109 { CODEC_ID_INDEO4, MKTAG('I', 'V', '4', '1') }, | |
110 { CODEC_ID_INDEO5, MKTAG('I', 'V', '5', '0') }, | |
111 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, | |
112 { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, | |
113 { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, | |
114 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, | |
115 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, | |
116 { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, | |
117 { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, | |
118 { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') }, | |
119 { CODEC_ID_VCR1, MKTAG('V', 'C', 'R', '1') }, | |
120 { CODEC_ID_FFV1, MKTAG('F', 'F', 'V', '1') }, | |
121 { CODEC_ID_XAN_WC4, MKTAG('X', 'x', 'a', 'n') }, | |
122 { 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
|
123 { CODEC_ID_MSRLE, MKTAG( 1 , 0 , 0 , 0 ) }, |
3131 | 124 { CODEC_ID_MSVIDEO1, MKTAG('M', 'S', 'V', 'C') }, |
125 { CODEC_ID_MSVIDEO1, MKTAG('m', 's', 'v', 'c') }, | |
126 { CODEC_ID_MSVIDEO1, MKTAG('C', 'R', 'A', 'M') }, | |
127 { CODEC_ID_MSVIDEO1, MKTAG('c', 'r', 'a', 'm') }, | |
128 { CODEC_ID_MSVIDEO1, MKTAG('W', 'H', 'A', 'M') }, | |
129 { CODEC_ID_MSVIDEO1, MKTAG('w', 'h', 'a', 'm') }, | |
130 { CODEC_ID_CINEPAK, MKTAG('c', 'v', 'i', 'd') }, | |
131 { CODEC_ID_TRUEMOTION1, MKTAG('D', 'U', 'C', 'K') }, | |
132 { CODEC_ID_MSZH, MKTAG('M', 'S', 'Z', 'H') }, | |
133 { CODEC_ID_ZLIB, MKTAG('Z', 'L', 'I', 'B') }, | |
134 { CODEC_ID_SNOW, MKTAG('S', 'N', 'O', 'W') }, | |
135 { CODEC_ID_4XM, MKTAG('4', 'X', 'M', 'V') }, | |
136 { CODEC_ID_FLV1, MKTAG('F', 'L', 'V', '1') }, | |
137 { CODEC_ID_FLASHSV, MKTAG('F', 'S', 'V', '1') }, | |
138 { CODEC_ID_VP6F, MKTAG('V', 'P', '6', 'F') }, | |
139 { CODEC_ID_SVQ1, MKTAG('s', 'v', 'q', '1') }, | |
140 { CODEC_ID_TSCC, MKTAG('t', 's', 'c', 'c') }, | |
141 { CODEC_ID_ULTI, MKTAG('U', 'L', 'T', 'I') }, | |
142 { CODEC_ID_VIXL, MKTAG('V', 'I', 'X', 'L') }, | |
143 { CODEC_ID_QPEG, MKTAG('Q', 'P', 'E', 'G') }, | |
144 { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '0') }, | |
145 { CODEC_ID_QPEG, MKTAG('Q', '1', '.', '1') }, | |
146 { CODEC_ID_WMV3, MKTAG('W', 'M', 'V', '3') }, | |
147 { CODEC_ID_VC1, MKTAG('W', 'V', 'C', '1') }, | |
148 { CODEC_ID_VC1, MKTAG('W', 'M', 'V', 'A') }, | |
149 { CODEC_ID_LOCO, MKTAG('L', 'O', 'C', 'O') }, | |
150 { CODEC_ID_WNV1, MKTAG('W', 'N', 'V', '1') }, | |
151 { CODEC_ID_AASC, MKTAG('A', 'A', 'S', 'C') }, | |
152 { CODEC_ID_INDEO2, MKTAG('R', 'T', '2', '1') }, | |
153 { CODEC_ID_FRAPS, MKTAG('F', 'P', 'S', '1') }, | |
154 { CODEC_ID_THEORA, MKTAG('t', 'h', 'e', 'o') }, | |
155 { CODEC_ID_TRUEMOTION2, MKTAG('T', 'M', '2', '0') }, | |
156 { CODEC_ID_CSCD, MKTAG('C', 'S', 'C', 'D') }, | |
157 { CODEC_ID_ZMBV, MKTAG('Z', 'M', 'B', 'V') }, | |
158 { CODEC_ID_KMVC, MKTAG('K', 'M', 'V', 'C') }, | |
159 { CODEC_ID_CAVS, MKTAG('C', 'A', 'V', 'S') }, | |
160 { CODEC_ID_JPEG2000, MKTAG('M', 'J', '2', 'C') }, | |
161 { CODEC_ID_VMNC, MKTAG('V', 'M', 'n', 'c') }, | |
162 { CODEC_ID_TARGA, MKTAG('t', 'g', 'a', ' ') }, | |
163 { CODEC_ID_CLJR, MKTAG('c', 'l', 'j', 'r') }, | |
3558 | 164 { CODEC_ID_DIRAC, MKTAG('d', 'r', 'a', 'c') }, |
3131 | 165 { CODEC_ID_NONE, 0 } |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
166 }; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
167 |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1593
diff
changeset
|
168 const AVCodecTag codec_wav_tags[] = { |
3064 | 169 { CODEC_ID_PCM_S16LE, 0x0001 }, |
170 { CODEC_ID_PCM_U8, 0x0001 }, /* must come after s16le in this list */ | |
171 { CODEC_ID_PCM_S24LE, 0x0001 }, | |
172 { CODEC_ID_PCM_S32LE, 0x0001 }, | |
173 { CODEC_ID_ADPCM_MS, 0x0002 }, | |
3737
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
174 { CODEC_ID_PCM_F32LE, 0x0003 }, |
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
175 { CODEC_ID_PCM_F64LE, 0x0003 }, /* must come after f32le in this list */ |
3064 | 176 { CODEC_ID_PCM_ALAW, 0x0006 }, |
177 { CODEC_ID_PCM_MULAW, 0x0007 }, | |
178 { CODEC_ID_WMAVOICE, 0x000A }, | |
179 { CODEC_ID_ADPCM_IMA_WAV, 0x0011 }, | |
3693 | 180 { CODEC_ID_PCM_ZORK, 0x0011 }, /* must come after adpcm_ima_wav in this list */ |
3064 | 181 { CODEC_ID_ADPCM_YAMAHA, 0x0020 }, |
182 { CODEC_ID_TRUESPEECH, 0x0022 }, | |
183 { CODEC_ID_GSM_MS, 0x0031 }, | |
184 { CODEC_ID_ADPCM_G726, 0x0045 }, | |
185 { CODEC_ID_MP2, 0x0050 }, | |
186 { CODEC_ID_MP3, 0x0055 }, | |
187 { CODEC_ID_ADPCM_IMA_DK4, 0x0061 }, /* rogue format number */ | |
188 { CODEC_ID_ADPCM_IMA_DK3, 0x0062 }, /* rogue format number */ | |
189 { CODEC_ID_VOXWARE, 0x0075 }, | |
190 { CODEC_ID_AAC, 0x00ff }, | |
191 { CODEC_ID_WMAV1, 0x0160 }, | |
192 { CODEC_ID_WMAV2, 0x0161 }, | |
193 { CODEC_ID_WMAPRO, 0x0162 }, | |
3094 | 194 { CODEC_ID_WMALOSSLESS, 0x0163 }, |
3064 | 195 { CODEC_ID_ADPCM_CT, 0x0200 }, |
196 { CODEC_ID_ATRAC3, 0x0270 }, | |
197 { CODEC_ID_IMC, 0x0401 }, | |
198 { CODEC_ID_AC3, 0x2000 }, | |
199 { CODEC_ID_DTS, 0x2001 }, | |
200 { CODEC_ID_SONIC, 0x2048 }, | |
201 { CODEC_ID_SONIC_LS, 0x2048 }, | |
202 { CODEC_ID_AAC, 0x706d }, | |
203 { CODEC_ID_FLAC, 0xF1AC }, | |
204 { CODEC_ID_ADPCM_SWF, ('S'<<8)+'F' }, | |
205 { CODEC_ID_VORBIS, ('V'<<8)+'o' }, //HACK/FIXME, does vorbis in WAV/AVI have an (in)official id? | |
1383 | 206 |
207 /* 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
|
208 // for NuppelVideo (nuv.c) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
209 { CODEC_ID_PCM_S16LE, MKTAG('R', 'A', 'W', 'A') }, |
3064 | 210 { CODEC_ID_MP3, MKTAG('L', 'A', 'M', 'E') }, |
211 { 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
|
212 { 0, 0 }, |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
213 }; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
214 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
215 #ifdef CONFIG_MUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
216 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
|
217 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
218 put_tag(pb, tag); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
219 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
220 return url_ftell(pb); |
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 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
223 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
|
224 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
225 offset_t pos; |
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 pos = url_ftell(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
228 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
|
229 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
|
230 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
|
231 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
232 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
233 /* WAVEFORMATEX header */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
234 /* 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
|
235 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
|
236 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
237 int bps, blkalign, bytespersec; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
238 int hdrsize = 18; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
239 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
240 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
|
241 return -1; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
242 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
243 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
|
244 put_le16(pb, enc->channels); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
245 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
|
246 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
|
247 enc->codec_id == CODEC_ID_PCM_ALAW || |
3693 | 248 enc->codec_id == CODEC_ID_PCM_MULAW || |
249 enc->codec_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
|
250 bps = 8; |
1802 | 251 } 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
|
252 bps = 0; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
253 } 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
|
254 bps = 4; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
255 } 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
|
256 bps = 24; |
3737
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
257 } else if (enc->codec_id == CODEC_ID_PCM_S32LE || enc->codec_id == CODEC_ID_PCM_F32LE) { |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
258 bps = 32; |
3737
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
259 } else if (enc->codec_id == CODEC_ID_PCM_F64LE) { |
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
260 bps = 64; |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
261 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
262 bps = 16; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
263 } |
1814 | 264 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
|
265 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
|
266 } |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
267 |
3345 | 268 if (enc->codec_id == CODEC_ID_MP2 || enc->codec_id == CODEC_ID_MP3 || enc->codec_id == CODEC_ID_GSM_MS || enc->codec_id == CODEC_ID_AC3) { |
2164 | 269 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
|
270 //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
|
271 } 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
|
272 blkalign = 1; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
273 } 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
|
274 blkalign = enc->block_align; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
275 } else |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
276 blkalign = enc->channels*bps >> 3; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
277 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
|
278 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
|
279 enc->codec_id == CODEC_ID_PCM_S32LE || |
3737
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
280 enc->codec_id == CODEC_ID_PCM_F32LE || |
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
281 enc->codec_id == CODEC_ID_PCM_F64LE || |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
282 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
|
283 bytespersec = enc->sample_rate * blkalign; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
284 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
285 bytespersec = enc->bit_rate / 8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
286 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
287 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
|
288 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
|
289 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
|
290 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
|
291 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
|
292 hdrsize += 12; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
293 put_le16(pb, 1); /* wID */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
294 put_le32(pb, 2); /* fdwFlags */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
295 put_le16(pb, 1152); /* nBlockSize */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
296 put_le16(pb, 1); /* nFramesPerBlock */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
297 put_le16(pb, 1393); /* nCodecDelay */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
298 } 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
|
299 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
|
300 hdrsize += 22; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
301 put_le16(pb, 2); /* fwHeadLayer */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
302 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
|
303 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
|
304 put_le16(pb, 0); /* fwHeadModeExt */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
305 put_le16(pb, 1); /* wHeadEmphasis */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
306 put_le16(pb, 16); /* fwHeadFlags */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
307 put_le32(pb, 0); /* dwPTSLow */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
308 put_le32(pb, 0); /* dwPTSHigh */ |
1802 | 309 } else if (enc->codec_id == CODEC_ID_GSM_MS) { |
310 put_le16(pb, 2); /* wav_extra_size */ | |
311 hdrsize += 2; | |
312 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
|
313 } 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
|
314 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
|
315 hdrsize += 2; |
1803
f05a4a9b1d19
Remove code duplicated between adpcm.c and riff.c
mbardiaux
parents:
1802
diff
changeset
|
316 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
|
317 } else if(enc->extradata_size){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
318 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
|
319 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
|
320 hdrsize += enc->extradata_size; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
321 if(hdrsize&1){ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
322 hdrsize++; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
323 put_byte(pb, 0); |
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 } else { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
326 hdrsize -= 2; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
327 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
328 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
329 return hdrsize; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
330 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
331 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
332 /* BITMAPINFOHEADER header */ |
1677
2a85c82b8538
add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents:
1593
diff
changeset
|
333 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
|
334 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
335 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
|
336 put_le32(pb, enc->width); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
337 put_le32(pb, enc->height); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
338 put_le16(pb, 1); /* planes */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
339 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
340 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
|
341 /* compression type */ |
1683
8b062c65fe0d
remove now useless codec_tag setting code in muxers
michael
parents:
1679
diff
changeset
|
342 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
|
343 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
|
344 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
345 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
346 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
347 put_le32(pb, 0); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
348 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
349 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
|
350 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
351 if (enc->extradata_size & 1) |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
352 put_byte(pb, 0); |
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 #endif //CONFIG_MUXERS |
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 #ifdef CONFIG_DEMUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
357 /* 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
|
358 * 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
|
359 * 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
|
360 * 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
|
361 * 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
|
362 * an openended structure. |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
363 */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
364 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
|
365 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
366 int id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
367 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
368 id = get_le16(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
369 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
|
370 codec->codec_tag = id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
371 codec->channels = get_le16(pb); |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
372 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
|
373 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
|
374 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
|
375 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
|
376 codec->bits_per_sample = 8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
377 }else |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
378 codec->bits_per_sample = get_le16(pb); |
1738 | 379 if (size >= 18) { /* We're obviously dealing with WAVEFORMATEX */ |
380 int cbSize = get_le16(pb); /* cbSize */ | |
381 size -= 18; | |
382 cbSize = FFMIN(size, cbSize); | |
383 if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */ | |
384 codec->bits_per_sample = get_le16(pb); | |
385 get_le32(pb); /* dwChannelMask */ | |
386 id = get_le32(pb); /* 4 first bytes of GUID */ | |
387 url_fskip(pb, 12); /* skip end of GUID */ | |
388 cbSize -= 22; | |
389 size -= 22; | |
390 } | |
391 codec->extradata_size = cbSize; | |
392 if (cbSize > 0) { | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
393 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
|
394 get_buffer(pb, codec->extradata, codec->extradata_size); |
1738 | 395 size -= cbSize; |
396 } | |
1172
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 /* It is possible for the chunk to contain garbage at the end */ |
1738 | 399 if (size > 0) |
400 url_fskip(pb, size); | |
1172
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
401 } |
1738 | 402 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
|
403 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
404 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
405 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
406 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
|
407 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
408 int id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
409 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
|
410 if (id <= 0) |
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 /* handle specific u8 codec */ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
413 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
|
414 id = CODEC_ID_PCM_U8; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
415 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
|
416 id = CODEC_ID_PCM_S24LE; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
417 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
|
418 id = CODEC_ID_PCM_S32LE; |
3737
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
419 if (id == CODEC_ID_PCM_F32LE && bps == 64) |
704c20dd52a4
Make RIFF-based demuxers handle F32LE and F64LE PCM audio.
pross
parents:
3705
diff
changeset
|
420 id = CODEC_ID_PCM_F64LE; |
2292 | 421 if (id == CODEC_ID_ADPCM_IMA_WAV && bps == 8) |
422 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
|
423 return id; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
424 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
425 #endif // CONFIG_DEMUXERS |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
426 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
427 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
|
428 { |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
429 int gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
430 |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
431 *au_ssize= stream->block_align; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
432 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
|
433 *au_scale=stream->frame_size; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
434 *au_rate= stream->sample_rate; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
435 }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
|
436 *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
|
437 *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
|
438 }else{ |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
439 *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
|
440 *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
|
441 } |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
442 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
|
443 *au_scale /= gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
444 *au_rate /= gcd; |
6a5e58d2114b
move common stuff from avienc.c and wav.c to new file riff.c
mru
parents:
diff
changeset
|
445 } |