@ -43,6 +43,7 @@
# include "decode.h"
# include "hwconfig.h"
# include "internal.h"
# include "packet_internal.h"
# include "thread.h"
typedef struct FramePool {
@ -142,15 +143,24 @@ fail2:
return 0 ;
}
static int extract_packet_props ( AVCodecInternal * avci , const AVPacket * pkt )
# define IS_EMPTY(pkt) (!(pkt)->data)
static int extract_packet_props ( AVCodecInternal * avci , AVPacket * pkt )
{
int ret = 0 ;
av_packet_unref ( avci - > last_pkt_props ) ;
if ( pkt ) {
ret = av_packet_copy_props ( avci - > last_pkt_props , pkt ) ;
if ( ! ret )
avci - > last_pkt_props - > size = pkt - > size ; // HACK: Needed for ff_decode_frame_props().
ret = avpriv_packet_list_put ( & avci - > pkt_props , & avci - > pkt_props_tail , pkt ,
av_packet_copy_props , 0 ) ;
if ( ret < 0 )
return ret ;
avci - > pkt_props_tail - > pkt . size = pkt - > size ; // HACK: Needed for ff_decode_frame_props().
avci - > pkt_props_tail - > pkt . data = ( void * ) 1 ; // HACK: Needed for IS_EMPTY().
if ( IS_EMPTY ( avci - > last_pkt_props ) ) {
ret = avpriv_packet_list_get ( & avci - > pkt_props ,
& avci - > pkt_props_tail ,
avci - > last_pkt_props ) ;
av_assert0 ( ret ! = AVERROR ( EAGAIN ) ) ;
}
return ret ;
}
@ -512,6 +522,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if ( ret > = pkt - > size | | ret < 0 ) {
av_packet_unref ( pkt ) ;
av_packet_unref ( avci - > last_pkt_props ) ;
} else {
int consumed = ret ;
@ -550,9 +561,11 @@ static int decode_receive_frame_internal(AVCodecContext *avctx, AVFrame *frame)
av_assert0 ( ! frame - > buf [ 0 ] ) ;
if ( avctx - > codec - > receive_frame )
if ( avctx - > codec - > receive_frame ) {
ret = avctx - > codec - > receive_frame ( avctx , frame ) ;
else
if ( ret ! = AVERROR ( EAGAIN ) )
av_packet_unref ( avci - > last_pkt_props ) ;
} else
ret = decode_simple_receive_frame ( avctx , frame ) ;
if ( ret = = AVERROR_EOF )
@ -1683,7 +1696,7 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame)
int ff_decode_frame_props ( AVCodecContext * avctx , AVFrame * frame )
{
const AVPacket * pkt = avctx - > internal - > last_pkt_props ;
AVPacket * pkt = avctx - > internal - > last_pkt_props ;
int i ;
static const struct {
enum AVPacketSideDataType packet ;
@ -1701,6 +1714,11 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
{ AV_PKT_DATA_S12M_TIMECODE , AV_FRAME_DATA_S12M_TIMECODE } ,
} ;
if ( IS_EMPTY ( pkt ) )
avpriv_packet_list_get ( & avctx - > internal - > pkt_props ,
& avctx - > internal - > pkt_props_tail ,
pkt ) ;
if ( pkt ) {
frame - > pts = pkt - > pts ;
# if FF_API_PKT_PTS