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 <mich...@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 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel