@ -46,7 +46,10 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src,
int val , count , x , start = bytestream2_tell_p ( pbc ) ;
void ( * bytestream2_put ) ( PutByteContext * , unsigned int ) ;
bytestream2_put = bytestream2_put_byte ;
if ( bpp = = 1 )
bytestream2_put = bytestream2_put_byte ;
else
bytestream2_put = bytestream2_put_be16 ;
for ( x = 0 ; x < w ; x + = count ) {
/* see if we can encode the next set of pixels with RLE */
@ -55,7 +58,7 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src,
if ( bytestream2_get_bytes_left_p ( pbc ) < bpp * 2 )
return AVERROR_INVALIDDATA ;
val = * src ;
val = bpp = = 1 ? * src : AV_RB16 ( src ) ;
bytestream2_put ( pbc , count ) ;
bytestream2_put ( pbc , val ) ;
} else {
@ -67,7 +70,7 @@ static int sgi_rle_encode(PutByteContext *pbc, const uint8_t *src,
bytestream2_put ( pbc , count + 0x80 ) ;
for ( i = 0 ; i < count ; i + + ) {
val = src [ i ] ;
val = bpp = = 1 ? src [ i ] : AV_RB16 ( src + i * bpp ) ;
bytestream2_put ( pbc , val ) ;
}
}
@ -117,7 +120,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
case AV_PIX_FMT_GRAY16LE :
put_be = ! HAVE_BIGENDIAN ;
case AV_PIX_FMT_GRAY16BE :
avctx - > coder_type = FF_CODER_TYPE_RAW ;
bytes_per_channel = 2 ;
pixmax = 0xFFFF ;
dimension = SGI_SINGLE_CHAN ;
@ -126,7 +128,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
case AV_PIX_FMT_RGB48LE :
put_be = ! HAVE_BIGENDIAN ;
case AV_PIX_FMT_RGB48BE :
avctx - > coder_type = FF_CODER_TYPE_RAW ;
bytes_per_channel = 2 ;
pixmax = 0xFFFF ;
dimension = SGI_MULTI_CHAN ;
@ -135,7 +136,6 @@ FF_ENABLE_DEPRECATION_WARNINGS
case AV_PIX_FMT_RGBA64LE :
put_be = ! HAVE_BIGENDIAN ;
case AV_PIX_FMT_RGBA64BE :
avctx - > coder_type = FF_CODER_TYPE_RAW ;
bytes_per_channel = 2 ;
pixmax = 0xFFFF ;
dimension = SGI_MULTI_CHAN ;
@ -191,19 +191,20 @@ FF_ENABLE_DEPRECATION_WARNINGS
bytestream2_skip_p ( & pbc , tablesize ) ;
/* Make an intermediate consecutive buffer. */
if ( ! ( encode_buf = av_malloc ( width ) ) )
if ( ! ( encode_buf = av_malloc ( width * bytes_per_channel ) ) )
return AVERROR ( ENOMEM ) ;
for ( z = 0 ; z < depth ; z + + ) {
in_buf = p - > data [ 0 ] + p - > linesize [ 0 ] * ( height - 1 ) + z ;
in_buf = p - > data [ 0 ] + p - > linesize [ 0 ] * ( height - 1 ) + z * bytes_per_channel ;
for ( y = 0 ; y < height ; y + + ) {
bytestream2_put_be32 ( & taboff_pcb , bytestream2_tell_p ( & pbc ) ) ;
for ( x = 0 ; x < width ; x + + )
for ( x = 0 ; x < width * bytes_per_channel ; x + = bytes_per_channel )
encode_buf [ x ] = in_buf [ depth * x ] ;
length = sgi_rle_encode ( & pbc , encode_buf , width , 1 ) ;
length = sgi_rle_encode ( & pbc , encode_buf , width ,
bytes_per_channel ) ;
if ( length < 1 ) {
av_free ( encode_buf ) ;
return - 1 ;