[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