Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrcombs <rcombs@rcombs.me>2021-12-21 11:38:18 +0300
committerrcombs <rcombs@rcombs.me>2021-12-23 03:43:34 +0300
commit8e24a8e93a9e0326967cf61a5caa243f566b3f81 (patch)
treee512ced14a91446de0c4d96501bd2d231f519c6e /libavfilter/vf_yadif_videotoolbox.m
parent0f77ee9d97a9a9ed56da59a192acc616f574b932 (diff)
lavfi/metal: fix build with pre-10.11 deployment targets
- Ensure the yadif .metal compiles when targeting any Metal runtime version - Use some preprocessor awkwardness to ensure Core Video's Metal-specific functionality is exposed regardless of our deployment target (this works around what seems to be an SDK header bug, filed as FB9816002) - Ensure all direct references to Metal functions and classes are gated behind runtime version checks (this satisfies clang's deployment-target violation warnings provided by -Wunguarded-availability).
Diffstat (limited to 'libavfilter/vf_yadif_videotoolbox.m')
-rw-r--r--libavfilter/vf_yadif_videotoolbox.m67
1 files changed, 58 insertions, 9 deletions
diff --git a/libavfilter/vf_yadif_videotoolbox.m b/libavfilter/vf_yadif_videotoolbox.m
index 65f155982e..455745817f 100644
--- a/libavfilter/vf_yadif_videotoolbox.m
+++ b/libavfilter/vf_yadif_videotoolbox.m
@@ -26,10 +26,12 @@
#include "libavutil/hwcontext.h"
#include "libavutil/objc.h"
+#include <assert.h>
+
extern char ff_vf_yadif_videotoolbox_metallib_data[];
extern unsigned int ff_vf_yadif_videotoolbox_metallib_len;
-typedef struct YADIFVTContext {
+typedef struct API_AVAILABLE(macos(10.11), ios(8.0)) YADIFVTContext {
YADIFContext yadif;
AVBufferRef *device_ref;
@@ -44,7 +46,12 @@ typedef struct YADIFVTContext {
id<MTLBuffer> mtlParamsBuffer;
CVMetalTextureCacheRef textureCache;
-} YADIFVTContext;
+} YADIFVTContext API_AVAILABLE(macos(10.11), ios(8.0));
+
+// Using sizeof(YADIFVTContext) outside of an availability check will error
+// if we're targeting an older OS version, so we need to calculate the size ourselves
+// (we'll statically verify it's correct in yadif_videotoolbox_init behind a check)
+#define YADIF_VT_CTX_SIZE (sizeof(YADIFContext) + sizeof(void*) * 10)
struct mtlYadifParams {
uint channels;
@@ -62,7 +69,7 @@ static void call_kernel(AVFilterContext *ctx,
id<MTLTexture> next,
int channels,
int parity,
- int tff)
+ int tff) API_AVAILABLE(macos(10.11), ios(8.0))
{
YADIFVTContext *s = ctx->priv;
id<MTLCommandBuffer> buffer = s->mtlQueue.commandBuffer;
@@ -93,7 +100,7 @@ static void call_kernel(AVFilterContext *ctx,
}
static void filter(AVFilterContext *ctx, AVFrame *dst,
- int parity, int tff)
+ int parity, int tff) API_AVAILABLE(macos(10.11), ios(8.0))
{
YADIFVTContext *s = ctx->priv;
YADIFContext *y = &s->yadif;
@@ -162,7 +169,7 @@ exit:
return;
}
-static av_cold void yadif_videotoolbox_uninit(AVFilterContext *ctx)
+static av_cold void do_uninit(AVFilterContext *ctx) API_AVAILABLE(macos(10.11), ios(8.0))
{
YADIFVTContext *s = ctx->priv;
YADIFContext *y = &s->yadif;
@@ -188,7 +195,15 @@ static av_cold void yadif_videotoolbox_uninit(AVFilterContext *ctx)
}
}
-static av_cold int yadif_videotoolbox_init(AVFilterContext *ctx)
+
+static av_cold void yadif_videotoolbox_uninit(AVFilterContext *ctx)
+{
+ if (@available(macOS 10.11, iOS 8.0, *)) {
+ do_uninit(ctx);
+ }
+}
+
+static av_cold int do_init(AVFilterContext *ctx) API_AVAILABLE(macos(10.11), ios(8.0))
{
YADIFVTContext *s = ctx->priv;
NSError *err = nil;
@@ -261,7 +276,19 @@ fail:
return AVERROR_EXTERNAL;
}
-static int config_input(AVFilterLink *inlink)
+static av_cold int yadif_videotoolbox_init(AVFilterContext *ctx)
+{
+ if (@available(macOS 10.11, iOS 8.0, *)) {
+ // Ensure we calculated YADIF_VT_CTX_SIZE correctly
+ static_assert(YADIF_VT_CTX_SIZE == sizeof(YADIFVTContext), "Incorrect YADIF_VT_CTX_SIZE value!");
+ return do_init(ctx);
+ } else {
+ av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS version\n");
+ return AVERROR(ENOSYS);
+ }
+}
+
+static int do_config_input(AVFilterLink *inlink) API_AVAILABLE(macos(10.11), ios(8.0))
{
AVFilterContext *ctx = inlink->dst;
YADIFVTContext *s = ctx->priv;
@@ -283,7 +310,18 @@ static int config_input(AVFilterLink *inlink)
return 0;
}
-static int config_output(AVFilterLink *link)
+static int config_input(AVFilterLink *inlink)
+{
+ AVFilterContext *ctx = inlink->dst;
+ if (@available(macOS 10.11, iOS 8.0, *)) {
+ return do_config_input(inlink);
+ } else {
+ av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS version\n");
+ return AVERROR(ENOSYS);
+ }
+}
+
+static int do_config_output(AVFilterLink *link) API_AVAILABLE(macos(10.11), ios(8.0))
{
AVHWFramesContext *output_frames;
AVFilterContext *ctx = link->src;
@@ -347,6 +385,17 @@ exit:
return ret;
}
+static int config_output(AVFilterLink *link)
+{
+ AVFilterContext *ctx = link->src;
+ if (@available(macOS 10.11, iOS 8.0, *)) {
+ return do_config_output(link);
+ } else {
+ av_log(ctx, AV_LOG_ERROR, "Metal is not available on this OS version\n");
+ return AVERROR(ENOSYS);
+ }
+}
+
#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
#define CONST(name, help, val, unit) { name, help, 0, AV_OPT_TYPE_CONST, {.i64=val}, INT_MIN, INT_MAX, FLAGS, unit }
@@ -394,7 +443,7 @@ static const AVFilterPad yadif_videotoolbox_outputs[] = {
AVFilter ff_vf_yadif_videotoolbox = {
.name = "yadif_videotoolbox",
.description = NULL_IF_CONFIG_SMALL("YADIF for VideoToolbox frames using Metal compute"),
- .priv_size = sizeof(YADIFVTContext),
+ .priv_size = YADIF_VT_CTX_SIZE,
.priv_class = &yadif_videotoolbox_class,
.init = yadif_videotoolbox_init,
.uninit = yadif_videotoolbox_uninit,