1 | /*
|
---|
2 | * FLAC (Free Lossless Audio Codec) decoder
|
---|
3 | * Copyright (c) 2003 Alex Beregszaszi
|
---|
4 | *
|
---|
5 | * This library is free software; you can redistribute it and/or
|
---|
6 | * modify it under the terms of the GNU Lesser General Public
|
---|
7 | * License as published by the Free Software Foundation; either
|
---|
8 | * version 2 of the License, or (at your option) any later version.
|
---|
9 | *
|
---|
10 | * This library is distributed in the hope that it will be useful,
|
---|
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
13 | * Lesser General Public License for more details.
|
---|
14 | *
|
---|
15 | * You should have received a copy of the GNU Lesser General Public
|
---|
16 | * License along with this library; if not, write to the Free Software
|
---|
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
---|
18 | */
|
---|
19 |
|
---|
20 | /**
|
---|
21 | * @file flac.c
|
---|
22 | * FLAC (Free Lossless Audio Codec) decoder
|
---|
23 | * @author Alex Beregszaszi
|
---|
24 | *
|
---|
25 | * For more information on the FLAC format, visit:
|
---|
26 | * http://flac.sourceforge.net/
|
---|
27 | *
|
---|
28 | * This decoder can be used in 1 of 2 ways: Either raw FLAC data can be fed
|
---|
29 | * through, starting from the initial 'fLaC' signature; or by passing the
|
---|
30 | * 34-byte streaminfo structure through avctx->extradata[_size] followed
|
---|
31 | * by data starting with the 0xFFF8 marker.
|
---|
32 | */
|
---|
33 |
|
---|
34 | #include <limits.h>
|
---|
35 |
|
---|
36 | #include "avcodec.h"
|
---|
37 | #include "bitstream.h"
|
---|
38 | #include "golomb.h"
|
---|
39 | #include "crc.h"
|
---|
40 |
|
---|
41 | #undef NDEBUG
|
---|
42 | #include <assert.h>
|
---|
43 |
|
---|
44 | #define MAX_CHANNELS 8
|
---|
45 | #define MAX_BLOCKSIZE 65535
|
---|
46 | #define FLAC_STREAMINFO_SIZE 34
|
---|
47 |
|
---|
48 | enum decorrelation_type {
|
---|
49 | INDEPENDENT,
|
---|
50 | LEFT_SIDE,
|
---|
51 | RIGHT_SIDE,
|
---|
52 | MID_SIDE,
|
---|
53 | };
|
---|
54 |
|
---|
55 | typedef struct FLACContext {
|
---|
56 | AVCodecContext *avctx;
|
---|
57 | GetBitContext gb;
|
---|
58 |
|
---|
59 | int min_blocksize, max_blocksize;
|
---|
60 | int min_framesize, max_framesize;
|
---|
61 | int samplerate, channels;
|
---|
62 | int blocksize/*, last_blocksize*/;
|
---|
63 | int bps, curr_bps;
|
---|
64 | enum decorrelation_type decorrelation;
|
---|
65 |
|
---|
66 | int32_t *decoded[MAX_CHANNELS];
|
---|
67 | uint8_t *bitstream;
|
---|
68 | int bitstream_size;
|
---|
69 | int bitstream_index;
|
---|
70 | unsigned int allocated_bitstream_size;
|
---|
71 | } FLACContext;
|
---|
72 |
|
---|
73 | #define METADATA_TYPE_STREAMINFO 0
|
---|
74 |
|
---|
75 | static int sample_rate_table[] =
|
---|
76 | { 0, 0, 0, 0,
|
---|
77 | 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000,
|
---|
78 | 0, 0, 0, 0 };
|
---|
79 |
|
---|
80 | static int sample_size_table[] =
|
---|
81 | { 0, 8, 12, 0, 16, 20, 24, 0 };
|
---|
82 |
|
---|
83 | static int blocksize_table[] = {
|
---|
84 | 0, 192, 576<<0, 576<<1, 576<<2, 576<<3, 0, 0,
|
---|
85 | 256<<0, 256<<1, 256<<2, 256<<3, 256<<4, 256<<5, 256<<6, 256<<7
|
---|
86 | };
|
---|
87 |
|
---|
88 | static int64_t get_utf8(GetBitContext *gb){
|
---|
89 | int64_t val;
|
---|
90 | GET_UTF8(val, get_bits(gb, 8), return -1;)
|
---|
91 | return val;
|
---|
92 | }
|
---|
93 |
|
---|
94 | static void metadata_streaminfo(FLACContext *s);
|
---|
95 | static void dump_headers(FLACContext *s);
|
---|
96 |
|
---|
97 | static int flac_decode_init(AVCodecContext * avctx)
|
---|
98 | {
|
---|
99 | FLACContext *s = avctx->priv_data;
|
---|
100 | s->avctx = avctx;
|
---|
101 |
|
---|
102 | /* initialize based on the demuxer-supplied streamdata header */
|
---|
103 | if (avctx->extradata_size == FLAC_STREAMINFO_SIZE) {
|
---|
104 | init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
|
---|
105 | metadata_streaminfo(s);
|
---|
106 | dump_headers(s);
|
---|
107 | }
|
---|
108 |
|
---|
109 | return 0;
|
---|
110 | }
|
---|
111 |
|
---|
112 | static void dump_headers(FLACContext *s)
|
---|
113 | {
|
---|
114 | av_log(s->avctx, AV_LOG_DEBUG, " Blocksize: %d .. %d (%d)\n", s->min_blocksize, s->max_blocksize, s->blocksize);
|
---|
115 | av_log(s->avctx, AV_LOG_DEBUG, " Framesize: %d .. %d\n", s->min_framesize, s->max_framesize);
|
---|
116 | av_log(s->avctx, AV_LOG_DEBUG, " Samplerate: %d\n", s->samplerate);
|
---|
117 | av_log(s->avctx, AV_LOG_DEBUG, " Channels: %d\n", s->channels);
|
---|
118 | av_log(s->avctx, AV_LOG_DEBUG, " Bits: %d\n", s->bps);
|
---|
119 | }
|
---|
120 |
|
---|
121 | static void allocate_buffers(FLACContext *s){
|
---|
122 | int i;
|
---|
123 |
|
---|
124 | assert(s->max_blocksize);
|
---|
125 |
|
---|
126 | if(s->max_framesize == 0 && s->max_blocksize){
|
---|
127 | s->max_framesize= (s->channels * s->bps * s->max_blocksize + 7)/ 8; //FIXME header overhead
|
---|
128 | }
|
---|
129 |
|
---|
130 | for (i = 0; i < s->channels; i++)
|
---|
131 | {
|
---|
132 | s->decoded[i] = av_realloc(s->decoded[i], sizeof(int32_t)*s->max_blocksize);
|
---|
133 | }
|
---|
134 |
|
---|
135 | s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
|
---|
136 | }
|
---|
137 |
|
---|
138 | static void metadata_streaminfo(FLACContext *s)
|
---|
139 | {
|
---|
140 | /* mandatory streaminfo */
|
---|
141 | s->min_blocksize = get_bits(&s->gb, 16);
|
---|
142 | s->max_blocksize = get_bits(&s->gb, 16);
|
---|
143 |
|
---|
144 | s->min_framesize = get_bits_long(&s->gb, 24);
|
---|
145 | s->max_framesize = get_bits_long(&s->gb, 24);
|
---|
146 |
|
---|
147 | s->samplerate = get_bits_long(&s->gb, 20);
|
---|
148 | s->channels = get_bits(&s->gb, 3) + 1;
|
---|
149 | s->bps = get_bits(&s->gb, 5) + 1;
|
---|
150 |
|
---|
151 | s->avctx->channels = s->channels;
|
---|
152 | s->avctx->sample_rate = s->samplerate;
|
---|
153 |
|
---|
154 | skip_bits(&s->gb, 36); /* total num of samples */
|
---|
155 |
|
---|
156 | skip_bits(&s->gb, 64); /* md5 sum */
|
---|
157 | skip_bits(&s->gb, 64); /* md5 sum */
|
---|
158 |
|
---|
159 | allocate_buffers(s);
|
---|
160 | }
|
---|
161 |
|
---|
162 | static int decode_residuals(FLACContext *s, int channel, int pred_order)
|
---|
163 | {
|
---|
164 | int i, tmp, partition, method_type, rice_order;
|
---|
165 | int sample = 0, samples;
|
---|
166 |
|
---|
167 | method_type = get_bits(&s->gb, 2);
|
---|
168 | if (method_type != 0){
|
---|
169 | av_log(s->avctx, AV_LOG_DEBUG, "illegal residual coding method %d\n", method_type);
|
---|
170 | return -1;
|
---|
171 | }
|
---|
172 |
|
---|
173 | rice_order = get_bits(&s->gb, 4);
|
---|
174 |
|
---|
175 | samples= s->blocksize >> rice_order;
|
---|
176 |
|
---|
177 | sample=
|
---|
178 | i= pred_order;
|
---|
179 | for (partition = 0; partition < (1 << rice_order); partition++)
|
---|
180 | {
|
---|
181 | tmp = get_bits(&s->gb, 4);
|
---|
182 | if (tmp == 15)
|
---|
183 | {
|
---|
184 | av_log(s->avctx, AV_LOG_DEBUG, "fixed len partition\n");
|
---|
185 | tmp = get_bits(&s->gb, 5);
|
---|
186 | for (; i < samples; i++, sample++)
|
---|
187 | s->decoded[channel][sample] = get_sbits(&s->gb, tmp);
|
---|
188 | }
|
---|
189 | else
|
---|
190 | {
|
---|
191 | // av_log(s->avctx, AV_LOG_DEBUG, "rice coded partition k=%d\n", tmp);
|
---|
192 | for (; i < samples; i++, sample++){
|
---|
193 | s->decoded[channel][sample] = get_sr_golomb_flac(&s->gb, tmp, INT_MAX, 0);
|
---|
194 | }
|
---|
195 | }
|
---|
196 | i= 0;
|
---|
197 | }
|
---|
198 |
|
---|
199 | // av_log(s->avctx, AV_LOG_DEBUG, "partitions: %d, samples: %d\n", 1 << rice_order, sample);
|
---|
200 |
|
---|
201 | return 0;
|
---|
202 | }
|
---|
203 |
|
---|
204 | static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order)
|
---|
205 | {
|
---|
206 | int i;
|
---|
207 |
|
---|
208 | // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME FIXED\n");
|
---|
209 |
|
---|
210 | /* warm up samples */
|
---|
211 | // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
|
---|
212 |
|
---|
213 | for (i = 0; i < pred_order; i++)
|
---|
214 | {
|
---|
215 | s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
|
---|
216 | // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]);
|
---|
217 | }
|
---|
218 |
|
---|
219 | if (decode_residuals(s, channel, pred_order) < 0)
|
---|
220 | return -1;
|
---|
221 |
|
---|
222 | switch(pred_order)
|
---|
223 | {
|
---|
224 | case 0:
|
---|
225 | break;
|
---|
226 | case 1:
|
---|
227 | for (i = pred_order; i < s->blocksize; i++)
|
---|
228 | s->decoded[channel][i] += s->decoded[channel][i-1];
|
---|
229 | break;
|
---|
230 | case 2:
|
---|
231 | for (i = pred_order; i < s->blocksize; i++)
|
---|
232 | s->decoded[channel][i] += 2*s->decoded[channel][i-1]
|
---|
233 | - s->decoded[channel][i-2];
|
---|
234 | break;
|
---|
235 | case 3:
|
---|
236 | for (i = pred_order; i < s->blocksize; i++)
|
---|
237 | s->decoded[channel][i] += 3*s->decoded[channel][i-1]
|
---|
238 | - 3*s->decoded[channel][i-2]
|
---|
239 | + s->decoded[channel][i-3];
|
---|
240 | break;
|
---|
241 | case 4:
|
---|
242 | for (i = pred_order; i < s->blocksize; i++)
|
---|
243 | s->decoded[channel][i] += 4*s->decoded[channel][i-1]
|
---|
244 | - 6*s->decoded[channel][i-2]
|
---|
245 | + 4*s->decoded[channel][i-3]
|
---|
246 | - s->decoded[channel][i-4];
|
---|
247 | break;
|
---|
248 | default:
|
---|
249 | av_log(s->avctx, AV_LOG_ERROR, "illegal pred order %d\n", pred_order);
|
---|
250 | return -1;
|
---|
251 | }
|
---|
252 |
|
---|
253 | return 0;
|
---|
254 | }
|
---|
255 |
|
---|
256 | static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order)
|
---|
257 | {
|
---|
258 | int i, j;
|
---|
259 | int coeff_prec, qlevel;
|
---|
260 | int coeffs[pred_order];
|
---|
261 |
|
---|
262 | // av_log(s->avctx, AV_LOG_DEBUG, " SUBFRAME LPC\n");
|
---|
263 |
|
---|
264 | /* warm up samples */
|
---|
265 | // av_log(s->avctx, AV_LOG_DEBUG, " warm up samples: %d\n", pred_order);
|
---|
266 |
|
---|
267 | for (i = 0; i < pred_order; i++)
|
---|
268 | {
|
---|
269 | s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
|
---|
270 | // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, s->decoded[channel][i]);
|
---|
271 | }
|
---|
272 |
|
---|
273 | coeff_prec = get_bits(&s->gb, 4) + 1;
|
---|
274 | if (coeff_prec == 16)
|
---|
275 | {
|
---|
276 | av_log(s->avctx, AV_LOG_DEBUG, "invalid coeff precision\n");
|
---|
277 | return -1;
|
---|
278 | }
|
---|
279 | // av_log(s->avctx, AV_LOG_DEBUG, " qlp coeff prec: %d\n", coeff_prec);
|
---|
280 | qlevel = get_sbits(&s->gb, 5);
|
---|
281 | // av_log(s->avctx, AV_LOG_DEBUG, " quant level: %d\n", qlevel);
|
---|
282 | if(qlevel < 0){
|
---|
283 | av_log(s->avctx, AV_LOG_DEBUG, "qlevel %d not supported, maybe buggy stream\n", qlevel);
|
---|
284 | return -1;
|
---|
285 | }
|
---|
286 |
|
---|
287 | for (i = 0; i < pred_order; i++)
|
---|
288 | {
|
---|
289 | coeffs[i] = get_sbits(&s->gb, coeff_prec);
|
---|
290 | // av_log(s->avctx, AV_LOG_DEBUG, " %d: %d\n", i, coeffs[i]);
|
---|
291 | }
|
---|
292 |
|
---|
293 | if (decode_residuals(s, channel, pred_order) < 0)
|
---|
294 | return -1;
|
---|
295 |
|
---|
296 | if (s->bps > 16) {
|
---|
297 | int64_t sum;
|
---|
298 | for (i = pred_order; i < s->blocksize; i++)
|
---|
299 | {
|
---|
300 | sum = 0;
|
---|
301 | for (j = 0; j < pred_order; j++)
|
---|
302 | sum += (int64_t)coeffs[j] * s->decoded[channel][i-j-1];
|
---|
303 | s->decoded[channel][i] += sum >> qlevel;
|
---|
304 | }
|
---|
305 | } else {
|
---|
306 | int sum;
|
---|
307 | for (i = pred_order; i < s->blocksize; i++)
|
---|
308 | {
|
---|
309 | sum = 0;
|
---|
310 | for (j = 0; j < pred_order; j++)
|
---|
311 | sum += coeffs[j] * s->decoded[channel][i-j-1];
|
---|
312 | s->decoded[channel][i] += sum >> qlevel;
|
---|
313 | }
|
---|
314 | }
|
---|
315 |
|
---|
316 | return 0;
|
---|
317 | }
|
---|
318 |
|
---|
319 | static inline int decode_subframe(FLACContext *s, int channel)
|
---|
320 | {
|
---|
321 | int type, wasted = 0;
|
---|
322 | int i, tmp;
|
---|
323 |
|
---|
324 | s->curr_bps = s->bps;
|
---|
325 | if(channel == 0){
|
---|
326 | if(s->decorrelation == RIGHT_SIDE)
|
---|
327 | s->curr_bps++;
|
---|
328 | }else{
|
---|
329 | if(s->decorrelation == LEFT_SIDE || s->decorrelation == MID_SIDE)
|
---|
330 | s->curr_bps++;
|
---|
331 | }
|
---|
332 |
|
---|
333 | if (get_bits1(&s->gb))
|
---|
334 | {
|
---|
335 | av_log(s->avctx, AV_LOG_ERROR, "invalid subframe padding\n");
|
---|
336 | return -1;
|
---|
337 | }
|
---|
338 | type = get_bits(&s->gb, 6);
|
---|
339 | // wasted = get_bits1(&s->gb);
|
---|
340 |
|
---|
341 | // if (wasted)
|
---|
342 | // {
|
---|
343 | // while (!get_bits1(&s->gb))
|
---|
344 | // wasted++;
|
---|
345 | // if (wasted)
|
---|
346 | // wasted++;
|
---|
347 | // s->curr_bps -= wasted;
|
---|
348 | // }
|
---|
349 | #if 0
|
---|
350 | wasted= 16 - av_log2(show_bits(&s->gb, 17));
|
---|
351 | skip_bits(&s->gb, wasted+1);
|
---|
352 | s->curr_bps -= wasted;
|
---|
353 | #else
|
---|
354 | if (get_bits1(&s->gb))
|
---|
355 | {
|
---|
356 | wasted = 1;
|
---|
357 | while (!get_bits1(&s->gb))
|
---|
358 | wasted++;
|
---|
359 | s->curr_bps -= wasted;
|
---|
360 | av_log(s->avctx, AV_LOG_DEBUG, "%d wasted bits\n", wasted);
|
---|
361 | }
|
---|
362 | #endif
|
---|
363 | //FIXME use av_log2 for types
|
---|
364 | if (type == 0)
|
---|
365 | {
|
---|
366 | av_log(s->avctx, AV_LOG_DEBUG, "coding type: constant\n");
|
---|
367 | tmp = get_sbits(&s->gb, s->curr_bps);
|
---|
368 | for (i = 0; i < s->blocksize; i++)
|
---|
369 | s->decoded[channel][i] = tmp;
|
---|
370 | }
|
---|
371 | else if (type == 1)
|
---|
372 | {
|
---|
373 | av_log(s->avctx, AV_LOG_DEBUG, "coding type: verbatim\n");
|
---|
374 | for (i = 0; i < s->blocksize; i++)
|
---|
375 | s->decoded[channel][i] = get_sbits(&s->gb, s->curr_bps);
|
---|
376 | }
|
---|
377 | else if ((type >= 8) && (type <= 12))
|
---|
378 | {
|
---|
379 | // av_log(s->avctx, AV_LOG_DEBUG, "coding type: fixed\n");
|
---|
380 | if (decode_subframe_fixed(s, channel, type & ~0x8) < 0)
|
---|
381 | return -1;
|
---|
382 | }
|
---|
383 | else if (type >= 32)
|
---|
384 | {
|
---|
385 | // av_log(s->avctx, AV_LOG_DEBUG, "coding type: lpc\n");
|
---|
386 | if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0)
|
---|
387 | return -1;
|
---|
388 | }
|
---|
389 | else
|
---|
390 | {
|
---|
391 | av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n");
|
---|
392 | return -1;
|
---|
393 | }
|
---|
394 |
|
---|
395 | if (wasted)
|
---|
396 | {
|
---|
397 | int i;
|
---|
398 | for (i = 0; i < s->blocksize; i++)
|
---|
399 | s->decoded[channel][i] <<= wasted;
|
---|
400 | }
|
---|
401 |
|
---|
402 | return 0;
|
---|
403 | }
|
---|
404 |
|
---|
405 | static int decode_frame(FLACContext *s)
|
---|
406 | {
|
---|
407 | int blocksize_code, sample_rate_code, sample_size_code, assignment, i, crc8;
|
---|
408 | int decorrelation, bps, blocksize, samplerate;
|
---|
409 |
|
---|
410 | blocksize_code = get_bits(&s->gb, 4);
|
---|
411 |
|
---|
412 | sample_rate_code = get_bits(&s->gb, 4);
|
---|
413 |
|
---|
414 | assignment = get_bits(&s->gb, 4); /* channel assignment */
|
---|
415 | if (assignment < 8 && s->channels == assignment+1)
|
---|
416 | decorrelation = INDEPENDENT;
|
---|
417 | else if (assignment >=8 && assignment < 11 && s->channels == 2)
|
---|
418 | decorrelation = LEFT_SIDE + assignment - 8;
|
---|
419 | else
|
---|
420 | {
|
---|
421 | av_log(s->avctx, AV_LOG_ERROR, "unsupported channel assignment %d (channels=%d)\n", assignment, s->channels);
|
---|
422 | return -1;
|
---|
423 | }
|
---|
424 |
|
---|
425 | sample_size_code = get_bits(&s->gb, 3);
|
---|
426 | if(sample_size_code == 0)
|
---|
427 | bps= s->bps;
|
---|
428 | else if((sample_size_code != 3) && (sample_size_code != 7))
|
---|
429 | bps = sample_size_table[sample_size_code];
|
---|
430 | else
|
---|
431 | {
|
---|
432 | av_log(s->avctx, AV_LOG_ERROR, "invalid sample size code (%d)\n", sample_size_code);
|
---|
433 | return -1;
|
---|
434 | }
|
---|
435 |
|
---|
436 | if (get_bits1(&s->gb))
|
---|
437 | {
|
---|
438 | av_log(s->avctx, AV_LOG_ERROR, "broken stream, invalid padding\n");
|
---|
439 | return -1;
|
---|
440 | }
|
---|
441 |
|
---|
442 | if(get_utf8(&s->gb) < 0){
|
---|
443 | av_log(s->avctx, AV_LOG_ERROR, "utf8 fscked\n");
|
---|
444 | return -1;
|
---|
445 | }
|
---|
446 | #if 0
|
---|
447 | if (/*((blocksize_code == 6) || (blocksize_code == 7)) &&*/
|
---|
448 | (s->min_blocksize != s->max_blocksize)){
|
---|
449 | }else{
|
---|
450 | }
|
---|
451 | #endif
|
---|
452 |
|
---|
453 | if (blocksize_code == 0)
|
---|
454 | blocksize = s->min_blocksize;
|
---|
455 | else if (blocksize_code == 6)
|
---|
456 | blocksize = get_bits(&s->gb, 8)+1;
|
---|
457 | else if (blocksize_code == 7)
|
---|
458 | blocksize = get_bits(&s->gb, 16)+1;
|
---|
459 | else
|
---|
460 | blocksize = blocksize_table[blocksize_code];
|
---|
461 |
|
---|
462 | if(blocksize > s->max_blocksize){
|
---|
463 | av_log(s->avctx, AV_LOG_ERROR, "blocksize %d > %d\n", blocksize, s->max_blocksize);
|
---|
464 | return -1;
|
---|
465 | }
|
---|
466 |
|
---|
467 | if (sample_rate_code == 0){
|
---|
468 | samplerate= s->samplerate;
|
---|
469 | }else if ((sample_rate_code > 3) && (sample_rate_code < 12))
|
---|
470 | samplerate = sample_rate_table[sample_rate_code];
|
---|
471 | else if (sample_rate_code == 12)
|
---|
472 | samplerate = get_bits(&s->gb, 8) * 1000;
|
---|
473 | else if (sample_rate_code == 13)
|
---|
474 | samplerate = get_bits(&s->gb, 16);
|
---|
475 | else if (sample_rate_code == 14)
|
---|
476 | samplerate = get_bits(&s->gb, 16) * 10;
|
---|
477 | else{
|
---|
478 | av_log(s->avctx, AV_LOG_ERROR, "illegal sample rate code %d\n", sample_rate_code);
|
---|
479 | return -1;
|
---|
480 | }
|
---|
481 |
|
---|
482 | skip_bits(&s->gb, 8);
|
---|
483 | crc8= av_crc(av_crc07, 0, s->gb.buffer, get_bits_count(&s->gb)/8);
|
---|
484 | if(crc8){
|
---|
485 | av_log(s->avctx, AV_LOG_ERROR, "header crc mismatch crc=%2X\n", crc8);
|
---|
486 | return -1;
|
---|
487 | }
|
---|
488 |
|
---|
489 | s->blocksize = blocksize;
|
---|
490 | s->samplerate = samplerate;
|
---|
491 | s->bps = bps;
|
---|
492 | s->decorrelation= decorrelation;
|
---|
493 |
|
---|
494 | // dump_headers(s);
|
---|
495 |
|
---|
496 | /* subframes */
|
---|
497 | for (i = 0; i < s->channels; i++)
|
---|
498 | {
|
---|
499 | // av_log(s->avctx, AV_LOG_DEBUG, "decoded: %x residual: %x\n", s->decoded[i], s->residual[i]);
|
---|
500 | if (decode_subframe(s, i) < 0)
|
---|
501 | return -1;
|
---|
502 | }
|
---|
503 |
|
---|
504 | align_get_bits(&s->gb);
|
---|
505 |
|
---|
506 | /* frame footer */
|
---|
507 | skip_bits(&s->gb, 16); /* data crc */
|
---|
508 |
|
---|
509 | return 0;
|
---|
510 | }
|
---|
511 |
|
---|
512 | static inline int16_t shift_to_16_bits(int32_t data, int bps)
|
---|
513 | {
|
---|
514 | if (bps == 24) {
|
---|
515 | return (data >> 8);
|
---|
516 | } else if (bps == 20) {
|
---|
517 | return (data >> 4);
|
---|
518 | } else {
|
---|
519 | return data;
|
---|
520 | }
|
---|
521 | }
|
---|
522 |
|
---|
523 | static int flac_decode_frame(AVCodecContext *avctx,
|
---|
524 | void *data, int *data_size,
|
---|
525 | uint8_t *buf, int buf_size)
|
---|
526 | {
|
---|
527 | FLACContext *s = avctx->priv_data;
|
---|
528 | int metadata_last, metadata_type, metadata_size;
|
---|
529 | int tmp = 0, i, j = 0, input_buf_size = 0;
|
---|
530 | int16_t *samples = data;
|
---|
531 |
|
---|
532 | if(s->max_framesize == 0){
|
---|
533 | s->max_framesize= 65536; // should hopefully be enough for the first header
|
---|
534 | s->bitstream= av_fast_realloc(s->bitstream, &s->allocated_bitstream_size, s->max_framesize);
|
---|
535 | }
|
---|
536 |
|
---|
537 | if(1 && s->max_framesize){//FIXME truncated
|
---|
538 | buf_size= FFMAX(FFMIN(buf_size, s->max_framesize - s->bitstream_size), 0);
|
---|
539 | input_buf_size= buf_size;
|
---|
540 |
|
---|
541 | if(s->bitstream_index + s->bitstream_size + buf_size > s->allocated_bitstream_size){
|
---|
542 | // printf("memmove\n");
|
---|
543 | memmove(s->bitstream, &s->bitstream[s->bitstream_index], s->bitstream_size);
|
---|
544 | s->bitstream_index=0;
|
---|
545 | }
|
---|
546 | memcpy(&s->bitstream[s->bitstream_index + s->bitstream_size], buf, buf_size);
|
---|
547 | buf= &s->bitstream[s->bitstream_index];
|
---|
548 | buf_size += s->bitstream_size;
|
---|
549 | s->bitstream_size= buf_size;
|
---|
550 |
|
---|
551 | if(buf_size < s->max_framesize){
|
---|
552 | // printf("wanna more data ...\n");
|
---|
553 | return input_buf_size;
|
---|
554 | }
|
---|
555 | }
|
---|
556 |
|
---|
557 | init_get_bits(&s->gb, buf, buf_size*8);
|
---|
558 |
|
---|
559 | /* fLaC signature (be) */
|
---|
560 | if (show_bits_long(&s->gb, 32) == bswap_32(ff_get_fourcc("fLaC")))
|
---|
561 | {
|
---|
562 | skip_bits(&s->gb, 32);
|
---|
563 |
|
---|
564 | av_log(s->avctx, AV_LOG_DEBUG, "STREAM HEADER\n");
|
---|
565 | do {
|
---|
566 | metadata_last = get_bits(&s->gb, 1);
|
---|
567 | metadata_type = get_bits(&s->gb, 7);
|
---|
568 | metadata_size = get_bits_long(&s->gb, 24);
|
---|
569 |
|
---|
570 | av_log(s->avctx, AV_LOG_DEBUG, " metadata block: flag = %d, type = %d, size = %d\n",
|
---|
571 | metadata_last, metadata_type,
|
---|
572 | metadata_size);
|
---|
573 | if(metadata_size){
|
---|
574 | switch(metadata_type)
|
---|
575 | {
|
---|
576 | case METADATA_TYPE_STREAMINFO:{
|
---|
577 | metadata_streaminfo(s);
|
---|
578 |
|
---|
579 | /* Buffer might have been reallocated, reinit bitreader */
|
---|
580 | if(buf != &s->bitstream[s->bitstream_index])
|
---|
581 | {
|
---|
582 | int bits_count = get_bits_count(&s->gb);
|
---|
583 | buf= &s->bitstream[s->bitstream_index];
|
---|
584 | init_get_bits(&s->gb, buf, buf_size*8);
|
---|
585 | skip_bits(&s->gb, bits_count);
|
---|
586 | }
|
---|
587 |
|
---|
588 | dump_headers(s);
|
---|
589 | break;}
|
---|
590 | default:
|
---|
591 | for(i=0; i<metadata_size; i++)
|
---|
592 | skip_bits(&s->gb, 8);
|
---|
593 | }
|
---|
594 | }
|
---|
595 | } while(!metadata_last);
|
---|
596 | }
|
---|
597 | else
|
---|
598 | {
|
---|
599 |
|
---|
600 | tmp = show_bits(&s->gb, 16);
|
---|
601 | if(tmp != 0xFFF8){
|
---|
602 | av_log(s->avctx, AV_LOG_ERROR, "FRAME HEADER not here\n");
|
---|
603 | while(get_bits_count(&s->gb)/8+2 < buf_size && show_bits(&s->gb, 16) != 0xFFF8)
|
---|
604 | skip_bits(&s->gb, 8);
|
---|
605 | goto end; // we may not have enough bits left to decode a frame, so try next time
|
---|
606 | }
|
---|
607 | skip_bits(&s->gb, 16);
|
---|
608 | if (decode_frame(s) < 0){
|
---|
609 | av_log(s->avctx, AV_LOG_ERROR, "decode_frame() failed\n");
|
---|
610 | s->bitstream_size=0;
|
---|
611 | s->bitstream_index=0;
|
---|
612 | return -1;
|
---|
613 | }
|
---|
614 | }
|
---|
615 |
|
---|
616 |
|
---|
617 | #if 0
|
---|
618 | /* fix the channel order here */
|
---|
619 | if (s->order == MID_SIDE)
|
---|
620 | {
|
---|
621 | short *left = samples;
|
---|
622 | short *right = samples + s->blocksize;
|
---|
623 | for (i = 0; i < s->blocksize; i += 2)
|
---|
624 | {
|
---|
625 | uint32_t x = s->decoded[0][i];
|
---|
626 | uint32_t y = s->decoded[0][i+1];
|
---|
627 |
|
---|
628 | right[i] = x - (y / 2);
|
---|
629 | left[i] = right[i] + y;
|
---|
630 | }
|
---|
631 | *data_size = 2 * s->blocksize;
|
---|
632 | }
|
---|
633 | else
|
---|
634 | {
|
---|
635 | for (i = 0; i < s->channels; i++)
|
---|
636 | {
|
---|
637 | switch(s->order)
|
---|
638 | {
|
---|
639 | case INDEPENDENT:
|
---|
640 | for (j = 0; j < s->blocksize; j++)
|
---|
641 | samples[(s->blocksize*i)+j] = s->decoded[i][j];
|
---|
642 | break;
|
---|
643 | case LEFT_SIDE:
|
---|
644 | case RIGHT_SIDE:
|
---|
645 | if (i == 0)
|
---|
646 | for (j = 0; j < s->blocksize; j++)
|
---|
647 | samples[(s->blocksize*i)+j] = s->decoded[0][j];
|
---|
648 | else
|
---|
649 | for (j = 0; j < s->blocksize; j++)
|
---|
650 | samples[(s->blocksize*i)+j] = s->decoded[0][j] - s->decoded[i][j];
|
---|
651 | break;
|
---|
652 | // case MID_SIDE:
|
---|
653 | // av_log(s->avctx, AV_LOG_DEBUG, "mid-side unsupported\n");
|
---|
654 | }
|
---|
655 | *data_size += s->blocksize;
|
---|
656 | }
|
---|
657 | }
|
---|
658 | #else
|
---|
659 | #define DECORRELATE(left, right)\
|
---|
660 | assert(s->channels == 2);\
|
---|
661 | for (i = 0; i < s->blocksize; i++)\
|
---|
662 | {\
|
---|
663 | int a= s->decoded[0][i];\
|
---|
664 | int b= s->decoded[1][i];\
|
---|
665 | *(samples++) = (left ) >> (16 - s->bps);\
|
---|
666 | *(samples++) = (right) >> (16 - s->bps);\
|
---|
667 | }\
|
---|
668 | break;
|
---|
669 |
|
---|
670 | switch(s->decorrelation)
|
---|
671 | {
|
---|
672 | case INDEPENDENT:
|
---|
673 | for (j = 0; j < s->blocksize; j++)
|
---|
674 | {
|
---|
675 | for (i = 0; i < s->channels; i++)
|
---|
676 | *(samples++) = shift_to_16_bits(s->decoded[i][j], s->bps);
|
---|
677 | }
|
---|
678 | break;
|
---|
679 | case LEFT_SIDE:
|
---|
680 | DECORRELATE(a,a-b)
|
---|
681 | case RIGHT_SIDE:
|
---|
682 | DECORRELATE(a+b,b)
|
---|
683 | case MID_SIDE:
|
---|
684 | DECORRELATE( (a-=b>>1) + b, a)
|
---|
685 | }
|
---|
686 | #endif
|
---|
687 |
|
---|
688 | *data_size = (int8_t *)samples - (int8_t *)data;
|
---|
689 | // av_log(s->avctx, AV_LOG_DEBUG, "data size: %d\n", *data_size);
|
---|
690 |
|
---|
691 | // s->last_blocksize = s->blocksize;
|
---|
692 | end:
|
---|
693 | i= (get_bits_count(&s->gb)+7)/8;;
|
---|
694 | if(i > buf_size){
|
---|
695 | av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", i - buf_size);
|
---|
696 | s->bitstream_size=0;
|
---|
697 | s->bitstream_index=0;
|
---|
698 | return -1;
|
---|
699 | }
|
---|
700 |
|
---|
701 | if(s->bitstream_size){
|
---|
702 | s->bitstream_index += i;
|
---|
703 | s->bitstream_size -= i;
|
---|
704 | return input_buf_size;
|
---|
705 | }else
|
---|
706 | return i;
|
---|
707 | }
|
---|
708 |
|
---|
709 | static int flac_decode_close(AVCodecContext *avctx)
|
---|
710 | {
|
---|
711 | FLACContext *s = avctx->priv_data;
|
---|
712 | int i;
|
---|
713 |
|
---|
714 | for (i = 0; i < s->channels; i++)
|
---|
715 | {
|
---|
716 | av_freep(&s->decoded[i]);
|
---|
717 | }
|
---|
718 | av_freep(&s->bitstream);
|
---|
719 |
|
---|
720 | return 0;
|
---|
721 | }
|
---|
722 |
|
---|
723 | static void flac_flush(AVCodecContext *avctx){
|
---|
724 | FLACContext *s = avctx->priv_data;
|
---|
725 |
|
---|
726 | s->bitstream_size=
|
---|
727 | s->bitstream_index= 0;
|
---|
728 | }
|
---|
729 |
|
---|
730 | AVCodec flac_decoder = {
|
---|
731 | "flac",
|
---|
732 | CODEC_TYPE_AUDIO,
|
---|
733 | CODEC_ID_FLAC,
|
---|
734 | sizeof(FLACContext),
|
---|
735 | flac_decode_init,
|
---|
736 | NULL,
|
---|
737 | flac_decode_close,
|
---|
738 | flac_decode_frame,
|
---|
739 | .flush= flac_flush,
|
---|
740 | };
|
---|