[FFmpeg-devel] [PATCH 1/2] AVFrame: add an opaque_ref field

Michael Niedermayer michael at niedermayer.cc
Sat Feb 11 18:30:24 EET 2017


On Sat, Feb 11, 2017 at 02:17:36PM +0100, wm4 wrote:
> This is an extended version of the AVFrame.opaque field, which can be
> used to attach arbitrary user information to an AVFrame.
> 
> The usefulness of the opaque field is rather limited, because it can
> store only up to 32 bits of information (or 64 bit on 64 bit systems).
> It's not possible to set this field to a memory allocation, because
> there is no way to deallocate it correctly.
> 
> The opaque_ref field circumvents this by letting the user set an
> AVBuffer, which makes the user data refcounted.
> 
> Signed-off-by: Anton Khirnov <anton at khirnov.net>
> 
> Merges Libav commit 04f3bd349651.
> ---
>  doc/APIchanges      |  3 +++
>  libavutil/frame.c   |  9 +++++++++
>  libavutil/frame.h   | 11 +++++++++++
>  libavutil/version.h |  2 +-
>  4 files changed, 24 insertions(+), 1 deletion(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 8bca71ef36..81e49c22b9 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2015-08-28
>  
>  API changes, most recent first:
>  
> +2017-02-11 - xxxxxxx - lavu 55.47.100 - frame.h
> +  Add AVFrame.opaque_ref.
> +
>  2017-01-31 - xxxxxxx - lavu 55.46.100 / 55.20.0 - cpu.h
>    Add AV_CPU_FLAG_SSSE3SLOW.
>  
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index a08e0c539d..2913982e91 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -379,6 +379,13 @@ FF_DISABLE_DEPRECATION_WARNINGS
>  FF_ENABLE_DEPRECATION_WARNINGS
>  #endif
>  
> +    av_buffer_unref(&dst->opaque_ref);
> +    if (src->opaque_ref) {
> +        dst->opaque_ref = av_buffer_ref(src->opaque_ref);
> +        if (!dst->opaque_ref)
> +            return AVERROR(ENOMEM);
> +    }

not just here but
the error handling in the whole function is not optimal,
ideally the destination frame should be left intact on error while
this could leave a half copied, unref and left as is mix


> +
>      return 0;
>  }
>  
> @@ -513,6 +520,8 @@ void av_frame_unref(AVFrame *frame)
>  
>      av_buffer_unref(&frame->hw_frames_ctx);
>  
> +    av_buffer_unref(&frame->opaque_ref);
> +
>      get_frame_defaults(frame);
>  }
>  
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index b4500923af..3023559beb 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -538,6 +538,17 @@ typedef struct AVFrame {
>       * AVHWFramesContext describing the frame.
>       */
>      AVBufferRef *hw_frames_ctx;
> +
> +    /**
> +     * AVBufferRef for free use by the API user. Libav will never check the
> +     * contents of the buffer ref. Libav calls av_buffer_unref() on it when

wrong project name

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Good people do not need laws to tell them to act responsibly, while bad
people will find a way around the laws. -- Plato
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170211/ca17e526/attachment.sig>


More information about the ffmpeg-devel mailing list