From patchwork Fri May 8 15:18:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19572 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id C129544922A for ; Fri, 8 May 2020 18:28:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AB2EB6880F5; Fri, 8 May 2020 18:28:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A4258688044 for ; Fri, 8 May 2020 18:28:38 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id 50so1836661wrc.11 for ; Fri, 08 May 2020 08:28:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=yDNwvV8lo+fyDi9SdPnA+4VoQxg8opal82yG46KpIv0=; b=QEYJQvtir3kqrNxMMou6RoV2OakgjwnQvdfyMsMuQnD9aaALwDTM774ORmL+98DNOb gI6mNdsyRyhUrFptI7XJL51zWSfBB7T6N278NEtnC2jlN2/OpylHVXk63TvWmX33DNjb mhqkxnzgfeZppnRblHZrYPqW6IoStk16W1jKxjhWhelTEqcdOHHmPVSt9Ra5GyYdJjb+ eylx8P/aJnCrYt2kmxtgyomtdOUr8G7F0VO4WZMIj/Y54tNZjHpZLQE78QJXWlAqCXga Dp73OGUatsaLDjaQx0wIsk5+h/8zq0LsFjJKuADtATG3sp6+eFdHSrZrk9GHGiXWlzYE /j9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=yDNwvV8lo+fyDi9SdPnA+4VoQxg8opal82yG46KpIv0=; b=n55ybv2cVsTNHysYSo8nLWQn60pjOFPeqTxohHmtNW1kPhPlmvqsRZoOgz+r8JkqID 0sUfr21t+9q6fWT81KIQMnf8yZLfbUSD0C0yBYgVu0gBjYr1Jd5StMEpFYoKieYQ3wpS ql9vNmKO2UP6Hhm2rPjcK0R7cWrDnqRp3S44Kxt5ofSv3RGgw4y8aHBjiZfeeuuBx0FK W+OTN/5xEn3ICPjGGaqFNMpxYLHD6tL7yRx2cSDesqBdY740Dg7sXgTzpbhB1/MLlLKM 9I4kxlajEAqdmdBVsZG2J290Y4aXfqtGRVX5TJmw/K2WAw8NnKN2rSRJmCrjc7BWKCWl n41g== X-Gm-Message-State: AGi0PuaFTGrhLG5Zc6qwH+VhlXzXXhamYyGYMEi01Df3bTyM//kfA8QU kmqJ7dsgWu9BoXGtUz7xxdch05l6FtzhzQ== X-Google-Smtp-Source: APiQypLfNEie7I6KnZipuwIwnTsozaJtwZx+BR4u+O/Q93GsgQ4V5Bhuda4T9k+HU3q5K2kWgYsXUw== X-Received: by 2002:adf:9d8b:: with SMTP id p11mr3486111wre.322.1588951221935; Fri, 08 May 2020 08:20:21 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:21 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:11 +0100 Message-Id: <20200508151821.49051-1-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200424145219.54067-4-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 01/11] fftools/qsv: enabling d3d11va/dxva2 device selection 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin child_device_type argument is responsible for selection. Usage examples: DirectX 11 -init_hw_device qsv:hw,child_device_type=d3d11va DirectX 9 -init_hw_device qsv:hw,child_device_type=dxva2 Signed-off-by: Artem Galin --- fftools/ffmpeg_opt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 60bb437ea7..83f1b53e9d 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -558,7 +558,11 @@ static int opt_init_hw_device(void *optctx, const char *opt, const char *arg) printf("\n"); exit_program(0); } else { - return hw_device_init_from_string(arg, NULL); + int err; + if (!arg) + return AVERROR(ENOMEM); + err = hw_device_init_from_string(arg, NULL); + return err; } } From patchwork Fri May 8 15:18:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19564 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 7F4D444A590 for ; Fri, 8 May 2020 18:20:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 51461688399; Fri, 8 May 2020 18:20:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 710D66880C1 for ; Fri, 8 May 2020 18:20:28 +0300 (EEST) Received: by mail-wr1-f50.google.com with SMTP id l18so2327713wrn.6 for ; Fri, 08 May 2020 08:20:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=u3/5vmhlXmWFS8pE3w5z+qBYywyAN7UGw+IOH7V6rmE=; b=RHBqcEIi4UjLq8My2pTKCPabCDLczlRY1fTso/XgJjWSFbgCyLFL0xvGVCU3Hcnvyn WmKeqP9UGnClEkoZjuG7SMQ8wmPFGg7HQTAGvbY///m4NzoikJ9thR1Ldw1SMDja3spM cNPVkbbmltegfRKmA/qpoI1i7lWUPlD3vE1K/idd1TMMO8IGXJcPs5XBgeXRzt6X0oV+ mk0+l5tEdvMpebRrEpqcj0Q8kQZAl+krGpOqQ9TrHHGdS7HaFi3bi3jsgA7ZY9TZXCLN jleKbWoJTPxs3HlIA6fz1qOkdy/1Yg3sw567u3+SILKZs8AgFvvcEYL35Fh0dV9H7FaL aqIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=u3/5vmhlXmWFS8pE3w5z+qBYywyAN7UGw+IOH7V6rmE=; b=LkPCYSwzlv20J6mtyOpUZmYE680YuZgycHY1ivTJ/qgRS4cNQz/GlXqR+vP9ChEE61 Ac+2ZxK32JaebYQiURRo1jCFoTxo/J6id4hih3mTqo4hxnoU6Sve4Jnf5Is/2QjfxFVT KXPAVGmmzQolyGN1k3/CGkeXxsDRvv/n9oFvRKnG/PUc/MbrymUJ6F7Z0kCPrFm0Mnuf s3sPPzRv727snrV0LME2c9fOSJxrudaxYvGufLzObaBDrsaFv5XMpGpOeLjcHhDyiiil ooaSs6CIWTaC+oAIfuEmKmXDXGpdA2MZ6xsKYaaYB8D7/2fZW21cQfy/uZxH/nRxW0ou uvWg== X-Gm-Message-State: AGi0PuYNJ3U2O0tOOb4lHaAn4Gpy/kaLJhIhG2PUWr81CZBZlLNxgNdK JCE4QVK2C1upgp3/9fGkGS7Rzuqrk7tqeg== X-Google-Smtp-Source: APiQypI3gSb9Gq+/SISkMXtCy3HPycb3EcXiDbz9ykv08TGI0X41D5inuKvi36buVk8+o+LHUcsJLA== X-Received: by 2002:a05:6000:18c:: with SMTP id p12mr3369634wrx.335.1588951227422; Fri, 08 May 2020 08:20:27 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:26 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:12 +0100 Message-Id: <20200508151821.49051-2-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 02/11] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Adding DX11 relevant device type checks and adjusting callbacks with proper MediaSDK pair type support. Extending structure for proper MediaSDK pair type support. Signed-off-by: Artem Galin --- libavcodec/qsv.c | 53 ++++++++++++++++++++++++++------------- libavcodec/qsv_internal.h | 2 +- 2 files changed, 37 insertions(+), 18 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index db98c75073..cc427c6dfd 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -36,6 +36,8 @@ #include "avcodec.h" #include "qsv_internal.h" +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) + #if QSV_VERSION_ATLEAST(1, 12) #include "mfx/mfxvp8.h" #endif @@ -221,7 +223,9 @@ int ff_qsv_find_surface_idx(QSVFramesContext *ctx, QSVFrame *frame) int i; for (i = 0; i < ctx->nb_mids; i++) { QSVMid *mid = &ctx->mids[i]; - if (mid->handle == frame->surface.Data.MemId) + mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId; + if ((mid->handle_pair.first == pair->first) && + (mid->handle_pair.second == pair->second)) return i; } return AVERROR_BUG; @@ -362,7 +366,11 @@ static int ff_qsv_set_display_handle(AVCodecContext *avctx, QSVSession *qs) int ff_qsv_init_internal_session(AVCodecContext *avctx, QSVSession *qs, const char *load_plugins, int gpu_copy) { +#if CONFIG_D3D11VA + mfxIMPL impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11; +#else mfxIMPL impl = MFX_IMPL_AUTO_ANY; +#endif mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; mfxInitParam init_par = { MFX_IMPL_AUTO_ANY }; @@ -451,7 +459,7 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref) for (i = 0; i < nb_surfaces; i++) { QSVMid *mid = &mids[i]; - mid->handle = frames_hwctx->surfaces[i].Data.MemId; + mid->handle_pair = *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId); mid->hw_frames_ref = hw_frames_ref1; } @@ -628,7 +636,7 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) goto fail; qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info; - qsv_mid->surf.Data.MemId = qsv_mid->handle; + qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair; /* map the data to the system memory */ ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame, @@ -661,7 +669,13 @@ static mfxStatus qsv_frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) static mfxStatus qsv_frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) { QSVMid *qsv_mid = (QSVMid*)mid; - *hdl = qsv_mid->handle; + mfxHDLPair *pair_dst = (mfxHDLPair*)hdl; + mfxHDLPair *pair_src = (mfxHDLPair*)&qsv_mid->handle_pair; + + pair_dst->first = pair_src->first; + + if (pair_src->second != (mfxMemId)MFX_INFINITE) + pair_dst->second = pair_src->second; return MFX_ERR_NONE; } @@ -669,24 +683,19 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, AVBufferRef *device_ref, const char *load_plugins, int gpu_copy) { - 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; mfxInitParam init_par = { MFX_IMPL_AUTO_ANY }; mfxHDL handle = NULL; + int hw_handle_supported = 0; mfxSession session; mfxVersion ver; mfxIMPL impl; mfxHandleType handle_type; mfxStatus err; - - int i, ret; + int ret; err = MFXQueryIMPL(parent_session, &impl); if (err == MFX_ERR_NONE) @@ -695,13 +704,23 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, return ff_qsv_print_error(avctx, err, "Error querying the session attributes"); - 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; + if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_VA_DISPLAY; + hw_handle_supported = 1; + } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D11_DEVICE; + hw_handle_supported = 1; + } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER; + hw_handle_supported = 1; + } + + if (hw_handle_supported) { + err = MFXVideoCORE_GetHandle(parent_session, handle_type, &handle); + if (err != MFX_ERR_NONE) { + return ff_qsv_print_error(avctx, err, + "Error getting handle session"); } - handle = NULL; } if (!handle) { av_log(avctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved " diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 6489836a67..370ab464e7 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -60,7 +60,7 @@ typedef struct QSVMid { AVBufferRef *hw_frames_ref; - mfxHDL handle; + mfxHDLPair handle_pair; AVFrame *locked_frame; AVFrame *hw_frame; From patchwork Fri May 8 15:18:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19574 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E098744A4AA for ; Fri, 8 May 2020 18:51:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B7FB868990F; Fri, 8 May 2020 18:51:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0DCA4688121 for ; Fri, 8 May 2020 18:51:33 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id j5so2464632wrq.2 for ; Fri, 08 May 2020 08:51:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bbtgyXZJ9H6BaRYJHbGVS8wDKOL/MfFAuVp3+BDkHDU=; b=gvsqH2lNiNx1ZKd0NPPkl6pXllYFXR9S8PXNr4nBDE2DSfIvte+NvGllj0QbB4KODm BSRG3qJ9+boIsmhlgKC3A4E2hGzvSD4mTJKJ3TPgOIyObTTZEghaJhIcnjOs7KGLhY8A Po5BQnDfMJBij3iM/a6JgQIF9FDI8j2XqQet0jRu67s3d/4ysiIjhPdatXtLP9oXzY53 xWjnwo5jdUM4Y7xVm9+IwsQYOkXNw9nbpeqXpWvf9bNq7ssYOPVuHmZmC8oCfdwV4a6w 2wssjFA/yccmf1JC2RXh85PjO2ie3NZR2GJ8wNBf2f9PYECwroPTcikIq78/pNVQ1trc iDPw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bbtgyXZJ9H6BaRYJHbGVS8wDKOL/MfFAuVp3+BDkHDU=; b=A40wWmTot0urp/aNKHsOl/OCOFNH4EvDLAff10M7BqwlUQWRzkhEPpzHqJFMPoYJiM xjwjOVac2aPxrn1ITbezNyEbmyChdTcq/NiiJ/pkiVL2Yqyy2oHoQaAhPn/P3hlSWWL7 Oeyz6aYMAWQDvr7Daupj9Km7IPXshqdB8w64I67rH4wIo/yQJFarxkz12V6Rcsi6fwuv V8aZI306ia975JLp3wFQP8WqxNp3xU5p1f35gyNt9zLU2oz3Ce18ANdpSbrNUFFGA553 vm3ywNTGgGrTNupuqM44ELyszUJ6QN/KgggBJJdNToKQap8/jUM/r0Ct+Rkd5wAGhXKm QENA== X-Gm-Message-State: AGi0PuZA/HBDuYEBNmNvQKt1w1+8Kcn35nJlbM4AS59KKYcpL0pEgTW9 wnRcnkYfMtOTmlajzHr1G457nsoHU6paPA== X-Google-Smtp-Source: APiQypIu5fMNXBnw8aL8scV4F5ZD49+T8tTikdJY5CS2MxvYNafCXGq94dLqgY4yATCHPGhKP5u7hw== X-Received: by 2002:adf:f1c4:: with SMTP id z4mr3765841wro.25.1588951229766; Fri, 08 May 2020 08:20:29 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:29 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:13 +0100 Message-Id: <20200508151821.49051-3-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 03/11] libavutil/hwcontext_d3d11va: adding more texture information to the D3D11 hwcontext API 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Added AVD3D11FrameDescriptors array to store array of single textures in case if there is no way to allocate array texture with BindFlags = D3D11_BIND_RENDER_TARGET. Signed-off-by: Artem Galin --- libavutil/hwcontext_d3d11va.c | 26 ++++++++++++++++++++------ libavutil/hwcontext_d3d11va.h | 9 +++++++++ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c index c8ae58f908..cd80931dd3 100644 --- a/libavutil/hwcontext_d3d11va.c +++ b/libavutil/hwcontext_d3d11va.c @@ -72,8 +72,8 @@ static av_cold void load_functions(void) } typedef struct D3D11VAFramesContext { - int nb_surfaces_used; - + size_t nb_surfaces; + size_t nb_surfaces_used; DXGI_FORMAT format; ID3D11Texture2D *staging_texture; @@ -112,6 +112,8 @@ static void d3d11va_frames_uninit(AVHWFramesContext *ctx) if (s->staging_texture) ID3D11Texture2D_Release(s->staging_texture); s->staging_texture = NULL; + + av_freep(&frames_hwctx->texture_infos); } static int d3d11va_frames_get_constraints(AVHWDeviceContext *ctx, @@ -152,8 +154,10 @@ static void free_texture(void *opaque, uint8_t *data) av_free(data); } -static AVBufferRef *wrap_texture_buf(ID3D11Texture2D *tex, int index) +static AVBufferRef *wrap_texture_buf(AVHWFramesContext *ctx, ID3D11Texture2D *tex, int index) { + D3D11VAFramesContext *s = ctx->internal->priv; + AVD3D11VAFramesContext *frames_hwctx = ctx->hwctx; AVBufferRef *buf; AVD3D11FrameDescriptor *desc = av_mallocz(sizeof(*desc)); if (!desc) { @@ -161,6 +165,10 @@ static AVBufferRef *wrap_texture_buf(ID3D11Texture2D *tex, int index) return NULL; } + frames_hwctx->texture_infos[s->nb_surfaces_used].texture = tex; + frames_hwctx->texture_infos[s->nb_surfaces_used].index = index; + s->nb_surfaces_used++; + desc->texture = tex; desc->index = index; @@ -199,7 +207,7 @@ static AVBufferRef *d3d11va_alloc_single(AVHWFramesContext *ctx) return NULL; } - return wrap_texture_buf(tex, 0); + return wrap_texture_buf(ctx, tex, 0); } static AVBufferRef *d3d11va_pool_alloc(void *opaque, int size) @@ -220,7 +228,7 @@ static AVBufferRef *d3d11va_pool_alloc(void *opaque, int size) } ID3D11Texture2D_AddRef(hwctx->texture); - return wrap_texture_buf(hwctx->texture, s->nb_surfaces_used++); + return wrap_texture_buf(ctx, hwctx->texture, s->nb_surfaces_used); } static int d3d11va_frames_init(AVHWFramesContext *ctx) @@ -267,7 +275,7 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx) av_log(ctx, AV_LOG_ERROR, "User-provided texture has mismatching parameters\n"); return AVERROR(EINVAL); } - } else if (texDesc.ArraySize > 0) { + } else if (!(texDesc.BindFlags & D3D11_BIND_RENDER_TARGET) && texDesc.ArraySize > 0) { hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL, &hwctx->texture); if (FAILED(hr)) { av_log(ctx, AV_LOG_ERROR, "Could not create the texture (%lx)\n", (long)hr); @@ -275,6 +283,12 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx) } } + hwctx->texture_infos = av_mallocz_array(ctx->initial_pool_size, sizeof(*hwctx->texture_infos)); + if (!hwctx->texture_infos) + return AVERROR(ENOMEM); + + s->nb_surfaces = ctx->initial_pool_size; + ctx->internal->pool_internal = av_buffer_pool_init2(sizeof(AVD3D11FrameDescriptor), ctx, d3d11va_pool_alloc, NULL); if (!ctx->internal->pool_internal) diff --git a/libavutil/hwcontext_d3d11va.h b/libavutil/hwcontext_d3d11va.h index 9f91e9b1b6..295bdcd90d 100644 --- a/libavutil/hwcontext_d3d11va.h +++ b/libavutil/hwcontext_d3d11va.h @@ -164,6 +164,15 @@ typedef struct AVD3D11VAFramesContext { * This field is ignored/invalid if a user-allocated texture is provided. */ UINT MiscFlags; + + /** + * In case if texture structure member above is not NULL contains the same texture + * pointer for all elements and different indexes into the array texture. + * In case if texture structure member above is NULL, all elements contains + * pointers to separate non-array textures and 0 indexes. + * This field is ignored/invalid if a user-allocated texture is provided. + */ + AVD3D11FrameDescriptor *texture_infos; } AVD3D11VAFramesContext; #endif /* AVUTIL_HWCONTEXT_D3D11VA_H */ From patchwork Fri May 8 15:18:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19565 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9929F44A590 for ; Fri, 8 May 2020 18:20:39 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7D97F68A484; Fri, 8 May 2020 18:20:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f41.google.com (mail-wm1-f41.google.com [209.85.128.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A1DBD68A3AF for ; Fri, 8 May 2020 18:20:32 +0300 (EEST) Received: by mail-wm1-f41.google.com with SMTP id u127so10997789wmg.1 for ; Fri, 08 May 2020 08:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=236k9StpKfJTZsoOdEdtujEwCo7TqHWT26xHkT4GoG8=; b=h6E247P19M61S8lyxqTRAYz4xvH4CVA1+PAGMjla6wpwExqAlpQCMxrNq9q55nPuW3 YGvFNnXE7s4Lz4Du4SI9uOKlPpJfn/o/zFdTGP1Zr/VoQF8AqJ45CQhdB/p6aqWlj5iI IiZqicOIZwtuaUTAL4+CkTdqH08sXPaPepoLiZSro0XJ7I8x9ds5YI04Yit02Tv22mLk pFKA4IqO64zbpEvfF6RZUj74FuBsgrBouBIR9F8XG2WMvyMoBJosajtLoW2eyaGWtRwv 3RX62EjBdcIts6+eSNM/W3JZcWeDYGbURXLwuEADxs2HyjhMA02pSj6cQQQPw3exKvKD J04g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=236k9StpKfJTZsoOdEdtujEwCo7TqHWT26xHkT4GoG8=; b=Z6vce06Fv7WdPneHHPP0SXzzJLjp072SgARoopzCqWETZFqaQgWOSlKndxdJUoK516 kN2VCx7nuNQmh9V/ONgmcxkCbMdw/T+VoXWNIQN7+QMucC4U7AuMgJRYtYF92c/3eJ40 j/sYQ+wJ4EEwBDAgZowHxybdTD7bs9Hv3uznn6fpzyLEZkHK77Z1GmtxElUD4YtSpKxJ O5+bNoq1MWZ7MflvL/1yBawa8W+Ka532txhL040/aVg5Ykv3Kd2bZAyYg36DPW36SjJn zxhQFISbPvb8q/mIqhIxlu9z1LnBI+y3b3UTHe56nXHbaVy2Jk4s5xHA62h4b7pPkQQk QqPg== X-Gm-Message-State: AGi0PuYxyyf4HpF8QItY6jdUauMrJAd+Rq++4wDeFXTKQCaJXMJuFaqP aeaHMfhNHLNZMJQBsWcpzTfM72XFJEpSTg== X-Google-Smtp-Source: APiQypLHqaaNeWMvxw7cUO28uLGDbsToFA8/xuMGjC2sQS4PBme1Y7pR9rSZ3hH7euPynK6PFe7wlA== X-Received: by 2002:a7b:cb53:: with SMTP id v19mr16210209wmj.166.1588951231644; Fri, 08 May 2020 08:20:31 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:31 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:14 +0100 Message-Id: <20200508151821.49051-4-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 04/11] libavutil/hwcontext_d3d11va: adding the vendor option to D3D11 device creation 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Example: --init_hw_device d3d11va:,vendor=0x8086 qsv_device option is still works and has higher priority over vendor option. Signed-off-by: Artem Galin hwctx; HRESULT hr; + AVDictionaryEntry *e; IDXGIAdapter *pAdapter = NULL; ID3D10Multithread *pMultithread; UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; + int adapter = -1; + long int vendor_id = -1; int is_debug = !!av_dict_get(opts, "debug", NULL, 0); int ret; @@ -553,13 +556,45 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, return AVERROR_UNKNOWN; } + e = av_dict_get(opts, "vendor", NULL, 0); + if (e) { + vendor_id = strtol(e->value, NULL, 0); + } + if (device) { + adapter = atoi(device); + } + + if (adapter >= 0 || vendor_id != -1) { IDXGIFactory2 *pDXGIFactory; hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&pDXGIFactory); if (SUCCEEDED(hr)) { - int adapter = atoi(device); - if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter))) + if (adapter < 0) { + int adapter_cnt = 0; + while (IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter_cnt++, &pAdapter) != DXGI_ERROR_NOT_FOUND) { + DXGI_ADAPTER_DESC adapter_desc; + hr = IDXGIAdapter2_GetDesc(pAdapter, &adapter_desc); + if (FAILED(hr)) { + av_log(ctx, AV_LOG_ERROR, "IDXGIAdapter2_GetDesc returned error with adapter id %d\n", adapter_cnt); + continue; + } + + if (adapter_desc.VendorId == vendor_id) { + break; + } + + if (adapter) + IDXGIAdapter_Release(pAdapter); + } + if (adapter_cnt < 0) { + av_log(ctx, AV_LOG_ERROR, "Failed to find d3d11va adapter by vendor id %ld\n", vendor_id); + IDXGIFactory2_Release(pDXGIFactory); + return AVERROR_UNKNOWN; + } + } else { + if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, &pAdapter))) pAdapter = NULL; + } IDXGIFactory2_Release(pDXGIFactory); } } From patchwork Fri May 8 15:18:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19566 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 9BB0344A590 for ; Fri, 8 May 2020 18:20:43 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 835DA68A4AB; Fri, 8 May 2020 18:20:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A019B6880C1 for ; Fri, 8 May 2020 18:20:36 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id j5so2348894wrq.2 for ; Fri, 08 May 2020 08:20:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=i/X/bBrb4HGMsuad+61FWSqgL/+5m5xDaDxCzD4Miyk=; b=dChBit+DEMf3NmFjSeBT5kTeRBIHOtXlbdHAxeg1IWa1tJUyLU6S0zY1uILyILeXb4 rgMS1AYdHoDbyiqsRpkphF2abplPpitgAkMIrjMRnZaR+65EOeWwrQ3j3+eYy/L0wDq/ ACYrIgxjB+HGBIRf2mz86RBuQvAJpQ/MdawlMoveyai4bfP+c1ZCjaD7YsGD1BsoSfXO 04vV/S9XrAk8vLw3BODUEqGT6ngNARZ7DueNIahsScyIdGQ3B1d2BMYguNku2hroKJFb b5pG1m++ZzzFQaa7gO0ThcwfAqdhbyglI9jIERS7I5y0Nsx2IM+lrMC4R075XbPR3ZiO Sh7A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=i/X/bBrb4HGMsuad+61FWSqgL/+5m5xDaDxCzD4Miyk=; b=SlG/aIO2xNBMk8dBvT9F69Gev/xSa6j78ybfWJCNPuBIHc+mg6W6Egan6qMan4h/67 fuqhmVsIiu6onWsnYup5zZ3vW886/TbXSxItliUbxbidBGzC9nRdKXxrqE8JSRo0HY5L 8TwOIzU5Jp99UGfiEIBTepsE+RfBqXGhmpL5JuAYNSb8Jgo5XSPfnnwQP7PTxZc/le2k vJGTkB8t4PckmHNhR5RpP9yWKnqv0LITZPsml6pigp9tOJaeO58KSv1sOA98yqC0EWBu ua6R2ignRe38WPutPZKrXAbJwEaCLPw9hmu0a/Chlw8KQ+vOZf/MqSVgxWiswQbwm9ud xwhA== X-Gm-Message-State: AGi0PuZu/wyX+0RLBrnDyc2xOuTK4eIuGkOTgydYNhdJZlziYKXfFtZZ PleUTUbm81OwXzpZzgeQENi659fxabWbAw== X-Google-Smtp-Source: APiQypJXUlAktH9LyVTDcrnKeE0lP2R7K+HScK+eXMuJdqQPTv9jU7vlglCDwjhWE8+QvtFkn/W0Hg== X-Received: by 2002:a05:6000:12cf:: with SMTP id l15mr3472994wrx.348.1588951235216; Fri, 08 May 2020 08:20:35 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:34 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:15 +0100 Message-Id: <20200508151821.49051-5-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 05/11] libavutil/hwcontext_qsv: enabling D3D11 usage by default, supporting D3D11 in qsv hwcontext 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Makes selection of d3d11va device type by default and over DirectX 9, which might break users with older drivers/systems. DCH driver with Gen6th support should be still fine. This enables usage of non-powered/headless GPU, better HDR support. Pool of resources is allocated as one texture with array of slices. DirectX 9 is still supported but requires explicit selection. Example: --init_hw_device qsv:hw,child_device_type=dxva2 Signed-off-by: Artem Galin --- libavutil/hwcontext_qsv.c | 395 ++++++++++++++++++++++++++++++-------- 1 file changed, 320 insertions(+), 75 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index b1b67400de..38681dfc9b 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -27,9 +27,13 @@ #include #endif +#define COBJMACROS #if CONFIG_VAAPI #include "hwcontext_vaapi.h" #endif +#if CONFIG_D3D11VA +#include "hwcontext_d3d11va.h" +#endif #if CONFIG_DXVA2 #include "hwcontext_dxva2.h" #endif @@ -44,6 +48,8 @@ #include "pixdesc.h" #include "time.h" +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) + typedef struct QSVDevicePriv { AVBufferRef *child_device_ctx; } QSVDevicePriv; @@ -70,6 +76,7 @@ typedef struct QSVFramesContext { AVBufferRef *child_frames_ref; mfxFrameSurface1 *surfaces_internal; + mfxHDLPair *handle_pairs_internal; int nb_surfaces_used; // used in the frame allocator for non-opaque surfaces @@ -81,20 +88,6 @@ typedef struct QSVFramesContext { mfxExtBuffer *ext_buffers[1]; } QSVFramesContext; -static const struct { - mfxHandleType handle_type; - enum AVHWDeviceType device_type; - enum AVPixelFormat pix_fmt; -} supported_handle_types[] = { -#if CONFIG_VAAPI - { MFX_HANDLE_VA_DISPLAY, AV_HWDEVICE_TYPE_VAAPI, AV_PIX_FMT_VAAPI }, -#endif -#if CONFIG_DXVA2 - { MFX_HANDLE_D3D9_DEVICE_MANAGER, AV_HWDEVICE_TYPE_DXVA2, AV_PIX_FMT_DXVA2_VLD }, -#endif - { 0 }, -}; - static const struct { enum AVPixelFormat pix_fmt; uint32_t fourcc; @@ -115,28 +108,32 @@ static uint32_t qsv_fourcc_from_pix_fmt(enum AVPixelFormat pix_fmt) return 0; } +#if CONFIG_D3D11VA +static uint32_t qsv_get_d3d11va_bind_flags(int mem_type) +{ + uint32_t bind_flags = 0; + + if ((mem_type & MFX_MEMTYPE_VIDEO_MEMORY_ENCODER_TARGET) && (mem_type & MFX_MEMTYPE_INTERNAL_FRAME)) + bind_flags = D3D11_BIND_DECODER | D3D11_BIND_VIDEO_ENCODER; + else + bind_flags = D3D11_BIND_DECODER; + + if ((MFX_MEMTYPE_FROM_VPPOUT & mem_type) || (MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET & mem_type)) + bind_flags = D3D11_BIND_RENDER_TARGET; + + return bind_flags; +} +#endif + static int qsv_device_init(AVHWDeviceContext *ctx) { AVQSVDeviceContext *hwctx = ctx->hwctx; QSVDeviceContext *s = ctx->internal->priv; - + int hw_handle_supported = 0; + mfxHandleType handle_type; + enum AVHWDeviceType device_type; + enum AVPixelFormat pix_fmt; mfxStatus err; - int i; - - for (i = 0; supported_handle_types[i].handle_type; i++) { - err = MFXVideoCORE_GetHandle(hwctx->session, supported_handle_types[i].handle_type, - &s->handle); - if (err == MFX_ERR_NONE) { - s->handle_type = supported_handle_types[i].handle_type; - s->child_device_type = supported_handle_types[i].device_type; - s->child_pix_fmt = supported_handle_types[i].pix_fmt; - break; - } - } - if (!s->handle) { - av_log(ctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved " - "from the session\n"); - } err = MFXQueryIMPL(hwctx->session, &s->impl); if (err == MFX_ERR_NONE) @@ -146,6 +143,41 @@ static int qsv_device_init(AVHWDeviceContext *ctx) return AVERROR_UNKNOWN; } + if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(s->impl)) { +#if CONFIG_VAAPI + handle_type = MFX_HANDLE_VA_DISPLAY; + device_type = AV_HWDEVICE_TYPE_VAAPI; + pix_fmt = AV_PIX_FMT_VAAPI; + hw_handle_supported = 1; +#endif + } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(s->impl)) { +#if CONFIG_D3D11VA + handle_type = MFX_HANDLE_D3D11_DEVICE; + device_type = AV_HWDEVICE_TYPE_D3D11VA; + pix_fmt = AV_PIX_FMT_D3D11; + hw_handle_supported = 1; +#endif + } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(s->impl)) { +#if CONFIG_DXVA2 + handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER; + device_type = AV_HWDEVICE_TYPE_DXVA2; + pix_fmt = AV_PIX_FMT_DXVA2_VLD; + hw_handle_supported = 1; +#endif + } + + if (hw_handle_supported) { + err = MFXVideoCORE_GetHandle(hwctx->session, handle_type, &s->handle); + if (err == MFX_ERR_NONE) { + s->handle_type = handle_type; + s->child_device_type = device_type; + s->child_pix_fmt = pix_fmt; + } + } + if (!s->handle) { + av_log(ctx, AV_LOG_VERBOSE, "No supported hw handle could be retrieved " + "from the session\n"); + } return 0; } @@ -175,6 +207,7 @@ static void qsv_frames_uninit(AVHWFramesContext *ctx) av_freep(&s->mem_ids); av_freep(&s->surface_ptrs); av_freep(&s->surfaces_internal); + av_freep(&s->handle_pairs_internal); av_buffer_unref(&s->child_frames_ref); } @@ -190,6 +223,8 @@ static AVBufferRef *qsv_pool_alloc(void *opaque, int size) if (s->nb_surfaces_used < hwctx->nb_surfaces) { s->nb_surfaces_used++; + av_buffer_create((uint8_t*)(s->handle_pairs_internal + s->nb_surfaces_used - 1), + sizeof(*s->handle_pairs_internal), qsv_pool_release_dummy, NULL, 0); return av_buffer_create((uint8_t*)(s->surfaces_internal + s->nb_surfaces_used - 1), sizeof(*hwctx->surfaces), qsv_pool_release_dummy, NULL, 0); } @@ -229,6 +264,13 @@ static int qsv_init_child_ctx(AVHWFramesContext *ctx) child_device_hwctx->display = (VADisplay)device_priv->handle; } #endif +#if CONFIG_D3D11VA + if (child_device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { + AVD3D11VADeviceContext *child_device_hwctx = child_device_ctx->hwctx; + ID3D11Device_AddRef((ID3D11Device*)device_priv->handle); + child_device_hwctx->device = (ID3D11Device*)device_priv->handle; + } +#endif #if CONFIG_DXVA2 if (child_device_ctx->type == AV_HWDEVICE_TYPE_DXVA2) { AVDXVA2DeviceContext *child_device_hwctx = child_device_ctx->hwctx; @@ -255,6 +297,16 @@ static int qsv_init_child_ctx(AVHWFramesContext *ctx) child_frames_ctx->width = FFALIGN(ctx->width, 16); child_frames_ctx->height = FFALIGN(ctx->height, 16); +#if CONFIG_D3D11VA + if (child_device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { + AVD3D11VAFramesContext *child_frames_hwctx = child_frames_ctx->hwctx; + if (hwctx->frame_type == 0) + hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; + if (hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE) + child_frames_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED; + child_frames_hwctx->BindFlags = qsv_get_d3d11va_bind_flags(hwctx->frame_type); + } +#endif #if CONFIG_DXVA2 if (child_device_ctx->type == AV_HWDEVICE_TYPE_DXVA2) { AVDXVA2FramesContext *child_frames_hwctx = child_frames_ctx->hwctx; @@ -274,16 +326,41 @@ static int qsv_init_child_ctx(AVHWFramesContext *ctx) #if CONFIG_VAAPI if (child_device_ctx->type == AV_HWDEVICE_TYPE_VAAPI) { AVVAAPIFramesContext *child_frames_hwctx = child_frames_ctx->hwctx; - for (i = 0; i < ctx->initial_pool_size; i++) - s->surfaces_internal[i].Data.MemId = child_frames_hwctx->surface_ids + i; + for (i = 0; i < ctx->initial_pool_size; i++) { + s->handle_pairs_internal[i].first = child_frames_hwctx->surface_ids + i; + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; + } hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; } #endif +#if CONFIG_D3D11VA + if (child_device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { + AVD3D11VAFramesContext *child_frames_hwctx = child_frames_ctx->hwctx; + for (i = 0; i < ctx->initial_pool_size; i++) { + s->handle_pairs_internal[i].first = (mfxMemId)child_frames_hwctx->texture_infos[i].texture; + if(child_frames_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + } else { + s->handle_pairs_internal[i].second = (mfxMemId)child_frames_hwctx->texture_infos[i].index; + } + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; + } + if (child_frames_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + hwctx->frame_type |= MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; + } else { + hwctx->frame_type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; + } + } +#endif #if CONFIG_DXVA2 if (child_device_ctx->type == AV_HWDEVICE_TYPE_DXVA2) { AVDXVA2FramesContext *child_frames_hwctx = child_frames_ctx->hwctx; - for (i = 0; i < ctx->initial_pool_size; i++) - s->surfaces_internal[i].Data.MemId = (mfxMemId)child_frames_hwctx->surfaces[i]; + for (i = 0; i < ctx->initial_pool_size; i++) { + s->handle_pairs_internal[i].first = (mfxMemId)child_frames_hwctx->surfaces[i]; + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; + } if (child_frames_hwctx->surface_type == DXVA2_VideoProcessorRenderTarget) hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; else @@ -348,6 +425,11 @@ static int qsv_init_pool(AVHWFramesContext *ctx, uint32_t fourcc) return AVERROR(EINVAL); } + s->handle_pairs_internal = av_mallocz_array(ctx->initial_pool_size, + sizeof(*s->handle_pairs_internal)); + if (!s->handle_pairs_internal) + return AVERROR(ENOMEM); + s->surfaces_internal = av_mallocz_array(ctx->initial_pool_size, sizeof(*s->surfaces_internal)); if (!s->surfaces_internal) @@ -421,7 +503,13 @@ static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) { - *hdl = mid; + mfxHDLPair *pair_dst = (mfxHDLPair*)hdl; + mfxHDLPair *pair_src = (mfxHDLPair*)mid; + + pair_dst->first = pair_src->first; + + if (pair_src->second != (mfxMemId)MFX_INFINITE) + pair_dst->second = pair_src->second; return MFX_ERR_NONE; } @@ -614,13 +702,26 @@ static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx, sizeof(*dst_hwctx->surface_ids)); if (!dst_hwctx->surface_ids) return AVERROR(ENOMEM); - for (i = 0; i < src_hwctx->nb_surfaces; i++) - dst_hwctx->surface_ids[i] = - *(VASurfaceID*)src_hwctx->surfaces[i].Data.MemId; + for (i = 0; i < src_hwctx->nb_surfaces; i++) { + mfxHDLPair *pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->surface_ids[i] = *(VASurfaceID*)pair->first; + } dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; } break; #endif +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + { + AVD3D11VAFramesContext *dst_hwctx = dst_ctx->hwctx; + mfxHDLPair *pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->texture = (ID3D11Texture2D*)pair->first; + if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE) + dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED; + dst_hwctx->BindFlags = qsv_get_d3d11va_bind_flags(src_hwctx->frame_type); + } + break; +#endif #if CONFIG_DXVA2 case AV_HWDEVICE_TYPE_DXVA2: { @@ -629,9 +730,10 @@ static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx, sizeof(*dst_hwctx->surfaces)); if (!dst_hwctx->surfaces) return AVERROR(ENOMEM); - for (i = 0; i < src_hwctx->nb_surfaces; i++) - dst_hwctx->surfaces[i] = - (IDirect3DSurface9*)src_hwctx->surfaces[i].Data.MemId; + for (i = 0; i < src_hwctx->nb_surfaces; i++) { + mfxHDLPair *pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->surfaces[i] = (IDirect3DSurface9*)pair->first; + } dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; if (src_hwctx->frame_type == MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) dst_hwctx->surface_type = DXVA2_VideoDecoderRenderTarget; @@ -665,13 +767,27 @@ static int qsv_map_from(AVHWFramesContext *ctx, switch (child_frames_ctx->device_ctx->type) { #if CONFIG_VAAPI case AV_HWDEVICE_TYPE_VAAPI: - child_data = (uint8_t*)(intptr_t)*(VASurfaceID*)surf->Data.MemId; + { + mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; + child_data = pair->first; + break; + } +#endif +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + { + mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; + child_data = pair->first; break; + } #endif #if CONFIG_DXVA2 case AV_HWDEVICE_TYPE_DXVA2: - child_data = surf->Data.MemId; + { + mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; + child_data = pair->first; break; + } #endif default: return AVERROR(ENOSYS); @@ -685,7 +801,14 @@ static int qsv_map_from(AVHWFramesContext *ctx, dst->width = src->width; dst->height = src->height; - dst->data[3] = child_data; + + if (child_frames_ctx->device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { + mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; + dst->data[0] = pair->first; + dst->data[1] = pair->second; + } else { + dst->data[3] = child_data; + } return 0; } @@ -708,7 +831,14 @@ static int qsv_map_from(AVHWFramesContext *ctx, dummy->format = child_frames_ctx->format; dummy->width = src->width; dummy->height = src->height; - dummy->data[3] = child_data; + + if (child_frames_ctx->device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { + mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; + dummy->data[0] = pair->first; + dummy->data[1] = pair->second; + } else { + dummy->data[3] = child_data; + } ret = av_hwframe_map(dst, dummy, flags); @@ -954,35 +1084,81 @@ static int qsv_frames_derive_to(AVHWFramesContext *dst_ctx, AVQSVFramesContext *dst_hwctx = dst_ctx->hwctx; int i; + if (src_ctx->initial_pool_size == 0) { + av_log(dst_ctx, AV_LOG_ERROR, "Only fixed-size pools can be " + "mapped to QSV frames.\n"); + return AVERROR(EINVAL); + } + switch (src_ctx->device_ctx->type) { #if CONFIG_VAAPI case AV_HWDEVICE_TYPE_VAAPI: { AVVAAPIFramesContext *src_hwctx = src_ctx->hwctx; + s->handle_pairs_internal = av_mallocz_array(src_ctx->initial_pool_size, sizeof(*s->handle_pairs_internal)); + if (!s->handle_pairs_internal) + return AVERROR(ENOMEM); s->surfaces_internal = av_mallocz_array(src_hwctx->nb_surfaces, sizeof(*s->surfaces_internal)); if (!s->surfaces_internal) return AVERROR(ENOMEM); for (i = 0; i < src_hwctx->nb_surfaces; i++) { qsv_init_surface(dst_ctx, &s->surfaces_internal[i]); - s->surfaces_internal[i].Data.MemId = src_hwctx->surface_ids + i; + s->handle_pairs_internal[i].first = src_hwctx->surface_ids + i; + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; } dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; dst_hwctx->frame_type = MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; } break; #endif +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + { + AVD3D11VAFramesContext *src_hwctx = src_ctx->hwctx; + s->handle_pairs_internal = av_mallocz_array(src_ctx->initial_pool_size, sizeof(*s->handle_pairs_internal)); + if (!s->handle_pairs_internal) + return AVERROR(ENOMEM); + s->surfaces_internal = av_mallocz_array(src_ctx->initial_pool_size, + sizeof(*s->surfaces_internal)); + if (!s->surfaces_internal) + return AVERROR(ENOMEM); + for (i = 0; i < src_ctx->initial_pool_size; i++) { + qsv_init_surface(dst_ctx, &s->surfaces_internal[i]); + s->handle_pairs_internal[i].first = (mfxMemId)src_hwctx->texture_infos[i].texture; + if (src_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + } else { + s->handle_pairs_internal[i].second = (mfxMemId)src_hwctx->texture_infos[i].index; + } + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; + } + dst_hwctx->nb_surfaces = src_ctx->initial_pool_size; + if (src_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + dst_hwctx->frame_type |= MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET; + } else { + dst_hwctx->frame_type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; + } + } + break; +#endif #if CONFIG_DXVA2 case AV_HWDEVICE_TYPE_DXVA2: { AVDXVA2FramesContext *src_hwctx = src_ctx->hwctx; + s->handle_pairs_internal = av_mallocz_array(src_ctx->initial_pool_size, sizeof(*s->handle_pairs_internal)); + if (!s->handle_pairs_internal) + return AVERROR(ENOMEM); s->surfaces_internal = av_mallocz_array(src_hwctx->nb_surfaces, sizeof(*s->surfaces_internal)); if (!s->surfaces_internal) return AVERROR(ENOMEM); for (i = 0; i < src_hwctx->nb_surfaces; i++) { qsv_init_surface(dst_ctx, &s->surfaces_internal[i]); - s->surfaces_internal[i].Data.MemId = (mfxMemId)src_hwctx->surfaces[i]; + s->handle_pairs_internal[i].first = (mfxMemId)src_hwctx->surfaces[i]; + s->handle_pairs_internal[i].second = (mfxMemId)MFX_INFINITE; + s->surfaces_internal[i].Data.MemId = (mfxMemId)&s->handle_pairs_internal[i]; } dst_hwctx->nb_surfaces = src_hwctx->nb_surfaces; if (src_hwctx->surface_type == DXVA2_VideoProcessorRenderTarget) @@ -1005,21 +1181,44 @@ static int qsv_map_to(AVHWFramesContext *dst_ctx, AVFrame *dst, const AVFrame *src, int flags) { AVQSVFramesContext *hwctx = dst_ctx->hwctx; - int i, err; + int i, err, index = -1; - for (i = 0; i < hwctx->nb_surfaces; i++) { + for (i = 0; i < hwctx->nb_surfaces && index < 0; i++) { + switch(src->format) { #if CONFIG_VAAPI - if (*(VASurfaceID*)hwctx->surfaces[i].Data.MemId == - (VASurfaceID)(uintptr_t)src->data[3]) - break; + case AV_PIX_FMT_VAAPI: + { + mfxHDLPair *pair = (mfxHDLPair*)hwctx->surfaces[i].Data.MemId; + if (pair->first == src->data[3]) { + index = i; + break; + } + } +#endif +#if CONFIG_D3D11VA + case AV_PIX_FMT_D3D11: + { + mfxHDLPair *pair = (mfxHDLPair*)hwctx->surfaces[i].Data.MemId; + if (pair->first == src->data[0] + && pair->second == src->data[1]) { + index = i; + break; + } + } #endif #if CONFIG_DXVA2 - if ((IDirect3DSurface9*)hwctx->surfaces[i].Data.MemId == - (IDirect3DSurface9*)(uintptr_t)src->data[3]) - break; + case AV_PIX_FMT_DXVA2_VLD: + { + mfxHDLPair *pair = (mfxHDLPair*)hwctx->surfaces[i].Data.MemId; + if (pair->first == src->data[3]) { + index = i; + break; + } + } #endif + } } - if (i >= hwctx->nb_surfaces) { + if (index < 0) { av_log(dst_ctx, AV_LOG_ERROR, "Trying to map from a surface which " "is not in the mapped frames context.\n"); return AVERROR(EINVAL); @@ -1032,7 +1231,7 @@ static int qsv_map_to(AVHWFramesContext *dst_ctx, dst->width = src->width; dst->height = src->height; - dst->data[3] = (uint8_t*)&hwctx->surfaces[i]; + dst->data[3] = (uint8_t*)&hwctx->surfaces[index]; return 0; } @@ -1074,7 +1273,7 @@ static void qsv_device_free(AVHWDeviceContext *ctx) av_freep(&priv); } -static mfxIMPL choose_implementation(const char *device) +static mfxIMPL choose_implementation(const char *device, enum AVHWDeviceType child_device_type) { static const struct { const char *name; @@ -1103,6 +1302,10 @@ static mfxIMPL choose_implementation(const char *device) impl = strtol(device, NULL, 0); } + if ( (child_device_type == AV_HWDEVICE_TYPE_D3D11VA) && (impl != MFX_IMPL_SOFTWARE) ) { + impl |= MFX_IMPL_VIA_D3D11; + } + return impl; } @@ -1129,6 +1332,15 @@ static int qsv_device_derive_from_child(AVHWDeviceContext *ctx, } break; #endif +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + { + AVD3D11VADeviceContext *child_device_hwctx = child_device_ctx->hwctx; + handle_type = MFX_HANDLE_D3D11_DEVICE; + handle = (mfxHDL)child_device_hwctx->device; + } + break; +#endif #if CONFIG_DXVA2 case AV_HWDEVICE_TYPE_DXVA2: { @@ -1191,7 +1403,9 @@ fail: static int qsv_device_derive(AVHWDeviceContext *ctx, AVHWDeviceContext *child_device_ctx, int flags) { - return qsv_device_derive_from_child(ctx, MFX_IMPL_HARDWARE_ANY, + mfxIMPL impl; + impl = choose_implementation("hw_any", child_device_ctx->type); + return qsv_device_derive_from_child(ctx, impl, child_device_ctx, flags); } @@ -1214,35 +1428,66 @@ static int qsv_device_create(AVHWDeviceContext *ctx, const char *device, ctx->user_opaque = priv; ctx->free = qsv_device_free; - e = av_dict_get(opts, "child_device", NULL, 0); - - child_device_opts = NULL; - if (CONFIG_VAAPI) { + e = av_dict_get(opts, "child_device_type", NULL, 0); + if (e) { + child_device_type = av_hwdevice_find_type_by_name(e ? e->value : NULL); + if (child_device_type == AV_HWDEVICE_TYPE_NONE) { + av_log(ctx, AV_LOG_ERROR, "Unknown child device type " + "\"%s\".\n", e ? e->value : NULL); + return AVERROR(EINVAL); + } + } else if (CONFIG_VAAPI) { child_device_type = AV_HWDEVICE_TYPE_VAAPI; - // libmfx does not actually implement VAAPI properly, rather it - // depends on the specific behaviour of a matching iHD driver when - // used on recent Intel hardware. Set options to the VAAPI device - // creation so that we should pick a usable setup by default if - // possible, even when multiple devices and drivers are available. - av_dict_set(&child_device_opts, "kernel_driver", "i915", 0); - av_dict_set(&child_device_opts, "driver", "iHD", 0); - } else if (CONFIG_DXVA2) + } else if (CONFIG_D3D11VA) { + child_device_type = AV_HWDEVICE_TYPE_D3D11VA; + } else if (CONFIG_DXVA2) { child_device_type = AV_HWDEVICE_TYPE_DXVA2; - else { + } else { av_log(ctx, AV_LOG_ERROR, "No supported child device type is enabled\n"); return AVERROR(ENOSYS); } + child_device_opts = NULL; + switch (child_device_type) { +#if CONFIG_VAAPI + case AV_HWDEVICE_TYPE_VAAPI: + { + // libmfx does not actually implement VAAPI properly, rather it + // depends on the specific behaviour of a matching iHD driver when + // used on recent Intel hardware. Set options to the VAAPI device + // creation so that we should pick a usable setup by default if + // possible, even when multiple devices and drivers are available. + av_dict_set(&child_device_opts, "kernel_driver", "i915", 0); + av_dict_set(&child_device_opts, "driver", "iHD", 0); + } + break; +#endif +#if CONFIG_D3D11VA + case AV_HWDEVICE_TYPE_D3D11VA: + break; +#endif +#if CONFIG_DXVA2 + case AV_HWDEVICE_TYPE_DXVA2: + break; +#endif + default: + { + av_log(ctx, AV_LOG_ERROR, "No supported child device type is enabled\n"); + return AVERROR(ENOSYS); + } + break; + } + + e = av_dict_get(opts, "child_device", NULL, 0); ret = av_hwdevice_ctx_create(&priv->child_device_ctx, child_device_type, e ? e->value : NULL, child_device_opts, 0); - av_dict_free(&child_device_opts); if (ret < 0) return ret; child_device = (AVHWDeviceContext*)priv->child_device_ctx->data; - impl = choose_implementation(device); + impl = choose_implementation(device, child_device_type); return qsv_device_derive_from_child(ctx, impl, child_device, 0); } From patchwork Fri May 8 15:18:16 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19567 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id DCFDF44A590 for ; Fri, 8 May 2020 18:20:44 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CE55268A60C; Fri, 8 May 2020 18:20:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8EBBB68A517 for ; Fri, 8 May 2020 18:20:38 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id w7so2314673wre.13 for ; Fri, 08 May 2020 08:20:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=mn4Vl9sRnfvbu6LgbupTq1PY/3/zBz1X5TGNIT/0R6M=; b=h86iJ/ogIANprmhMGCs/qIir9eun5XoQAn8LbzXYie6SHyrh45XCdFgnEkmqKhCXC3 JhRaKuYMZHPMNz9Z3ES3guTNBnDUWNHRckANcOSiss2PzskoKkd4enAcfE0w6cv4m0R2 VnVQfoVAU6snuOQ6hGBWHJ+M8ZXE8zS2qrQUJdhrNEp963EeVoLy7we4HjFz09SAhOnC Jk1TJ+SBLTECJHZLRSZEg5hoXT6Eb/F8wwoxcb6cEae/h8Qn6iSzZTqQYWeXajq0aWAL WWxQ8I8o21zv8XCZvTdXQ5iYn/PSQYVkOsDqw4VRD99JSA5wOzKKUn6vG1Xjr1CAsKBN 45eA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=mn4Vl9sRnfvbu6LgbupTq1PY/3/zBz1X5TGNIT/0R6M=; b=Ayifm+xNFw+CGcErvcw2Ix6Zj/fODsi4Z6eXFtHGCaIYG+EgGqZ8T41rlzVYYHq/LN +0CyyCUEOQ811REsPdboxNr4U9o5m/mGc70MikHBDgyEIgTYpP4lgtldGcgce9byiOKX o1cLEmNOtcDef5TlLNYZ94erJug1eD2O5vWkMNiQoWj+STCGKrQMY8P8gIPEaDflMr0B 1sXUkOnUs0F/QDNgGbv+9ct/TMiekvyG5pZIIXAdmJ+8roPdZwrQjmuT0KgYBcu7uiY5 wRWQqVnLBXy3poK1PE/vNl4cgVIwvzcFaVuWufYEfA+RFB4Uwq1e2qfAnbiBXk0K9LeY fL9Q== X-Gm-Message-State: AGi0PuZVC+5DnXnKBpTK0uHgVY3ebKgDr/l+eIzbGLNZHY/1/TTmDses Voea3uzPCLEJnsfXZE7K6M23SUYb5hBAsA== X-Google-Smtp-Source: APiQypKJif+nJ60jS5+rL2Qwxojm+fPrl6oVfoO1G4OyeTjm7P32dWd6BJt3wM7eOBGRwz0F+hC4GQ== X-Received: by 2002:adf:f786:: with SMTP id q6mr3479219wrp.120.1588951237817; Fri, 08 May 2020 08:20:37 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:37 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:16 +0100 Message-Id: <20200508151821.49051-6-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 06/11] libavutil/hwcontext_qsv: pass vendor option to child device 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Signed-off-by: Artem Galin --- libavutil/hwcontext_qsv.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 38681dfc9b..5ffb8fb437 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1464,6 +1464,11 @@ static int qsv_device_create(AVHWDeviceContext *ctx, const char *device, #endif #if CONFIG_D3D11VA case AV_HWDEVICE_TYPE_D3D11VA: + { + e = av_dict_get(opts, "vendor", NULL, 0); + if(e) + av_dict_set(&child_device_opts, "vendor", e->value, 0); + } break; #endif #if CONFIG_DXVA2 From patchwork Fri May 8 15:18:17 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19568 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id CFE3244A590 for ; Fri, 8 May 2020 18:20:47 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B04FC68A67E; Fri, 8 May 2020 18:20:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1F34668A3F5 for ; Fri, 8 May 2020 18:20:41 +0300 (EEST) Received: by mail-wr1-f65.google.com with SMTP id i15so2320355wrx.10 for ; Fri, 08 May 2020 08:20:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=myeJOp4q6Mdw2hOYXQrTvUR1G6QRxluLe8flEyNctHg=; b=d9mD8Vbc+TQUiJuagtdkC0ik6DyrWqlF9qMU/ftsxTCWHZGBzdVT5wMfPTy8m2Z88S mYqcx3H7+6FxoskQ7ESw5bmtjBwlVLG9zpYZl6/fR/Wwdsk6t0VB+QRwVWWMRMb56tD5 AZHoDVXwGxgI1uSIdVyGu8VXcSoK4LilattmusIgaPL8/RQKhg80p2Ty+TZeDS9CFi0t zKHHBerHsSwz+2NZyO8UDw+vgtX0FMWOEb4OIoERsRtNZDfTa0s7ZhwJnnhmePWTlh1w U+uFFOaD0D/IFsbSzBmSH3FK4SaJXBDQCYB5tjjogydkwhNnWQ8bBoMpqnfnAonKoDCU 7ChQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=myeJOp4q6Mdw2hOYXQrTvUR1G6QRxluLe8flEyNctHg=; b=QTpbMy8FNhZNFLlV0SLjpyhWhdymn5a2Vb01LU0bvEptFSvlpfPjP7rIjS1J/Lcavj DuCAZTN0rRF3V2gGi7MlI/kOvAukJfdOXn+TR55b1hXAbMxc6dDd45eg2LzPeWdHaEyL 7ACuN8wVp5oYmwSkUs5htR54sHumVpkn5fwowwf5SV6kkrckk+jJIQ+J6R9s4ougWJ+G b/kmprOYrOlTHnd6JSYHnu76VhW8nCcuvPw0dOKqRi2oeIpns0R/Br/Ex1cxN0PXDsa4 tqGa66KwURG8tzWl+MbGD12si9oLB2nlQ1P8uHyK6GElm7fzeE4/u2W8xiNqppnf8xvx d5BQ== X-Gm-Message-State: AGi0Pub30ZXAo0zsXEAsV/8R7ra89qb5bDAM77KoAt2fBcyyUrzJlXeM 8fSvW69U71JwgJrLUVSpnKlQODCamRpxvg== X-Google-Smtp-Source: APiQypIn7drm8oVdRMXNjQyYPqQe+2H9vqQFVcfZ46v4uKiehM3oopQv2eUSsJIwjsivP0aMWwGG7g== X-Received: by 2002:adf:de81:: with SMTP id w1mr3414463wrl.353.1588951240363; Fri, 08 May 2020 08:20:40 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:39 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:17 +0100 Message-Id: <20200508151821.49051-7-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 07/11] libavfilter/qsvvpp: enabling d3d11va support, added mfxhdlpair 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Adding DX11 relevant device type checks and adjusting callback with proper MediaSDK pair type support. Signed-off-by: Artem Galin --- libavfilter/qsvvpp.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 8d5ff2eb65..0d3f7fb2f9 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -36,6 +36,7 @@ MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET)) #define IS_OPAQUE_MEMORY(mode) (mode & MFX_MEMTYPE_OPAQUE_FRAME) #define IS_SYSTEM_MEMORY(mode) (mode & MFX_MEMTYPE_SYSTEM_MEMORY) +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) typedef struct QSVFrame { AVFrame *frame; @@ -68,12 +69,6 @@ struct QSVVPPContext { int nb_ext_buffers; }; -static const mfxHandleType handle_types[] = { - MFX_HANDLE_VA_DISPLAY, - MFX_HANDLE_D3D9_DEVICE_MANAGER, - MFX_HANDLE_D3D11_DEVICE, -}; - static const AVRational default_tb = { 1, 90000 }; /* functions for frameAlloc */ @@ -129,7 +124,13 @@ static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) { - *hdl = mid; + mfxHDLPair *pair_dst = (mfxHDLPair*)hdl; + mfxHDLPair *pair_src = (mfxHDLPair*)mid; + + pair_dst->first = pair_src->first; + + if (pair_src->second != (mfxMemId)MFX_INFINITE) + pair_dst->second = pair_src->second; return MFX_ERR_NONE; } @@ -497,14 +498,18 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) return AVERROR_UNKNOWN; } - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], &handle); - if (ret == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } + if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_VA_DISPLAY; + } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D11_DEVICE; + } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER; + } else { + av_log(avctx, AV_LOG_ERROR, "Error unsupported handle type\n"); + return AVERROR_UNKNOWN; } + ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_type, &handle); if (ret != MFX_ERR_NONE) { av_log(avctx, AV_LOG_ERROR, "Error getting the session handle\n"); return AVERROR_UNKNOWN; From patchwork Fri May 8 15:18:18 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19569 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 57C0044BD84 for ; Fri, 8 May 2020 18:26:14 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2964C68A466; Fri, 8 May 2020 18:26:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ADBF0689ECB for ; Fri, 8 May 2020 18:26:07 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id m12so5688923wmc.0 for ; Fri, 08 May 2020 08:26:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=1IxXZtkm3kItGtTyWnbf6mWQmUvTH9cdcuogme+tLR0=; b=Nb+tRzSMI5uqjixLtWe8eSY2aFJHthYF/5LmyE0Boxf6pA8dkS9SZaO95JtVRzlXY5 6Eq2EuSD/RziwQH4a+eqLWJBePr6FqG6Z6pv/gYnvEBFkqxzL1S8euDrz/9vbh26S3GL k7rcOHOPes4dF4OHtXZ/X0W4t9CPvwN5O/vP8k/mAs8dpPFJawUCl+i1IjugiENuU+El oJiVv1IB15ASbV8qMsPWaeyZfPQq1VKtRAQMy2mThGVHdYCCH0lWvFZtpUvhQXr0hRVr b677jreewCaasNbrSpzZugb7Kk4HjKDeGy6agafL+SVI4KHMB1xMncmZkvcYaX4zdO/h Xlmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=1IxXZtkm3kItGtTyWnbf6mWQmUvTH9cdcuogme+tLR0=; b=DnjNADBwtpLgQwPyg0NPDvCfNpy/beDUA8SSUVOiWdNMsum4376ERts8o3JBMlIigB zhOqBvxB5SKIU5pV064BqOh89mdxXLS52fPZAPN2nzpxpkWMIyoM+sWYxoGkAFbGbv6z z6m1DgZpmlIclWr1N29L7JJ43hHCsbMLEkLPN2CJpBUMY0flG1oNSjAmvdmEXaasYnqi EYvxi6578dxrUOJzEV/24P4VslaJNXxq+Ueq4YdzLJJtf4EEArpeL0DTFMj0N13a3XbJ BbDLtc+9E3rLLjjP22Z0ilPtMCkMCznPR9Zj7MWibKxxFBjWJ7B1r/mllRjJuQEnA8yz pp9g== X-Gm-Message-State: AGi0PuZ9F95lSSJGT9QyPS/HhxGFcOhSs7g339+SuZaQhVKxCsGBi2Q5 B/Qhpc/ExbGFB0hTWjQa+mHdj9bj22wKVQ== X-Google-Smtp-Source: APiQypIP8WCCzSC4JDAXlzLGD+lDkkr8z2bvZ0wjEFdYZtpraB0Ix6TwGPG3DtcSGhp/RS8tNbAT4Q== X-Received: by 2002:a05:600c:14d4:: with SMTP id i20mr17504376wmh.118.1588951242915; Fri, 08 May 2020 08:20:42 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:42 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:18 +0100 Message-Id: <20200508151821.49051-8-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 08/11] libavfilter/qsvvpp: add MFX_MEMTYPE_FROM_VPPOUT flag to output frame memory mode 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin In case of DX11 device type, Media SDK is sensitive to these flags. Signed-off-by: Artem Galin --- libavfilter/qsvvpp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 0d3f7fb2f9..c89d4180d0 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -452,7 +452,7 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) s->out_mem_mode = IS_OPAQUE_MEMORY(s->in_mem_mode) ? MFX_MEMTYPE_OPAQUE_FRAME : - MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT; out_frames_ctx = (AVHWFramesContext *)out_frames_ref->data; out_frames_hwctx = out_frames_ctx->hwctx; From patchwork Fri May 8 15:18:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19570 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4C5AE448FBD for ; Fri, 8 May 2020 18:27:35 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2F9CF68A303; Fri, 8 May 2020 18:27:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 197F768A175 for ; Fri, 8 May 2020 18:27:29 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id x4so10606597wmj.1 for ; Fri, 08 May 2020 08:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=bfnd0AzuKMvBl0MydVnltuG6ad8qTz2HHFg1+d51O18=; b=Q8VNCVCqeov3yYdHIriK2CgXLVxaj8OJ1v2LGy8mjdR+dtp+rI8F3osfwl5F6aYSGW Y/YCU9ZNuKzRIOUYisfMfGhgahIAXgW+gC883n2k5mIhsnexyzPD5RdfcWHc4eeretb4 BDpOTuy38mWwJU1kDcei8qWQqw23kqDn06O1VhswgbmKWfwLfIMO6oDoWrBHTmVVA2lZ kjY+s8+5CwLOk9g9rqT0ScLmboPd0KG7K9hUljijrvPz55OKkxHac6JR4qoeq0ikhNiL GiVAq7f6zf5TUt/5bdogbcHH4f9KEVK5QKFkpKzLic9jshz1KUMuvHo+LMj8iGhLC4FW 40eQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=bfnd0AzuKMvBl0MydVnltuG6ad8qTz2HHFg1+d51O18=; b=bFxAUF+fhX+Y8xEUngEB8q17TWvll/M0x8VeEtR/eUIIpOY4fX56Aq2RUxIUBcWYa2 wY+TWf2QwIutme/aBCGJfQv0Kb+Uxg4xf6ZOAXsH4o4bqQO3XNadQ8hAIQ+n/aToL907 os8Kx+Xkx+hxvDuhujbeq7HCwIybd5C1KJIqFfrdBg2OHIfuobuH8SDdqaZpagKKNovs HbAfgrwLqNo1AM3GvySavFgYcDdqNMyyJirDjKpZmwC3pSe7jiCj+P5WQ2E/fLMI/6/3 Ot/h1+mV73XBakUp4xj0kfY6MlEqAxL2poFgGL3w3LJvJ81ubj+6bifx+Jrk/mmc03yA y0CQ== X-Gm-Message-State: AGi0PuYZZWJhjxuAApjuKNLFFSzSvloiwUnVWfbEAHYvHF1vsUsIYgdz 5ojIg4LimbbhmL7GvvpoewyKnUXrey8dlQ== X-Google-Smtp-Source: APiQypLgCN8bpOE0D49klXzqTd31GWaGzJiXYdfjECeQMv4u2FxcgIgNYAzhMKzS/RpNSKYFdKTI3g== X-Received: by 2002:a7b:c10d:: with SMTP id w13mr16285693wmi.78.1588951245147; Fri, 08 May 2020 08:20:45 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:44 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:19 +0100 Message-Id: <20200508151821.49051-9-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 09/11] libavfilter/vf_scale_qsv: enabling d3d11va support, added mfxhdlpair 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Adding DX11 relevant device type checks and adjusting callback with proper MediaSDK pair type support. Signed-off-by: Artem Galin --- libavfilter/vf_scale_qsv.c | 43 +++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 5064dcbb60..47701c20d0 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -70,6 +70,7 @@ enum var_name { }; #define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19) +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) typedef struct QSVScaleContext { const AVClass *class; @@ -264,16 +265,16 @@ static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) { - *hdl = mid; + mfxHDLPair *pair_dst = (mfxHDLPair*)hdl; + mfxHDLPair *pair_src = (mfxHDLPair*)mid; + + pair_dst->first = pair_src->first; + + if (pair_src->second != (mfxMemId)MFX_INFINITE) + pair_dst->second = pair_src->second; return MFX_ERR_NONE; } -static const mfxHandleType handle_types[] = { - MFX_HANDLE_VA_DISPLAY, - MFX_HANDLE_D3D9_DEVICE_MANAGER, - MFX_HANDLE_D3D11_DEVICE, -}; - static int init_out_session(AVFilterContext *ctx) { @@ -292,28 +293,32 @@ static int init_out_session(AVFilterContext *ctx) mfxIMPL impl; mfxVideoParam par; mfxStatus err; - int i; + int ret, i; s->num_ext_buf = 0; /* extract the properties of the "master" session given to us */ - err = MFXQueryIMPL(device_hwctx->session, &impl); - if (err == MFX_ERR_NONE) - err = MFXQueryVersion(device_hwctx->session, &ver); - if (err != MFX_ERR_NONE) { + ret = MFXQueryIMPL(device_hwctx->session, &impl); + if (ret == MFX_ERR_NONE) + ret = MFXQueryVersion(device_hwctx->session, &ver); + if (ret != MFX_ERR_NONE) { av_log(ctx, AV_LOG_ERROR, "Error querying the session attributes\n"); return AVERROR_UNKNOWN; } - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], &handle); - if (err == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } + if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_VA_DISPLAY; + } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D11_DEVICE; + } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER; + } else { + av_log(ctx, AV_LOG_ERROR, "Error unsupported handle type\n"); + return AVERROR_UNKNOWN; } - if (err != MFX_ERR_NONE) { + ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_type, &handle); + if (ret != MFX_ERR_NONE) { av_log(ctx, AV_LOG_ERROR, "Error getting the session handle\n"); return AVERROR_UNKNOWN; } From patchwork Fri May 8 15:18:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19573 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 244C0449373 for ; Fri, 8 May 2020 18:29:11 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 04946689E22; Fri, 8 May 2020 18:29:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f66.google.com (mail-wm1-f66.google.com [209.85.128.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8ABF76804B3 for ; Fri, 8 May 2020 18:29:05 +0300 (EEST) Received: by mail-wm1-f66.google.com with SMTP id g14so1382464wme.1 for ; Fri, 08 May 2020 08:29:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=HbY5cQkaGzFheVpbY+AjqWjqOrvRiSBZHlkekbUrK5g=; b=Ch1I6eohfMFw2U5V7/gKeJDyyBiNkhD+it3093pn9fvQtnkUs4nbAetIrNBcREIWU6 fOnftoHGivI+Z8KKWo9xMw/aJUFEKN3PyjDyHJGSgRweOVuDgZlH7vNfLIhUp1egjyae VhpA+otrB4VglbOkyDEy42YQLXlkLPKB9G6EQWbcUwiDzGKFImUPT9cowN70AB7Z/HR1 fyXymWXLqECC+BkXToH7GBqcv7L3CpUNWMSizOgsDZxz15bqE9nIvzaDKsI2tsRs8HXM hKOwRT6kUcodFziN8PMmDyTVEaYm7P358KUwjC72TdSvmJvwhFN/nAwZ4xfTICKSKWQY hrdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=HbY5cQkaGzFheVpbY+AjqWjqOrvRiSBZHlkekbUrK5g=; b=RX80faxX+J7ydowf3YFfpHSQ7p/kH/IUX51VJcElVRNLCfU/N+0ak2Z6mHQFZQScU9 eFsBF1kov1+oauhH+P6BOyAzi0Q4ZTZp8ebC/qILtyKHyvsY021MrnhVuaaJUzvIc/R2 /NPqRsW8nUbicsfjizM98k7xPh0QZsNl5buqAbMGvisLtlmrj/wUN+3Jpl6BxzP7j/oG dlduTv4ROKv1r4TuKx0g4V9WqRPXQ9h5APVTLO7//Df3Z5KvfkVv/xwcbkCXVpU7jgRZ B1wLjIUnSdJP/YbiMENjNi/u9Ow/zkc4Vdil+HAiA285xjDgWiXZLTe3wlBbY3MPr8xw yxRA== X-Gm-Message-State: AGi0PuYI9TYwZbn0/rfFCXFVDoS6IR6J/skEXboV8lCpwx4zbxPX/LGj EJ/F2xE3lviagdJAzrI5p3sx7oW4nE2AMg== X-Google-Smtp-Source: APiQypLD3IiASJbWIJt+d7YPkwv3PBucFhoICa5PTIlSOSC85/zTS9p1rGjosUJRkGqsd2Ums1tHUg== X-Received: by 2002:a7b:c941:: with SMTP id i1mr15493655wml.132.1588951247259; Fri, 08 May 2020 08:20:47 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:46 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:20 +0100 Message-Id: <20200508151821.49051-10-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 10/11] libavfilter/vf_scale_qsv: add MFX_MEMTYPE_FROM_VPPOUT to frame_type 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin In case of DX11 device type, Media SDK is sensitive to these flags. Signed-off-by: Artem Galin --- libavfilter/vf_scale_qsv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 47701c20d0..9eb59325c3 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -207,7 +207,7 @@ static int init_out_pool(AVFilterContext *ctx, out_frames_ctx->sw_format = out_format; out_frames_ctx->initial_pool_size = 4; - out_frames_hwctx->frame_type = in_frames_hwctx->frame_type; + out_frames_hwctx->frame_type = in_frames_hwctx->frame_type | MFX_MEMTYPE_FROM_VPPOUT; ret = ff_filter_init_hw_frames(ctx, outlink, 32); if (ret < 0) From patchwork Fri May 8 15:18:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19571 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B203B44922A for ; Fri, 8 May 2020 18:28:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 91F8F68A466; Fri, 8 May 2020 18:28:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 28F1268A175 for ; Fri, 8 May 2020 18:28:06 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id z72so1431784wmc.2 for ; Fri, 08 May 2020 08:28:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=/PAdynOYSfy/gnxR9uBeaR4o2ncUbeULbVzPUzK9bJQ=; b=dCxqfW4Y7kde22+z910wqPKfNkVU3Bsx15I+M2pvv15T0PcAipEluEOC/ZG784mUp2 W3gmQlMgvoOTtTAM0u/Y7C08x203nWneqpHWtbzxddbDBcyFidXNBsa2eXtCHlAAFDkq DWkm/zSCd32Eo7uxWvE4vCl4OIrGAOu+6aQC371S7SA8KUFMPecNukqdFiJq6wUjNrD3 Ab4F2SGngi1Q5ezK/7TsMueR35i+0AXg5TwPL5B5uJcdfy5Tf6Wo9LMLBWhfTNkElfMf x5D4cUcwFniQZjOL42Sl6VWgHnt1TEp4Bw4hsVxWcJm0gt9JDrxi6yvOSFuXIOQfWt+g FQhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=/PAdynOYSfy/gnxR9uBeaR4o2ncUbeULbVzPUzK9bJQ=; b=dJfsSF/A/9RyAqx3Hkz3b7J1E8NgIVuF7cWlTs0lVwaDA2COx5HNzY2MSson5bR/Mn tAa7haFLf7KdAggKjXJv72FkS32qyEbawB0shv9T/Rebaujtfdo5G9UYl6fyN9ySGK7i AGKhdvPzXfZvHFA8txOjSKA+ngt0l+sjGiMx+g10kv3Un1SpXO2ScYYQgIadgUg4frWG a/rdT5Zg9Anum16IKLbcBYzXP45nO/43RZvXKXibtm4tXkHrDF0u9+XHI09jvRiWr9tL AX4OsZuTozDn8Rrv/JudMw3o4SUHh7926v/dVcR5vwFwfUUg/hr/Yoxcx0vhuihSgDuJ vEPg== X-Gm-Message-State: AGi0PuYEWiRXq4esST0nLFjupX6To0S02jtZ6P5KyWFTxInpUDDMMxuE YglaL30cv8TGMnBKAXjwMHSSzGhDzoQ96Q== X-Google-Smtp-Source: APiQypKDVAq+eE5h7++yKei63Wnr7c9lPHSyxnJ/UmFoiKvgY603b8wR9TuK7U1p9djkL1Djhn/CyQ== X-Received: by 2002:a1c:3281:: with SMTP id y123mr16707286wmy.30.1588951249100; Fri, 08 May 2020 08:20:49 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:c904:d18e:fdcb:4131]) by smtp.googlemail.com with ESMTPSA id u24sm7339937wmm.47.2020.05.08.08.20.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 May 2020 08:20:48 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 8 May 2020 16:18:21 +0100 Message-Id: <20200508151821.49051-11-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.0 In-Reply-To: <20200508151821.49051-1-artem.galin@gmail.com> References: <20200424145219.54067-4-artem.galin@gmail.com> <20200508151821.49051-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 11/11] libavfilter/vf_deinterlace_qsv: enabling d3d11va support, added mfxhdlpair 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 Cc: Artem Galin , robux4@ycbcr.xyz Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Adding DX11 relevant device type checks and adjusting callback with proper MediaSDK pair type support. Signed-off-by: Artem Galin --- libavfilter/vf_deinterlace_qsv.c | 44 ++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c index 80217c8419..f7f9d916db 100644 --- a/libavfilter/vf_deinterlace_qsv.c +++ b/libavfilter/vf_deinterlace_qsv.c @@ -42,6 +42,8 @@ #include "internal.h" #include "video.h" +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) + enum { QSVDEINT_MORE_OUTPUT = 1, QSVDEINT_MORE_INPUT, @@ -157,16 +159,16 @@ static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) { - *hdl = mid; + mfxHDLPair *pair_dst = (mfxHDLPair*)hdl; + mfxHDLPair *pair_src = (mfxHDLPair*)mid; + + pair_dst->first = pair_src->first; + + if (pair_src->second != (mfxMemId)MFX_INFINITE) + pair_dst->second = pair_src->second; return MFX_ERR_NONE; } -static const mfxHandleType handle_types[] = { - MFX_HANDLE_VA_DISPLAY, - MFX_HANDLE_D3D9_DEVICE_MANAGER, - MFX_HANDLE_D3D11_DEVICE, -}; - static int init_out_session(AVFilterContext *ctx) { @@ -183,26 +185,30 @@ static int init_out_session(AVFilterContext *ctx) mfxIMPL impl; mfxVideoParam par; mfxStatus err; - int i; + int ret, i; /* extract the properties of the "master" session given to us */ - err = MFXQueryIMPL(device_hwctx->session, &impl); - if (err == MFX_ERR_NONE) - err = MFXQueryVersion(device_hwctx->session, &ver); - if (err != MFX_ERR_NONE) { + ret = MFXQueryIMPL(device_hwctx->session, &impl); + if (ret == MFX_ERR_NONE) + ret = MFXQueryVersion(device_hwctx->session, &ver); + if (ret != MFX_ERR_NONE) { av_log(ctx, AV_LOG_ERROR, "Error querying the session attributes\n"); return AVERROR_UNKNOWN; } - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], &handle); - if (err == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } + if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_VA_DISPLAY; + } else if (MFX_IMPL_VIA_D3D11 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D11_DEVICE; + } else if (MFX_IMPL_VIA_D3D9 == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_D3D9_DEVICE_MANAGER; + } else { + av_log(ctx, AV_LOG_ERROR, "Error unsupported handle type\n"); + return AVERROR_UNKNOWN; } - if (err != MFX_ERR_NONE) { + ret = MFXVideoCORE_GetHandle(device_hwctx->session, handle_type, &handle); + if (ret != MFX_ERR_NONE) { av_log(ctx, AV_LOG_ERROR, "Error getting the session handle\n"); return AVERROR_UNKNOWN; }