mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
qsv: Add ability to create a session from a device
This commit is contained in:
parent
41dda86087
commit
4936a48b1e
@ -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…
Reference in New Issue
Block a user