lavfi/qsv: create mfx session using oneVPL for qsv filters

Use the mfxLoader handle in qsv hwdevice to create mfx session for qsv
filters.

This is in preparation for oneVPL support
pull/388/head
Haihao Xiang 4 years ago
parent 6900feef06
commit 54c4196d56
  1. 109
      libavfilter/qsvvpp.c
  2. 5
      libavfilter/qsvvpp.h
  3. 13
      libavfilter/vf_deinterlace_qsv.c
  4. 11
      libavfilter/vf_scale_qsv.c

@ -23,8 +23,6 @@
#include "libavutil/common.h"
#include "libavutil/mathematics.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_qsv.h"
#include "libavutil/time.h"
#include "libavutil/pixdesc.h"
@ -32,6 +30,12 @@
#include "qsvvpp.h"
#include "video.h"
#if QSV_ONEVPL
#include <mfxdispatcher.h>
#else
#define MFXUnload(a) do { } while(0)
#endif
#define IS_VIDEO_MEMORY(mode) (mode & (MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | \
MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET))
#if QSV_HAVE_OPAQUE
@ -620,13 +624,10 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s)
}
/* create a "slave" session with those same properties, to be used for vpp */
ret = MFXInit(impl, &ver, &s->session);
if (ret < 0)
return ff_qsvvpp_print_error(avctx, ret, "Error initializing a session");
else if (ret > 0) {
ff_qsvvpp_print_warning(avctx, ret, "Warning in session initialization");
return AVERROR_UNKNOWN;
}
ret = ff_qsvvpp_create_mfx_session(avctx, device_hwctx->loader, impl, &ver,
&s->session);
if (ret)
return ret;
if (handle) {
ret = MFXVideoCORE_SetHandle(s->session, handle_type, handle);
@ -912,3 +913,93 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr
return 0;
}
#if QSV_ONEVPL
int ff_qsvvpp_create_mfx_session(void *ctx,
void *loader,
mfxIMPL implementation,
mfxVersion *pver,
mfxSession *psession)
{
mfxStatus sts;
mfxSession session = NULL;
uint32_t impl_idx = 0;
av_log(ctx, AV_LOG_VERBOSE,
"Use Intel(R) oneVPL to create MFX session with the specified MFX loader\n");
if (!loader) {
av_log(ctx, AV_LOG_ERROR, "Invalid MFX Loader handle\n");
return AVERROR(EINVAL);
}
while (1) {
/* Enumerate all implementations */
mfxImplDescription *impl_desc;
sts = MFXEnumImplementations(loader, impl_idx,
MFX_IMPLCAPS_IMPLDESCSTRUCTURE,
(mfxHDL *)&impl_desc);
/* Failed to find an available implementation */
if (sts == MFX_ERR_NOT_FOUND)
break;
else if (sts != MFX_ERR_NONE) {
impl_idx++;
continue;
}
sts = MFXCreateSession(loader, impl_idx, &session);
MFXDispReleaseImplDescription(loader, impl_desc);
if (sts == MFX_ERR_NONE)
break;
impl_idx++;
}
if (sts < 0)
return ff_qsvvpp_print_error(ctx, sts,
"Error creating a MFX session");
else if (sts > 0) {
ff_qsvvpp_print_warning(ctx, sts,
"Warning in MFX session creation");
return AVERROR_UNKNOWN;
}
*psession = session;
return 0;
}
#else
int ff_qsvvpp_create_mfx_session(void *ctx,
void *loader,
mfxIMPL implementation,
mfxVersion *pver,
mfxSession *psession)
{
mfxSession session = NULL;
mfxStatus sts;
av_log(ctx, AV_LOG_VERBOSE,
"Use Intel(R) Media SDK to create MFX session, API version is "
"%d.%d, the required implementation version is %d.%d\n",
MFX_VERSION_MAJOR, MFX_VERSION_MINOR, pver->Major, pver->Minor);
*psession = NULL;
sts = MFXInit(implementation, pver, &session);
if (sts < 0)
return ff_qsvvpp_print_error(ctx, sts,
"Error initializing an MFX session");
else if (sts > 0) {
ff_qsvvpp_print_warning(ctx, sts, "Warning in MFX session initialization");
return AVERROR_UNKNOWN;
}
*psession = session;
return 0;
}
#endif

@ -28,6 +28,8 @@
#include "avfilter.h"
#include "libavutil/fifo.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_qsv.h"
#define FF_INLINK_IDX(link) ((int)((link)->dstpad - (link)->dst->input_pads))
#define FF_OUTLINK_IDX(link) ((int)((link)->srcpad - (link)->src->output_pads))
@ -122,4 +124,7 @@ int ff_qsvvpp_print_error(void *log_ctx, mfxStatus err,
int ff_qsvvpp_print_warning(void *log_ctx, mfxStatus err,
const char *warning_string);
int ff_qsvvpp_create_mfx_session(void *ctx, void *loader, mfxIMPL implementation,
mfxVersion *pver, mfxSession *psession);
#endif /* AVFILTER_QSVVPP_H */

@ -163,7 +163,7 @@ static int init_out_session(AVFilterContext *ctx)
mfxIMPL impl;
mfxVideoParam par;
mfxStatus err;
int i;
int i, ret;
#if QSV_HAVE_OPAQUE
opaque = !!(hw_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
@ -198,13 +198,10 @@ static int init_out_session(AVFilterContext *ctx)
/* create a "slave" session with those same properties, to be used for
* actual deinterlacing */
err = MFXInit(impl, &ver, &s->session);
if (err < 0)
return ff_qsvvpp_print_error(ctx, err, "Error initializing a session for deinterlacing");
else if (err > 0) {
ff_qsvvpp_print_warning(ctx, err, "Warning in session initialization");
return AVERROR_UNKNOWN;
}
ret = ff_qsvvpp_create_mfx_session(ctx, device_hwctx->loader, impl, &ver,
&s->session);
if (ret)
return ret;
if (handle) {
err = MFXVideoCORE_SetHandle(s->session, handle_type, handle);

@ -278,7 +278,7 @@ static int init_out_session(AVFilterContext *ctx)
mfxIMPL impl;
mfxVideoParam par;
mfxStatus err;
int i;
int i, ret;
#if QSV_HAVE_OPAQUE
opaque = !!(in_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME);
@ -315,11 +315,10 @@ static int init_out_session(AVFilterContext *ctx)
/* create a "slave" session with those same properties, to be used for
* actual scaling */
err = MFXInit(impl, &ver, &s->session);
if (err != MFX_ERR_NONE) {
av_log(ctx, AV_LOG_ERROR, "Error initializing a session for scaling\n");
return AVERROR_UNKNOWN;
}
ret = ff_qsvvpp_create_mfx_session(ctx, device_hwctx->loader, impl, &ver,
&s->session);
if (ret)
return ret;
if (handle) {
err = MFXVideoCORE_SetHandle(s->session, handle_type, handle);

Loading…
Cancel
Save