Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1529)

Side by Side Diff: patched-ffmpeg-mt/libavcodec/wavpack.c

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698