@ -2240,62 +2240,6 @@ int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size,
return END_NOT_FOUND ;
}
static int decode_chunks ( AVCodecContext * avctx ,
AVFrame * picture , int * data_size ,
const uint8_t * buf , int buf_size ) ;
/* handle buffering and image synchronisation */
static int mpeg_decode_frame ( AVCodecContext * avctx ,
void * data , int * data_size ,
AVPacket * avpkt )
{
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
Mpeg1Context * s = avctx - > priv_data ;
AVFrame * picture = data ;
MpegEncContext * s2 = & s - > mpeg_enc_ctx ;
av_dlog ( avctx , " fill_buffer \n " ) ;
if ( buf_size = = 0 | | ( buf_size = = 4 & & AV_RB32 ( buf ) = = SEQ_END_CODE ) ) {
/* special case for last picture */
if ( s2 - > low_delay = = 0 & & s2 - > next_picture_ptr ) {
* picture = s2 - > next_picture_ptr - > f ;
s2 - > next_picture_ptr = NULL ;
* data_size = sizeof ( AVFrame ) ;
}
return buf_size ;
}
if ( s2 - > flags & CODEC_FLAG_TRUNCATED ) {
int next = ff_mpeg1_find_frame_end ( & s2 - > parse_context , buf , buf_size , NULL ) ;
if ( ff_combine_frame ( & s2 - > parse_context , next , ( const uint8_t * * ) & buf , & buf_size ) < 0 )
return buf_size ;
}
s2 - > codec_tag = avpriv_toupper4 ( avctx - > codec_tag ) ;
if ( s - > mpeg_enc_ctx_allocated = = 0 & & ( s2 - > codec_tag = = AV_RL32 ( " VCR2 " )
| | s2 - > codec_tag = = AV_RL32 ( " BW10 " )
) )
vcr2_init_sequence ( avctx ) ;
s - > slice_count = 0 ;
if ( avctx - > extradata & & ! s - > parsed_extra ) {
int ret = decode_chunks ( avctx , picture , data_size , avctx - > extradata , avctx - > extradata_size ) ;
if ( * data_size ) {
av_log ( avctx , AV_LOG_ERROR , " picture in extradata \n " ) ;
* data_size = 0 ;
}
s - > parsed_extra = 1 ;
if ( ret < 0 & & ( avctx - > err_recognition & AV_EF_EXPLODE ) )
return ret ;
}
return decode_chunks ( avctx , picture , data_size , buf , buf_size ) ;
}
static int decode_chunks ( AVCodecContext * avctx ,
AVFrame * picture , int * data_size ,
const uint8_t * buf , int buf_size )
@ -2564,6 +2508,58 @@ static int decode_chunks(AVCodecContext *avctx,
}
}
static int mpeg_decode_frame ( AVCodecContext * avctx ,
void * data , int * data_size ,
AVPacket * avpkt )
{
const uint8_t * buf = avpkt - > data ;
int buf_size = avpkt - > size ;
Mpeg1Context * s = avctx - > priv_data ;
AVFrame * picture = data ;
MpegEncContext * s2 = & s - > mpeg_enc_ctx ;
av_dlog ( avctx , " fill_buffer \n " ) ;
if ( buf_size = = 0 | | ( buf_size = = 4 & & AV_RB32 ( buf ) = = SEQ_END_CODE ) ) {
/* special case for last picture */
if ( s2 - > low_delay = = 0 & & s2 - > next_picture_ptr ) {
* picture = s2 - > next_picture_ptr - > f ;
s2 - > next_picture_ptr = NULL ;
* data_size = sizeof ( AVFrame ) ;
}
return buf_size ;
}
if ( s2 - > flags & CODEC_FLAG_TRUNCATED ) {
int next = ff_mpeg1_find_frame_end ( & s2 - > parse_context , buf , buf_size , NULL ) ;
if ( ff_combine_frame ( & s2 - > parse_context , next , ( const uint8_t * * ) & buf , & buf_size ) < 0 )
return buf_size ;
}
s2 - > codec_tag = avpriv_toupper4 ( avctx - > codec_tag ) ;
if ( s - > mpeg_enc_ctx_allocated = = 0 & & ( s2 - > codec_tag = = AV_RL32 ( " VCR2 " )
| | s2 - > codec_tag = = AV_RL32 ( " BW10 " )
) )
vcr2_init_sequence ( avctx ) ;
s - > slice_count = 0 ;
if ( avctx - > extradata & & ! s - > parsed_extra ) {
int ret = decode_chunks ( avctx , picture , data_size , avctx - > extradata , avctx - > extradata_size ) ;
if ( * data_size ) {
av_log ( avctx , AV_LOG_ERROR , " picture in extradata \n " ) ;
* data_size = 0 ;
}
s - > parsed_extra = 1 ;
if ( ret < 0 & & ( avctx - > err_recognition & AV_EF_EXPLODE ) )
return ret ;
}
return decode_chunks ( avctx , picture , data_size , buf , buf_size ) ;
}
static void flush ( AVCodecContext * avctx )
{
Mpeg1Context * s = avctx - > priv_data ;