@ -190,7 +190,7 @@ static int decode_frame(AVCodecContext *avctx,
p - > key_frame = 1 ;
p - > key_frame = 1 ;
# define ADVANCE_BY_DECODED do { \
# define ADVANCE_BY_DECODED do { \
if ( decoded < 0 ) goto stop ; \
if ( decoded < 0 | | decoded > = buf_size ) goto buf_too_small ; \
buf + = decoded ; buf_size - = decoded ; \
buf + = decoded ; buf_size - = decoded ; \
} while ( 0 )
} while ( 0 )
switch ( l - > mode ) {
switch ( l - > mode ) {
@ -224,7 +224,8 @@ static int decode_frame(AVCodecContext *avctx,
decoded = loco_decode_plane ( l , p - > data [ 0 ] + p - > linesize [ 0 ] * ( avctx - > height - 1 ) + 2 , avctx - > width , avctx - > height ,
decoded = loco_decode_plane ( l , p - > data [ 0 ] + p - > linesize [ 0 ] * ( avctx - > height - 1 ) + 2 , avctx - > width , avctx - > height ,
- p - > linesize [ 0 ] , buf , buf_size , 3 ) ;
- p - > linesize [ 0 ] , buf , buf_size , 3 ) ;
break ;
break ;
case LOCO_CRGBA : case LOCO_RGBA :
case LOCO_CRGBA :
case LOCO_RGBA :
decoded = loco_decode_plane ( l , p - > data [ 0 ] + p - > linesize [ 0 ] * ( avctx - > height - 1 ) , avctx - > width , avctx - > height ,
decoded = loco_decode_plane ( l , p - > data [ 0 ] + p - > linesize [ 0 ] * ( avctx - > height - 1 ) , avctx - > width , avctx - > height ,
- p - > linesize [ 0 ] , buf , buf_size , 4 ) ;
- p - > linesize [ 0 ] , buf , buf_size , 4 ) ;
ADVANCE_BY_DECODED ;
ADVANCE_BY_DECODED ;
@ -238,12 +239,14 @@ static int decode_frame(AVCodecContext *avctx,
- p - > linesize [ 0 ] , buf , buf_size , 4 ) ;
- p - > linesize [ 0 ] , buf , buf_size , 4 ) ;
break ;
break ;
}
}
stop :
* got_frame = 1 ;
* got_frame = 1 ;
* ( AVFrame * ) data = l - > pic ;
* ( AVFrame * ) data = l - > pic ;
return buf_size < 0 ? - 1 : avpkt - > size - buf_size ;
return buf_size < 0 ? - 1 : avpkt - > size - buf_size ;
buf_too_small :
av_log ( avctx , AV_LOG_ERROR , " Input data too small. \n " ) ;
return AVERROR ( EINVAL ) ;
}
}
static av_cold int decode_init ( AVCodecContext * avctx )
static av_cold int decode_init ( AVCodecContext * avctx )