@ -40,11 +40,13 @@ static void qpeg_decode_intra(uint8_t *src, uint8_t *dst, int size,
int c0 , c1 ;
int run , copy ;
int filled = 0 ;
int rows_to_go ;
rows_to_go = height ;
height - - ;
dst = dst + height * stride ;
while ( size > 0 ) {
while ( ( size > 0 ) & & ( rows_to_go > 0 ) ) {
code = * src + + ;
size - - ;
run = copy = 0 ;
@ -85,17 +87,23 @@ static void qpeg_decode_intra(uint8_t *src, uint8_t *dst, int size,
if ( filled > = width ) {
filled = 0 ;
dst - = stride ;
rows_to_go - - ;
if ( rows_to_go < = 0 )
break ;
}
}
} else {
size - = copy ;
for ( i = 0 ; i < copy ; i + + ) {
dst [ filled + + ] = * src + + ;
if ( filled > = width ) {
filled = 0 ;
dst - = stride ;
rows_to_go - - ;
if ( rows_to_go < = 0 )
break ;
}
}
size - = copy ;
}
}
}
@ -113,17 +121,19 @@ static void qpeg_decode_inter(uint8_t *src, uint8_t *dst, int size,
int i , j ;
int code ;
int filled = 0 ;
int orig_height ;
uint8_t * blkdata ;
/* copy prev frame */
for ( i = 0 ; i < height ; i + + )
memcpy ( refdata + ( i * width ) , dst + ( i * stride ) , width ) ;
orig_height = height ;
blkdata = src - 0x86 ;
height - - ;
dst = dst + height * stride ;
while ( size > 0 ) {
while ( ( size > 0 ) & & ( height > = 0 ) ) {
code = * src + + ;
size - - ;
@ -155,11 +165,19 @@ static void qpeg_decode_inter(uint8_t *src, uint8_t *dst, int size,
val - = 16 ;
me_y = val ;
/* do motion compensation */
me_plane = refdata + ( filled + me_x ) + ( height - me_y ) * width ;
for ( j = 0 ; j < me_h ; j + + ) {
for ( i = 0 ; i < me_w ; i + + )
dst [ filled + i - ( j * stride ) ] = me_plane [ i - ( j * width ) ] ;
/* check motion vector */
if ( ( me_x + filled < 0 ) | | ( me_x + me_w + filled > width ) | |
( height - me_y - me_h < 0 ) | | ( height - me_y > orig_height ) | |
( filled + me_w > width ) | | ( height - me_h < 0 ) )
av_log ( NULL , AV_LOG_ERROR , " Bogus motion vector (%i,%i), block size %ix%i at %i,%i \n " ,
me_x , me_y , me_w , me_h , filled , height ) ;
else {
/* do motion compensation */
me_plane = refdata + ( filled + me_x ) + ( height - me_y ) * width ;
for ( j = 0 ; j < me_h ; j + + ) {
for ( i = 0 ; i < me_w ; i + + )
dst [ filled + i - ( j * stride ) ] = me_plane [ i - ( j * width ) ] ;
}
}
}
code = * src + + ;
@ -212,6 +230,8 @@ static void qpeg_decode_inter(uint8_t *src, uint8_t *dst, int size,
filled - = width ;
dst - = stride ;
height - - ;
if ( height < 0 )
break ;
}
} else {
/* zero code treated as one-pixel skip */