Mercurial > libavcodec.hg
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 } |