|
|
@ -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; |
|
|
|
|
|
|
|
|
|
|
|