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

Michael Niedermayer michael at niedermayer.cc
Sun Nov 5 14:34:51 EET 2017


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
-- 
2.15.0



More information about the ffmpeg-devel mailing list