@ -470,6 +470,44 @@ static int tiff_unpack_zlib(TiffContext *s, uint8_t *dst, int stride,
}
# endif
static int tiff_unpack_fax ( TiffContext * s , uint8_t * dst , int stride ,
const uint8_t * src , int size , int width , int lines )
{
int i , ret = 0 ;
int line ;
uint8_t * src2 = av_malloc ( ( unsigned ) size +
FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( ! src2 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" Error allocating temporary buffer \n " ) ;
return AVERROR ( ENOMEM ) ;
}
if ( s - > fax_opts & 2 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" Uncompressed fax mode is not supported (yet) \n " ) ;
av_free ( src2 ) ;
return AVERROR_INVALIDDATA ;
}
if ( ! s - > fill_order ) {
memcpy ( src2 , src , size ) ;
} else {
for ( i = 0 ; i < size ; i + + )
src2 [ i ] = ff_reverse [ src [ i ] ] ;
}
memset ( src2 + size , 0 , FF_INPUT_BUFFER_PADDING_SIZE ) ;
ret = ff_ccitt_unpack ( s - > avctx , src2 , size , dst , lines , stride ,
s - > compr , s - > fax_opts ) ;
if ( s - > bpp < 8 & & s - > avctx - > pix_fmt = = AV_PIX_FMT_PAL8 )
for ( line = 0 ; line < lines ; line + + ) {
horizontal_fill ( s - > bpp , dst , 1 , dst , 0 , width , 0 ) ;
dst + = stride ;
}
av_free ( src2 ) ;
return ret ;
}
static int tiff_unpack_strip ( TiffContext * s , uint8_t * dst , int stride ,
const uint8_t * src , int size , int lines )
{
@ -510,43 +548,7 @@ static int tiff_unpack_strip(TiffContext *s, uint8_t *dst, int stride,
if ( s - > compr = = TIFF_CCITT_RLE | |
s - > compr = = TIFF_G3 | |
s - > compr = = TIFF_G4 ) {
int i , ret = 0 ;
uint8_t * src2 = av_malloc ( ( unsigned ) size +
FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( ! src2 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" Error allocating temporary buffer \n " ) ;
return AVERROR ( ENOMEM ) ;
}
if ( s - > fax_opts & 2 ) {
av_log ( s - > avctx , AV_LOG_ERROR ,
" Uncompressed fax mode is not supported (yet) \n " ) ;
av_free ( src2 ) ;
return AVERROR_INVALIDDATA ;
}
if ( ! s - > fill_order ) {
memcpy ( src2 , src , size ) ;
} else {
for ( i = 0 ; i < size ; i + + )
src2 [ i ] = ff_reverse [ src [ i ] ] ;
}
memset ( src2 + size , 0 , FF_INPUT_BUFFER_PADDING_SIZE ) ;
switch ( s - > compr ) {
case TIFF_CCITT_RLE :
case TIFF_G3 :
case TIFF_G4 :
ret = ff_ccitt_unpack ( s - > avctx , src2 , size , dst , lines , stride ,
s - > compr , s - > fax_opts ) ;
break ;
}
if ( s - > bpp < 8 & & s - > avctx - > pix_fmt = = AV_PIX_FMT_PAL8 )
for ( line = 0 ; line < lines ; line + + ) {
horizontal_fill ( s - > bpp , dst , 1 , dst , 0 , width , 0 ) ;
dst + = stride ;
}
av_free ( src2 ) ;
return ret ;
return tiff_unpack_fax ( s , dst , stride , src , size , width , lines ) ;
}
for ( line = 0 ; line < lines ; line + + ) {
if ( src - ssrc > size ) {