summaryrefslogtreecommitdiff
path: root/libavfilter
diff options
context:
space:
mode:
authorHaihao Xiang <haihao.xiang@intel.com>2020-08-19 09:43:12 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2022-08-12 10:43:39 +0800
commitc77149bc37f5a200e635c60bf6eb4efc7b03af91 (patch)
tree18507a6a99e3624c4ad3a9e05df5e53b07db5fc7 /libavfilter
parent63cda40930a228e490e107f4fc945688696cef2a (diff)
qsv: restrict OPAQUE memory to MFX_VERSION < 2.0
OPAQUE memory isn't supported for MFX_VERSION >= 2.0[1][2]. This is in preparation for oneVPL support [1] https://spec.oneapi.io/versions/latest/elements/oneVPL/source/VPL_intel_media_sdk.html#msdk-full-name-feature-removals [2] https://github.com/oneapi-src/oneVPL
Diffstat (limited to 'libavfilter')
-rw-r--r--libavfilter/qsvvpp.c26
-rw-r--r--libavfilter/qsvvpp.h3
-rw-r--r--libavfilter/vf_deinterlace_qsv.c57
-rw-r--r--libavfilter/vf_scale_qsv.c74
4 files changed, 101 insertions, 59 deletions
diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c
index e849245133..10beeef14b 100644
--- a/libavfilter/qsvvpp.c
+++ b/libavfilter/qsvvpp.c
@@ -34,7 +34,9 @@
#define IS_VIDEO_MEMORY(mode) (mode & (MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | \
MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET))
+#if QSV_HAVE_OPAQUE
#define IS_OPAQUE_MEMORY(mode) (mode & MFX_MEMTYPE_OPAQUE_FRAME)
+#endif
#define IS_SYSTEM_MEMORY(mode) (mode & MFX_MEMTYPE_SYSTEM_MEMORY)
#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl))
@@ -53,10 +55,14 @@ static const struct {
} qsv_iopatterns[] = {
{MFX_IOPATTERN_IN_VIDEO_MEMORY, "input is video memory surface" },
{MFX_IOPATTERN_IN_SYSTEM_MEMORY, "input is system memory surface" },
+#if QSV_HAVE_OPAQUE
{MFX_IOPATTERN_IN_OPAQUE_MEMORY, "input is opaque memory surface" },
+#endif
{MFX_IOPATTERN_OUT_VIDEO_MEMORY, "output is video memory surface" },
{MFX_IOPATTERN_OUT_SYSTEM_MEMORY, "output is system memory surface" },
+#if QSV_HAVE_OPAQUE
{MFX_IOPATTERN_OUT_OPAQUE_MEMORY, "output is opaque memory surface" },
+#endif
};
int ff_qsvvpp_print_iopattern(void *log_ctx, int mfx_iopattern,
@@ -542,9 +548,13 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
if (!out_frames_ref)
return AVERROR(ENOMEM);
+#if QSV_HAVE_OPAQUE
s->out_mem_mode = IS_OPAQUE_MEMORY(s->in_mem_mode) ?
MFX_MEMTYPE_OPAQUE_FRAME :
MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT;
+#else
+ s->out_mem_mode = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT;
+#endif
out_frames_ctx = (AVHWFramesContext *)out_frames_ref->data;
out_frames_hwctx = out_frames_ctx->hwctx;
@@ -630,6 +640,7 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
return AVERROR_UNKNOWN;
}
+#if QSV_HAVE_OPAQUE
if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) {
s->opaque_alloc.In.Surfaces = s->surface_ptrs_in;
s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs_in;
@@ -641,7 +652,9 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
- } else if (IS_VIDEO_MEMORY(s->in_mem_mode) || IS_VIDEO_MEMORY(s->out_mem_mode)) {
+ } else
+#endif
+ if (IS_VIDEO_MEMORY(s->in_mem_mode) || IS_VIDEO_MEMORY(s->out_mem_mode)) {
mfxFrameAllocator frame_allocator = {
.pthis = s,
.Alloc = frame_alloc,
@@ -713,6 +726,7 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p
goto failed;
}
+#if QSV_HAVE_OPAQUE
if (IS_OPAQUE_MEMORY(s->in_mem_mode) || IS_OPAQUE_MEMORY(s->out_mem_mode)) {
s->nb_ext_buffers = param->num_ext_buf + 1;
s->ext_buffers = av_calloc(s->nb_ext_buffers, sizeof(*s->ext_buffers));
@@ -730,6 +744,10 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p
s->vpp_param.NumExtParam = param->num_ext_buf;
s->vpp_param.ExtParam = param->ext_buf;
}
+#else
+ s->vpp_param.NumExtParam = param->num_ext_buf;
+ s->vpp_param.ExtParam = param->ext_buf;
+#endif
s->got_frame = 0;
@@ -747,15 +765,19 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p
s->vpp_param.IOPattern |= MFX_IOPATTERN_IN_SYSTEM_MEMORY;
else if (IS_VIDEO_MEMORY(s->in_mem_mode))
s->vpp_param.IOPattern |= MFX_IOPATTERN_IN_VIDEO_MEMORY;
+#if QSV_HAVE_OPAQUE
else if (IS_OPAQUE_MEMORY(s->in_mem_mode))
s->vpp_param.IOPattern |= MFX_IOPATTERN_IN_OPAQUE_MEMORY;
+#endif
if (IS_SYSTEM_MEMORY(s->out_mem_mode))
s->vpp_param.IOPattern |= MFX_IOPATTERN_OUT_SYSTEM_MEMORY;
else if (IS_VIDEO_MEMORY(s->out_mem_mode))
s->vpp_param.IOPattern |= MFX_IOPATTERN_OUT_VIDEO_MEMORY;
+#if QSV_HAVE_OPAQUE
else if (IS_OPAQUE_MEMORY(s->out_mem_mode))
s->vpp_param.IOPattern |= MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
+#endif
/* Print input memory mode */
ff_qsvvpp_print_iopattern(avctx, s->vpp_param.IOPattern & 0x0F, "VPP");
@@ -794,7 +816,9 @@ int ff_qsvvpp_free(QSVVPPContext **vpp)
clear_frame_list(&s->out_frame_list);
av_freep(&s->surface_ptrs_in);
av_freep(&s->surface_ptrs_out);
+#if QSV_HAVE_OPAQUE
av_freep(&s->ext_buffers);
+#endif
av_freep(&s->frame_infos);
av_fifo_freep2(&s->async_fifo);
av_freep(vpp);
diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h
index 802abd987d..3e7d56021b 100644
--- a/libavfilter/qsvvpp.h
+++ b/libavfilter/qsvvpp.h
@@ -41,6 +41,7 @@
(MFX_VERSION.Major == (MAJOR) && MFX_VERSION.Minor >= (MINOR)))
#define QSV_ONEVPL QSV_VERSION_ATLEAST(2, 0)
+#define QSV_HAVE_OPAQUE !QSV_ONEVPL
typedef struct QSVFrame {
AVFrame *frame;
@@ -66,10 +67,12 @@ typedef struct QSVVPPContext {
mfxFrameSurface1 **surface_ptrs_in;
mfxFrameSurface1 **surface_ptrs_out;
+#if QSV_HAVE_OPAQUE
/** MFXVPP extern parameters */
mfxExtOpaqueSurfaceAlloc opaque_alloc;
mfxExtBuffer **ext_buffers;
int nb_ext_buffers;
+#endif
int got_frame;
int async_depth;
diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c
index b8ff3e8339..50f9156d14 100644
--- a/libavfilter/vf_deinterlace_qsv.c
+++ b/libavfilter/vf_deinterlace_qsv.c
@@ -62,7 +62,9 @@ typedef struct QSVDeintContext {
mfxFrameSurface1 **surface_ptrs;
int nb_surface_ptrs;
+#if QSV_HAVE_OPAQUE
mfxExtOpaqueSurfaceAlloc opaque_alloc;
+#endif
mfxExtVPPDeinterlacing deint_conf;
mfxExtBuffer *ext_buffers[2];
int num_ext_buffers;
@@ -154,9 +156,7 @@ static int init_out_session(AVFilterContext *ctx)
AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)s->hw_frames_ctx->data;
AVQSVFramesContext *hw_frames_hwctx = hw_frames_ctx->hwctx;
AVQSVDeviceContext *device_hwctx = hw_frames_ctx->device_ctx->hwctx;
-
- int opaque = !!(hw_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
-
+ int opaque = 0;
mfxHDL handle = NULL;
mfxHandleType handle_type;
mfxVersion ver;
@@ -165,6 +165,9 @@ static int init_out_session(AVFilterContext *ctx)
mfxStatus err;
int i;
+#if QSV_HAVE_OPAQUE
+ opaque = !!(hw_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
+#endif
/* extract the properties of the "master" session given to us */
err = MFXQueryIMPL(device_hwctx->session, &impl);
if (err == MFX_ERR_NONE)
@@ -223,28 +226,7 @@ static int init_out_session(AVFilterContext *ctx)
s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->deint_conf;
- if (opaque) {
- s->surface_ptrs = av_calloc(hw_frames_hwctx->nb_surfaces,
- sizeof(*s->surface_ptrs));
- if (!s->surface_ptrs)
- return AVERROR(ENOMEM);
- for (i = 0; i < hw_frames_hwctx->nb_surfaces; i++)
- s->surface_ptrs[i] = hw_frames_hwctx->surfaces + i;
- s->nb_surface_ptrs = hw_frames_hwctx->nb_surfaces;
-
- s->opaque_alloc.In.Surfaces = s->surface_ptrs;
- s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs;
- s->opaque_alloc.In.Type = hw_frames_hwctx->frame_type;
-
- s->opaque_alloc.Out = s->opaque_alloc.In;
-
- s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
- s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
-
- s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->opaque_alloc;
-
- par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
- } else {
+ if (!opaque) {
mfxFrameAllocator frame_allocator = {
.pthis = ctx,
.Alloc = frame_alloc,
@@ -268,6 +250,31 @@ static int init_out_session(AVFilterContext *ctx)
par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
}
+#if QSV_HAVE_OPAQUE
+ else {
+ s->surface_ptrs = av_calloc(hw_frames_hwctx->nb_surfaces,
+ sizeof(*s->surface_ptrs));
+
+ if (!s->surface_ptrs)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < hw_frames_hwctx->nb_surfaces; i++)
+ s->surface_ptrs[i] = hw_frames_hwctx->surfaces + i;
+ s->nb_surface_ptrs = hw_frames_hwctx->nb_surfaces;
+
+ s->opaque_alloc.In.Surfaces = s->surface_ptrs;
+ s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs;
+ s->opaque_alloc.In.Type = hw_frames_hwctx->frame_type;
+
+ s->opaque_alloc.Out = s->opaque_alloc.In;
+
+ s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
+ s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
+
+ s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->opaque_alloc;
+
+ par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
+ }
+#endif
par.ExtParam = s->ext_buffers;
par.NumExtParam = s->num_ext_buffers;
diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c
index af0e85bd03..fa0152d785 100644
--- a/libavfilter/vf_scale_qsv.c
+++ b/libavfilter/vf_scale_qsv.c
@@ -89,7 +89,9 @@ typedef struct QSVScaleContext {
mfxFrameSurface1 **surface_ptrs_out;
int nb_surface_ptrs_out;
+#if QSV_HAVE_OPAQUE
mfxExtOpaqueSurfaceAlloc opaque_alloc;
+#endif
mfxExtVPPScaling scale_conf;
int mode;
@@ -268,7 +270,7 @@ static int init_out_session(AVFilterContext *ctx)
AVQSVFramesContext *out_frames_hwctx = out_frames_ctx->hwctx;
AVQSVDeviceContext *device_hwctx = in_frames_ctx->device_ctx->hwctx;
- int opaque = !!(in_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
+ int opaque = 0;
mfxHDL handle = NULL;
mfxHandleType handle_type;
@@ -278,6 +280,9 @@ static int init_out_session(AVFilterContext *ctx)
mfxStatus err;
int i;
+#if QSV_HAVE_OPAQUE
+ opaque = !!(in_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
+#endif
s->num_ext_buf = 0;
/* extract the properties of the "master" session given to us */
@@ -330,38 +335,7 @@ static int init_out_session(AVFilterContext *ctx)
memset(&par, 0, sizeof(par));
- if (opaque) {
- s->surface_ptrs_in = av_calloc(in_frames_hwctx->nb_surfaces,
- sizeof(*s->surface_ptrs_in));
- if (!s->surface_ptrs_in)
- return AVERROR(ENOMEM);
- for (i = 0; i < in_frames_hwctx->nb_surfaces; i++)
- s->surface_ptrs_in[i] = in_frames_hwctx->surfaces + i;
- s->nb_surface_ptrs_in = in_frames_hwctx->nb_surfaces;
-
- s->surface_ptrs_out = av_calloc(out_frames_hwctx->nb_surfaces,
- sizeof(*s->surface_ptrs_out));
- if (!s->surface_ptrs_out)
- return AVERROR(ENOMEM);
- for (i = 0; i < out_frames_hwctx->nb_surfaces; i++)
- s->surface_ptrs_out[i] = out_frames_hwctx->surfaces + i;
- s->nb_surface_ptrs_out = out_frames_hwctx->nb_surfaces;
-
- s->opaque_alloc.In.Surfaces = s->surface_ptrs_in;
- s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs_in;
- s->opaque_alloc.In.Type = in_frames_hwctx->frame_type;
-
- s->opaque_alloc.Out.Surfaces = s->surface_ptrs_out;
- s->opaque_alloc.Out.NumSurface = s->nb_surface_ptrs_out;
- s->opaque_alloc.Out.Type = out_frames_hwctx->frame_type;
-
- s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
- s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
-
- s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->opaque_alloc;
-
- par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
- } else {
+ if (!opaque) {
mfxFrameAllocator frame_allocator = {
.pthis = ctx,
.Alloc = frame_alloc,
@@ -393,6 +367,40 @@ static int init_out_session(AVFilterContext *ctx)
par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
}
+#if QSV_HAVE_OPAQUE
+ else {
+ s->surface_ptrs_in = av_calloc(in_frames_hwctx->nb_surfaces,
+ sizeof(*s->surface_ptrs_in));
+ if (!s->surface_ptrs_in)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < in_frames_hwctx->nb_surfaces; i++)
+ s->surface_ptrs_in[i] = in_frames_hwctx->surfaces + i;
+ s->nb_surface_ptrs_in = in_frames_hwctx->nb_surfaces;
+
+ s->surface_ptrs_out = av_calloc(out_frames_hwctx->nb_surfaces,
+ sizeof(*s->surface_ptrs_out));
+ if (!s->surface_ptrs_out)
+ return AVERROR(ENOMEM);
+ for (i = 0; i < out_frames_hwctx->nb_surfaces; i++)
+ s->surface_ptrs_out[i] = out_frames_hwctx->surfaces + i;
+ s->nb_surface_ptrs_out = out_frames_hwctx->nb_surfaces;
+
+ s->opaque_alloc.In.Surfaces = s->surface_ptrs_in;
+ s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs_in;
+ s->opaque_alloc.In.Type = in_frames_hwctx->frame_type;
+
+ s->opaque_alloc.Out.Surfaces = s->surface_ptrs_out;
+ s->opaque_alloc.Out.NumSurface = s->nb_surface_ptrs_out;
+ s->opaque_alloc.Out.Type = out_frames_hwctx->frame_type;
+
+ s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
+ s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
+
+ s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->opaque_alloc;
+
+ par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
+ }
+#endif
memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling));
s->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING;