Commit | Line | Data |
---|---|---|
4f52c312 MN |
1 | /* |
2 | * FLAC (Free Lossless Audio Codec) decoder | |
3 | * Copyright (c) 2003 Alex Beregszaszi | |
4 | * | |
b78e7197 DB |
5 | * This file is part of FFmpeg. |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
4f52c312 MN |
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. |
4f52c312 | 11 | * |
b78e7197 | 12 | * FFmpeg is distributed in the hope that it will be useful, |
4f52c312 MN |
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 |
5509bffa | 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
4f52c312 MN |
20 | */ |
21 | ||
22 | /** | |
8f51144b | 23 | * @file flacdec.c |
4f52c312 MN |
24 | * FLAC (Free Lossless Audio Codec) decoder |
25 | * @author Alex Beregszaszi | |
9eda2f94 MM |
26 | * |
27 | * For more information on the FLAC format, visit: | |
28 | * http://flac.sourceforge.net/ | |
29 | * | |
30 | * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed | |
31 | * through, starting from the initial 'fLaC' signature; or by passing the | |
32 | * 34-byte streaminfo structure through avctx->extradata[_size] followed | |
33 | * by data starting with the 0xFFF8 marker. | |
4f52c312 | 34 | */ |
115329f1 | 35 | |
ac2570a8 | 36 | #include <limits.h> |
115329f1 | 37 | |
75c998a2 | 38 | #define ALT_BITSTREAM_READER |
245976da | 39 | #include "libavutil/crc.h" |
4f52c312 | 40 | #include "avcodec.h" |
caa336b4 | 41 | #include "bitstream.h" |
4f52c312 | 42 | #include "golomb.h" |
9d48410f | 43 | #include "flac.h" |
4f52c312 | 44 | |
ac2570a8 MN |
45 | #undef NDEBUG |
46 | #include <assert.h> | |
47 | ||
4f52c312 MN |
48 | #define MAX_CHANNELS 8 |
49 | #define MAX_BLOCKSIZE 65535 | |
9eda2f94 | 50 | #define FLAC_STREAMINFO_SIZE 34 |
4f52c312 | 51 | |
9d656110 | 52 | enum decorrelation_type { |
4f52c312 MN |
53 | INDEPENDENT, |
54 | LEFT_SIDE, | |
55 | RIGHT_SIDE, | |
56 | MID_SIDE, | |
57 | }; | |
58 | ||
59 | typedef struct FLACContext { | |
9d48410f JR |
60 | FLACSTREAMINFO |
61 | ||
4f52c312 MN |
62 | AVCodecContext *avctx; |
63 | GetBitContext gb; | |
64 | ||
ac2570a8 | 65 | int blocksize/*, last_blocksize*/; |
9d48410f | 66 | int curr_bps; |
9d656110 | 67 | enum decorrelation_type decorrelation; |
4f52c312 | 68 | |
ac2570a8 MN |
69 | int32_t *decoded[MAX_CHANNELS]; |
70 | uint8_t *bitstream; | |
1e77df15 MN |
71 | unsigned int bitstream_size; |
72 | unsigned int bitstream_index; | |
f038fe8b | 73 | unsigned int allocated_bitstream_size; |
4f52c312 MN |
74 | } FLACContext; |
75 | ||
76 | #define METADATA_TYPE_STREAMINFO 0 | |
77 | ||
cf2baeb3 | 78 | static const int sample_rate_table[] = |
959e0006 JR |
79 | { 0, |
80 | 88200, 176400, 192000, | |
4f52c312 | 81 | 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000, |
115329f1 | 82 | 0, 0, 0, 0 }; |
4f52c312 | 83 | |
cf2baeb3 | 84 | static const int sample_size_table[] = |
4f52c312 MN |
85 | { 0, 8, 12, 0, 16, 20, 24, 0 }; |
86 | ||
cf2baeb3 | 87 | static const int blocksize_table[] = { |
115329f1 DB |
88 | 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0, |
89 | 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7 | |
0496a034 MN |
90 | }; |
91 | ||
9d82b0dd MN |
92 | static int64_t get_utf8(GetBitContext *gb){ |
93 | int64_t val; | |
94 | GET_UTF8(val, get_bits(gb, 8), return -1;) | |
ac2570a8 | 95 | return val; |
4f52c312 MN |
96 | } |
97 | ||
17c90b9d AJ |
98 | static void allocate_buffers(FLACContext *s); |
99 | static int metadata_parse(FLACContext *s); | |
9eda2f94 | 100 | |
98a6fff9 | 101 | static av_cold int flac_decode_init(AVCodecContext * avctx) |
4f52c312 | 102 | { |
9eda2f94 MM |
103 | FLACContext *s = avctx->priv_data; |
104 | s->avctx = avctx; | |
105 | ||
17c90b9d AJ |
106 | if (avctx->extradata_size > 4) { |
107 | /* initialize based on the demuxer-supplied streamdata header */ | |
17c90b9d | 108 | if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) { |
9482171b | 109 | ff_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, avctx->extradata); |
17c90b9d AJ |
110 | allocate_buffers(s); |
111 | } else { | |
512b37bb | 112 | init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8); |
17c90b9d AJ |
113 | metadata_parse(s); |
114 | } | |
9eda2f94 MM |
115 | } |
116 | ||
fd76c37f | 117 | avctx->sample_fmt = SAMPLE_FMT_S16; |
4f52c312 MN |
118 | return 0; |
119 | } | |
120 | ||
9482171b | 121 | static void dump_headers(AVCodecContext *avctx, FLACStreaminfo *s) |
4f52c312 | 122 | { |
9482171b | 123 | av_log(avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d\n", s->min_blocksize, s->max_blocksize); |
4bc07e78 JR |
124 | av_log(avctx, AV_LOG_DEBUG, " Max Framesize: %d\n", s->max_framesize); |
125 | av_log(avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate); | |
126 | av_log(avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels); | |
127 | av_log(avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps); | |
4f52c312 MN |
128 | } |
129 | ||
ac2570a8 | 130 | static void allocate_buffers(FLACContext *s){ |
4f52c312 MN |
131 | int i; |
132 | ||
ac2570a8 MN |
133 | assert(s->max_blocksize); |
134 | ||
135 | if(s->max_framesize == 0 && s->max_blocksize){ | |
136 | s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead | |
137 | } | |
138 | ||
139 | for (i = 0; i < s->channels; i++) | |
140 | { | |
141 | s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize); | |
ac2570a8 MN |
142 | } |
143 | ||
cfcd396b MN |
144 | if(s->allocated_bitstream_size < s->max_framesize) |
145 | s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); | |
ac2570a8 MN |
146 | } |
147 | ||
9482171b JR |
148 | void ff_flac_parse_streaminfo(AVCodecContext *avctx, struct FLACStreaminfo *s, |
149 | const uint8_t *buffer) | |
ac2570a8 | 150 | { |
a128cc91 JR |
151 | GetBitContext gb; |
152 | init_get_bits(&gb, buffer, FLAC_STREAMINFO_SIZE*8); | |
153 | ||
4f52c312 | 154 | /* mandatory streaminfo */ |
a128cc91 JR |
155 | s->min_blocksize = get_bits(&gb, 16); |
156 | s->max_blocksize = get_bits(&gb, 16); | |
4f52c312 | 157 | |
a128cc91 JR |
158 | skip_bits(&gb, 24); /* skip min frame size */ |
159 | s->max_framesize = get_bits_long(&gb, 24); | |
115329f1 | 160 | |
a128cc91 JR |
161 | s->samplerate = get_bits_long(&gb, 20); |
162 | s->channels = get_bits(&gb, 3) + 1; | |
163 | s->bps = get_bits(&gb, 5) + 1; | |
115329f1 | 164 | |
a128cc91 JR |
165 | avctx->channels = s->channels; |
166 | avctx->sample_rate = s->samplerate; | |
4f52c312 | 167 | |
a128cc91 | 168 | skip_bits(&gb, 36); /* total num of samples */ |
115329f1 | 169 | |
a128cc91 JR |
170 | skip_bits(&gb, 64); /* md5 sum */ |
171 | skip_bits(&gb, 64); /* md5 sum */ | |
115329f1 | 172 | |
4bc07e78 | 173 | dump_headers(avctx, s); |
17c90b9d AJ |
174 | } |
175 | ||
176 | /** | |
177 | * Parse a list of metadata blocks. This list of blocks must begin with | |
178 | * the fLaC marker. | |
179 | * @param s the flac decoding context containing the gb bit reader used to | |
180 | * parse metadata | |
181 | * @return 1 if some metadata was read, 0 if no fLaC marker was found | |
182 | */ | |
183 | static int metadata_parse(FLACContext *s) | |
184 | { | |
185 | int i, metadata_last, metadata_type, metadata_size, streaminfo_updated=0; | |
e0168e3b | 186 | int initial_pos= get_bits_count(&s->gb); |
17c90b9d AJ |
187 | |
188 | if (show_bits_long(&s->gb, 32) == MKBETAG('f','L','a','C')) { | |
189 | skip_bits(&s->gb, 32); | |
190 | ||
17c90b9d | 191 | do { |
5fc32c27 | 192 | metadata_last = get_bits1(&s->gb); |
17c90b9d AJ |
193 | metadata_type = get_bits(&s->gb, 7); |
194 | metadata_size = get_bits_long(&s->gb, 24); | |
195 | ||
e0168e3b MN |
196 | if(get_bits_count(&s->gb) + 8*metadata_size > s->gb.size_in_bits){ |
197 | skip_bits_long(&s->gb, initial_pos - get_bits_count(&s->gb)); | |
198 | break; | |
199 | } | |
200 | ||
17c90b9d AJ |
201 | if (metadata_size) { |
202 | switch (metadata_type) { | |
203 | case METADATA_TYPE_STREAMINFO: | |
9482171b | 204 | ff_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, s->gb.buffer+get_bits_count(&s->gb)/8); |
17c90b9d | 205 | streaminfo_updated = 1; |
17c90b9d AJ |
206 | |
207 | default: | |
208 | for (i=0; i<metadata_size; i++) | |
209 | skip_bits(&s->gb, 8); | |
210 | } | |
211 | } | |
212 | } while (!metadata_last); | |
213 | ||
214 | if (streaminfo_updated) | |
215 | allocate_buffers(s); | |
216 | return 1; | |
217 | } | |
218 | return 0; | |
4f52c312 MN |
219 | } |
220 | ||
221 | static int decode_residuals(FLACContext *s, int channel, int pred_order) | |
222 | { | |
223 | int i, tmp, partition, method_type, rice_order; | |
224 | int sample = 0, samples; | |
225 | ||
226 | method_type = get_bits(&s->gb, 2); | |
e471443a | 227 | if (method_type > 1){ |
5305f40b | 228 | av_log(s->avctx, AV_LOG_ERROR, "illegal residual coding method %d\n", method_type); |
4f52c312 | 229 | return -1; |
ac2570a8 | 230 | } |
115329f1 | 231 | |
4f52c312 MN |
232 | rice_order = get_bits(&s->gb, 4); |
233 | ||
ac2570a8 | 234 | samples= s->blocksize >> rice_order; |
5484dad7 RD |
235 | if (pred_order > samples) { |
236 | av_log(s->avctx, AV_LOG_ERROR, "invalid predictor order: %i > %i\n", pred_order, samples); | |
237 | return -1; | |
238 | } | |
4f52c312 | 239 | |
115329f1 | 240 | sample= |
ac2570a8 | 241 | i= pred_order; |
4f52c312 MN |
242 | for (partition = 0; partition < (1 << rice_order); partition++) |
243 | { | |
e471443a JC |
244 | tmp = get_bits(&s->gb, method_type == 0 ? 4 : 5); |
245 | if (tmp == (method_type == 0 ? 15 : 31)) | |
4f52c312 | 246 | { |
4f52c312 | 247 | tmp = get_bits(&s->gb, 5); |
4f52c312 | 248 | for (; i < samples; i++, sample++) |
4fd12598 | 249 | s->decoded[channel][sample] = get_sbits(&s->gb, tmp); |
4f52c312 MN |
250 | } |
251 | else | |
252 | { | |
ac2570a8 | 253 | for (; i < samples; i++, sample++){ |
4fd12598 | 254 | s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0); |
ac2570a8 | 255 | } |
4f52c312 | 256 | } |
ac2570a8 | 257 | i= 0; |
4f52c312 MN |
258 | } |
259 | ||
4f52c312 | 260 | return 0; |
115329f1 | 261 | } |
4f52c312 MN |
262 | |
263 | static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) | |
264 | { | |
08965b22 LM |
265 | const int blocksize = s->blocksize; |
266 | int32_t *decoded = s->decoded[channel]; | |
267 | int a, b, c, d, i; | |
115329f1 | 268 | |
4f52c312 | 269 | /* warm up samples */ |
4f52c312 MN |
270 | for (i = 0; i < pred_order; i++) |
271 | { | |
08965b22 | 272 | decoded[i] = get_sbits(&s->gb, s->curr_bps); |
4f52c312 | 273 | } |
115329f1 | 274 | |
4f52c312 MN |
275 | if (decode_residuals(s, channel, pred_order) < 0) |
276 | return -1; | |
277 | ||
0ec7b71d | 278 | if(pred_order > 0) |
1f4fa6a4 | 279 | a = decoded[pred_order-1]; |
0ec7b71d | 280 | if(pred_order > 1) |
1f4fa6a4 | 281 | b = a - decoded[pred_order-2]; |
0ec7b71d | 282 | if(pred_order > 2) |
1f4fa6a4 | 283 | c = b - decoded[pred_order-2] + decoded[pred_order-3]; |
0ec7b71d | 284 | if(pred_order > 3) |
1f4fa6a4 | 285 | d = c - decoded[pred_order-2] + 2*decoded[pred_order-3] - decoded[pred_order-4]; |
08965b22 | 286 | |
4f52c312 MN |
287 | switch(pred_order) |
288 | { | |
289 | case 0: | |
4f52c312 MN |
290 | break; |
291 | case 1: | |
08965b22 LM |
292 | for (i = pred_order; i < blocksize; i++) |
293 | decoded[i] = a += decoded[i]; | |
4f52c312 MN |
294 | break; |
295 | case 2: | |
08965b22 LM |
296 | for (i = pred_order; i < blocksize; i++) |
297 | decoded[i] = a += b += decoded[i]; | |
4f52c312 MN |
298 | break; |
299 | case 3: | |
08965b22 LM |
300 | for (i = pred_order; i < blocksize; i++) |
301 | decoded[i] = a += b += c += decoded[i]; | |
4f52c312 MN |
302 | break; |
303 | case 4: | |
08965b22 LM |
304 | for (i = pred_order; i < blocksize; i++) |
305 | decoded[i] = a += b += c += d += decoded[i]; | |
4f52c312 | 306 | break; |
ac2570a8 MN |
307 | default: |
308 | av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order); | |
309 | return -1; | |
4f52c312 | 310 | } |
ac2570a8 | 311 | |
4f52c312 MN |
312 | return 0; |
313 | } | |
314 | ||
315 | static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) | |
316 | { | |
0187178e | 317 | int i, j; |
4f52c312 MN |
318 | int coeff_prec, qlevel; |
319 | int coeffs[pred_order]; | |
d1a5c421 | 320 | int32_t *decoded = s->decoded[channel]; |
115329f1 | 321 | |
4f52c312 | 322 | /* warm up samples */ |
4f52c312 MN |
323 | for (i = 0; i < pred_order; i++) |
324 | { | |
d1a5c421 | 325 | decoded[i] = get_sbits(&s->gb, s->curr_bps); |
4f52c312 | 326 | } |
115329f1 | 327 | |
4f52c312 MN |
328 | coeff_prec = get_bits(&s->gb, 4) + 1; |
329 | if (coeff_prec == 16) | |
330 | { | |
5305f40b | 331 | av_log(s->avctx, AV_LOG_ERROR, "invalid coeff precision\n"); |
4f52c312 MN |
332 | return -1; |
333 | } | |
ac2570a8 | 334 | qlevel = get_sbits(&s->gb, 5); |
9d656110 | 335 | if(qlevel < 0){ |
5305f40b | 336 | av_log(s->avctx, AV_LOG_ERROR, "qlevel %d not supported, maybe buggy stream\n", qlevel); |
9d656110 MN |
337 | return -1; |
338 | } | |
339 | ||
4f52c312 MN |
340 | for (i = 0; i < pred_order; i++) |
341 | { | |
ac2570a8 | 342 | coeffs[i] = get_sbits(&s->gb, coeff_prec); |
4f52c312 | 343 | } |
115329f1 | 344 | |
4f52c312 MN |
345 | if (decode_residuals(s, channel, pred_order) < 0) |
346 | return -1; | |
347 | ||
0187178e LB |
348 | if (s->bps > 16) { |
349 | int64_t sum; | |
350 | for (i = pred_order; i < s->blocksize; i++) | |
351 | { | |
352 | sum = 0; | |
353 | for (j = 0; j < pred_order; j++) | |
d1a5c421 LM |
354 | sum += (int64_t)coeffs[j] * decoded[i-j-1]; |
355 | decoded[i] += sum >> qlevel; | |
0187178e LB |
356 | } |
357 | } else { | |
bd49d4fd | 358 | for (i = pred_order; i < s->blocksize-1; i += 2) |
0187178e | 359 | { |
d1a5c421 LM |
360 | int c; |
361 | int d = decoded[i-pred_order]; | |
362 | int s0 = 0, s1 = 0; | |
bd49d4fd LM |
363 | for (j = pred_order-1; j > 0; j--) |
364 | { | |
d1a5c421 | 365 | c = coeffs[j]; |
bd49d4fd | 366 | s0 += c*d; |
d1a5c421 LM |
367 | d = decoded[i-j]; |
368 | s1 += c*d; | |
bd49d4fd | 369 | } |
d1a5c421 LM |
370 | c = coeffs[0]; |
371 | s0 += c*d; | |
372 | d = decoded[i] += s0 >> qlevel; | |
373 | s1 += c*d; | |
374 | decoded[i+1] += s1 >> qlevel; | |
bd49d4fd LM |
375 | } |
376 | if (i < s->blocksize) | |
377 | { | |
378 | int sum = 0; | |
0187178e | 379 | for (j = 0; j < pred_order; j++) |
d1a5c421 LM |
380 | sum += coeffs[j] * decoded[i-j-1]; |
381 | decoded[i] += sum >> qlevel; | |
0187178e | 382 | } |
4f52c312 | 383 | } |
115329f1 | 384 | |
4f52c312 MN |
385 | return 0; |
386 | } | |
387 | ||
388 | static inline int decode_subframe(FLACContext *s, int channel) | |
389 | { | |
390 | int type, wasted = 0; | |
391 | int i, tmp; | |
115329f1 | 392 | |
4f52c312 | 393 | s->curr_bps = s->bps; |
ac2570a8 | 394 | if(channel == 0){ |
9d656110 | 395 | if(s->decorrelation == RIGHT_SIDE) |
ac2570a8 MN |
396 | s->curr_bps++; |
397 | }else{ | |
9d656110 | 398 | if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE) |
ac2570a8 MN |
399 | s->curr_bps++; |
400 | } | |
401 | ||
4f52c312 MN |
402 | if (get_bits1(&s->gb)) |
403 | { | |
1cef211d | 404 | av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n"); |
4f52c312 MN |
405 | return -1; |
406 | } | |
407 | type = get_bits(&s->gb, 6); | |
c5706efd | 408 | |
4f52c312 MN |
409 | if (get_bits1(&s->gb)) |
410 | { | |
411 | wasted = 1; | |
412 | while (!get_bits1(&s->gb)) | |
413 | wasted++; | |
414 | s->curr_bps -= wasted; | |
415 | } | |
c5706efd | 416 | |
ac2570a8 | 417 | //FIXME use av_log2 for types |
4f52c312 MN |
418 | if (type == 0) |
419 | { | |
ac2570a8 | 420 | tmp = get_sbits(&s->gb, s->curr_bps); |
4f52c312 MN |
421 | for (i = 0; i < s->blocksize; i++) |
422 | s->decoded[channel][i] = tmp; | |
423 | } | |
424 | else if (type == 1) | |
425 | { | |
4f52c312 | 426 | for (i = 0; i < s->blocksize; i++) |
ac2570a8 | 427 | s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps); |
4f52c312 MN |
428 | } |
429 | else if ((type >= 8) && (type <= 12)) | |
430 | { | |
4f52c312 MN |
431 | if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) |
432 | return -1; | |
433 | } | |
434 | else if (type >= 32) | |
435 | { | |
4f52c312 MN |
436 | if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0) |
437 | return -1; | |
438 | } | |
439 | else | |
440 | { | |
1cef211d | 441 | av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); |
4f52c312 MN |
442 | return -1; |
443 | } | |
115329f1 | 444 | |
4f52c312 MN |
445 | if (wasted) |
446 | { | |
447 | int i; | |
448 | for (i = 0; i < s->blocksize; i++) | |
449 | s->decoded[channel][i] <<= wasted; | |
450 | } | |
451 | ||
452 | return 0; | |
453 | } | |
454 | ||
ac66834c | 455 | static int decode_frame(FLACContext *s, int alloc_data_size) |
4f52c312 | 456 | { |
9d656110 | 457 | int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8; |
0496a034 | 458 | int decorrelation, bps, blocksize, samplerate; |
115329f1 | 459 | |
4f52c312 | 460 | blocksize_code = get_bits(&s->gb, 4); |
4f52c312 MN |
461 | |
462 | sample_rate_code = get_bits(&s->gb, 4); | |
115329f1 | 463 | |
4f52c312 | 464 | assignment = get_bits(&s->gb, 4); /* channel assignment */ |
0496a034 MN |
465 | if (assignment < 8 && s->channels == assignment+1) |
466 | decorrelation = INDEPENDENT; | |
467 | else if (assignment >=8 && assignment < 11 && s->channels == 2) | |
468 | decorrelation = LEFT_SIDE + assignment - 8; | |
4f52c312 MN |
469 | else |
470 | { | |
1cef211d | 471 | av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels); |
4f52c312 MN |
472 | return -1; |
473 | } | |
115329f1 | 474 | |
4f52c312 | 475 | sample_size_code = get_bits(&s->gb, 3); |
0496a034 MN |
476 | if(sample_size_code == 0) |
477 | bps= s->bps; | |
478 | else if((sample_size_code != 3) && (sample_size_code != 7)) | |
479 | bps = sample_size_table[sample_size_code]; | |
115329f1 | 480 | else |
4f52c312 | 481 | { |
1cef211d | 482 | av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code); |
4f52c312 MN |
483 | return -1; |
484 | } | |
485 | ||
486 | if (get_bits1(&s->gb)) | |
487 | { | |
1cef211d | 488 | av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n"); |
0496a034 | 489 | return -1; |
4f52c312 | 490 | } |
115329f1 | 491 | |
0496a034 MN |
492 | if(get_utf8(&s->gb) < 0){ |
493 | av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n"); | |
494 | return -1; | |
495 | } | |
115329f1 | 496 | |
ac2570a8 | 497 | if (blocksize_code == 0) |
0496a034 | 498 | blocksize = s->min_blocksize; |
ac2570a8 | 499 | else if (blocksize_code == 6) |
0496a034 | 500 | blocksize = get_bits(&s->gb, 8)+1; |
ac2570a8 | 501 | else if (blocksize_code == 7) |
0496a034 | 502 | blocksize = get_bits(&s->gb, 16)+1; |
115329f1 | 503 | else |
0496a034 | 504 | blocksize = blocksize_table[blocksize_code]; |
4f52c312 | 505 | |
0496a034 MN |
506 | if(blocksize > s->max_blocksize){ |
507 | av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize); | |
ac2570a8 MN |
508 | return -1; |
509 | } | |
510 | ||
ac66834c MN |
511 | if(blocksize * s->channels * sizeof(int16_t) > alloc_data_size) |
512 | return -1; | |
513 | ||
ac2570a8 | 514 | if (sample_rate_code == 0){ |
0496a034 | 515 | samplerate= s->samplerate; |
959e0006 | 516 | }else if (sample_rate_code < 12) |
0496a034 | 517 | samplerate = sample_rate_table[sample_rate_code]; |
ac2570a8 | 518 | else if (sample_rate_code == 12) |
0496a034 | 519 | samplerate = get_bits(&s->gb, 8) * 1000; |
ac2570a8 | 520 | else if (sample_rate_code == 13) |
0496a034 | 521 | samplerate = get_bits(&s->gb, 16); |
ac2570a8 | 522 | else if (sample_rate_code == 14) |
0496a034 | 523 | samplerate = get_bits(&s->gb, 16) * 10; |
ac2570a8 MN |
524 | else{ |
525 | av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code); | |
526 | return -1; | |
4f52c312 MN |
527 | } |
528 | ||
9d656110 | 529 | skip_bits(&s->gb, 8); |
3abe5fbd AJ |
530 | crc8 = av_crc(av_crc_get_table(AV_CRC_8_ATM), 0, |
531 | s->gb.buffer, get_bits_count(&s->gb)/8); | |
9d656110 | 532 | if(crc8){ |
160d679c | 533 | av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8); |
9d656110 MN |
534 | return -1; |
535 | } | |
115329f1 | 536 | |
0496a034 MN |
537 | s->blocksize = blocksize; |
538 | s->samplerate = samplerate; | |
539 | s->bps = bps; | |
540 | s->decorrelation= decorrelation; | |
4f52c312 | 541 | |
9482171b | 542 | // dump_headers(s->avctx, (FLACStreaminfo *)s); |
4f52c312 MN |
543 | |
544 | /* subframes */ | |
545 | for (i = 0; i < s->channels; i++) | |
546 | { | |
4f52c312 MN |
547 | if (decode_subframe(s, i) < 0) |
548 | return -1; | |
549 | } | |
115329f1 | 550 | |
4f52c312 MN |
551 | align_get_bits(&s->gb); |
552 | ||
553 | /* frame footer */ | |
554 | skip_bits(&s->gb, 16); /* data crc */ | |
555 | ||
556 | return 0; | |
557 | } | |
558 | ||
559 | static int flac_decode_frame(AVCodecContext *avctx, | |
560 | void *data, int *data_size, | |
1545c5e5 | 561 | const uint8_t *buf, int buf_size) |
4f52c312 MN |
562 | { |
563 | FLACContext *s = avctx->priv_data; | |
3f1899a8 MM |
564 | int tmp = 0, i, j = 0, input_buf_size = 0; |
565 | int16_t *samples = data; | |
ac66834c MN |
566 | int alloc_data_size= *data_size; |
567 | ||
568 | *data_size=0; | |
4f52c312 | 569 | |
ac2570a8 | 570 | if(s->max_framesize == 0){ |
d3ce0792 | 571 | s->max_framesize= FFMAX(4, buf_size); // should hopefully be enough for the first header |
ac2570a8 MN |
572 | s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize); |
573 | } | |
574 | ||
575 | if(1 && s->max_framesize){//FIXME truncated | |
e0168e3b MN |
576 | if(s->bitstream_size < 4 || AV_RL32(s->bitstream) != MKTAG('f','L','a','C')) |
577 | buf_size= FFMIN(buf_size, s->max_framesize - FFMIN(s->bitstream_size, s->max_framesize)); | |
ac2570a8 MN |
578 | input_buf_size= buf_size; |
579 | ||
e0168e3b MN |
580 | if(s->bitstream_size + buf_size < buf_size || s->bitstream_index + s->bitstream_size + buf_size < s->bitstream_index) |
581 | return -1; | |
582 | ||
583 | if(s->allocated_bitstream_size < s->bitstream_size + buf_size) | |
584 | s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->bitstream_size + buf_size); | |
585 | ||
ac2570a8 | 586 | if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){ |
ac2570a8 MN |
587 | memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size); |
588 | s->bitstream_index=0; | |
589 | } | |
590 | memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size); | |
591 | buf= &s->bitstream[s->bitstream_index]; | |
592 | buf_size += s->bitstream_size; | |
593 | s->bitstream_size= buf_size; | |
115329f1 | 594 | |
4c453ddb | 595 | if(buf_size < s->max_framesize && input_buf_size){ |
ac2570a8 MN |
596 | return input_buf_size; |
597 | } | |
598 | } | |
4f52c312 MN |
599 | |
600 | init_get_bits(&s->gb, buf, buf_size*8); | |
115329f1 | 601 | |
2b4b8c82 MN |
602 | if(metadata_parse(s)) |
603 | goto end; | |
604 | ||
13de8a08 JR |
605 | tmp = show_bits(&s->gb, 16); |
606 | if((tmp & 0xFFFE) != 0xFFF8){ | |
607 | av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n"); | |
608 | while(get_bits_count(&s->gb)/8+2 < buf_size && (show_bits(&s->gb, 16) & 0xFFFE) != 0xFFF8) | |
609 | skip_bits(&s->gb, 8); | |
610 | goto end; // we may not have enough bits left to decode a frame, so try next time | |
611 | } | |
612 | skip_bits(&s->gb, 16); | |
613 | if (decode_frame(s, alloc_data_size) < 0){ | |
614 | av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n"); | |
615 | s->bitstream_size=0; | |
616 | s->bitstream_index=0; | |
617 | return -1; | |
618 | } | |
ac2570a8 | 619 | |
c448303d MN |
620 | #define DECORRELATE(left, right)\ |
621 | assert(s->channels == 2);\ | |
622 | for (i = 0; i < s->blocksize; i++)\ | |
623 | {\ | |
624 | int a= s->decoded[0][i];\ | |
625 | int b= s->decoded[1][i];\ | |
71fd1225 BF |
626 | *samples++ = ((left) << (24 - s->bps)) >> 8;\ |
627 | *samples++ = ((right) << (24 - s->bps)) >> 8;\ | |
c448303d MN |
628 | }\ |
629 | break; | |
630 | ||
9d656110 | 631 | switch(s->decorrelation) |
4f52c312 MN |
632 | { |
633 | case INDEPENDENT: | |
ac2570a8 | 634 | for (j = 0; j < s->blocksize; j++) |
4f52c312 | 635 | { |
ac2570a8 | 636 | for (i = 0; i < s->channels; i++) |
71fd1225 | 637 | *samples++ = (s->decoded[i][j] << (24 - s->bps)) >> 8; |
4f52c312 MN |
638 | } |
639 | break; | |
640 | case LEFT_SIDE: | |
c448303d | 641 | DECORRELATE(a,a-b) |
4f52c312 | 642 | case RIGHT_SIDE: |
c448303d | 643 | DECORRELATE(a+b,b) |
4f52c312 | 644 | case MID_SIDE: |
c448303d | 645 | DECORRELATE( (a-=b>>1) + b, a) |
4f52c312 | 646 | } |
4f52c312 | 647 | |
ac2570a8 | 648 | *data_size = (int8_t *)samples - (int8_t *)data; |
4f52c312 | 649 | |
ac2570a8 | 650 | end: |
cea96420 | 651 | i= (get_bits_count(&s->gb)+7)/8; |
ac2570a8 MN |
652 | if(i > buf_size){ |
653 | av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size); | |
9d656110 MN |
654 | s->bitstream_size=0; |
655 | s->bitstream_index=0; | |
ac2570a8 MN |
656 | return -1; |
657 | } | |
4f52c312 | 658 | |
ac2570a8 MN |
659 | if(s->bitstream_size){ |
660 | s->bitstream_index += i; | |
661 | s->bitstream_size -= i; | |
662 | return input_buf_size; | |
115329f1 | 663 | }else |
ac2570a8 | 664 | return i; |
4f52c312 MN |
665 | } |
666 | ||
98a6fff9 | 667 | static av_cold int flac_decode_close(AVCodecContext *avctx) |
4f52c312 MN |
668 | { |
669 | FLACContext *s = avctx->priv_data; | |
670 | int i; | |
115329f1 | 671 | |
4f52c312 MN |
672 | for (i = 0; i < s->channels; i++) |
673 | { | |
ac2570a8 | 674 | av_freep(&s->decoded[i]); |
4f52c312 | 675 | } |
ac2570a8 | 676 | av_freep(&s->bitstream); |
115329f1 | 677 | |
4f52c312 MN |
678 | return 0; |
679 | } | |
680 | ||
1e31d32c | 681 | static void flac_flush(AVCodecContext *avctx){ |
1e31d32c MN |
682 | FLACContext *s = avctx->priv_data; |
683 | ||
684 | s->bitstream_size= | |
685 | s->bitstream_index= 0; | |
686 | } | |
687 | ||
4f52c312 MN |
688 | AVCodec flac_decoder = { |
689 | "flac", | |
690 | CODEC_TYPE_AUDIO, | |
691 | CODEC_ID_FLAC, | |
692 | sizeof(FLACContext), | |
693 | flac_decode_init, | |
694 | NULL, | |
695 | flac_decode_close, | |
696 | flac_decode_frame, | |
4c453ddb | 697 | CODEC_CAP_DELAY, |
115329f1 | 698 | .flush= flac_flush, |
fe4bf374 | 699 | .long_name= NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), |
4f52c312 | 700 | }; |