OLD | NEW |
1 /* | 1 /* |
2 * WavPack lossless audio decoder | 2 * WavPack lossless audio decoder |
3 * Copyright (c) 2006 Konstantin Shishkov | 3 * Copyright (c) 2006 Konstantin Shishkov |
4 * | 4 * |
5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
6 * | 6 * |
7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 WP_ID_HYBRID, | 60 WP_ID_HYBRID, |
61 WP_ID_SHAPING, | 61 WP_ID_SHAPING, |
62 WP_ID_FLOATINFO, | 62 WP_ID_FLOATINFO, |
63 WP_ID_INT32INFO, | 63 WP_ID_INT32INFO, |
64 WP_ID_DATA, | 64 WP_ID_DATA, |
65 WP_ID_CORR, | 65 WP_ID_CORR, |
66 WP_ID_EXTRABITS, | 66 WP_ID_EXTRABITS, |
67 WP_ID_CHANINFO | 67 WP_ID_CHANINFO |
68 }; | 68 }; |
69 | 69 |
| 70 typedef struct SavedContext { |
| 71 int offset; |
| 72 int size; |
| 73 int bits_used; |
| 74 uint32_t crc; |
| 75 } SavedContext; |
| 76 |
70 #define MAX_TERMS 16 | 77 #define MAX_TERMS 16 |
71 | 78 |
72 typedef struct Decorr { | 79 typedef struct Decorr { |
73 int delta; | 80 int delta; |
74 int value; | 81 int value; |
75 int weightA; | 82 int weightA; |
76 int weightB; | 83 int weightB; |
77 int samplesA[8]; | 84 int samplesA[8]; |
78 int samplesB[8]; | 85 int samplesB[8]; |
79 } Decorr; | 86 } Decorr; |
(...skipping 20 matching lines...) Expand all Loading... |
100 Decorr decorr[MAX_TERMS]; | 107 Decorr decorr[MAX_TERMS]; |
101 int zero, one, zeroes; | 108 int zero, one, zeroes; |
102 int extra_bits; | 109 int extra_bits; |
103 int and, or, shift; | 110 int and, or, shift; |
104 int post_shift; | 111 int post_shift; |
105 int hybrid, hybrid_bitrate; | 112 int hybrid, hybrid_bitrate; |
106 int float_flag; | 113 int float_flag; |
107 int float_shift; | 114 int float_shift; |
108 int float_max_exp; | 115 int float_max_exp; |
109 WvChannel ch[2]; | 116 WvChannel ch[2]; |
| 117 int samples_left; |
| 118 int max_samples; |
| 119 int pos; |
| 120 SavedContext sc, extra_sc; |
110 } WavpackContext; | 121 } WavpackContext; |
111 | 122 |
112 // exponent table copied from WavPack source | 123 // exponent table copied from WavPack source |
113 static const uint8_t wp_exp2_table [256] = { | 124 static const uint8_t wp_exp2_table [256] = { |
114 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08
, 0x09, 0x0a, 0x0b, | 125 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08
, 0x09, 0x0a, 0x0b, |
115 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14
, 0x15, 0x16, 0x16, | 126 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14
, 0x15, 0x16, 0x16, |
116 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20
, 0x21, 0x22, 0x23, | 127 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20
, 0x21, 0x22, 0x23, |
117 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d
, 0x2e, 0x2f, 0x30, | 128 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d
, 0x2e, 0x2f, 0x30, |
118 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a
, 0x3b, 0x3c, 0x3d, | 129 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a
, 0x3b, 0x3c, 0x3d, |
119 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48
, 0x49, 0x4a, 0x4b, | 130 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48
, 0x49, 0x4a, 0x4b, |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 } | 443 } |
433 } | 444 } |
434 } | 445 } |
435 | 446 |
436 *crc = *crc * 27 + S * 9 + exp * 3 + sign; | 447 *crc = *crc * 27 + S * 9 + exp * 3 + sign; |
437 | 448 |
438 value.u = (sign << 31) | (exp << 23) | S; | 449 value.u = (sign << 31) | (exp << 23) | S; |
439 return value.f; | 450 return value.f; |
440 } | 451 } |
441 | 452 |
| 453 static void wv_reset_saved_context(WavpackContext *s) |
| 454 { |
| 455 s->pos = 0; |
| 456 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF; |
| 457 } |
| 458 |
442 static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *d
st, const int type) | 459 static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *d
st, const int type) |
443 { | 460 { |
444 int i, j, count = 0; | 461 int i, j, count = 0; |
445 int last, t; | 462 int last, t; |
446 int A, B, L, L2, R, R2; | 463 int A, B, L, L2, R, R2; |
447 int pos = 0; | 464 int pos = s->pos; |
448 uint32_t crc = 0xFFFFFFFF; | 465 uint32_t crc = s->sc.crc; |
449 uint32_t crc_extra_bits = 0xFFFFFFFF; | 466 uint32_t crc_extra_bits = s->extra_sc.crc; |
450 int16_t *dst16 = dst; | 467 int16_t *dst16 = dst; |
451 int32_t *dst32 = dst; | 468 int32_t *dst32 = dst; |
452 float *dstfl = dst; | 469 float *dstfl = dst; |
453 | 470 |
454 s->one = s->zero = s->zeroes = 0; | 471 if(s->samples_left == s->samples) |
| 472 s->one = s->zero = s->zeroes = 0; |
455 do{ | 473 do{ |
456 L = wv_get_value(s, gb, 0, &last); | 474 L = wv_get_value(s, gb, 0, &last); |
457 if(last) break; | 475 if(last) break; |
458 R = wv_get_value(s, gb, 1, &last); | 476 R = wv_get_value(s, gb, 1, &last); |
459 if(last) break; | 477 if(last) break; |
460 for(i = 0; i < s->terms; i++){ | 478 for(i = 0; i < s->terms; i++){ |
461 t = s->decorr[i].value; | 479 t = s->decorr[i].value; |
462 if(t > 0){ | 480 if(t > 0){ |
463 if(t > 8){ | 481 if(t > 8){ |
464 if(t & 1){ | 482 if(t & 1){ |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
532 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L); | 550 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L); |
533 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R); | 551 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R); |
534 } else if(type == SAMPLE_FMT_S32){ | 552 } else if(type == SAMPLE_FMT_S32){ |
535 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L); | 553 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L); |
536 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R); | 554 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R); |
537 } else { | 555 } else { |
538 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L); | 556 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L); |
539 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R); | 557 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R); |
540 } | 558 } |
541 count++; | 559 count++; |
542 }while(!last && count < s->samples); | 560 }while(!last && count < s->max_samples); |
543 | 561 |
544 if(crc != s->CRC){ | 562 s->samples_left -= count; |
545 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); | 563 if(!s->samples_left){ |
546 return -1; | 564 if(crc != s->CRC){ |
547 } | 565 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); |
548 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ | 566 return -1; |
549 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); | 567 } |
550 return -1; | 568 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ |
| 569 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); |
| 570 return -1; |
| 571 } |
| 572 wv_reset_saved_context(s); |
| 573 }else{ |
| 574 s->pos = pos; |
| 575 s->sc.crc = crc; |
| 576 s->sc.bits_used = get_bits_count(&s->gb); |
| 577 if(s->got_extra_bits){ |
| 578 s->extra_sc.crc = crc_extra_bits; |
| 579 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits); |
| 580 } |
551 } | 581 } |
552 return count * 2; | 582 return count * 2; |
553 } | 583 } |
554 | 584 |
555 static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst
, const int type) | 585 static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst
, const int type) |
556 { | 586 { |
557 int i, j, count = 0; | 587 int i, j, count = 0; |
558 int last, t; | 588 int last, t; |
559 int A, S, T; | 589 int A, S, T; |
560 int pos = 0; | 590 int pos = s->pos; |
561 uint32_t crc = 0xFFFFFFFF; | 591 uint32_t crc = s->sc.crc; |
562 uint32_t crc_extra_bits = 0xFFFFFFFF; | 592 uint32_t crc_extra_bits = s->extra_sc.crc; |
563 int16_t *dst16 = dst; | 593 int16_t *dst16 = dst; |
564 int32_t *dst32 = dst; | 594 int32_t *dst32 = dst; |
565 float *dstfl = dst; | 595 float *dstfl = dst; |
566 | 596 |
567 s->one = s->zero = s->zeroes = 0; | 597 if(s->samples_left == s->samples) |
| 598 s->one = s->zero = s->zeroes = 0; |
568 do{ | 599 do{ |
569 T = wv_get_value(s, gb, 0, &last); | 600 T = wv_get_value(s, gb, 0, &last); |
570 S = 0; | 601 S = 0; |
571 if(last) break; | 602 if(last) break; |
572 for(i = 0; i < s->terms; i++){ | 603 for(i = 0; i < s->terms; i++){ |
573 t = s->decorr[i].value; | 604 t = s->decorr[i].value; |
574 if(t > 8){ | 605 if(t > 8){ |
575 if(t & 1) | 606 if(t & 1) |
576 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]; | 607 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]; |
577 else | 608 else |
(...skipping 16 matching lines...) Expand all Loading... |
594 | 625 |
595 if(type == SAMPLE_FMT_FLT) | 626 if(type == SAMPLE_FMT_FLT) |
596 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S); | 627 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S); |
597 else if(type == SAMPLE_FMT_S32) | 628 else if(type == SAMPLE_FMT_S32) |
598 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S); | 629 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S); |
599 else | 630 else |
600 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S); | 631 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S); |
601 count++; | 632 count++; |
602 }while(!last && count < s->samples); | 633 }while(!last && count < s->samples); |
603 | 634 |
604 if(crc != s->CRC){ | 635 s->samples_left -= count; |
605 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); | 636 if(!s->samples_left){ |
606 return -1; | 637 if(crc != s->CRC){ |
607 } | 638 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); |
608 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ | 639 return -1; |
609 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); | 640 } |
610 return -1; | 641 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ |
| 642 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); |
| 643 return -1; |
| 644 } |
| 645 wv_reset_saved_context(s); |
| 646 }else{ |
| 647 s->pos = pos; |
| 648 s->sc.crc = crc; |
| 649 s->sc.bits_used = get_bits_count(&s->gb); |
| 650 if(s->got_extra_bits){ |
| 651 s->extra_sc.crc = crc_extra_bits; |
| 652 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits); |
| 653 } |
611 } | 654 } |
612 return count; | 655 return count; |
613 } | 656 } |
614 | 657 |
615 static av_cold int wavpack_decode_init(AVCodecContext *avctx) | 658 static av_cold int wavpack_decode_init(AVCodecContext *avctx) |
616 { | 659 { |
617 WavpackContext *s = avctx->priv_data; | 660 WavpackContext *s = avctx->priv_data; |
618 | 661 |
619 s->avctx = avctx; | 662 s->avctx = avctx; |
620 s->stereo = (avctx->channels == 2); | 663 s->stereo = (avctx->channels == 2); |
621 if(avctx->bits_per_coded_sample <= 16) | 664 if(avctx->bits_per_coded_sample <= 16) |
622 avctx->sample_fmt = SAMPLE_FMT_S16; | 665 avctx->sample_fmt = SAMPLE_FMT_S16; |
623 else | 666 else |
624 avctx->sample_fmt = SAMPLE_FMT_S32; | 667 avctx->sample_fmt = SAMPLE_FMT_S32; |
625 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_
MONO; | 668 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_
MONO; |
626 | 669 |
| 670 wv_reset_saved_context(s); |
| 671 |
627 return 0; | 672 return 0; |
628 } | 673 } |
629 | 674 |
630 static int wavpack_decode_frame(AVCodecContext *avctx, | 675 static int wavpack_decode_frame(AVCodecContext *avctx, |
631 void *data, int *data_size, | 676 void *data, int *data_size, |
632 AVPacket *avpkt) | 677 AVPacket *avpkt) |
633 { | 678 { |
634 const uint8_t *buf = avpkt->data; | 679 const uint8_t *buf = avpkt->data; |
635 int buf_size = avpkt->size; | 680 int buf_size = avpkt->size; |
636 WavpackContext *s = avctx->priv_data; | 681 WavpackContext *s = avctx->priv_data; |
637 void *samples = data; | 682 void *samples = data; |
638 int samplecount; | 683 int samplecount; |
639 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs
= 0, got_float = 0; | 684 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs
= 0, got_float = 0; |
640 int got_hybrid = 0; | 685 int got_hybrid = 0; |
641 const uint8_t* buf_end = buf + buf_size; | 686 const uint8_t* buf_end = buf + buf_size; |
642 int i, j, id, size, ssize, weights, t; | 687 int i, j, id, size, ssize, weights, t; |
643 int bpp; | 688 int bpp; |
644 | 689 |
645 if (buf_size == 0){ | 690 if (buf_size == 0){ |
646 *data_size = 0; | 691 *data_size = 0; |
647 return 0; | 692 return 0; |
648 } | 693 } |
649 | 694 |
650 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); | 695 if(!s->samples_left){ |
651 memset(s->ch, 0, sizeof(s->ch)); | 696 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); |
652 s->extra_bits = 0; | 697 memset(s->ch, 0, sizeof(s->ch)); |
653 s->and = s->or = s->shift = 0; | 698 s->extra_bits = 0; |
654 s->got_extra_bits = 0; | 699 s->and = s->or = s->shift = 0; |
| 700 s->got_extra_bits = 0; |
| 701 } |
655 | 702 |
656 s->samples = AV_RL32(buf); buf += 4; | 703 s->samples = AV_RL32(buf); buf += 4; |
657 if(!s->samples){ | 704 if(!s->samples){ |
658 *data_size = 0; | 705 *data_size = 0; |
659 return buf_size; | 706 return buf_size; |
660 } | 707 } |
661 s->frame_flags = AV_RL32(buf); buf += 4; | 708 s->frame_flags = AV_RL32(buf); buf += 4; |
662 if(s->frame_flags&0x80){ | 709 if(s->frame_flags&0x80){ |
663 bpp = sizeof(float); | 710 bpp = sizeof(float); |
664 avctx->sample_fmt = SAMPLE_FMT_FLT; | 711 avctx->sample_fmt = SAMPLE_FMT_FLT; |
665 } else if((s->frame_flags&0x03) <= 1){ | 712 } else if((s->frame_flags&0x03) <= 1){ |
666 bpp = 2; | 713 bpp = 2; |
667 avctx->sample_fmt = SAMPLE_FMT_S16; | 714 avctx->sample_fmt = SAMPLE_FMT_S16; |
668 } else { | 715 } else { |
669 bpp = 4; | 716 bpp = 4; |
670 avctx->sample_fmt = SAMPLE_FMT_S32; | 717 avctx->sample_fmt = SAMPLE_FMT_S32; |
671 } | 718 } |
672 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; | 719 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; |
673 s->joint = s->frame_flags & WV_JOINT_STEREO; | 720 s->joint = s->frame_flags & WV_JOINT_STEREO; |
674 s->hybrid = s->frame_flags & WV_HYBRID_MODE; | 721 s->hybrid = s->frame_flags & WV_HYBRID_MODE; |
675 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; | 722 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE; |
676 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13)
& 0x1f); | 723 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13)
& 0x1f); |
677 s->CRC = AV_RL32(buf); buf += 4; | 724 s->CRC = AV_RL32(buf); buf += 4; |
678 | 725 |
679 /* should not happen but who knows */ | 726 s->max_samples = *data_size / (bpp * avctx->channels); |
680 if(s->samples * bpp * avctx->channels > *data_size){ | 727 s->max_samples = FFMIN(s->max_samples, s->samples); |
681 av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lav
c!\n"); | 728 if(s->samples_left > 0){ |
682 return -1; | 729 s->max_samples = FFMIN(s->max_samples, s->samples_left); |
| 730 buf = buf_end; |
683 } | 731 } |
684 | 732 |
685 // parse metadata blocks | 733 // parse metadata blocks |
686 while(buf < buf_end){ | 734 while(buf < buf_end){ |
687 id = *buf++; | 735 id = *buf++; |
688 size = *buf++; | 736 size = *buf++; |
689 if(id & WP_IDF_LONG) { | 737 if(id & WP_IDF_LONG) { |
690 size |= (*buf++) << 8; | 738 size |= (*buf++) << 8; |
691 size |= (*buf++) << 16; | 739 size |= (*buf++) << 16; |
692 } | 740 } |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
840 buf += ssize; | 888 buf += ssize; |
841 continue; | 889 continue; |
842 } | 890 } |
843 s->float_flag = buf[0]; | 891 s->float_flag = buf[0]; |
844 s->float_shift = buf[1]; | 892 s->float_shift = buf[1]; |
845 s->float_max_exp = buf[2]; | 893 s->float_max_exp = buf[2]; |
846 buf += 4; | 894 buf += 4; |
847 got_float = 1; | 895 got_float = 1; |
848 break; | 896 break; |
849 case WP_ID_DATA: | 897 case WP_ID_DATA: |
| 898 s->sc.offset = buf - avpkt->data; |
| 899 s->sc.size = size * 8; |
850 init_get_bits(&s->gb, buf, size * 8); | 900 init_get_bits(&s->gb, buf, size * 8); |
851 s->data_size = size * 8; | 901 s->data_size = size * 8; |
852 buf += size; | 902 buf += size; |
853 got_bs = 1; | 903 got_bs = 1; |
854 break; | 904 break; |
855 case WP_ID_EXTRABITS: | 905 case WP_ID_EXTRABITS: |
856 if(size <= 4){ | 906 if(size <= 4){ |
857 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", si
ze); | 907 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", si
ze); |
858 buf += size; | 908 buf += size; |
859 continue; | 909 continue; |
860 } | 910 } |
| 911 s->extra_sc.offset = buf - avpkt->data; |
| 912 s->extra_sc.size = size * 8; |
861 init_get_bits(&s->gb_extra_bits, buf, size * 8); | 913 init_get_bits(&s->gb_extra_bits, buf, size * 8); |
862 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32); | 914 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32); |
863 buf += size; | 915 buf += size; |
864 s->got_extra_bits = 1; | 916 s->got_extra_bits = 1; |
865 break; | 917 break; |
866 default: | 918 default: |
867 buf += size; | 919 buf += size; |
868 } | 920 } |
869 if(id & WP_IDF_ODD) buf++; | 921 if(id & WP_IDF_ODD) buf++; |
870 } | 922 } |
871 if(!got_terms){ | 923 if(!s->samples_left){ |
872 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n"); | 924 if(!got_terms){ |
873 return -1; | 925 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n"); |
874 } | 926 return -1; |
875 if(!got_weights){ | 927 } |
876 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n"); | 928 if(!got_weights){ |
877 return -1; | 929 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n")
; |
878 } | 930 return -1; |
879 if(!got_samples){ | 931 } |
880 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n"); | 932 if(!got_samples){ |
881 return -1; | 933 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n")
; |
882 } | 934 return -1; |
883 if(!got_entropy){ | 935 } |
884 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n"); | 936 if(!got_entropy){ |
885 return -1; | 937 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n"); |
886 } | 938 return -1; |
887 if(s->hybrid && !got_hybrid){ | 939 } |
888 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n"); | 940 if(s->hybrid && !got_hybrid){ |
889 return -1; | 941 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n"); |
890 } | 942 return -1; |
891 if(!got_bs){ | 943 } |
892 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n"); | 944 if(!got_bs){ |
893 return -1; | 945 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n"); |
894 } | 946 return -1; |
895 if(!got_float && avctx->sample_fmt == SAMPLE_FMT_FLT){ | 947 } |
896 av_log(avctx, AV_LOG_ERROR, "Float information not found\n"); | 948 if(!got_float && avctx->sample_fmt == SAMPLE_FMT_FLT){ |
897 return -1; | 949 av_log(avctx, AV_LOG_ERROR, "Float information not found\n"); |
898 } | 950 return -1; |
899 if(s->got_extra_bits && avctx->sample_fmt != SAMPLE_FMT_FLT){ | 951 } |
900 const int size = get_bits_left(&s->gb_extra_bits); | 952 if(s->got_extra_bits && avctx->sample_fmt != SAMPLE_FMT_FLT){ |
901 const int wanted = s->samples * s->extra_bits << s->stereo_in; | 953 const int size = get_bits_left(&s->gb_extra_bits); |
902 if(size < wanted){ | 954 const int wanted = s->samples * s->extra_bits << s->stereo_in; |
903 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n"); | 955 if(size < wanted){ |
904 s->got_extra_bits = 0; | 956 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n"); |
| 957 s->got_extra_bits = 0; |
| 958 } |
| 959 } |
| 960 s->samples_left = s->samples; |
| 961 }else{ |
| 962 init_get_bits(&s->gb, avpkt->data + s->sc.offset, s->sc.size); |
| 963 skip_bits_long(&s->gb, s->sc.bits_used); |
| 964 if(s->got_extra_bits){ |
| 965 init_get_bits(&s->gb_extra_bits, avpkt->data + s->extra_sc.offset, |
| 966 s->extra_sc.size); |
| 967 skip_bits_long(&s->gb_extra_bits, s->extra_sc.bits_used); |
905 } | 968 } |
906 } | 969 } |
907 | 970 |
908 if(s->stereo_in){ | 971 if(s->stereo_in){ |
909 if(avctx->sample_fmt == SAMPLE_FMT_S16) | 972 if(avctx->sample_fmt == SAMPLE_FMT_S16) |
910 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S16); | 973 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S16); |
911 else if(avctx->sample_fmt == SAMPLE_FMT_S32) | 974 else if(avctx->sample_fmt == SAMPLE_FMT_S32) |
912 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S32); | 975 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_S32); |
913 else | 976 else |
914 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_FLT); | 977 samplecount = wv_unpack_stereo(s, &s->gb, samples, SAMPLE_FMT_FLT); |
(...skipping 30 matching lines...) Expand all Loading... |
945 int cnt = samplecount; | 1008 int cnt = samplecount; |
946 while(cnt--){ | 1009 while(cnt--){ |
947 *--dst = *--src; | 1010 *--dst = *--src; |
948 *--dst = *src; | 1011 *--dst = *src; |
949 } | 1012 } |
950 samplecount *= 2; | 1013 samplecount *= 2; |
951 } | 1014 } |
952 } | 1015 } |
953 *data_size = samplecount * bpp; | 1016 *data_size = samplecount * bpp; |
954 | 1017 |
955 return buf_size; | 1018 return s->samples_left > 0 ? 0 : buf_size; |
956 } | 1019 } |
957 | 1020 |
958 AVCodec wavpack_decoder = { | 1021 AVCodec wavpack_decoder = { |
959 "wavpack", | 1022 "wavpack", |
960 CODEC_TYPE_AUDIO, | 1023 CODEC_TYPE_AUDIO, |
961 CODEC_ID_WAVPACK, | 1024 CODEC_ID_WAVPACK, |
962 sizeof(WavpackContext), | 1025 sizeof(WavpackContext), |
963 wavpack_decode_init, | 1026 wavpack_decode_init, |
964 NULL, | 1027 NULL, |
965 NULL, | 1028 NULL, |
966 wavpack_decode_frame, | 1029 wavpack_decode_frame, |
967 .capabilities = CODEC_CAP_SUBFRAMES, | 1030 .capabilities = CODEC_CAP_SUBFRAMES, |
968 .long_name = NULL_IF_CONFIG_SMALL("WavPack"), | 1031 .long_name = NULL_IF_CONFIG_SMALL("WavPack"), |
969 }; | 1032 }; |
OLD | NEW |