[FFmpeg-devel] [PATCH v4] avcodec: Add explicit capability flag for encoder flushing

Anton Khirnov anton at khirnov.net
Wed Apr 15 22:44:06 EEST 2020


Quoting Philip Langdale (2020-04-14 04:48:19)
> Previously, there was no way to flush an encoder such that after
> draining, the encoder could be used again. We generally suggested
> that clients teardown and replace the encoder instance in these
> situations. However, for at least some hardware encoders, the cost of
> this tear down/replace cycle is very high, which can get in the way of
> some use-cases - for example: segmented encoding with nvenc.
> 
> To help address that use case, we added support for calling
> avcodec_flush_buffers() to nvenc and things worked in practice,
> although it was not clearly documented as to whether this should work
> or not. There was only one previous example of an encoder implementing
> the flush callback (audiotoolboxenc) and it's unclear if that was
> untentional or not. However, it was clear that calling
> avocdec_flush_buffers() on any other encoder would leave the encoder in
> an undefined state, and that's not great.
> 
> As part of cleaning this up, this change introduces a formal capability
> flag for encoders that support flushing and ensures a flush call is a
> no-op for any other encoder. This allows client code to check if it is
> meaningful to call flush on an encoder before actually doing it.
> 
> I have not attempted to separate the steps taken inside
> avcodec_flush_buffers() because it's not doing anything that's wrong
> for an encoder. But I did add a sanity check to reject attempts to
> flush a frame threaded encoder because I couldn't wrap my head around
> whether that code path was actually safe or not. As this combination
> doesn't exist today, we'll deal with it if it ever comes up.
> 
> Signed-off-by: Philip Langdale <philipl at overt.org>
> ---
>  doc/APIchanges               |  6 ++++++
>  libavcodec/audiotoolboxenc.c |  3 ++-
>  libavcodec/avcodec.h         | 25 ++++++++++++++++++++-----
>  libavcodec/decode.c          | 15 +++++++++++++++
>  libavcodec/nvenc_h264.c      |  6 ++++--
>  libavcodec/nvenc_hevc.c      |  6 ++++--
>  libavcodec/version.h         |  4 ++--
>  7 files changed, 53 insertions(+), 12 deletions(-)

Looks good, no more objections from me.

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list