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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession,
 | 
			
		||||
                                  QSVFramesContext *qsv_frames_ctx,
 | 
			
		||||
                                  const char *load_plugins, int opaque)
 | 
			
		||||
int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
 | 
			
		||||
                               AVBufferRef *device_ref, const char *load_plugins)
 | 
			
		||||
{
 | 
			
		||||
    static const mfxHandleType handle_types[] = {
 | 
			
		||||
        MFX_HANDLE_VA_DISPLAY,
 | 
			
		||||
        MFX_HANDLE_D3D9_DEVICE_MANAGER,
 | 
			
		||||
        MFX_HANDLE_D3D11_DEVICE,
 | 
			
		||||
    };
 | 
			
		||||
    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;
 | 
			
		||||
    AVQSVDeviceContext *device_hwctx = frames_ctx->device_ctx->hwctx;
 | 
			
		||||
    AVHWDeviceContext    *device_ctx = (AVHWDeviceContext*)device_ref->data;
 | 
			
		||||
    AVQSVDeviceContext *device_hwctx = device_ctx->hwctx;
 | 
			
		||||
    mfxSession        parent_session = device_hwctx->session;
 | 
			
		||||
 | 
			
		||||
    mfxSession    session;
 | 
			
		||||
@ -607,6 +596,36 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession,
 | 
			
		||||
        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) {
 | 
			
		||||
        qsv_frames_ctx->logctx = avctx;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -87,7 +87,10 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format, uint32_t *fourcc);
 | 
			
		||||
int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session,
 | 
			
		||||
                                 const char *load_plugins);
 | 
			
		||||
 | 
			
		||||
int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *session,
 | 
			
		||||
int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession,
 | 
			
		||||
                               AVBufferRef *device_ref, const char *load_plugins);
 | 
			
		||||
 | 
			
		||||
int ff_qsv_init_session_frames(AVCodecContext *avctx, mfxSession *session,
 | 
			
		||||
                               QSVFramesContext *qsv_frames_ctx,
 | 
			
		||||
                               const char *load_plugins, int opaque);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -59,7 +59,7 @@ static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession ses
 | 
			
		||||
        if (!q->frames_ctx.hw_frames_ctx)
 | 
			
		||||
            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->iopattern == MFX_IOPATTERN_OUT_OPAQUE_MEMORY);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
 | 
			
		||||
@ -684,7 +684,7 @@ static int qsvenc_init_session(AVCodecContext *avctx, QSVEncContext *q)
 | 
			
		||||
        if (!q->frames_ctx.hw_frames_ctx)
 | 
			
		||||
            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->param.IOPattern == MFX_IOPATTERN_IN_OPAQUE_MEMORY);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user