@ -113,6 +113,22 @@ static void sub_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, i
}
}
static void sub_left_prediction ( DSPContext * dsp , uint8_t * dst , const uint8_t * src , int bpp , int size )
{
const uint8_t * src1 = src + bpp ;
const uint8_t * src2 = src ;
int x , unaligned_w ;
memcpy ( dst , src , bpp ) ;
dst + = bpp ;
size - = bpp ;
unaligned_w = FFMIN ( 32 - bpp , size ) ;
for ( x = 0 ; x < unaligned_w ; x + + )
* dst + + = * src1 + + - * src2 + + ;
size - = unaligned_w ;
dsp - > diff_bytes ( dst , src1 , src2 , size ) ;
}
static void png_filter_row ( DSPContext * dsp , uint8_t * dst , int filter_type ,
uint8_t * src , uint8_t * top , int size , int bpp )
{
@ -123,8 +139,7 @@ static void png_filter_row(DSPContext *dsp, uint8_t *dst, int filter_type,
memcpy ( dst , src , size ) ;
break ;
case PNG_FILTER_VALUE_SUB :
dsp - > diff_bytes ( dst , src , src - bpp , size ) ;
memcpy ( dst , src , bpp ) ;
sub_left_prediction ( dsp , dst , src , bpp , size ) ;
break ;
case PNG_FILTER_VALUE_UP :
dsp - > diff_bytes ( dst , src , top , size ) ;