@ -1,6 +1,7 @@
/*
/*
* IFF PBM / ILBM bitmap decoder
* IFF PBM / ILBM bitmap decoder
* Copyright ( c ) 2010 Peter Ross < pross @ xvid . org >
* Copyright ( c ) 2010 Peter Ross < pross @ xvid . org >
* Copyright ( c ) 2010 Sebastian Vater < cdgs . basty @ googlemail . com >
*
*
* This file is part of FFmpeg .
* This file is part of FFmpeg .
*
*
@ -31,7 +32,7 @@
typedef struct {
typedef struct {
AVFrame frame ;
AVFrame frame ;
int planesize ;
unsigned planesize ;
uint8_t * planebuf ;
uint8_t * planebuf ;
} IffContext ;
} IffContext ;
@ -40,7 +41,7 @@ typedef struct {
*/
*/
int ff_cmap_read_palette ( AVCodecContext * avctx , uint32_t * pal )
int ff_cmap_read_palette ( AVCodecContext * avctx , uint32_t * pal )
{
{
int count , i ;
unsigned count , i ;
if ( avctx - > bits_per_coded_sample > 8 ) {
if ( avctx - > bits_per_coded_sample > 8 ) {
av_log ( avctx , AV_LOG_ERROR , " bit_per_coded_sample > 8 not supported \n " ) ;
av_log ( avctx , AV_LOG_ERROR , " bit_per_coded_sample > 8 not supported \n " ) ;
@ -71,7 +72,7 @@ static av_cold int decode_init(AVCodecContext *avctx)
return AVERROR_INVALIDDATA ;
return AVERROR_INVALIDDATA ;
}
}
s - > planesize = avctx - > width / 8 ;
s - > planesize = avctx - > width > > 3 ;
s - > planebuf = av_malloc ( s - > planesize + FF_INPUT_BUFFER_PADDING_SIZE ) ;
s - > planebuf = av_malloc ( s - > planesize + FF_INPUT_BUFFER_PADDING_SIZE ) ;
if ( ! s - > planebuf )
if ( ! s - > planebuf )
return AVERROR ( ENOMEM ) ;
return AVERROR ( ENOMEM ) ;
@ -97,12 +98,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
static void decodeplane8 ( uint8_t * dst , const uint8_t * const buf , int buf_size , int bps , int plane )
static void decodeplane8 ( uint8_t * dst , const uint8_t * const buf , int buf_size , int bps , int plane )
{
{
GetBitContext gb ;
GetBitContext gb ;
int i , b ;
unsigned int i ;
const unsigned b = ( buf_size * 8 ) + bps - 1 ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
for ( i = 0 ; i < ( buf_size * 8 + bps - 1 ) / bps ; i + + ) {
for ( i = 0 ; i < b ; i + + ) {
for ( b = 0 ; b < bps ; b + + ) {
dst [ i ] | = get_bits1 ( & gb ) < < plane ;
dst [ i * bps + b ] | = get_bits1 ( & gb ) < < plane ;
}
}
}
}
}
@ -117,12 +117,11 @@ static void decodeplane8(uint8_t *dst, const uint8_t *const buf, int buf_size, i
static void decodeplane32 ( uint32_t * dst , const uint8_t * const buf , int buf_size , int bps , int plane )
static void decodeplane32 ( uint32_t * dst , const uint8_t * const buf , int buf_size , int bps , int plane )
{
{
GetBitContext gb ;
GetBitContext gb ;
int i , b ;
unsigned i ;
const unsigned b = ( buf_size * 8 ) + bps - 1 ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
init_get_bits ( & gb , buf , buf_size * 8 ) ;
for ( i = 0 ; i < ( buf_size * 8 + bps - 1 ) / bps ; i + + ) {
for ( i = 0 ; i < b ; i + + ) {
for ( b = 0 ; b < bps ; b + + ) {
dst [ i ] | = get_bits1 ( & gb ) < < plane ;
dst [ i * bps + b ] | = get_bits1 ( & gb ) < < plane ;
}
}
}
}
}
@ -132,9 +131,9 @@ static int decode_frame_ilbm(AVCodecContext *avctx,
{
{
IffContext * s = avctx - > priv_data ;
IffContext * s = avctx - > priv_data ;
const uint8_t * buf = avpkt - > data ;
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
unsigned buf_size = avpkt - > size ;
const uint8_t * buf_end = buf + buf_size ;
const uint8_t * buf_end = buf + buf_size ;
int y , plane ;
unsigned y , plane ;
if ( avctx - > reget_buffer ( avctx , & s - > frame ) < 0 ) {
if ( avctx - > reget_buffer ( avctx , & s - > frame ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
@ -148,7 +147,7 @@ static int decode_frame_ilbm(AVCodecContext *avctx,
if ( avctx - > pix_fmt = = PIX_FMT_PAL8 ) {
if ( avctx - > pix_fmt = = PIX_FMT_PAL8 ) {
decodeplane8 ( row , buf , FFMIN ( s - > planesize , buf_end - buf ) , avctx - > bits_per_coded_sample , plane ) ;
decodeplane8 ( row , buf , FFMIN ( s - > planesize , buf_end - buf ) , avctx - > bits_per_coded_sample , plane ) ;
} else { // PIX_FMT_BGR32
} else { // PIX_FMT_BGR32
decodeplane32 ( row , buf , FFMIN ( s - > planesize , buf_end - buf ) , avctx - > bits_per_coded_sample , plane ) ;
decodeplane32 ( ( uint32_t * ) row , buf , FFMIN ( s - > planesize , buf_end - buf ) , avctx - > bits_per_coded_sample , plane ) ;
}
}
buf + = s - > planesize ;
buf + = s - > planesize ;
}
}
@ -165,9 +164,9 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
{
{
IffContext * s = avctx - > priv_data ;
IffContext * s = avctx - > priv_data ;
const uint8_t * buf = avpkt - > data ;
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
unsigned buf_size = avpkt - > size ;
const uint8_t * buf_end = buf + buf_size ;
const uint8_t * buf_end = buf + buf_size ;
int y , plane , x ;
unsigned y , plane , x ;
if ( avctx - > reget_buffer ( avctx , & s - > frame ) < 0 ) {
if ( avctx - > reget_buffer ( avctx , & s - > frame ) < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
av_log ( avctx , AV_LOG_ERROR , " get_buffer() failed \n " ) ;
@ -181,7 +180,7 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
for ( plane = 0 ; plane < avctx - > bits_per_coded_sample ; plane + + ) {
for ( plane = 0 ; plane < avctx - > bits_per_coded_sample ; plane + + ) {
for ( x = 0 ; x < s - > planesize & & buf < buf_end ; ) {
for ( x = 0 ; x < s - > planesize & & buf < buf_end ; ) {
int8_t value = * buf + + ;
int8_t value = * buf + + ;
int length ;
unsigned length ;
if ( value > = 0 ) {
if ( value > = 0 ) {
length = value + 1 ;
length = value + 1 ;
memcpy ( s - > planebuf + x , buf , FFMIN3 ( length , s - > planesize - x , buf_end - buf ) ) ;
memcpy ( s - > planebuf + x , buf , FFMIN3 ( length , s - > planesize - x , buf_end - buf ) ) ;
@ -197,13 +196,13 @@ static int decode_frame_byterun1(AVCodecContext *avctx,
if ( avctx - > pix_fmt = = PIX_FMT_PAL8 ) {
if ( avctx - > pix_fmt = = PIX_FMT_PAL8 ) {
decodeplane8 ( row , s - > planebuf , s - > planesize , avctx - > bits_per_coded_sample , plane ) ;
decodeplane8 ( row , s - > planebuf , s - > planesize , avctx - > bits_per_coded_sample , plane ) ;
} else { //PIX_FMT_BGR32
} else { //PIX_FMT_BGR32
decodeplane32 ( row , s - > planebuf , s - > planesize , avctx - > bits_per_coded_sample , plane ) ;
decodeplane32 ( ( uint32_t * ) row , s - > planebuf , s - > planesize , avctx - > bits_per_coded_sample , plane ) ;
}
}
}
}
} else {
} else {
for ( x = 0 ; x < avctx - > width & & buf < buf_end ; ) {
for ( x = 0 ; x < avctx - > width & & buf < buf_end ; ) {
int8_t value = * buf + + ;
int8_t value = * buf + + ;
int length ;
unsigned length ;
if ( value > = 0 ) {
if ( value > = 0 ) {
length = value + 1 ;
length = value + 1 ;
memcpy ( row + x , buf , FFMIN3 ( length , buf_end - buf , avctx - > width - x ) ) ;
memcpy ( row + x , buf , FFMIN3 ( length , buf_end - buf , avctx - > width - x ) ) ;