[FFmpeg-cvslog] lavc/videotoolbox: do not pass AVCodecContext to decoder output callback
Anton Khirnov
git at videolan.org
Sun Sep 25 11:07:37 EEST 2022
ffmpeg | branch: release/4.4 | Anton Khirnov <anton at khirnov.net> | Thu Sep 15 14:53:36 2022 +0200| [768d4c2e2ad17fb275f8e6f9e1ecdab0c16e979e] | committer: Anton Khirnov
lavc/videotoolbox: do not pass AVCodecContext to decoder output callback
The opaque parameter for the callback is set in videotoolbox_start(),
called when the hwaccel is initialized. When frame threading is used,
avctx will be the context corresponding to the frame thread currently
doing the decoding. Using this same codec context in all subsequent
invocations of the decoder callback (even those triggered by a different
frame thread) is unsafe, and broken after
cc867f2c09d2b69cee8a0eccd62aff002cbbfe11, since each frame thread now
cleans up its hwaccel state after decoding each frame.
Fix this by passing hwaccel_priv_data as the opaque parameter, which
exists in a single instance forwarded between all frame threads.
The only other use of AVCodecContext in the decoder output callback is
as a logging context. For this purpose, store a logging context in
hwaccel_priv_data.
(cherry picked from commit d7f4ad88a0df3c1339e142957bf2c40cd056b8ce)
Signed-off-by: Anton Khirnov <anton at khirnov.net>
(cherry picked from commit ddf3bedfb8160883fd9fdfd4082050d904f51755)
Signed-off-by: Anton Khirnov <anton at khirnov.net>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=768d4c2e2ad17fb275f8e6f9e1ecdab0c16e979e
---
libavcodec/videotoolbox.c | 10 ++++++----
libavcodec/vt_internal.h | 2 ++
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index 49e726a75f..2357401412 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -608,8 +608,7 @@ static void videotoolbox_decoder_callback(void *opaque,
CMTime pts,
CMTime duration)
{
- AVCodecContext *avctx = opaque;
- VTContext *vtctx = avctx->internal->hwaccel_priv_data;
+ VTContext *vtctx = opaque;
if (vtctx->frame) {
CVPixelBufferRelease(vtctx->frame);
@@ -617,7 +616,8 @@ static void videotoolbox_decoder_callback(void *opaque,
}
if (!image_buffer) {
- av_log(avctx, AV_LOG_DEBUG, "vt decoder cb: output image buffer is null\n");
+ av_log(vtctx->logctx, AV_LOG_DEBUG,
+ "vt decoder cb: output image buffer is null: %i\n", status);
return;
}
@@ -828,7 +828,7 @@ static int videotoolbox_start(AVCodecContext *avctx)
videotoolbox->cv_pix_fmt_type);
decoder_cb.decompressionOutputCallback = videotoolbox_decoder_callback;
- decoder_cb.decompressionOutputRefCon = avctx;
+ decoder_cb.decompressionOutputRefCon = avctx->internal->hwaccel_priv_data;
status = VTDecompressionSessionCreate(NULL, // allocator
videotoolbox->cm_fmt_desc, // videoFormatDescription
@@ -1040,6 +1040,8 @@ static int videotoolbox_common_init(AVCodecContext *avctx)
AVHWFramesContext *hw_frames;
int err;
+ vtctx->logctx = avctx;
+
// Old API - do nothing.
if (avctx->hwaccel_context)
return 0;
diff --git a/libavcodec/vt_internal.h b/libavcodec/vt_internal.h
index fb64735b8c..08d9c77090 100644
--- a/libavcodec/vt_internal.h
+++ b/libavcodec/vt_internal.h
@@ -42,6 +42,8 @@ typedef struct VTContext {
// Current H264 parameters (used to trigger decoder restart on SPS changes).
uint8_t sps[3];
bool reconfig_needed;
+
+ void *logctx;
} VTContext;
int ff_videotoolbox_alloc_frame(AVCodecContext *avctx, AVFrame *frame);
More information about the ffmpeg-cvslog
mailing list