@ -41,6 +41,7 @@
# include "mpegvideo.h"
# include "vp3data.h"
# include "xiph.h"
# define FRAGMENT_PIXELS 8
@ -2574,8 +2575,9 @@ static int theora_decode_init(AVCodecContext *avctx)
Vp3DecodeContext * s = avctx - > priv_data ;
GetBitContext gb ;
int ptype ;
uint8_t * p = avctx - > extradata ;
int op_bytes , i ;
uint8_t * header_start [ 3 ] ;
int header_len [ 3 ] ;
int i ;
s - > theora = 1 ;
@ -2585,12 +2587,14 @@ static int theora_decode_init(AVCodecContext *avctx)
return - 1 ;
}
for ( i = 0 ; i < 3 ; i + + ) {
op_bytes = * ( p + + ) < < 8 ;
op_bytes + = * ( p + + ) ;
if ( ff_split_xiph_headers ( avctx - > extradata , avctx - > extradata_size ,
42 , header_start , header_len ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " Corrupt extradata \n " ) ;
return - 1 ;
}
init_get_bits ( & gb , p , op_bytes ) ;
p + = op_bytes ;
for ( i = 0 ; i < 3 ; i + + ) {
init_get_bits ( & gb , header_start [ i ] , header_len [ i ] ) ;
ptype = get_bits ( & gb , 8 ) ;
debug_vp3 ( " Theora headerpacket type: %x \n " , ptype ) ;
@ -2620,8 +2624,8 @@ static int theora_decode_init(AVCodecContext *avctx)
av_log ( avctx , AV_LOG_ERROR , " Unknown Theora config packet: %d \n " , ptype & ~ 0x80 ) ;
break ;
}
if ( 8 * op_bytes ! = get_bits_count ( & gb ) )
av_log ( avctx , AV_LOG_ERROR , " %d bits left in packet %X \n " , 8 * op_bytes - get_bits_count ( & gb ) , ptype ) ;
if ( 8 * header_len [ i ] ! = get_bits_count ( & gb ) )
av_log ( avctx , AV_LOG_ERROR , " %d bits left in packet %X \n " , 8 * header_len [ i ] - get_bits_count ( & gb ) , ptype ) ;
if ( s - > theora < 0x030200 )
break ;
}