On Thu, 30 Nov 2017, John Stebbins wrote:
--- fftools/ffplay.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/fftools/ffplay.c b/fftools/ffplay.c index 10a917194d..152d220cdb 100644 --- a/fftools/ffplay.c +++ b/fftools/ffplay.c @@ -198,6 +198,8 @@ typedef struct Decoder { int64_t next_pts; AVRational next_pts_tb; SDL_Thread *decoder_tid; + int drop_disposable; + int frame_drops_disposable; } Decoder; typedef struct VideoState { @@ -660,10 +662,16 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) { ret = got_frame ? 0 : (pkt.data ? AVERROR(EAGAIN) : AVERROR_EOF); } } else { - if (avcodec_send_packet(d->avctx, &pkt) == AVERROR(EAGAIN)) { - av_log(d->avctx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n"); - d->packet_pending = 1; - av_packet_move_ref(&d->pkt, &pkt); + if (d->avctx->codec_type == AVMEDIA_TYPE_VIDEO && + d->drop_disposable && + (pkt.flags & AV_PKT_FLAG_DISPOSABLE)) { + d->frame_drops_disposable++; + } else { + if (avcodec_send_packet(d->avctx, &pkt) == AVERROR(EAGAIN)) { + av_log(d->avctx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n"); + d->packet_pending = 1; + av_packet_move_ref(&d->pkt, &pkt); + } } } av_packet_unref(&pkt); @@ -1622,6 +1630,7 @@ retry: frame_queue_next(&is->pictq); goto retry; } + is->viddec.drop_disposable = 0; } if (is->subtitle_st) { @@ -1699,7 +1708,8 @@ display: get_master_clock(is), (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : " ")), av_diff, - is->frame_drops_early + is->frame_drops_late, + is->frame_drops_early + is->frame_drops_late + + is->viddec.frame_drops_disposable, aqsize / 1024, vqsize / 1024, sqsize, @@ -1767,6 +1777,7 @@ static int get_video_frame(VideoState *is, AVFrame *frame) is->frame_drops_early++; av_frame_unref(frame); got_picture = 0; + is->viddec.drop_disposable = 1; } } }
The patch looks OK now, but as I mentioned earlier, please do not enable this kind of frame dropping by default, either introduce a separate option "hardframedrop", or make -framedrop an integer and use "2" for this kind of hard dropping.
Regards, Marton _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel