@ -38,6 +38,7 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
int mb_bits ;
int w = r - > s . width , h = r - > s . height ;
int mb_size ;
int rpr ;
memset ( si , 0 , sizeof ( SliceInfo ) ) ;
if ( get_bits ( gb , 3 ) )
@ -49,9 +50,14 @@ static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceIn
si - > quant = get_bits ( gb , 5 ) ;
skip_bits1 ( gb ) ;
si - > pts = get_bits ( gb , 13 ) ;
skip_bits ( gb , r - > rpr ) ;
si - > width = w ;
si - > height = h ;
rpr = get_bits ( gb , r - > rpr ) ;
if ( ! rpr ) {
si - > width = w ;
si - > height = h ;
} else {
si - > width = r - > s . avctx - > extradata [ 6 + rpr * 2 ] < < 2 ;
si - > height = r - > s . avctx - > extradata [ 7 + rpr * 2 ] < < 2 ;
}
mb_size = ( ( w + 15 ) > > 4 ) * ( ( h + 15 ) > > 4 ) ;
mb_bits = ff_rv34_get_start_offset ( gb , mb_size ) ;
si - > start = get_bits ( gb , mb_bits ) ;
@ -248,6 +254,10 @@ static av_cold int rv30_decode_init(AVCodecContext *avctx)
}
r - > rpr = ( avctx - > extradata [ 1 ] & 7 ) > > 1 ;
r - > rpr = FFMIN ( r - > rpr + 1 , 3 ) ;
if ( avctx - > extradata_size - 8 < ( r - > rpr - 1 ) * 2 ) {
av_log ( avctx , AV_LOG_ERROR , " Insufficient extradata - need at least %d bytes, got %d \n " ,
6 + r - > rpr * 2 , avctx - > extradata_size ) ;
}
r - > parse_slice_header = rv30_parse_slice_header ;
r - > decode_intra_types = rv30_decode_intra_types ;
r - > decode_mb_info = rv30_decode_mb_info ;