comparison vorbis.c @ 2716:040b965f2cd0 libavcodec

accept old extradata format
author mru
date Thu, 19 May 2005 11:45:10 +0000
parents e36446161876
children 4a5ed2d916f6
comparison
equal deleted inserted replaced
2715:e36446161876 2716:040b965f2cd0
757 757
758 static int vorbis_decode_init(AVCodecContext *avccontext) { 758 static int vorbis_decode_init(AVCodecContext *avccontext) {
759 vorbis_context *vc = avccontext->priv_data ; 759 vorbis_context *vc = avccontext->priv_data ;
760 uint8_t *headers = avccontext->extradata; 760 uint8_t *headers = avccontext->extradata;
761 int headers_len=avccontext->extradata_size; 761 int headers_len=avccontext->extradata_size;
762 uint8_t *header_start[3];
762 int header_len[3]; 763 int header_len[3];
763 GetBitContext *gb = &(vc->gb); 764 GetBitContext *gb = &(vc->gb);
764 int i, j, hdr_type; 765 int i, j, hdr_type;
765 766
766 vc->avccontext = avccontext; 767 vc->avccontext = avccontext;
767 768
768 if (!headers_len || headers[0]!=2) { 769 if (!headers_len) {
769 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); 770 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
770 return -1; 771 return -1;
771 } 772 }
772 773
773 for(j=1,i=0;i<2;++i, ++j) { 774 if(headers[0] == 0 && headers[1] == 30) {
774 header_len[i]=0; 775 for(i = 0; i < 3; i++){
775 while(j<headers_len && headers[j]==0xff) { 776 header_len[i] = *headers++ << 8;
776 header_len[i]+=0xff; 777 header_len[i] += *headers++;
777 ++j; 778 header_start[i] = headers;
778 } 779 headers += header_len[i];
779 if (j>=headers_len) { 780 }
780 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n"); 781 } else if(headers[0] == 2) {
781 return -1; 782 for(j=1,i=0;i<2;++i, ++j) {
782 } 783 header_len[i]=0;
783 header_len[i]+=headers[j]; 784 while(j<headers_len && headers[j]==0xff) {
784 } 785 header_len[i]+=0xff;
785 header_len[2]=headers_len-header_len[0]-header_len[1]-j; 786 ++j;
786 headers+=j; 787 }
787 788 if (j>=headers_len) {
788 init_get_bits(gb, headers, header_len[0]*8); 789 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
790 return -1;
791 }
792 header_len[i]+=headers[j];
793 }
794 header_len[2]=headers_len-header_len[0]-header_len[1]-j;
795 headers+=j;
796 header_start[0] = headers;
797 header_start[1] = header_start[0] + header_len[0];
798 header_start[2] = header_start[1] + header_len[1];
799 } else {
800 av_log(avccontext, AV_LOG_ERROR, "Extradata corrupt.\n");
801 return -1;
802 }
803
804 init_get_bits(gb, header_start[0], header_len[0]*8);
789 hdr_type=get_bits(gb, 8); 805 hdr_type=get_bits(gb, 8);
790 if (hdr_type!=1) { 806 if (hdr_type!=1) {
791 av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n"); 807 av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n");
792 return -1; 808 return -1;
793 } 809 }
795 av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n"); 811 av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n");
796 vorbis_free(vc); 812 vorbis_free(vc);
797 return -1; 813 return -1;
798 } 814 }
799 815
800 init_get_bits(gb, headers+header_len[0]+header_len[1], header_len[2]*8); 816 init_get_bits(gb, header_start[2], header_len[2]*8);
801 hdr_type=get_bits(gb, 8); 817 hdr_type=get_bits(gb, 8);
802 if (hdr_type!=5) { 818 if (hdr_type!=5) {
803 av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n"); 819 av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header.\n");
804 return -1; 820 return -1;
805 } 821 }