[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