From patchwork Tue Jan 17 22:30:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 2238 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp738821vsb; Tue, 17 Jan 2017 14:30:32 -0800 (PST) X-Received: by 10.28.182.6 with SMTP id g6mr302590wmf.11.1484692232224; Tue, 17 Jan 2017 14:30:32 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b6si17564602wmh.15.2017.01.17.14.30.31; Tue, 17 Jan 2017 14:30:32 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@jkqxz-net.20150623.gappssmtp.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 690ED689A91; Wed, 18 Jan 2017 00:30:18 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f46.google.com (mail-wm0-f46.google.com [74.125.82.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 725C7689962 for ; Wed, 18 Jan 2017 00:30:11 +0200 (EET) Received: by mail-wm0-f46.google.com with SMTP id r144so245951819wme.1 for ; Tue, 17 Jan 2017 14:30:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=subject:to:references:from:message-id:date:user-agent:mime-version :in-reply-to:content-transfer-encoding; bh=fO+QBexw7GHjeWeRo3P4cheNcFpSfQiLMU0fbcuQg6o=; b=STwoQkEwyPjpBRBPG3zJYHZFi0ELKM+ZYp2KDzeE3dnOzB8tpM446Aa0QVbj2nKInk OY+eb/AfxfqeObXa8QNskmuz58EeZq+QdIMUMWvWFSS+nM61K0u/Bw4Ep7iyGx7Tk3M8 yIG5MSnQZDqFDNakxh4bKgUD3XPXiMae7P0LalFK03gmOawd032mFIuouv+yBwKjDZsY 4qbg6+rXHcRmNMj9w9v7NaV6JNaHvQ706IQi6fcAn/rsvlppQu9dYgaiha8/bslB957L DyeOs5e7PIaLfOF0M+IXlw5dps4OW6VE/Dqwh+2j2Jk/P/5tinO+BNPSwg36LJqj1sWl RGIg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-transfer-encoding; bh=fO+QBexw7GHjeWeRo3P4cheNcFpSfQiLMU0fbcuQg6o=; b=OoUUqYVoxk+ILNYWxmSEJQPZuup3IYIVWIXkbwoKhO2BRWtI/rpq3SkZD0HL/+rbS8 8iS8zGZL27wdbou5SwPbQAL6Kxi4jx2i82tudG5VWURsJyMWU53PTvZZAhEXY8NJKlaW LkBPPp43BaBSAbN/s/XO+L1jav67q50rGwh9wRXhVJM+FvOAw8SJLA0Ok52WX6lsmfwZ SSbrCTaFin1Ba+TqwJsldhdZEEy8U9xlkQ6IPKBwb4HJeAtb/68Df6C1ubPyVi1QweOO 1dJaW2vMsCpqdmuNix5PJMOYSM4tOLXqqmV2G2WNwFgguxBJDfjcQglsk/GfPIOod6DI /LBg== X-Gm-Message-State: AIkVDXKabPgvkg22nm/QZnNpUZdkByoFB3eO18li0Nb7Mwt53A/CezcFNynY4kWh/RqZtQ== X-Received: by 10.28.17.20 with SMTP id 20mr284879wmr.99.1484692220983; Tue, 17 Jan 2017 14:30:20 -0800 (PST) Received: from [192.168.0.8] (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id k11sm40111569wmb.18.2017.01.17.14.30.20 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Jan 2017 14:30:20 -0800 (PST) To: FFmpeg development discussions and patches References: <6b40ed0b-4faf-1591-1a47-e8ad6bd12952@jkqxz.net> From: Mark Thompson Message-ID: <916eb042-dfe8-80dd-a786-9a3fa2ba4bad@jkqxz.net> Date: Tue, 17 Jan 2017 22:30:19 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.4.0 MIME-Version: 1.0 In-Reply-To: <6b40ed0b-4faf-1591-1a47-e8ad6bd12952@jkqxz.net> Subject: [FFmpeg-devel] [PATCH 2/6] qsv: Add ability to create a session from a device context X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/qsv.c | 121 +++++++++++++++++++++++++++------------------- libavcodec/qsv_internal.h | 3 ++ 2 files changed, 73 insertions(+), 51 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index aac6ce6..5e6f462 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -214,6 +214,73 @@ int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session, return 0; } +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, + }; + AVHWDeviceContext *device_ctx = (AVHWDeviceContext*)device_ref->data; + AVQSVDeviceContext *device_hwctx = device_ctx->hwctx; + mfxSession parent_session = device_hwctx->session; + + mfxSession session; + mfxVersion ver; + mfxIMPL impl; + mfxHDL handle = NULL; + mfxHandleType handle_type; + mfxStatus err; + + int i, ret; + + err = MFXQueryIMPL(parent_session, &impl); + if (err == MFX_ERR_NONE) + err = MFXQueryVersion(parent_session, &ver); + if (err != MFX_ERR_NONE) { + av_log(avctx, AV_LOG_ERROR, "Error querying the session attributes\n"); + return ff_qsv_error(err); + } + + for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { + err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle); + if (err == MFX_ERR_NONE) { + handle_type = handle_types[i]; + break; + } + handle = NULL; + } + if (!handle) { + av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved " + "from the session\n"); + } + + err = MFXInit(impl, &ver, &session); + if (err != MFX_ERR_NONE) { + av_log(avctx, AV_LOG_ERROR, + "Error initializing a child MFX session: %d\n", err); + return ff_qsv_error(err); + } + + if (handle) { + err = MFXVideoCORE_SetHandle(session, handle_type, handle); + if (err != MFX_ERR_NONE) { + av_log(avctx, AV_LOG_ERROR, "Error setting a HW handle: %d\n", err); + return ff_qsv_error(err); + } + } + + ret = qsv_load_plugins(session, load_plugins, avctx); + if (ret < 0) { + av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n"); + return ret; + } + + *psession = session; + return 0; +} + static mfxStatus qsv_frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, mfxFrameAllocResponse *resp) { @@ -265,11 +332,6 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession, QSVFramesContext *qsv_frames_ctx, const char *load_plugins, int opaque) { - 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, @@ -281,59 +343,16 @@ int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *psession, 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 session; - mfxVersion ver; - mfxIMPL impl; - mfxHDL handle = NULL; - mfxHandleType handle_type; mfxStatus err; int i, ret; - err = MFXQueryIMPL(parent_session, &impl); - if (err == MFX_ERR_NONE) - err = MFXQueryVersion(parent_session, &ver); - if (err != MFX_ERR_NONE) { - av_log(avctx, AV_LOG_ERROR, "Error querying the session attributes\n"); - return ff_qsv_error(err); - } - - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle); - if (err == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } - handle = NULL; - } - if (!handle) { - av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved " - "from the session\n"); - } - - err = MFXInit(impl, &ver, &session); - if (err != MFX_ERR_NONE) { - av_log(avctx, AV_LOG_ERROR, - "Error initializing a child MFX session: %d\n", err); - return ff_qsv_error(err); - } - - if (handle) { - err = MFXVideoCORE_SetHandle(session, handle_type, handle); - if (err != MFX_ERR_NONE) { - av_log(avctx, AV_LOG_ERROR, "Error setting a HW handle: %d\n", err); - return ff_qsv_error(err); - } - } - - ret = qsv_load_plugins(session, load_plugins, avctx); - if (ret < 0) { - av_log(avctx, AV_LOG_ERROR, "Error loading plugins\n"); + ret = ff_qsv_init_session_device(avctx, &session, + frames_ctx->device_ref, load_plugins); + if (ret < 0) return ret; - } if (!opaque) { av_freep(&qsv_frames_ctx->mids); diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 5d2a216..e32148c 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -70,6 +70,9 @@ 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_device(AVCodecContext *avctx, mfxSession *session, + AVBufferRef *device_ref, const char *load_plugins); + int ff_qsv_init_session_hwcontext(AVCodecContext *avctx, mfxSession *session, QSVFramesContext *qsv_frames_ctx, const char *load_plugins, int opaque);