From patchwork Thu Jul 22 10:56:28 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29010 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp412693ios; Thu, 22 Jul 2021 04:05:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJycI+8YgqMHqHNgBsM07gqnE7N0QTrr4IYsa7P0j0R71q+9+QJOttWjcrRiXrJcRWL0Qo1A X-Received: by 2002:a05:6402:1a25:: with SMTP id be5mr53893512edb.123.1626951900305; Thu, 22 Jul 2021 04:05:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951900; cv=none; d=google.com; s=arc-20160816; b=Srxz7y1RknErEF3ZZA/7t4L7ZPjfrEvVLrlgoDPghhJ6YB0lJWdk74MOfFSS8Ohqme 6ZgkDB2gDSq2IHL2JpLaail6Jo/cMzq2ibpxLFfvAl2agq7ibxhRz0TRRQpG78tWDeRD IO0D4pJkZmfPtE8kEa+v9zNQhgmFbgvYVdgp96ukLgfD5t9QJrXVvrK735Qcd0V1kEq8 oPTZDAX68zWLzugFHDkUbF61ZzSyP1+TOdcsv6LxOoiN1jh5RVA4WFSWUJdMIG8sJw5A RL8H/yLl+/iQgaExeg5za6U3xFroFc47cmMM6cLqu1vcK2HMAkGBEOx9prwDWF9jf5c/ 3EQg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=QV/4r8Q9U8Oh2VYjwUXrpOJj0SOb3P6u5Vmxha7VSVI=; b=VpxsmAela6dAbourle2g01yMF6y2waZzqJlycU+YrIX9UfEXbT2NUg7kP9iesNkyup 5ObfvdGOUiIcfCDMFlMRwD0sm5IG7c3kPiENHj7Jt6GrWH9NjEYrEpN7fed2c4wc4aM1 lanoa4N2ssRznfzQ0/29L6r86CkPQiM2kMJ6/9gGp0ztfyMniMsxwjFdlebUuxuASmvu pbVd0JU43P/Fa0S8sk/57hNHf5iVQz9SflHeAGaE0+WsphFbdavWl8f9gm3FJtQrHjM/ FNKW69iRRGw0mj2X2MZ1lP3g8AEJZY40GvUQeAugeaV1yAIhBMy9zko/SIY/Ily1yBB0 L14Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=O07pPfKx; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n7si20051990ejr.517.2021.07.22.04.04.59; Thu, 22 Jul 2021 04:05:00 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=O07pPfKx; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AE43368A8F1; Thu, 22 Jul 2021 14:04:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6B2F568A5D0 for ; Thu, 22 Jul 2021 14:04:46 +0300 (EEST) Received: by mail-ed1-f53.google.com with SMTP id l26so6254462eda.10; Thu, 22 Jul 2021 04:04:46 -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:mime-version :content-transfer-encoding; bh=AooZyP8FSmou9YACivSNywr0PSBTWAbSTsbCqj+XD8Y=; b=O07pPfKx6AhjYfPwHs/lvnKg1ZV490dZ8IRxze+Urw7u8bqOC3jVVJtn9MO5Q5q+Si iUPR6FpX4CTgvMIqjfYIBXu3tWM7Ji498QbEmW8W4O5umIi+EgwDN3J6Vmno4uKVjZ5e Bw89L3ZS7ST84WGHJuReBOMsGoc9WuKGYIKZ2zP2FW76+9AnspOPZNO5wwdKFs/RRrlg nDub+d9Pde2d5H/kbcJCweI6JAGjXqWAAj1Gqe47/Yak2ZFVuRcJfhCU+oRGEqtOCrNn ZRse0KtQbdOTludwlg0DanFo0APG7i8HbP5DygP1h1qTUOq78WuHv+eqV+mOS/yjhIgP sIyA== 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:mime-version :content-transfer-encoding; bh=AooZyP8FSmou9YACivSNywr0PSBTWAbSTsbCqj+XD8Y=; b=baZWkTltQR9OKLDWkG0PWlev97yHaxRPUXAv+NaP457zUieVtph3BORlkgojtArgYP wO/lAYzrtg96rOKKm40ujdDUN5DUZIc84bFMQ6szE/DJsyrVBZRyhwIu3ZKqYcWWa1Q8 38VdShJOc12lSORsnuG47j5kpJLfpTfP3UNZjHdgzbKXsN6REuRgunJXOaRI4WNxK2rI Ljfle3f10YhjevInTPf62iyjbJaDKlVPl6l42RXJ3s44vwtVXSeeDv/9Ks1kcCjb0Qmc /VHyyimWQ5wTxJsinoetTq3y6NHQrrIL6OCZrU1kt7mdz0vbc5N6ndqWf4DE41NPXpxk Hx7g== X-Gm-Message-State: AOAM530xCDdvnDX42UyC5Fi1OUPmJRnuIuLrPQHFMfjjDpmgO8qXRFeW Dn5eXQvN+2fQAMKyBl+uAOk4fYDffQmVSJaw X-Received: by 2002:a2e:b548:: with SMTP id a8mr34910113ljn.346.1626951409583; Thu, 22 Jul 2021 03:56:49 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:49 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:28 +0100 Message-Id: <20210722105635.48075-1-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/8] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: QvQR+pQVMaZh 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 6e3154e1a3..d9d7c2cb43 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 @@ -243,7 +245,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; @@ -383,7 +387,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 }; @@ -472,7 +480,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; } @@ -649,7 +657,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, @@ -682,7 +690,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; } @@ -690,24 +704,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) @@ -716,13 +725,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 6b2fbbe252..10b08f0f9a 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -62,7 +62,7 @@ typedef struct QSVMid { AVBufferRef *hw_frames_ref; - mfxHDL handle; + mfxHDLPair *handle_pair; AVFrame *locked_frame; AVFrame *hw_frame; From patchwork Thu Jul 22 10:56:29 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29007 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp411416ios; Thu, 22 Jul 2021 04:03:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwvPW+/QO6+egQa/agNaVqCDB9j7UCt1LmnF6QEc/zVXvgveSKzchGau/whH7vNlNdrxvsA X-Received: by 2002:a17:906:6b1b:: with SMTP id q27mr42148865ejr.169.1626951809506; Thu, 22 Jul 2021 04:03:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951809; cv=none; d=google.com; s=arc-20160816; b=TjY81DFsVNr5WzZKqlc0Vf8DywwLeYuh99Ki7DSfUeayyyDM0rZxLIyWsi/7enkSA3 ZmtSf6SUDLeccX0kHtT/oKsTLBh0DD8vNmYaknNiG92Jbb1TchJdvQMBWZfc1Mhx27q5 QIRXdAbvF/92JzBrBUIp22jNb2u03bTu4uZ+WmjfCIP/7vwV/gk9rGjXvP37GII6hI3p Kzq3UKPPgUHJYjxRD94P+VmMB00ACzalfICslowzQPxyTz/egsqtEqc5P54OL9/bxk1M A7bVxdUkfHOAStvcUm/rw7Xu1DAWLUDEIGSayynuaCphX9p2pZpStkHIF064+SD1Ut0K KYvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=QOYoleaqnocOIoO/L221J5NEvcJpBHBzHXYKtcIqSAY=; b=AwWdNlGipmDuURqX8+fsEuluh5ljvRQGkGEEVvozGf93FbQX6JcCoM1TPvw3DMbT3W w3SG54xBTWSUEleBoW7SKWw4c8A8u8mEhrG+BVuKhbrU9VuFOAMn6VYGdHInaYzBTalb Nz67sYKq7xaksWPtj74XYtZESPgLXtx2skSwf8sFTW3d2KENHvVZISIqyfhEUqW75q4l Lx4jaxx0+Vxzu0/DEdXdYRJP6P6TAg+6C7RemxZtJaJkXQmZFwvncpiuCgwKinvPRxxk WQ/YfvJKe5eqCrY0wbR3nBcb7y+Taisu5/rbqaDJFsCQ+6/cXwDPm5X7OxHKwvXg2Anl bpsw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=X2HtfLox; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l5si32104692edv.367.2021.07.22.04.03.05; Thu, 22 Jul 2021 04:03:29 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=X2HtfLox; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9638468A7ED; Thu, 22 Jul 2021 14:03:00 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f50.google.com (mail-ed1-f50.google.com [209.85.208.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4244168A380 for ; Thu, 22 Jul 2021 14:02:48 +0300 (EEST) Received: by mail-ed1-f50.google.com with SMTP id k27so6250919edk.9; Thu, 22 Jul 2021 04:02:48 -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=wPDkangqmk1fXMbFREEnvDIGdRHcz9+N17k/d6T0BVE=; b=X2HtfLoxagUOjz2yDVItH5MHMs0OnURbzlB6eib2pVdmSU8SKGdDE/6gKKtV62VYXE jCidJUptY3bhaxQgHZ/Fj9ZTfIIZAv10hq65Bg5SU7qJG6HEuA5VrdXz1H6hJxwkTKkW IpZvNKvtfxr4rcX7WYdzFjKpXASiQ0sxVQ/ZBDO4sUIQ+a2iTfxesYUAdJXbDmT/zaRD cJnbwch+SzfcibQ2NJafI3dZWKk9VWuPD46NYywoNl9P363Y7YXB6XF2tpT2hfpB3hQu sOJsiR5WgNk/BVS/3jaQus2HPqytpBsZhlTdpoXWmA+PFgMlqBN3/qgCJy+C8GFSb4fG nwtQ== 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=wPDkangqmk1fXMbFREEnvDIGdRHcz9+N17k/d6T0BVE=; b=mQvrJKAbYz2ufRBuqXRMCJSKTg809Bkaku7mTfmDGCxj/ARhpsrpJx+6ofOzXEuDGk 7TeWY/wvLeyM3nV2JuFnrtIk3zN9GTYxn9NPntiKs7XLxWqVz9jwT7hAHA9p91l7QFkn 0hDxzqxQUe6ocvU2SPKeK/85uq0+Y2l10T4JQUJzO3Jt6b7hwqbV4TK/eweOJV7Fa/FR vBmTrq1GO1MF+2E4y+iyWCvaWl00Q2zSdC8VsSCW1CDQiX/Lp/NINcMLRKDRfhTpp0wp spTcyH/Ql6fKEOzqegeOyQZr+rIPvk0q57A4vcOeR2de+OKOSv/FFUto9fatTPsUc2cq y3Og== X-Gm-Message-State: AOAM530XFQfqlQgu8ubIZDg3lWvHzkiDeb3n0wQevMGsG3B1HhOVC3Wh Bg1IsPr0CmTosc98Mb8X6vlGaVwaxkvFcnTT X-Received: by 2002:a19:7110:: with SMTP id m16mr28774918lfc.125.1626951410116; Thu, 22 Jul 2021 03:56:50 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:49 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:29 +0100 Message-Id: <20210722105635.48075-2-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/8] libavutil/hwcontext_qsv: supporting d3d11va device type X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0zV8PsCTivCm From: Artem Galin This enables usage of non-powered/headless GPU, better HDR support. Pool of resources is allocated as one texture with array of slices. Signed-off-by: Artem Galin --- libavutil/hwcontext_qsv.c | 323 +++++++++++++++++++++++++++++++------- 1 file changed, 262 insertions(+), 61 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 08a6e0ee1c..95170323d9 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 @@ -48,6 +52,8 @@ (MFX_VERSION_MAJOR > (MAJOR) || \ MFX_VERSION_MAJOR == (MAJOR) && MFX_VERSION_MINOR >= (MINOR)) +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) + typedef struct QSVDevicePriv { AVBufferRef *child_device_ctx; } QSVDevicePriv; @@ -74,6 +80,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 @@ -85,20 +92,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; @@ -131,24 +124,11 @@ 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) @@ -158,6 +138,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; } @@ -187,6 +202,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); } @@ -202,6 +218,8 @@ static AVBufferRef *qsv_pool_alloc(void *opaque, size_t 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); } @@ -241,6 +259,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; @@ -267,6 +292,17 @@ 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 & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) + child_frames_hwctx->BindFlags = D3D11_BIND_RENDER_TARGET; + else + child_frames_hwctx->BindFlags = D3D11_BIND_DECODER; + if (hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE) + child_frames_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED; + } +#endif #if CONFIG_DXVA2 if (child_device_ctx->type == AV_HWDEVICE_TYPE_DXVA2) { AVDXVA2FramesContext *child_frames_hwctx = child_frames_ctx->hwctx; @@ -286,16 +322,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; + 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)i; + } + 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 @@ -360,6 +421,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) @@ -433,7 +499,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; } @@ -626,13 +698,29 @@ 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; + if (src_hwctx->frame_type == MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) + dst_hwctx->BindFlags = D3D11_BIND_DECODER; + else + dst_hwctx->BindFlags = D3D11_BIND_RENDER_TARGET; + } + break; +#endif #if CONFIG_DXVA2 case AV_HWDEVICE_TYPE_DXVA2: { @@ -641,9 +729,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; @@ -677,13 +766,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); @@ -697,7 +800,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; } @@ -720,7 +830,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); @@ -978,35 +1095,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; + 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)i; + } + 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) @@ -1029,21 +1192,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); @@ -1056,7 +1242,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; } @@ -1098,7 +1284,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; @@ -1127,6 +1313,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; } @@ -1153,6 +1343,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: { @@ -1216,7 +1415,9 @@ static int qsv_device_derive(AVHWDeviceContext *ctx, AVHWDeviceContext *child_device_ctx, AVDictionary *opts, 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); } @@ -1267,7 +1468,7 @@ static int qsv_device_create(AVHWDeviceContext *ctx, const char *device, 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 Thu Jul 22 10:56:30 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29014 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp428107ios; Thu, 22 Jul 2021 04:27:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxXw7n4evwli4nH2RqvwTZbIf4ubCu1LMWEi3t23O1SkT9rXX5s4JNik2+aqGImaQB543MS X-Received: by 2002:a17:906:c110:: with SMTP id do16mr7524266ejc.347.1626953271614; Thu, 22 Jul 2021 04:27:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626953271; cv=none; d=google.com; s=arc-20160816; b=HrHcmTmI8yHUkniQUZDdw8qi9RC5ujmndsvt+WKZrwH+fVgmE1NCzZhYnoqk/XmTbS G5JsG3ySdNJ0VIuuTLflP6zOvNDXyiDqRDlHCfDZspYT5W7Muukbgx0MDPYohTEyNzqM HEjKnpbEIzWba4zvy8m69ws+HWW+4el4AK2iUgC8vCcHrNmT+RmBTSbqlKSYgi0wjp4A 3zJerxKZCMM2TAhsVMTbVOn+GFbp2cq0syMZ6G2ilja5egqHyftllOy58V2BXnlCSHes F+kcq6GQK2L4ofgazA1jHviEYJPSAf7uX2QwJhdCrnE9u1wSI3MjbZ7gyO1TG2E0dFfH Zyzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=FZqHyNmVbNRb0v46IdYQ3qKFGxbUOLghouNFxZMCVro=; b=ltlDDgzq9WAXVk74YV4ltwUHOh0v01/3dj9b0cfKik8x7MymplKHSrgA+ByI+hH/xG /tjWYQsh8CFwtvNSKi+CyPrgzTxkUgQd5Y0+I8U8xmLXJJWXTqZELsccRLwfemplG5fv Bym4Sosu4MwYaPYBfetZLgO77mksheolHOCBsKQ7TrINNriFoQF78QEclyRDtxfkJlq7 0mzXnO95IQ8wx/EFt7fvb0S6uVnKUQ2q2XZP3vdFFEWhTd5jzMPkirkOTgSeZMGvMZlF /I0aO/Urhy5cmNwWlT46TiX1Mgqlkm30Aw2jELpkeegRiGYaZJ8pELyDfiuNBHT/Ht5G p5GQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="D6u9/iNp"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y22si29662714edu.579.2021.07.22.04.27.51; Thu, 22 Jul 2021 04:27:51 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b="D6u9/iNp"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A140768AA98; Thu, 22 Jul 2021 14:27:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1D03C68A44C for ; Thu, 22 Jul 2021 14:27:37 +0300 (EEST) Received: by mail-lf1-f42.google.com with SMTP id m16so7929869lfg.13; Thu, 22 Jul 2021 04:27:37 -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=ZAootAwZofD+5WA7+x0/Y0nrr6beX0NYs1p6oeu1e/Y=; b=D6u9/iNpn4fELhf2eGKWas5AO36GOe2tasM8N5Eu2murqx1UXMNprK/RnVQH1I2EAz hCN7DwrktwVrvh46lfIA2E5Im+At8pByfyQVmCGPP+1Hfi8b+nu/W2WgrMSkTlhF6CWd c8vGAzRgkT68opCk3A4NK0iqNq31g4OgccTLLiMuQ9PocyGwVxG5P4zJccefWy028qno rdqEP7E4mDqw20OPiP5bCGyQOSpiKoG779YMnkdoikOUVe+zhlBbt7/dU2ZnbzAfkhEg wetUA9/aSXBHBKLJ/bADCIjWYfk/QWoHxqhRekTPtX24jty+bu22ECcbN1kuWf3zOpn6 FVgQ== 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=ZAootAwZofD+5WA7+x0/Y0nrr6beX0NYs1p6oeu1e/Y=; b=b5vJvsHOkxZoMWPGcDtnLwMTbF1X425bp9Wc7Iys8B+ZcN963E2Sk5CILWEEBxi1Uu RsKZ6R6DKyDARdwGblmHxdB+Op0VZWcNUwBJi6f6MVNuAF1fBUTbSsBQ9xv/+ozvBFN7 VBWY8Cpr+B0gkBtMSCDONRn1mwCBSxJbNmFKmkrQTdg9BQF4BSHPu9OMX609tmSfM27S nMQbbsFCZcsUErvAZltPhmj43bwWGCqsoMKROkG7CyuQuBHMv2QygfYxeC/9P6dOK0ze gJPR7/YS495zEzH0PXGIVlenV8bgqRu8h3RnRtBA595FBfRX6gSS+/mQVA72CfjjVygx l2YQ== X-Gm-Message-State: AOAM531A6n5TP3QvdwRg2ixFL2WheJIICMn3QKoR3GbTuT9/HK4J2rzB leurzYn0dXESlv8tJxyq34EIDj6IOkFDt2OR X-Received: by 2002:a05:651c:12c8:: with SMTP id 8mr34288695lje.151.1626951410769; Thu, 22 Jul 2021 03:56:50 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:50 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:30 +0100 Message-Id: <20210722105635.48075-3-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/8] libavutil/hwcontext_qsv: enabling d3d11va usage by default, add usage child_device_type argument X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NoDijVo0JfR5 From: Artem Galin Rebase of last patch set over current master. Makes selection of d3d11va/DX11 device type by default and over dxva/DX9, helps to cover more HW configurations without explicit parameters need. Fixes TGL / AV1 decode as requires DX11 with default parameters Add headless/multi adapter support and fixes: https://trac.ffmpeg.org/ticket/7511 https://trac.ffmpeg.org/ticket/6827 http://ffmpeg.org/pipermail/ffmpeg-trac/2017-November/041901.html https://trac.ffmpeg.org/ticket/7933 https://github.com/InitialForce/FFmpeg/commit/338fbcd5bba1de0e1b3e3bad8985eee2fdfbeca1 https://github.com/jellyfin/jellyfin/issues/2626#issuecomment-602153952 Any other fixes are welcome including OpenCL interop patch since I don't have proper setup to validate this use case Decoding, encoding, transcoding have been validated. Requires apply the following patch https://patchwork.ffmpeg.org/project/ffmpeg/patch/20210623030346.2025933-1-haihao.xiang@intel.com/ to make command lines work as below. child_device_type option is responsible for d3d11va/dxva2 device selection Usage examples: DirectX 11: -init_hw_device qsv:hw,child_device_type=d3d11va -init_hw_device qsv:hw,child_device_type=d3d11va,child_device=0 OR -init_hw_device d3d11va=dx -init_hw_device qsv@dx DirectX 9 is still supported but requires explicit selection: -init_hw_device qsv:hw,child_device_type=dxva2 OR -init_hw_device dxva2=dx -init_hw_device qsv@dx Signed-off-by: Artem Galin --- doc/ffmpeg.texi | 20 ++++++++++++- libavutil/hwcontext_qsv.c | 59 +++++++++++++++++++++++++++++---------- 2 files changed, 64 insertions(+), 15 deletions(-) diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index b27b9fe2c4..04e14bb56c 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -1097,6 +1097,9 @@ device type: @item dxva2 @var{device} is the number of the Direct3D 9 display adapter. +@item d3d11va +@var{device} is the number of the Direct3D 11 display adapter. + @item vaapi @var{device} is either an X11 display name or a DRM render node. If not specified, it will attempt to open the default X11 display (@emph{$DISPLAY}) @@ -1120,9 +1123,21 @@ If not specified, it will attempt to open the default X11 display (@emph{$DISPLA @end table If not specified, @samp{auto_any} is used. (Note that it may be easier to achieve the desired result for QSV by creating the -platform-appropriate subdevice (@samp{dxva2} or @samp{vaapi}) and then deriving a +platform-appropriate subdevice (@samp{dxva2} or @samp{d3d11va} or @samp{vaapi}) and then deriving a QSV device from that.) +Alternatively, @samp{child_device_type} helps to choose platform-appropriate subdevice type. +On Windows @samp{d3d11va} is used as default subdevice type. + +Examples: +@table @emph +@item -init_hw_device qsv:hw,child_device_type=d3d11va +Choose the GPU subdevice with type @samp{d3d11va} and create QSV device with @samp{MFX_IMPL_HARDWARE}. + +@item -init_hw_device qsv:hw,child_device_type=dxva2 +Choose the GPU subdevice with type @samp{dxva2} and create QSV device with @samp{MFX_IMPL_HARDWARE}. +@end table + @item opencl @var{device} selects the platform and device as @emph{platform_index.device_index}. @@ -1225,6 +1240,9 @@ Use VDPAU (Video Decode and Presentation API for Unix) hardware acceleration. @item dxva2 Use DXVA2 (DirectX Video Acceleration) hardware acceleration. +@item d3d11va +Use D3D11VA (DirectX Video Acceleration) hardware acceleration. + @item vaapi Use VAAPI (Video Acceleration API) hardware acceleration. diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 95170323d9..f7cd13cf1b 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1440,28 +1440,59 @@ 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; From patchwork Thu Jul 22 10:56:31 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29011 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp411676ios; Thu, 22 Jul 2021 04:03:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzEnyykgUmnvxGJpVRkTsnuWwjWc2gwOfwZAiSxd1KU7rXJ9+lQjPfVW2RwdI4GnNWkmM8X X-Received: by 2002:a17:906:6814:: with SMTP id k20mr42440311ejr.381.1626951831855; Thu, 22 Jul 2021 04:03:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951831; cv=none; d=google.com; s=arc-20160816; b=XHf2gXzIikcfL2EjfAcPiqiIV07zHNAa/lCy3kz5y3wfkptxv21JE4FEXAbC4tb0f2 TAnAFDksnoZm4WK6ABVSa2E5CwLii2cHTwe75LidS8AbbgfOm9ZEDqdsFmU3uF3rK4M2 efAihICbRhxeNA7ZIfp4rBHceeZimvBlK7nO13wobgxPckqM73UWzD+F4cx1yqATFCYG mwcvi6cNjXuai7Jlvl2I0uTlQOA0fMmnPvtzEmVh5HW/zeLZG48OiHuunJomrikOgb/g vu8Z5+8Xl4rR7vbie4RWypKpj4THIfNIEy/5+kgvS+G2sWamxZFAAEDLWWajBS8nI4RQ ZsyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=kx4cflEi4zqhXzmFQRCirOhwyRLt8htc23qi5yXj8rI=; b=B9HESbPPqjcvZp4Rm+0FeuX0tjtNDrB+D8gmDvzbFX2nJcMHt7kT6m453FgDcDx367 PpriIQuV5HMj3SbjBKIKBnivCmRn4BeNmomSsf2ABxFCvpbRPm1O4BlJnKJXOTYwtJpK UuHmon+t7CyFtpVyTD+BLCe3cSEcsTpnjdkPz6QrPNtpO8Miz76H9ZR3M3TcycsjAy2l Zc/dbo+iop3dKWaFZNmVuIMKQnTI41GQd+BxeZx/nYEplIa3TJVqGLcHjbM+38uvrbTG tVv8RGcPvH9IExGp/zhECoVJ7IfSNH4n4e5L0fHemdmFVlndqoXyW0WiT+rhDQc5GDFz b5ww== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="Zu9/Yogp"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id lr6si9594747ejb.129.2021.07.22.04.03.51; Thu, 22 Jul 2021 04:03:51 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b="Zu9/Yogp"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B4D4568A883; Thu, 22 Jul 2021 14:03:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 37AF168A82C for ; Thu, 22 Jul 2021 14:03:40 +0300 (EEST) Received: by mail-wr1-f51.google.com with SMTP id t5so5455513wrw.12; Thu, 22 Jul 2021 04:03:40 -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=OLEao4lJNi/60jLkTLc7O6XjU9kS69Wc8hDJarJPWuw=; b=Zu9/YogpYzr+aYQIG8MUobzPh00uYXZV5COHGnEJpzbxfsPBQPqUAwdarXhVN6m1Hl ZqP7tuaSES+3i3w1aYhSs7SiLSMXx3unwnkp0RIKFct7m/a4LcjORpKepbUaKh3eTjpn h+oPzPnP898oVimEGXeq3I0PUs20EiZP7WMKGBf56zUk0DaDFdfJYAeNTcijJZcjphDG Snn8OaJcJBAFbf6jgjoLf9vMmgyuodfnd8h2R1Jx9WpatKZV+TmvRDL5K4tbi2pCIF4B fZpqZ8OY7mL1xQGhQFvwbT//hJeOM81xPsBq/MgorChZaFuYrbhrnmq4p9vEz/s5Nynb KL8Q== 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=OLEao4lJNi/60jLkTLc7O6XjU9kS69Wc8hDJarJPWuw=; b=K/no48RU7HTNbjf/zIBOdl0ZztvFj0NSXchNvDgYirvZsHAmgh7/rrDBRzJvd2AzQK OwOL9EyMt4cQdMacuT3zKl0wYIJLMI3aO0FTqw8tyFSl8Y2vMaXjdmSgUaomEm2bZ5ZT sfOO0RkyYDBbCdgN9fANV4Z3fGMTaQkb+6pYxSbclDSYyh2aP4I9QWKwUIXJQcJAk5wV icbljUcOcsBZqsxE4VbMvMmyvmGUOwzXBpzmdDy/1nSdzkkHO7kEKFgENBSRLLHLMEKG IPqPSENZXhOqw5nir55qjkofDwFFY8pA8BtXYvZv95tHUuL09l+VfNWyaN6rjnqzc5kI 260w== X-Gm-Message-State: AOAM530jo9Ayk20E3bumzIKLq24xSkJKc/nUuMgTJ9Dxvk3BMVETkbz0 jRrNnStRqvDEbph2gKYmsufnaL6KlhDxtiAp X-Received: by 2002:a2e:a5c5:: with SMTP id n5mr32364275ljp.197.1626951411388; Thu, 22 Jul 2021 03:56:51 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:51 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:31 +0100 Message-Id: <20210722105635.48075-4-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/8] libavutil/hwcontext_d3d11va: adding more texture information to the D3D11 hwcontext API X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Itq8ntTeNHZ6 From: Artem Galin Microsoft VideoProcessor requires texture with D3DUSAGE_RENDERTARGET flag as output. There is no way to allocate array of textures with D3D11_BIND_RENDER_TARGET flag and .ArraySize > 2 by ID3D11Device_CreateTexture2D due to the Microsoft limitation. Adding AVD3D11FrameDescriptors array to store array of single textures instead of texture with multiple slices resolves this. Signed-off-by: Artem Galin --- libavutil/hwcontext_d3d11va.c | 24 ++++++++++++++++++----- libavutil/hwcontext_d3d11va.h | 9 +++++++++ libavutil/hwcontext_qsv.c | 37 +++++++++++++++++++++++------------ 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c index 27274ee3fa..272a19da47 100644 --- a/libavutil/hwcontext_d3d11va.c +++ b/libavutil/hwcontext_d3d11va.c @@ -72,6 +72,7 @@ static av_cold void load_functions(void) } typedef struct D3D11VAFramesContext { + int nb_surfaces; int nb_surfaces_used; DXGI_FORMAT format; @@ -112,6 +113,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,15 +155,21 @@ 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) { AVBufferRef *buf; - AVD3D11FrameDescriptor *desc = av_mallocz(sizeof(*desc)); + AVD3D11FrameDescriptor *desc = av_mallocz(sizeof(*desc)); + D3D11VAFramesContext *s = ctx->internal->priv; + AVD3D11VAFramesContext *frames_hwctx = ctx->hwctx; if (!desc) { ID3D11Texture2D_Release(tex); 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 +208,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, size_t size) @@ -220,7 +229,7 @@ static AVBufferRef *d3d11va_pool_alloc(void *opaque, size_t 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 +276,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 +284,11 @@ 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..77d2d72f1b 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 */ diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index f7cd13cf1b..b8294f2511 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -120,6 +120,23 @@ 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; @@ -295,12 +312,11 @@ static int qsv_init_child_ctx(AVHWFramesContext *ctx) #if CONFIG_D3D11VA if (child_device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { AVD3D11VAFramesContext *child_frames_hwctx = child_frames_ctx->hwctx; - if (hwctx->frame_type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) - child_frames_hwctx->BindFlags = D3D11_BIND_RENDER_TARGET; - else - child_frames_hwctx->BindFlags = D3D11_BIND_DECODER; + 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 @@ -334,11 +350,11 @@ static int qsv_init_child_ctx(AVHWFramesContext *ctx) 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; + 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)i; + 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]; } @@ -714,10 +730,7 @@ static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx, dst_hwctx->texture = (ID3D11Texture2D*)pair->first; if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE) dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED; - if (src_hwctx->frame_type == MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET) - dst_hwctx->BindFlags = D3D11_BIND_DECODER; - else - dst_hwctx->BindFlags = D3D11_BIND_RENDER_TARGET; + dst_hwctx->BindFlags = qsv_get_d3d11va_bind_flags(src_hwctx->frame_type); } break; #endif @@ -1137,11 +1150,11 @@ static int qsv_frames_derive_to(AVHWFramesContext *dst_ctx, 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; + 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)i; + 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]; } From patchwork Thu Jul 22 10:56:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29008 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp413022ios; Thu, 22 Jul 2021 04:05:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz0+r77OhTD/3PdcQJEZWshwaAXynQUv33fHIrgP5aGl6zYKLt2cRXQ7UKPz4PMGPWVGMBo X-Received: by 2002:a17:906:5fc1:: with SMTP id k1mr41717894ejv.360.1626951922918; Thu, 22 Jul 2021 04:05:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951922; cv=none; d=google.com; s=arc-20160816; b=liliriB4K++59qRaFO+Wp2wi/AYlzoHCPnxUAGh10LBfs4QQrKwUFjwr6tXT2nsB3J 7PgrJPv/5zkH8U02n2Op+RcA1MfZKt1nukQ0oDiYkJWNpvluifjdWAjiRtVrudPsGe3B 4y46qgla9ics5B1sNV7qpJNVo9x5iYiIMMFxOwmv2V50zTTm4r8OO9FjxhKn7t9PH3Vx V4hGOVigB8tEkekc9bxM0kcNKiYdW6PHhu2XkddFQCOt2WXXYUMSxlhvuueOFgkBgn+J APcTdxdaBtawtLlPN4JccU7WylJqMSr352lpDQGxOuPzN5Eaj0oVV/7KiO+T3o2BJxll PpWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=gegVio1Gfo6nF5w+JP+PiqUhRdIvh1ixnvlBmzwdKUY=; b=kCmiQkumhNREWggccxq/O+EoFudWfhReolgujx2qwg2DODGRMuoS6QmRvfPjontY6s 77PjOOGaR+KJg+4pImi+ecXyLA7r8zTr1p6BlvHXBHmsWMUT6XxdpXyXiAedrHDw4DMS EEHjVPtT2T4HIAYzC2VmrPa/YG0dLQytJPHndxnI7PIr0ySHCBgm8BoKHI2cNR7zrPgz 2u5oKCmLVF9Coe3zbS3D21w2stMInqxtWQBIRV0N9Zx797udhwfazvLIdAB4ZQqVWlKt QXr8Wlb4q5dxBNb2du1g0Qu0bEDfxbdS1cQzlRMhikVUTAnYV3y8Adzy7IYSJONi1f+S B6NA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=JeWRTbpj; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id r2si14806249edy.605.2021.07.22.04.05.22; Thu, 22 Jul 2021 04:05:22 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=JeWRTbpj; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ADA5468AA4A; Thu, 22 Jul 2021 14:05:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 13BA668A867 for ; Thu, 22 Jul 2021 14:05:05 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id f30so7855167lfv.10; Thu, 22 Jul 2021 04:05: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=sqmk/bKBfTyIpfERkgwsMD4duZxJw5ML6RbbF/TKcbg=; b=JeWRTbpj/Zfn7zrIyGaJTkmOC3lCt12W3EXv5h+H+jx5ny65d/A6HDOZ5SFE06wffu ipy+vk/Oy4kjhOG1AlWs7wJrNW0Gn9NWKsulrIUp5PN0eMKbMJbuOVDXG5ISawUbZj/9 5kO2QPxPSI7Sxzzf63AEI0pZqIqK6GkLErnKVGoAquwtwrOgyAr27LLPR8D65uHGiVBc B8a8xosJ2zeCkDebH8xfWT2vhFUGjj6tYpIEJy31bUeQwN2w6Y3dOaitjWTWmRBW/RDl Ge9TPpyaHlNhiQjEpsUrjBqUub3YSBtXvoFPzUdjp5zzjmA5COwiV534Z0sYDRv8CtQt r+0A== 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=sqmk/bKBfTyIpfERkgwsMD4duZxJw5ML6RbbF/TKcbg=; b=djHi6zLLpuwRiW9UR2w+J9c+taTMI5y/CJahOaoQSM9vC8zdwpojvb58oc8X4HUNh2 VVgB/7JQ40AF176vZe74MvHZsV1VXGPr/StZAd5xqRE7VfLx6ZJlyaMBvxaa2v9vmIgr L0+nloqe+udCErJJlrpkUq8bjyb9Y0XhcipCa+6+nF1UPaJ2qM7zt2ukPAgqGYeCKv2o maos+UvOSKpYAjqb3Dgt15Dp/Io7TIgR+JW/W4sLQy6DG9qn1Uk3qUDIY5OJb1laYwTx px5rHoY4a57tluvmTBKkLlajqgB6kFM+iaadXKMMosJX4RTxF9l48eNcU3QKr6FMA1d/ Z9aw== X-Gm-Message-State: AOAM533vRSaEPLtjF3d1l5fAVQo09DRqSZOBoQySgc2yVONud15Zsgsf UZgyK0Mw1sTiCQNZqddHIvwSSpaltWnKMDNy X-Received: by 2002:a05:6512:2316:: with SMTP id o22mr29543515lfu.175.1626951411985; Thu, 22 Jul 2021 03:56:51 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:51 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:32 +0100 Message-Id: <20210722105635.48075-5-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/8] libavfilter/qsvvpp: enabling d3d11va support, added mfxhdlpair X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4zCDYhdDv5C0 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 4768f6208b..7f2f197ce3 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -36,12 +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) - -static const mfxHandleType handle_types[] = { - MFX_HANDLE_VA_DISPLAY, - MFX_HANDLE_D3D9_DEVICE_MANAGER, - MFX_HANDLE_D3D11_DEVICE, -}; +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) static const AVRational default_tb = { 1, 90000 }; @@ -202,7 +197,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; } @@ -572,14 +573,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 < 0) return ff_qsvvpp_print_error(avctx, ret, "Error getting the session handle"); else if (ret > 0) { From patchwork Thu Jul 22 10:56:33 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29013 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp427806ios; Thu, 22 Jul 2021 04:27:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxPC1q1xaCJ77jQIBp/THZtL+O/wO8uxSjfd2Xyqw/oFKCYJZ6Wj5GPRMus0A3nTmvYy7yQ X-Received: by 2002:aa7:da49:: with SMTP id w9mr53796941eds.47.1626953239793; Thu, 22 Jul 2021 04:27:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626953239; cv=none; d=google.com; s=arc-20160816; b=lutUfH5rt+f9blBITjzCeo9KwceHOUkFXABiRZW6B99IZKzevurmRBHycV1zLAX0D7 j5KKAgLvrm8AEun6hx+i3T1ejyD+djYl07w2oKm90fywZsz7uNDLN/kVQIAHGS06C3Al 0xFm0u6E55ODV9PbxmP/wNtpsPNoWs9yCZayDdQ9Ocnx6qFEGLwzQ97d2KNa8HOXjPl8 bnbwcXQMiupnMpUV6/BQ7StH4QHR9bXbH/Y2GI7Kf1DtAtOIijLPTN+5i7QPNyk2xdF2 yQn822LSDOxh4Wu6cUM3pjG4qFcOlobwogBsEP87Vm3eoG1EnjOPrgtioVo6ptBeqtcU MvIQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=vEnwcUc4eX1ExSxTWABT6qQit8/wgIl7BcYgUw67WyA=; b=pipSNOMYZVKTtHMA/c7p0CZUw0Bf/CH6pRm905ZOSoB/9IZkByQwike+lakLvgP3kw NpX7TBgZsRpDtG4jsnGEa7HQVjrRA43nmr1jdwj4ZB8N5OsCRs4LaCp1rGZKq0kPiXIr MFw+Zmb1k22jnug86Q1Rnct60b+dFqbz8+2JY2n6LMkmowGkF9DmeKwHmaDZqU9u7MFW iqzUAbRdzNL2Go1vPws/0UtDAwZqEM3TRRGfsPw9a76YquEBKoVn4BTfEpukJiGBjSMd eRe1/Ik8kjWzS8CrYc00fRaXPsVWyxKLhQoJqdr6eY7nXuwwXS/7HwmsprJEwW9GtrLw iGuQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=V2IBMi8q; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i18si29328413edr.353.2021.07.22.04.27.19; Thu, 22 Jul 2021 04:27:19 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=V2IBMi8q; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9607D68A9C9; Thu, 22 Jul 2021 14:27:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D350B68A701 for ; Thu, 22 Jul 2021 14:27:03 +0300 (EEST) Received: by mail-lf1-f43.google.com with SMTP id q16so7973858lfa.5; Thu, 22 Jul 2021 04:27:03 -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=X8SZCqpMTryz8ZIafb7khm35PZcn4kxYc86LfkkxB2o=; b=V2IBMi8q8N7VwStcYIKCwCEAg/UuU35LIKQMZ8NT2uehge1KxKOWMENrZtS15gP0j6 hXD1nuDQWo26OxGVAMuNLyqASAmQaJssAJmrfKO5RJLVbsF3Se8frAg/h7mXA67OIwoZ SPuCGTGGoquDyDf18QiGlP1GE48WYdsnSZ3fob+tUQ79YQD9ywM08Uu+pVWzczMnm5Aw nn9iech0MnqZGQA1vFugCJAKIa9RgnF4fzoCE6QsrGsTLQ0Bp050b6UQd9kSuZktDWd+ /xkgGDlF3ZO0/q4K6epIAKe9tx8ambceIcSsUVLNOHv9S3aqx0LgR9UtbsgCN1rnY56d tyZQ== 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=X8SZCqpMTryz8ZIafb7khm35PZcn4kxYc86LfkkxB2o=; b=kSRwUiAxpTZnYOj3V1DT+tPyKyTH+kCodVRz1drlP4iWajWYqLEUZAVdagitlJSXfA Ifx8WdGXgh7jxWXl6pVrytR8E+V1D79Pd+eb6YZV1RfCgXmSPMwHICUG737IJ+Beq3l6 bdhaZOrGyQHL6668RWPP3R8uZuY8wHtrYnDtVdoqz0Iyl6npxUexg61jOIqlO5Hsiu1o GTTqjbeYCsfh51jTibnUb6vuKIp26Fl5KiZzfXS9s7hR3DfUkDvW6nsLn67VZMnOeaOA ZUo8TOlJ+4ykoY8qKXRprsf7TVROtJRkyCCSWxC/3YMR/GMsLBEBJPYrgpnpUTaKqVEd fk8g== X-Gm-Message-State: AOAM531GLRBkdtpHNbMZ4r72t0kLzoygiaLvHfLRZI6sIqwR9yQAMuh2 rUSX7qDdcCaIH/wxgOnxLpq2bOAjwylggluu X-Received: by 2002:a05:6512:31d3:: with SMTP id j19mr5912649lfe.53.1626951412625; Thu, 22 Jul 2021 03:56:52 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:52 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:33 +0100 Message-Id: <20210722105635.48075-6-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/8] libavfilter/vf_scale_qsv: enabling d3d11va support, added mfxhdlpair X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: m5scoWKYGNCp 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 | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 189223a58a..c02d98f3db 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) { @@ -305,14 +306,18 @@ static int init_out_session(AVFilterContext *ctx) 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; } + err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_type, &handle); if (err < 0) return ff_qsvvpp_print_error(ctx, err, "Error getting the session handle"); else if (err > 0) { From patchwork Thu Jul 22 10:56:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29012 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp412932ios; Thu, 22 Jul 2021 04:05:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzrLnSOIqqmTPF0Bt4nkR0UgYsX5hN+K3ha4wpRU2bzYU3d77xDapiCxdNvL1Nzjgti8Wef X-Received: by 2002:a05:6402:22cf:: with SMTP id dm15mr52906760edb.280.1626951914501; Thu, 22 Jul 2021 04:05:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951914; cv=none; d=google.com; s=arc-20160816; b=VEfKqggYKai8cRpZn5mkOjGVW8DcHcMR0A70DB/BV/1jH39FoPlIKK76kPcyq8wqSs o1XokDHPTvyV2o68ypVeRmaY+lItF/7ObLX1xoZHU0I00SrZTxK+0EArJ83xXq3KYFem zLgSRhb2JnuDEhoEoh180AJFb7vdA6LpP5MBvS3dOOdxFYV1c46lKJKChO6sqU04iig3 TF8t4tr73tNvT3AP7EuxVbdfuZp8cuvHnpKmRtEKz4Z6eR4NeHtLJ1fTdH9yrvRWv2rQ g07yVlEx0bMIVDMkPqVcPzgGfm5sdxLaA1mhsofEHV5zSgBk7VqxX2uGpCW9lpwGfRI9 9P4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=9YcXex3IiLWYEpOtNqpAy6RCkOycvkMtH8eFNOsxEj4=; b=uaVGP4Qi+vRbkmv6RdPL/N3olpywemP0QdDIrf3IQUq+uLMOnAcdaHqkurCCkFgM/D MOw35Dt/OcOsf3ivZXiBSV5+p/FqW//Y+ZDNaPs1ew2xn9CLkGTNVFdcXfY40VsLP/GX NX3GotKu/Hr7OByjK2hFOBaE1fUekufrdKnp1Jn6QU1V6wvDgF8J4elpGzRcce2zDZgB MT6wGfFy0c6m8L9gSXfqsJVju6SLGPfcjZ6GzMd/2Gj7DlAp8JBU6ayMjkcI7k2Uc3n7 x4j6+DJkP99ZhuO4rJgeeMM7n4mHlqOgsNCBNJRC1Nh2RkgyWx4cjN0GIwLuMJAjvb3W FbFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="k44Loe/k"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id c19si6051132ede.486.2021.07.22.04.05.13; Thu, 22 Jul 2021 04:05:14 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b="k44Loe/k"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C7D6B68A64D; Thu, 22 Jul 2021 14:05:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 94F6668A64D for ; Thu, 22 Jul 2021 14:05:03 +0300 (EEST) Received: by mail-wr1-f49.google.com with SMTP id i94so5475811wri.4; Thu, 22 Jul 2021 04:05:03 -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=m21e8Ro9834KkfLUmX3QIzbgCDaMCixys7sRdQo0eqw=; b=k44Loe/k2MfmeGsWB1e8xbZ4hib2gvvHEs8v/zOxF9SwUJGgC3IhQWWqxj1pW5PYTI 4WPxFkfrQdI0IOGEFJvNWOC8J0vuii19kqwjxwnXCu/XJ0sB+6DdwFegPVvvFljn5Dvf QZh0RKuWt5RVoEBv+lBOH6spcHiOQ2NgZhHEOhYhA1mlN968ZA2IQANzK/a+cSFljgvj WkQHm0+I1L4C7aoIYsVFYtX0T9VY2NzmmCy4ok0JdNfHRbuNy8JoQWQlogxr8tRMJxOB SlYre2pWxDBKUGTEqPIoxk3AsDzlWh3t8fFSeCtB5/EX2Iapf7FRyoshd50ismaFAumn 2f7A== 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=m21e8Ro9834KkfLUmX3QIzbgCDaMCixys7sRdQo0eqw=; b=gLr2z/C5Ga0HAxaeEyOthMD+GZhgt8bEJ2qFi7D94kicA4VYheeV+5kGW2oiGYYSf1 ZdOpRfOhRmE5RjRaBYMqxRcFIU6d7+dDqnLUOZdRG6NkVBJXutXIQ+i/i3jlW9MvDO4z e8pz0JhPdZnjfD5FpUXIH+QCJE25aQcWuI74S+9ps5OOQs2I8GClfHRie3nRwU4bgdzv SZr4YZfv2vyAKVif4Bm7zLPqNHqMnU/9KxtFxil9v6rEwvc/T71IurNLFdBop8+hSMqG n+jWVEilwUi54vF7IBY5I0LIZyfkxqNjzkOxrD7p7lBZSwuQII8iK7RcYJo6RK6mgjZ0 Uflg== X-Gm-Message-State: AOAM530DeCTqaUgKC06bssOhnvRQql75Pguh2CgdLEGYiO/LH4CVyN9w kPPfMFAzg1faAWBBzB7+ajwnt+E0hVbD+fqD X-Received: by 2002:a05:6512:3a8c:: with SMTP id q12mr28543906lfu.334.1626951413282; Thu, 22 Jul 2021 03:56:53 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:52 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:34 +0100 Message-Id: <20210722105635.48075-7-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/8] libavfilter/vf_scale_qsv: add MFX_MEMTYPE_FROM_VPPOUT flag to frame_type X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: h5unIyBEUZjt 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 c02d98f3db..f32cacc1e2 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 Thu Jul 22 10:56:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29009 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp411808ios; Thu, 22 Jul 2021 04:04:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx0OTriF3ZzQ3AdCiUz7Xg5hXP9Dp4YHGhucHXLV4fL02fCy/vTYDvn/VryZKPk/pd8TXg4 X-Received: by 2002:aa7:c952:: with SMTP id h18mr54280174edt.18.1626951841273; Thu, 22 Jul 2021 04:04:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626951841; cv=none; d=google.com; s=arc-20160816; b=jQ1jZJe7v3x/O0S2+AEtNyEMFOA0ai45305MsITitVE0Y9uXIW9Hr26m6TtaPvFrLN 90Y8wIpo4RxbxIi7fFiEdsB6uHe+TLKTUJQXyKOOkIfWgOKD1xNWpK8VciYtMBV44fkl BehTxkMroPgsaULkemVYfslFKPGNBInDAhzyauf15zk7QILWsgKTGyKGYCoMep4cNi4L L9mqmJG5eWFgt5ou8G9Xvh2hKdKTREx5CA1Sm96qWIof9fK3l+lsJTfpplWkjc5m/ICt 7TXsrbh1e4QBgkpw5+LxfOlpkl3EiHhaUyd2gpzUAROcE+H9acrOb3op+OnNxWwLFGqY p4sA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=KKxZLPG+uJEUq9OFZw4ysNBVdZpDYjCHFMdOFTO+BCY=; b=FtFIdpLtvX30tCOPlkwF1pbE5nB3/cH2gZcZYZVaZmlIHHWKSHox9ZQrUpbBOobKlX d8pjC3v1y845orW8V9PWgdNYBkiiqYIcrVx2XHqNsb0PP8wJ/qS4gMQhBOQgubpN9QcK h5SyJMbU/2RtlTOyjXLkidTD+TIKA+F42DeeSvzGWUhFkIeRSa6UmMVHBdreFX+arp15 J3LSPxOSf5v+ksKhiM7katpNm7qmatwzhQ7u8NSF0zKU/1sdMWHAhdWaHp06A+AkiaUp YY07bLvapCbkgyDp8+QgpfZBRvVzohcSd99T2DdpJ2dqaov4vC2S9r1c1M4YDA9vd6vp V6DQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=trGWFZ0y; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id c12si38036075edx.372.2021.07.22.04.04.00; Thu, 22 Jul 2021 04:04:01 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=trGWFZ0y; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9A25A68A784; Thu, 22 Jul 2021 14:03:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f41.google.com (mail-wr1-f41.google.com [209.85.221.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 540AB68A834 for ; Thu, 22 Jul 2021 14:03:40 +0300 (EEST) Received: by mail-wr1-f41.google.com with SMTP id c15so5479994wrs.5; Thu, 22 Jul 2021 04:03:40 -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=iJQn+/WINeAUsEtEks41aeFFUXEvYB8iUsfaKyMhy6w=; b=trGWFZ0yIlyooDfnyCSBeiUrurikWAMZAZIHkrzoVaIT/t270F2vjxegzqv4CoLcUQ hiuIPIngi2slYqUKZnQWXb+wYBR2x6qJ4kT6DWr4id3nGHUxjVcDLrsqgTqT2PDlxEdX 05R80nSXkRgUOqr3lc+ElbIRiKCNtj7XqIegzKvIhX71MkWhg2/iWp4Bfe4Go2s1UOLT +5hb0adTp5BHXEFewsRMewNXhSwXx/G202L5kEm7ysN7kBnWH/BYb525HsTfh/PjzFxo 8Zw5+hG+wz5kSnve3vCIfbGUaWwlB5mk/UM73+2HvPkoxOsJmKLUZuW6GxpAwQLN6jEA 2q2A== 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=iJQn+/WINeAUsEtEks41aeFFUXEvYB8iUsfaKyMhy6w=; b=GGXgokAJlc3zm+9/bHYbxeASfFOQ49YPJdGWzzpodIRQZgXvAY58dN0TGD9kKWzij2 fUbLkxjRjoobYKsteP8Xpy0s/EsrzW0t7UNx51MFTCz/sPoRWCMegDVqxXj+FocRQGNr 6xgXkmxHlIT05IELl2SNGzZ674qyGyvjUzrku6tf/TcGCvy4MadW9/Gwh/3o1IhAnBpa TQnSztXX1xqMn3f7hciRA/fUHvElbi9a2XP2ZmF8euyudkKCGBsoPgBYRXaH+9jTuhye keAUpKkF6wpvd9JxlpTW3tdElaPve5BnvlLaSqwODHiwUXDNWKvq0IjneOAOH2XRTffD jctw== X-Gm-Message-State: AOAM532JH70Q42EjYHbTU2q234bE6R6cb754KQUmid5qtHFl4LuS2C0r q8gEYfq4gLI5iaHpYYtgG6aY6ezyY2ymGqaM X-Received: by 2002:a2e:834e:: with SMTP id l14mr34252817ljh.458.1626951413864; Thu, 22 Jul 2021 03:56:53 -0700 (PDT) Received: from localhost.localdomain (37-144-244-78.broadband.corbina.ru. [37.144.244.78]) by smtp.googlemail.com with ESMTPSA id z4sm1951236lfh.2.2021.07.22.03.56.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 22 Jul 2021 03:56:53 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org, ffmpeg-devep@ffmpeg.org Date: Thu, 22 Jul 2021 11:56:35 +0100 Message-Id: <20210722105635.48075-8-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210722105635.48075-1-artem.galin@gmail.com> References: <20210722105635.48075-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 8/8] libavfilter/vf_deinterlace_qsv: enabling d3d11va support, added mfxhdlpair X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: sFIUJOLiIc8B 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 | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c index 3c2d87c7c8..238e83bfd3 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, @@ -149,16 +151,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) { @@ -186,14 +188,18 @@ static int init_out_session(AVFilterContext *ctx) 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; } + err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_type, &handle); if (err < 0) return ff_qsvvpp_print_error(ctx, err, "Error getting the session handle"); else if (err > 0) {