diff options
Diffstat (limited to 'apps/codecs/libffmpegFLAC/decoder.c')
-rw-r--r-- | apps/codecs/libffmpegFLAC/decoder.c | 80 |
1 files changed, 18 insertions, 62 deletions
diff --git a/apps/codecs/libffmpegFLAC/decoder.c b/apps/codecs/libffmpegFLAC/decoder.c index 1fafec17fb..2dbedf3110 100644 --- a/apps/codecs/libffmpegFLAC/decoder.c +++ b/apps/codecs/libffmpegFLAC/decoder.c | |||
@@ -381,17 +381,13 @@ static inline int decode_subframe(FLACContext *s, int channel, int32_t* decoded) | |||
381 | } | 381 | } |
382 | 382 | ||
383 | static int decode_frame(FLACContext *s, | 383 | static int decode_frame(FLACContext *s, |
384 | int32_t* decoded0, | ||
385 | int32_t* decoded1, | ||
386 | void (*yield)(void)) ICODE_ATTR_FLAC; | 384 | void (*yield)(void)) ICODE_ATTR_FLAC; |
387 | static int decode_frame(FLACContext *s, | 385 | static int decode_frame(FLACContext *s, |
388 | int32_t* decoded0, | ||
389 | int32_t* decoded1, | ||
390 | void (*yield)(void)) | 386 | void (*yield)(void)) |
391 | { | 387 | { |
392 | int blocksize_code, sample_rate_code, sample_size_code, assignment, crc8; | 388 | int blocksize_code, sample_rate_code, sample_size_code, assignment, crc8; |
393 | int decorrelation, bps, blocksize, samplerate; | 389 | int decorrelation, bps, blocksize, samplerate; |
394 | int res; | 390 | int res, ch; |
395 | 391 | ||
396 | blocksize_code = get_bits(&s->gb, 4); | 392 | blocksize_code = get_bits(&s->gb, 4); |
397 | 393 | ||
@@ -477,16 +473,10 @@ static int decode_frame(FLACContext *s, | |||
477 | s->bps = bps; | 473 | s->bps = bps; |
478 | s->decorrelation= decorrelation; | 474 | s->decorrelation= decorrelation; |
479 | 475 | ||
480 | yield(); | 476 | for (ch=0; ch<s->channels; ++ch) { |
481 | /* subframes */ | 477 | yield(); |
482 | if ((res=decode_subframe(s, 0, decoded0)) < 0) | 478 | if ((res=decode_subframe(s, ch, s->decoded[ch])) < 0) |
483 | return res-100; | 479 | return res-100; |
484 | |||
485 | yield(); | ||
486 | |||
487 | if (s->channels==2) { | ||
488 | if ((res=decode_subframe(s, 1, decoded1)) < 0) | ||
489 | return res-200; | ||
490 | } | 480 | } |
491 | 481 | ||
492 | yield(); | 482 | yield(); |
@@ -499,8 +489,6 @@ static int decode_frame(FLACContext *s, | |||
499 | } | 489 | } |
500 | 490 | ||
501 | int flac_decode_frame(FLACContext *s, | 491 | int flac_decode_frame(FLACContext *s, |
502 | int32_t* decoded0, | ||
503 | int32_t* decoded1, | ||
504 | uint8_t *buf, int buf_size, | 492 | uint8_t *buf, int buf_size, |
505 | void (*yield)(void)) | 493 | void (*yield)(void)) |
506 | { | 494 | { |
@@ -516,68 +504,36 @@ int flac_decode_frame(FLACContext *s, | |||
516 | return -41; | 504 | return -41; |
517 | } | 505 | } |
518 | 506 | ||
519 | if ((framesize=decode_frame(s,decoded0,decoded1,yield)) < 0){ | 507 | if ((framesize=decode_frame(s,yield)) < 0){ |
520 | s->bitstream_size=0; | 508 | s->bitstream_size=0; |
521 | s->bitstream_index=0; | 509 | s->bitstream_index=0; |
522 | return framesize; | 510 | return framesize; |
523 | } | 511 | } |
524 | 512 | ||
525 | yield(); | 513 | yield(); |
514 | |||
515 | #define DECORRELATE(left, right)\ | ||
516 | for (i = 0; i < s->blocksize; i++) {\ | ||
517 | int a = s->decoded[0][i];\ | ||
518 | int b = s->decoded[1][i];\ | ||
519 | s->decoded[0][i] = (left) << scale;\ | ||
520 | s->decoded[1][i] = (right) << scale;\ | ||
521 | }\ | ||
526 | 522 | ||
527 | scale=FLAC_OUTPUT_DEPTH-s->bps; | 523 | scale=FLAC_OUTPUT_DEPTH-s->bps; |
528 | switch(s->decorrelation) | 524 | switch(s->decorrelation) |
529 | { | 525 | { |
530 | case INDEPENDENT: | 526 | case INDEPENDENT: |
531 | if (s->channels==1) {; | 527 | DECORRELATE(a, b) /* Always decorrelate exactly the two supported channels. */ |
532 | for (i = 0; i < s->blocksize; i++) | ||
533 | { | ||
534 | decoded0[i] = decoded0[i] << scale; | ||
535 | } | ||
536 | } else { | ||
537 | for (i = 0; i < s->blocksize; i++) | ||
538 | { | ||
539 | decoded0[i] = decoded0[i] << scale; | ||
540 | decoded1[i] = decoded1[i] << scale; | ||
541 | } | ||
542 | } | ||
543 | break; | 528 | break; |
544 | case LEFT_SIDE: | 529 | case LEFT_SIDE: |
545 | //assert(s->channels == 2); | 530 | DECORRELATE(a, a-b) |
546 | for (i = 0; i < s->blocksize; i++) | ||
547 | { | ||
548 | decoded1[i] = (decoded0[i] - decoded1[i]) << scale; | ||
549 | decoded0[i] = decoded0[i] << scale; | ||
550 | } | ||
551 | break; | 531 | break; |
552 | case RIGHT_SIDE: | 532 | case RIGHT_SIDE: |
553 | //assert(s->channels == 2); | 533 | DECORRELATE(a+b, a) |
554 | for (i = 0; i < s->blocksize; i++) | ||
555 | { | ||
556 | decoded0[i] = (decoded0[i] + decoded1[i]) << scale; | ||
557 | decoded1[i] = decoded1[i] << scale; | ||
558 | } | ||
559 | break; | 534 | break; |
560 | case MID_SIDE: | 535 | case MID_SIDE: |
561 | //assert(s->channels == 2); | 536 | DECORRELATE( (a-=b>>1) + b, a) |
562 | for (i = 0; i < s->blocksize; i++) | ||
563 | { | ||
564 | int mid, side; | ||
565 | mid = decoded0[i]; | ||
566 | side = decoded1[i]; | ||
567 | |||
568 | #if 1 //needs to be checked but IMHO it should be binary identical | ||
569 | mid -= side>>1; | ||
570 | decoded0[i] = (mid + side) << scale; | ||
571 | decoded1[i] = mid << scale; | ||
572 | #else | ||
573 | |||
574 | mid <<= 1; | ||
575 | if (side & 1) | ||
576 | mid++; | ||
577 | decoded0[i] = ((mid + side) >> 1) << scale; | ||
578 | decoded1[i] = ((mid - side) >> 1) << scale; | ||
579 | #endif | ||
580 | } | ||
581 | break; | 537 | break; |
582 | } | 538 | } |
583 | 539 | ||