[FFmpeg-devel] [PATCH] avutil/frame: Add avcodec_private_ref to AVFrame

Hendrik Leppkes h.leppkes at gmail.com
Sun Nov 5 15:52:50 EET 2017


On Sun, Nov 5, 2017 at 1:34 PM, Michael Niedermayer
<michael at niedermayer.cc> wrote:
> This gives libavcodec a field that it can freely and safely use.
> Avoiding the need of wraping of a users opaque_ref field and its issues.
>
> Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>
> ---
>  libavutil/frame.c |  8 +++++++-
>  libavutil/frame.h | 10 ++++++++++
>  2 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/libavutil/frame.c b/libavutil/frame.c
> index 982fbb5c81..6ddaef1e74 100644
> --- a/libavutil/frame.c
> +++ b/libavutil/frame.c
> @@ -383,12 +383,17 @@ FF_ENABLE_DEPRECATION_WARNINGS
>  #endif
>
>      av_buffer_unref(&dst->opaque_ref);
> +    av_buffer_unref(&dst->avcodec_private_ref);
>      if (src->opaque_ref) {
>          dst->opaque_ref = av_buffer_ref(src->opaque_ref);
>          if (!dst->opaque_ref)
>              return AVERROR(ENOMEM);
>      }
> -
> +    if (src->avcodec_private_ref) {
> +        dst->avcodec_private_ref = av_buffer_ref(src->avcodec_private_ref);
> +        if (!dst->avcodec_private_ref)
> +            return AVERROR(ENOMEM);
> +    }
>      return 0;
>  }
>
> @@ -524,6 +529,7 @@ void av_frame_unref(AVFrame *frame)
>      av_buffer_unref(&frame->hw_frames_ctx);
>
>      av_buffer_unref(&frame->opaque_ref);
> +    av_buffer_unref(&frame->avcodec_private_ref);
>
>      get_frame_defaults(frame);
>  }
> diff --git a/libavutil/frame.h b/libavutil/frame.h
> index 0c6aab1c02..73b7d949a9 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -563,6 +563,16 @@ typedef struct AVFrame {
>      /**
>       * @}
>       */
> +    /**
> +     * AVBufferRef for free use by libavcodec. Code outside avcodec will never
> +     * check or change the contents of the buffer ref. FFmpeg calls
> +     * av_buffer_unref() on it when the frame is unreferenced.
> +     * av_frame_copy_props() calls create a new reference with av_buffer_ref()
> +     * for the target frame's avcodec_private_ref field.
> +     *
> +     * avcodec should never assign mutually incompatible types to this field.
> +     */
> +    AVBufferRef *avcodec_private_ref;
>  } AVFrame;
>
>  #if FF_API_FRAME_GET_SET

I would prefer if this field would not be library-specific, but
perhaps just "private_ref" which is not allowed to be touched by
users, and documented to only be valid while within one library - ie.
if you pass a frame from avcodec to avfilter, avfilter could take over
the field (and just free any info, if its still in there).
This would avoid any chances of adding a multitude of fields later,
and a single AVFrame instance is not going to be used in multiple
libraries at the same time anyway (the contents might, but not the
actual AVFrame struct)

- Hendrik


More information about the ffmpeg-devel mailing list