@ -110,6 +110,23 @@ static int h263_decode_end(AVCodecContext *avctx)
return 0 ;
return 0 ;
}
}
/**
* retunrs the number of bytes consumed for building the current frame
*/
static int get_consumed_bytes ( MpegEncContext * s , int buf_size ) {
int pos = ( get_bits_count ( & s - > gb ) + 7 ) > > 3 ;
if ( s - > divx_version > = 500 ) {
//we would have to scan through the whole buf to handle the weird reordering ...
return buf_size ;
} else {
if ( pos = = 0 ) pos = 1 ; //avoid infinite loops (i doubt thats needed but ...)
if ( pos > buf_size ) pos = buf_size ; // oops ;)
return pos ;
}
}
static int h263_decode_frame ( AVCodecContext * avctx ,
static int h263_decode_frame ( AVCodecContext * avctx ,
void * data , int * data_size ,
void * data , int * data_size ,
UINT8 * buf , int buf_size )
UINT8 * buf , int buf_size )
@ -179,20 +196,20 @@ uint64_t time= rdtsc();
return - 1 ;
return - 1 ;
}
}
if ( ret = = FRAME_SKIPED ) return buf_size ;
if ( ret = = FRAME_SKIPED ) return get_consumed_bytes ( s , buf_size ) ;
/* skip if the header was thrashed */
/* skip if the header was thrashed */
if ( ret < 0 ) {
if ( ret < 0 ) {
fprintf ( stderr , " header damaged \n " ) ;
fprintf ( stderr , " header damaged \n " ) ;
return - 1 ;
return - 1 ;
}
}
/* skip b frames if we dont have reference frames */
/* skip b frames if we dont have reference frames */
if ( s - > num_available_buffers < 2 & & s - > pict_type = = B_TYPE ) return buf_size ;
if ( s - > num_available_buffers < 2 & & s - > pict_type = = B_TYPE ) return get_consumed_bytes ( s , buf_size ) ;
/* skip b frames if we are in a hurry */
/* skip b frames if we are in a hurry */
if ( s - > hurry_up & & s - > pict_type = = B_TYPE ) return buf_size ;
if ( s - > hurry_up & & s - > pict_type = = B_TYPE ) return get_consumed_bytes ( s , buf_size ) ;
if ( s - > next_p_frame_damaged ) {
if ( s - > next_p_frame_damaged ) {
if ( s - > pict_type = = B_TYPE )
if ( s - > pict_type = = B_TYPE )
return buf_size ;
return get_consumed_bytes ( s , buf_size ) ;
else
else
s - > next_p_frame_damaged = 0 ;
s - > next_p_frame_damaged = 0 ;
}
}
@ -354,14 +371,14 @@ uint64_t time= rdtsc();
if ( msmpeg4_decode_ext_header ( s , buf_size ) < 0 ) return - 1 ;
if ( msmpeg4_decode_ext_header ( s , buf_size ) < 0 ) return - 1 ;
/* divx 5.01+ bistream reorder stuff */
/* divx 5.01+ bistream reorder stuff */
if ( s - > codec_id = = CODEC_ID_MPEG4 & & s - > bitstream_buffer_size = = 0 ) {
if ( s - > codec_id = = CODEC_ID_MPEG4 & & s - > bitstream_buffer_size = = 0 & & s - > divx_version > = 500 ) {
int current_pos = get_bits_count ( & s - > gb ) > > 3 ;
int current_pos = get_bits_count ( & s - > gb ) > > 3 ;
if ( buf_size - current_pos > 5
if ( buf_size - current_pos > 5
& & buf_size - current_pos < BITSTREAM_BUFFER_SIZE ) {
& & buf_size - current_pos < BITSTREAM_BUFFER_SIZE ) {
int i ;
int i ;
int startcode_found = 0 ;
int startcode_found = 0 ;
for ( i = current_pos ; i < buf_size ; i + + ) {
for ( i = current_pos ; i < buf_size - 3 ; i + + ) {
if ( buf [ i ] = = 0 & & buf [ i + 1 ] = = 0 & & buf [ i + 2 ] = = 1 & & buf [ i + 3 ] = = 0xB6 ) {
if ( buf [ i ] = = 0 & & buf [ i + 1 ] = = 0 & & buf [ i + 2 ] = = 1 & & buf [ i + 3 ] = = 0xB6 ) {
startcode_found = 1 ;
startcode_found = 1 ;
break ;
break ;
@ -454,7 +471,7 @@ uint64_t time= rdtsc();
# ifdef PRINT_FRAME_TIME
# ifdef PRINT_FRAME_TIME
printf ( " %Ld \n " , rdtsc ( ) - time ) ;
printf ( " %Ld \n " , rdtsc ( ) - time ) ;
# endif
# endif
return buf_size ;
return get_consumed_bytes ( s , buf_size ) ;
}
}
AVCodec mpeg4_decoder = {
AVCodec mpeg4_decoder = {