[FFmpeg-devel] [PATCH 2/9] avcodec/videotoolbox: extract videotoolbox_{start, stop} helpers
Aman Gupta
ffmpeg at tmm1.net
Tue Sep 26 03:36:24 EEST 2017
From: Aman Gupta <aman at tmm1.net>
These helpers will be used in later commits to automatically restart
the decoder session when SPS changes are encountered.
---
libavcodec/videotoolbox.c | 36 ++++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 14 deletions(-)
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index dd13e2581b..7dfcf14c00 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -580,7 +580,7 @@ static CMVideoFormatDescriptionRef videotoolbox_format_desc_create(CMVideoCodecT
return cm_fmt_desc;
}
-static int videotoolbox_default_init(AVCodecContext *avctx)
+static int videotoolbox_start(AVCodecContext *avctx)
{
AVVideotoolboxContext *videotoolbox = videotoolbox_get_context(avctx);
OSStatus status;
@@ -615,6 +615,11 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
decoder_spec = videotoolbox_decoder_config_create(videotoolbox->cm_codec_type, avctx);
+ if (!decoder_spec) {
+ av_log(avctx, AV_LOG_ERROR, "decoder specification creation failed\n");
+ return -1;
+ }
+
videotoolbox->cm_fmt_desc = videotoolbox_format_desc_create(videotoolbox->cm_codec_type,
decoder_spec,
avctx->width,
@@ -656,7 +661,7 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
case kVTVideoDecoderMalfunctionErr:
av_log(avctx, AV_LOG_VERBOSE, "VideoToolbox malfunction.\n");
return AVERROR(EINVAL);
- case kVTVideoDecoderBadDataErr :
+ case kVTVideoDecoderBadDataErr:
av_log(avctx, AV_LOG_VERBOSE, "VideoToolbox reported invalid data.\n");
return AVERROR_INVALIDDATA;
case 0:
@@ -667,18 +672,21 @@ static int videotoolbox_default_init(AVCodecContext *avctx)
}
}
-static void videotoolbox_default_free(AVCodecContext *avctx)
+static void videotoolbox_stop(AVCodecContext *avctx)
{
AVVideotoolboxContext *videotoolbox = videotoolbox_get_context(avctx);
+ if (!videotoolbox)
+ return;
- if (videotoolbox) {
- if (videotoolbox->cm_fmt_desc)
- CFRelease(videotoolbox->cm_fmt_desc);
+ if (videotoolbox->cm_fmt_desc) {
+ CFRelease(videotoolbox->cm_fmt_desc);
+ videotoolbox->cm_fmt_desc = NULL;
+ }
- if (videotoolbox->session) {
- VTDecompressionSessionInvalidate(videotoolbox->session);
- CFRelease(videotoolbox->session);
- }
+ if (videotoolbox->session) {
+ VTDecompressionSessionInvalidate(videotoolbox->session);
+ CFRelease(videotoolbox->session);
+ videotoolbox->session = NULL;
}
}
@@ -691,7 +699,7 @@ static int videotoolbox_uninit(AVCodecContext *avctx)
ff_videotoolbox_uninit(avctx);
if (vtctx->vt_ctx)
- videotoolbox_default_free(avctx);
+ videotoolbox_stop(avctx);
av_buffer_unref(&vtctx->cached_hw_frames_ctx);
av_freep(&vtctx->vt_ctx);
@@ -757,7 +765,7 @@ static int videotoolbox_common_init(AVCodecContext *avctx)
goto fail;
}
- err = videotoolbox_default_init(avctx);
+ err = videotoolbox_start(avctx);
if (err < 0)
goto fail;
@@ -860,13 +868,13 @@ int av_videotoolbox_default_init2(AVCodecContext *avctx, AVVideotoolboxContext *
avctx->hwaccel_context = vtctx ?: av_videotoolbox_alloc_context();
if (!avctx->hwaccel_context)
return AVERROR(ENOMEM);
- return videotoolbox_default_init(avctx);
+ return videotoolbox_start(avctx);
}
void av_videotoolbox_default_free(AVCodecContext *avctx)
{
- videotoolbox_default_free(avctx);
+ videotoolbox_stop(avctx);
av_freep(&avctx->hwaccel_context);
}
#endif /* CONFIG_VIDEOTOOLBOX */
--
2.13.5 (Apple Git-94)
More information about the ffmpeg-devel
mailing list