Mercurial > libavcodec.hg
comparison wavpack.c @ 11211:dfeaae916502 libavcodec
Since WavPack chunk can contain more samples than FFmpeg is guaranteed to
hold, decode it in several iterations outputting as many samples as possible.
author | kostya |
---|---|
date | Fri, 19 Feb 2010 14:05:41 +0000 |
parents | 95f3daa991a2 |
children | 4a0b77af9d9c |
comparison
equal
deleted
inserted
replaced
11210:0c0c6c954942 | 11211:dfeaae916502 |
---|---|
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; |
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, |
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 *dst, const int type) | 459 static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *dst, 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 |
471 if(s->samples_left == s->samples) | |
454 s->one = s->zero = s->zeroes = 0; | 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); |
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 |
562 s->samples_left -= count; | |
563 if(!s->samples_left){ | |
544 if(crc != s->CRC){ | 564 if(crc != s->CRC){ |
545 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); | 565 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); |
546 return -1; | 566 return -1; |
547 } | 567 } |
548 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ | 568 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ |
549 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); | 569 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); |
550 return -1; | 570 return -1; |
551 } | 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 } | |
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 |
597 if(s->samples_left == s->samples) | |
567 s->one = s->zero = s->zeroes = 0; | 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; |
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 |
635 s->samples_left -= count; | |
636 if(!s->samples_left){ | |
604 if(crc != s->CRC){ | 637 if(crc != s->CRC){ |
605 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); | 638 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n"); |
606 return -1; | 639 return -1; |
607 } | 640 } |
608 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ | 641 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){ |
609 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); | 642 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n"); |
610 return -1; | 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) |
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; |
669 | |
670 wv_reset_saved_context(s); | |
626 | 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, |
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 |
695 if(!s->samples_left){ | |
650 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); | 696 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr)); |
651 memset(s->ch, 0, sizeof(s->ch)); | 697 memset(s->ch, 0, sizeof(s->ch)); |
652 s->extra_bits = 0; | 698 s->extra_bits = 0; |
653 s->and = s->or = s->shift = 0; | 699 s->and = s->or = s->shift = 0; |
654 s->got_extra_bits = 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; |
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 lavc!\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++; |
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; |
856 if(size <= 4){ | 906 if(size <= 4){ |
857 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size); | 907 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size); |
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 } |
923 if(!s->samples_left){ | |
871 if(!got_terms){ | 924 if(!got_terms){ |
872 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n"); | 925 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n"); |
873 return -1; | 926 return -1; |
874 } | 927 } |
875 if(!got_weights){ | 928 if(!got_weights){ |
900 const int size = get_bits_left(&s->gb_extra_bits); | 953 const int size = get_bits_left(&s->gb_extra_bits); |
901 const int wanted = s->samples * s->extra_bits << s->stereo_in; | 954 const int wanted = s->samples * s->extra_bits << s->stereo_in; |
902 if(size < wanted){ | 955 if(size < wanted){ |
903 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n"); | 956 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n"); |
904 s->got_extra_bits = 0; | 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) |
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, |