Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: James Zern via ffmpeg-devel <ffmpeg-devel@ffmpeg.org>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Cc: James Zern <jzern@google.com>
Subject: [FFmpeg-devel] Re: [PATCH] libavcodec: support frame dropping in libvpxenc
Date: Mon, 1 Dec 2025 17:39:03 -0500
Message-ID: <CABWgkXK-SzDdXk6fxYM2t2-FnSoGz99fEhT8GgOMDRZMOUVQWg@mail.gmail.com> (raw)
In-Reply-To: <20251126152859.1968312-1-darekm@google.com>

Anton,

On Wed, Nov 26, 2025 at 10:29 AM Dariusz Marcinkiewicz via ffmpeg-devel <
ffmpeg-devel@ffmpeg.org> wrote:

> vp8 encoder can be configured to drop frames, when e.g. bitrate
> overshoot is detected. At present the code responsible for
> managing an internal fifo assumes that we will get an output frame per
> each frame fed into encoder. That is not the case if the encoder can
> decide to drop frames.
>
> Running:
> ffmpeg -stream_loop 100 -i dash_video3.webm -c:v libvpx -b:v 50k
> -drop-threshold 20 -screen-content-mode 2 output.webm
>
> results in lots of warnings like:
> [libvpx @ 0x563fd8aba100] Mismatching timestamps: libvpx 2187 queued
> 2185; this is a bug, please report it
> [libvpx @ 0x563fd8aba100] Mismatching timestamps: libvpx 2189 queued
> 2186; this is a bug, please report it
>
> followed by:
> [vost#0:0/libvpx @ 0x563fd8ab9b40] [enc:libvpx @ 0x563fd8aba080] Error
> submitting video frame to the encoder
> [vost#0:0/libvpx @ 0x563fd8ab9b40] [enc:libvpx @ 0x563fd8aba080] Error
> encoding a frame: No space left on device
> [vost#0:0/libvpx @ 0x563fd8ab9b40] Task finished with error code: -28
> (No space left on device)
> [vost#0:0/libvpx @ 0x563fd8ab9b40] Terminating thread with return code
> -28 (No space left on device)
>
> The reason for the above error is that each dropped frame leaves an
> extra item in the fifo, which eventually overflows.
>
> The proposed fix is to keep popping elements from the fifo until the
> one with the matching pts is found. A side effect of this change is that
> the code no longer considers pts mismatch to be a bug.
>
> This has likely regressed around 5bda4ec6c3cb6f286bb40dee4457c3c26e0f78cb
> when fifo started to be universally used.
>

If you're around could you have a look at this?


>
> Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
> ---
>  libavcodec/libvpxenc.c | 31 ++++++++++++++++++++++++-------
>  1 file changed, 24 insertions(+), 7 deletions(-)
>
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index 05c34a6857..c537c96603 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -383,6 +383,18 @@ static int frame_data_submit(AVCodecContext *avctx,
> AVFifo *fifo,
>      }
>
>      ret = av_fifo_write(fifo, &fd, 1);
> +    if (ret == AVERROR(ENOSPC)) {
> +      FrameData fd2;
> +
> +      av_log(avctx, AV_LOG_WARNING, "Fifo full, will drop a front
> element\n");
> +
> +      ret = av_fifo_read(fifo, &fd2, 1);
> +      if (ret >= 0) {
> +        frame_data_uninit(&fd2);
> +        ret = av_fifo_write(fifo, &fd, 1);
> +      }
> +    }
> +
>      if (ret < 0)
>          goto fail;
>
> @@ -398,13 +410,18 @@ static int frame_data_apply(AVCodecContext *avctx,
> AVFifo *fifo, AVPacket *pkt)
>      uint8_t *data;
>      int ret = 0;
>
> -    if (av_fifo_peek(fifo, &fd, 1, 0) < 0)
> -        return 0;
> -    if (fd.pts != pkt->pts) {
> -        av_log(avctx, AV_LOG_WARNING,
> -               "Mismatching timestamps: libvpx %"PRId64" queued
> %"PRId64"; "
> -               "this is a bug, please report it\n", pkt->pts, fd.pts);
> -        goto skip;
> +    while (1) {
> +      if (av_fifo_peek(fifo, &fd, 1, 0) < 0)
> +          return 0;
> +
> +      if (fd.pts == pkt->pts) {
> +        break;
> +      }
> +
> +      av_log(avctx, AV_LOG_DEBUG, "Dropped frame with pts %"PRId64"\n",
> +             fd.pts);
> +      av_fifo_drain2(fifo, 1);
> +      frame_data_uninit(&fd);
>      }
>
>      pkt->duration = fd.duration;
> --
> 2.52.0.487.g5c8c507ade-goog
>
> _______________________________________________
> ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
> To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org
>
_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

      parent reply	other threads:[~2025-12-01 22:39 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-26 15:28 [FFmpeg-devel] " Dariusz Marcinkiewicz via ffmpeg-devel
2025-11-27 13:40 ` [FFmpeg-devel] " Dariusz Marcinkiewicz via ffmpeg-devel
2025-12-01 22:39 ` James Zern via ffmpeg-devel [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CABWgkXK-SzDdXk6fxYM2t2-FnSoGz99fEhT8GgOMDRZMOUVQWg@mail.gmail.com \
    --to=ffmpeg-devel@ffmpeg.org \
    --cc=jzern@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git