qsv: Add ability to create a session from a device

pull/272/head
Mark Thompson 8 years ago
parent 41dda86087
commit 4936a48b1e
  1. 49
      libavcodec/qsv.c
  2. 9
      libavcodec/qsv_internal.h
  3. 6
      libavcodec/qsvdec.c
  4. 6
      libavcodec/qsvenc.c

@ -537,27 +537,16 @@ static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
return MFX_ERR_NONE; return MFX_ERR_NONE;
} }
int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession, int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
QSVFramesContext *qsv_frames_ctx, AVBufferRef *device_ref, const char *load_plugins)
const char *load_plugins, int opaque)
{ {
static const mfxHandleType handle_types[] = { static const mfxHandleType handle_types[] = {
MFX_HANDLE_VA_DISPLAY, MFX_HANDLE_VA_DISPLAY,
MFX_HANDLE_D3D9_DEVICE_MANAGER, MFX_HANDLE_D3D9_DEVICE_MANAGER,
MFX_HANDLE_D3D11_DEVICE, MFX_HANDLE_D3D11_DEVICE,
}; };
mfxFrameAllocator frame_allocator = { AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)device_ref->data;
.pthis = qsv_frames_ctx, AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
.Alloc = qsv_frame_alloc,
.Lock = qsv_frame_lock,
.Unlock = qsv_frame_unlock,
.GetHDL = qsv_frame_get_hdl,
.Free = qsv_frame_free,
};
AVHWFramesContext *frames_ctx = (AVHWFramesContext*)qsv_frames_ctx->hw_frames_ctx->data;
AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx;
AVQSVDeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
mfxSession parent_session = device_hwctx->session; mfxSession parent_session = device_hwctx->session;
mfxSession session; mfxSession session;
@ -607,6 +596,36 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession,
return ret; return ret;
} }
*psession = session;
return 0;
}
int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *psession,
QSVFramesContext *qsv_frames_ctx,
const char *load_plugins, int opaque)
{
mfxFrameAllocator frame_allocator = {
.pthis = qsv_frames_ctx,
.Alloc = qsv_frame_alloc,
.Lock = qsv_frame_lock,
.Unlock = qsv_frame_unlock,
.GetHDL = qsv_frame_get_hdl,
.Free = qsv_frame_free,
};
AVHWFramesContext *frames_ctx = (AVHWFramesContext*)qsv_frames_ctx->hw_frames_ctx->data;
AVQSVFramesContext *frames_hwctx = frames_ctx->hwctx;
mfxSession session;
mfxStatus err;
int ret;
ret = ff_qsv_init_session_device(avctx, &session,
frames_ctx->device_ref, load_plugins);
if (ret < 0)
return ret;
if (!opaque) { if (!opaque) {
qsv_frames_ctx->logctx = avctx; qsv_frames_ctx->logctx = avctx;

@ -87,9 +87,12 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc);
int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session,
const char *load_plugins); const char *load_plugins);
int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *session, int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
QSVFramesContext *qsv_frames_ctx, AVBufferRef *device_ref, const char *load_plugins);
const char *load_plugins, int opaque);
int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
QSVFramesContext *qsv_frames_ctx,
const char *load_plugins, int opaque);
int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame); int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame);

@ -59,9 +59,9 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses
if (!q->frames_ctx.hw_frames_ctx) if (!q->frames_ctx.hw_frames_ctx)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
ret = ff_qsv_init_session_hwcontext(avctx, &q->internal_session, ret = ff_qsv_init_session_frames(avctx, &q->internal_session,
&q->frames_ctx, q->load_plugins, &q->frames_ctx, q->load_plugins,
q->iopattern == MFX_IOPATTERN_OUT_OPAQUE_MEMORY); q->iopattern == MFX_IOPATTERN_OUT_OPAQUE_MEMORY);
if (ret < 0) { if (ret < 0) {
av_buffer_unref(&q->frames_ctx.hw_frames_ctx); av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
return ret; return ret;

@ -684,9 +684,9 @@ static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q)
if (!q->frames_ctx.hw_frames_ctx) if (!q->frames_ctx.hw_frames_ctx)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
ret = ff_qsv_init_session_hwcontext(avctx, &q->internal_session, ret = ff_qsv_init_session_frames(avctx, &q->internal_session,
&q->frames_ctx, q->load_plugins, &q->frames_ctx, q->load_plugins,
q->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY); q->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY);
if (ret < 0) { if (ret < 0) {
av_buffer_unref(&q->frames_ctx.hw_frames_ctx); av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
return ret; return ret;

Loading…
Cancel
Save