[FFmpeg-devel] [PATCH 10/15] lavc/videotoolbox: expose some functions as lavc-internal
rcombs
rcombs at rcombs.me
Sat Nov 13 23:09:11 EET 2021
---
libavcodec/videotoolbox.c | 146 ++++++++++++++++++--------------------
libavcodec/vt_internal.h | 10 +++
2 files changed, 78 insertions(+), 78 deletions(-)
diff --git a/libavcodec/videotoolbox.c b/libavcodec/videotoolbox.c
index 764021586b..18cc589d2a 100644
--- a/libavcodec/videotoolbox.c
+++ b/libavcodec/videotoolbox.c
@@ -61,9 +61,9 @@ static void videotoolbox_buffer_release(void *opaque, uint8_t *data)
av_free(data);
}
-static int videotoolbox_buffer_copy(VTContext *vtctx,
- const uint8_t *buffer,
- uint32_t size)
+int ff_videotoolbox_buffer_copy(VTContext *vtctx,
+ const uint8_t *buffer,
+ uint32_t size)
{
void *tmp;
@@ -374,7 +374,7 @@ int ff_videotoolbox_h264_start_frame(AVCodecContext *avctx,
H264Context *h = avctx->priv_data;
if (h->is_avc == 1) {
- return videotoolbox_buffer_copy(vtctx, buffer, size);
+ return ff_videotoolbox_buffer_copy(vtctx, buffer, size);
}
return 0;
@@ -438,18 +438,6 @@ int ff_videotoolbox_h264_decode_slice(AVCodecContext *avctx,
return videotoolbox_common_decode_slice(avctx, buffer, size);
}
-int ff_videotoolbox_uninit(AVCodecContext *avctx)
-{
- VTContext *vtctx = avctx->internal->hwaccel_priv_data;
- if (vtctx) {
- av_freep(&vtctx->bitstream);
- if (vtctx->frame)
- CVPixelBufferRelease(vtctx->frame);
- }
-
- return 0;
-}
-
#if CONFIG_VIDEOTOOLBOX
// Return the AVVideotoolboxContext that matters currently. Where it comes from
// depends on the API used.
@@ -465,6 +453,43 @@ static AVVideotoolboxContext *videotoolbox_get_context(AVCodecContext *avctx)
return avctx->hwaccel_context;
}
+static void videotoolbox_stop(AVCodecContext *avctx)
+{
+ AVVideotoolboxContext *videotoolbox = videotoolbox_get_context(avctx);
+ if (!videotoolbox)
+ return;
+
+ if (videotoolbox->cm_fmt_desc) {
+ CFRelease(videotoolbox->cm_fmt_desc);
+ videotoolbox->cm_fmt_desc = NULL;
+ }
+
+ if (videotoolbox->session) {
+ VTDecompressionSessionInvalidate(videotoolbox->session);
+ CFRelease(videotoolbox->session);
+ videotoolbox->session = NULL;
+ }
+}
+
+int ff_videotoolbox_uninit(AVCodecContext *avctx)
+{
+ VTContext *vtctx = avctx->internal->hwaccel_priv_data;
+ if (!vtctx)
+ return 0;
+
+ av_freep(&vtctx->bitstream);
+ if (vtctx->frame)
+ CVPixelBufferRelease(vtctx->frame);
+
+ if (vtctx->vt_ctx)
+ videotoolbox_stop(avctx);
+
+ av_buffer_unref(&vtctx->cached_hw_frames_ctx);
+ av_freep(&vtctx->vt_ctx);
+
+ return 0;
+}
+
static int videotoolbox_buffer_create(AVCodecContext *avctx, AVFrame *frame)
{
VTContext *vtctx = avctx->internal->hwaccel_priv_data;
@@ -901,24 +926,6 @@ static int videotoolbox_start(AVCodecContext *avctx)
}
}
-static void videotoolbox_stop(AVCodecContext *avctx)
-{
- AVVideotoolboxContext *videotoolbox = videotoolbox_get_context(avctx);
- if (!videotoolbox)
- return;
-
- if (videotoolbox->cm_fmt_desc) {
- CFRelease(videotoolbox->cm_fmt_desc);
- videotoolbox->cm_fmt_desc = NULL;
- }
-
- if (videotoolbox->session) {
- VTDecompressionSessionInvalidate(videotoolbox->session);
- CFRelease(videotoolbox->session);
- videotoolbox->session = NULL;
- }
-}
-
static const char *videotoolbox_error_string(OSStatus status)
{
switch (status) {
@@ -932,7 +939,7 @@ static const char *videotoolbox_error_string(OSStatus status)
return "unknown";
}
-static int videotoolbox_common_end_frame(AVCodecContext *avctx, AVFrame *frame)
+int ff_videotoolbox_common_end_frame(AVCodecContext *avctx, AVFrame *frame)
{
OSStatus status;
AVVideotoolboxContext *videotoolbox = videotoolbox_get_context(avctx);
@@ -971,7 +978,7 @@ static int videotoolbox_h264_end_frame(AVCodecContext *avctx)
H264Context *h = avctx->priv_data;
AVFrame *frame = h->cur_pic_ptr->f;
VTContext *vtctx = avctx->internal->hwaccel_priv_data;
- int ret = videotoolbox_common_end_frame(avctx, frame);
+ int ret = ff_videotoolbox_common_end_frame(avctx, frame);
vtctx->bitstream_size = 0;
return ret;
}
@@ -1010,7 +1017,7 @@ static int videotoolbox_hevc_end_frame(AVCodecContext *avctx)
h->output_frame->crop_top = 0;
h->output_frame->crop_bottom = 0;
- int ret = videotoolbox_common_end_frame(avctx, frame);
+ int ret = ff_videotoolbox_common_end_frame(avctx, frame);
vtctx->bitstream_size = 0;
return ret;
}
@@ -1021,7 +1028,7 @@ static int videotoolbox_mpeg_start_frame(AVCodecContext *avctx,
{
VTContext *vtctx = avctx->internal->hwaccel_priv_data;
- return videotoolbox_buffer_copy(vtctx, buffer, size);
+ return ff_videotoolbox_buffer_copy(vtctx, buffer, size);
}
static int videotoolbox_mpeg_decode_slice(AVCodecContext *avctx,
@@ -1036,24 +1043,7 @@ static int videotoolbox_mpeg_end_frame(AVCodecContext *avctx)
MpegEncContext *s = avctx->priv_data;
AVFrame *frame = s->current_picture_ptr->f;
- return videotoolbox_common_end_frame(avctx, frame);
-}
-
-static int videotoolbox_uninit(AVCodecContext *avctx)
-{
- VTContext *vtctx = avctx->internal->hwaccel_priv_data;
- if (!vtctx)
- return 0;
-
- ff_videotoolbox_uninit(avctx);
-
- if (vtctx->vt_ctx)
- videotoolbox_stop(avctx);
-
- av_buffer_unref(&vtctx->cached_hw_frames_ctx);
- av_freep(&vtctx->vt_ctx);
-
- return 0;
+ return ff_videotoolbox_common_end_frame(avctx, frame);
}
static enum AVPixelFormat videotoolbox_best_pixel_format(AVCodecContext *avctx) {
@@ -1095,7 +1085,7 @@ static enum AVPixelFormat videotoolbox_best_pixel_format(AVCodecContext *avctx)
return AV_PIX_FMT_NV12;
}
-static int videotoolbox_common_init(AVCodecContext *avctx)
+int ff_videotoolbox_common_init(AVCodecContext *avctx)
{
VTContext *vtctx = avctx->internal->hwaccel_priv_data;
AVHWFramesContext *hw_frames;
@@ -1167,12 +1157,12 @@ static int videotoolbox_common_init(AVCodecContext *avctx)
return 0;
fail:
- videotoolbox_uninit(avctx);
+ ff_videotoolbox_uninit(avctx);
return err;
}
-static int videotoolbox_frame_params(AVCodecContext *avctx,
- AVBufferRef *hw_frames_ctx)
+int ff_videotoolbox_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx)
{
AVHWFramesContext *frames_ctx = (AVHWFramesContext*)hw_frames_ctx->data;
@@ -1193,9 +1183,9 @@ const AVHWAccel ff_h263_videotoolbox_hwaccel = {
.start_frame = videotoolbox_mpeg_start_frame,
.decode_slice = videotoolbox_mpeg_decode_slice,
.end_frame = videotoolbox_mpeg_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
@@ -1209,9 +1199,9 @@ const AVHWAccel ff_hevc_videotoolbox_hwaccel = {
.decode_slice = videotoolbox_hevc_decode_slice,
.decode_params = videotoolbox_hevc_decode_params,
.end_frame = videotoolbox_hevc_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
@@ -1225,9 +1215,9 @@ const AVHWAccel ff_h264_videotoolbox_hwaccel = {
.decode_slice = ff_videotoolbox_h264_decode_slice,
.decode_params = videotoolbox_h264_decode_params,
.end_frame = videotoolbox_h264_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
@@ -1240,9 +1230,9 @@ const AVHWAccel ff_mpeg1_videotoolbox_hwaccel = {
.start_frame = videotoolbox_mpeg_start_frame,
.decode_slice = videotoolbox_mpeg_decode_slice,
.end_frame = videotoolbox_mpeg_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
@@ -1255,9 +1245,9 @@ const AVHWAccel ff_mpeg2_videotoolbox_hwaccel = {
.start_frame = videotoolbox_mpeg_start_frame,
.decode_slice = videotoolbox_mpeg_decode_slice,
.end_frame = videotoolbox_mpeg_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
@@ -1270,9 +1260,9 @@ const AVHWAccel ff_mpeg4_videotoolbox_hwaccel = {
.start_frame = videotoolbox_mpeg_start_frame,
.decode_slice = videotoolbox_mpeg_decode_slice,
.end_frame = videotoolbox_mpeg_end_frame,
- .frame_params = videotoolbox_frame_params,
- .init = videotoolbox_common_init,
- .uninit = videotoolbox_uninit,
+ .frame_params = ff_videotoolbox_frame_params,
+ .init = ff_videotoolbox_common_init,
+ .uninit = ff_videotoolbox_uninit,
.priv_data_size = sizeof(VTContext),
};
diff --git a/libavcodec/vt_internal.h b/libavcodec/vt_internal.h
index fb64735b8c..e2f279d0fc 100644
--- a/libavcodec/vt_internal.h
+++ b/libavcodec/vt_internal.h
@@ -19,6 +19,9 @@
#ifndef AVCODEC_VT_INTERNAL_H
#define AVCODEC_VT_INTERNAL_H
+#include "avcodec.h"
+#include "videotoolbox.h"
+
typedef struct VTContext {
// The current bitstream buffer.
uint8_t *bitstream;
@@ -45,6 +48,12 @@ typedef struct VTContext {
} VTContext;
int ff_videotoolbox_alloc_frame(AVCodecContext *avctx, AVFrame *frame);
+int ff_videotoolbox_common_init(AVCodecContext *avctx);
+int ff_videotoolbox_frame_params(AVCodecContext *avctx,
+ AVBufferRef *hw_frames_ctx);
+int ff_videotoolbox_buffer_copy(VTContext *vtctx,
+ const uint8_t *buffer,
+ uint32_t size);
int ff_videotoolbox_uninit(AVCodecContext *avctx);
int ff_videotoolbox_h264_start_frame(AVCodecContext *avctx,
const uint8_t *buffer,
@@ -52,6 +61,7 @@ int ff_videotoolbox_h264_start_frame(AVCodecContext *avctx,
int ff_videotoolbox_h264_decode_slice(AVCodecContext *avctx,
const uint8_t *buffer,
uint32_t size);
+int ff_videotoolbox_common_end_frame(AVCodecContext *avctx, AVFrame *frame);
CFDataRef ff_videotoolbox_avcc_extradata_create(AVCodecContext *avctx);
CFDataRef ff_videotoolbox_hvcc_extradata_create(AVCodecContext *avctx);
--
2.33.1
More information about the ffmpeg-devel
mailing list