[FFmpeg-devel] [PATCH 6/6] ffplay: use AV_PKT_FLAG_DISPOSABLE in frame drop logic
Marton Balint
cus at passwd.hu
Sun Nov 19 23:28:16 EET 2017
On Sun, 19 Nov 2017, John Stebbins wrote:
> ---
> fftools/ffplay.c | 10 ++++++++++
> 1 file changed, 10 insertions(+)
>
> diff --git a/fftools/ffplay.c b/fftools/ffplay.c
> index 10a917194d..97555d5047 100644
> --- a/fftools/ffplay.c
> +++ b/fftools/ffplay.c
> @@ -257,6 +257,7 @@ typedef struct VideoState {
> struct SwrContext *swr_ctx;
> int frame_drops_early;
> int frame_drops_late;
> + int drop_disposable;
>
> enum ShowMode {
> SHOW_MODE_NONE = -1, SHOW_MODE_VIDEO = 0, SHOW_MODE_WAVES, SHOW_MODE_RDFT, SHOW_MODE_NB
> @@ -1619,9 +1620,11 @@ retry:
> duration = vp_duration(is, vp, nextvp);
> if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
> is->frame_drops_late++;
> + is->drop_disposable = 1;
> frame_queue_next(&is->pictq);
> goto retry;
> }
> + is->drop_disposable = 0;
> }
>
> if (is->subtitle_st) {
> @@ -2900,6 +2903,7 @@ static int read_thread(void *arg)
> infinite_buffer = 1;
>
> for (;;) {
> + AVStream * st;
> if (is->abort_request)
> break;
> if (is->paused != is->last_paused) {
> @@ -3008,6 +3012,12 @@ static int read_thread(void *arg)
> } else {
> is->eof = 0;
> }
> + st = ic->streams[pkt->stream_index];
> + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
> + is->drop_disposable && pkt->flags & AV_PKT_FLAG_DISPOSABLE) {
> + av_packet_unref(pkt);
> + continue;
> + }
> /* check if packet is in play range specified by user, then queue, otherwise discard */
> stream_start_time = ic->streams[pkt->stream_index]->start_time;
> pkt_ts = pkt->pts == AV_NOPTS_VALUE ? pkt->dts : pkt->pts;
I am not a fan of enabling this by default. Unknown number of packets
accumulate in the packet queue, unknown number of packets are processed by
the decoder, so we might drop packets referring to frames 1 second from
now... If you really want to dynamically drop packets, then at least drop
them right before feeding them to the decoder to get rid of the packet
queue latency.
Regards,
Marton
More information about the ffmpeg-devel
mailing list