From patchwork Mon May 18 18:55:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19756 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 93E7C44BA57 for ; Mon, 18 May 2020 22:25:54 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 720A368AA68; Mon, 18 May 2020 22:25:54 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f65.google.com (mail-ed1-f65.google.com [209.85.208.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ECDDB68809C for ; Mon, 18 May 2020 22:25:47 +0300 (EEST) Received: by mail-ed1-f65.google.com with SMTP id s19so9458445edt.12 for ; Mon, 18 May 2020 12:25:47 -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=yDiDYzXtmrm3gnaI3s8UZZS+XU3yKpum18Q75TAqsLM=; b=gX4AEdRzrnJsbGKIQBzgd4GwYYvpaKuZmUqm6qEkECh8y1YdO9SNT/sVWdTgalmkM5 5iFn+Y9ziVvV8eHFx48QXbQEVyIyPw4Riol7hjYq8cEX+jVAy2wNQ1+nURP56Biw0yq5 /JTyM0Dctc9r8xtJ/GTOoyh7hSgXwm7RzWm5oRDINmiZ+vY5QvfbG1Uu1YndKOZbLVBq sNYtDlq7Txcd9BPNmRLEYTIQF2WH0KGtxxcDjk/di9eq+ht2KHXB4FPyceBch4CCucSS WBmbfLifAPWgvRiTug5mDiFR3Y2NtzPs8mVC4TN+qnYSFFKRlaom1ersiEkrsd2UGIbJ ErIA== 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=yDiDYzXtmrm3gnaI3s8UZZS+XU3yKpum18Q75TAqsLM=; b=r8GHBVNDJ5vJHwYiz9qs9qbn+UL5ujatY7XjFpPw/FKBIMnxYzRW6l8qB4Rw9/eHLY ZsiyveQRrQOJXdCCP2k5Z/UKULHnjRRf1UpNVjRc8Rhudi0KquJPd27/dBkIdLFYGL6a oxKc574ov3uOoZlocxGeorn+B8ploHowKYtt1DgYMOYKrniK+q93eZdCrhaOpDCxORmK otFNpoUaImIYtDRBqXqGX+Yl8RSi3zbOtxzgzTADs5nO5hnTEZtEhYgMuL6zfftLd7iK Q/y91XwwQtCgDQ5zhTeVGrcywpIq2ZEp3TgF1KAp9DxVZEIBZAhxih2EZedAqdXsHUXr NN0A== X-Gm-Message-State: AOAM532+hNhSNL7ifw1LWtyhZju9ba4T1y59tjSfSXKs0cXCyJDX1HL+ g1v786Ww9d0Pw6gVkYUqysdxOdKvOO3hZg== X-Google-Smtp-Source: ABdhPJyi16yhSGlrpWgWpzTrqT/+r2mQ12fhET3xvR6Ao8RR4qJiS6kdOn39lWxQ/i+vsCtxJ9+FpA== X-Received: by 2002:adf:efd0:: with SMTP id i16mr20797294wrp.315.1589828142349; Mon, 18 May 2020 11:55:42 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:41 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:00 +0100 Message-Id: <20200518185508.44779-1-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200415130741.27263-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 1/9] fftools/qsv: add device initialization from string 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 --- 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 Mon May 18 18:55:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19755 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 44EB44491AB for ; Mon, 18 May 2020 22:03:08 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2B81C68AA8A; Mon, 18 May 2020 22:03:08 +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 266FC68024C for ; Mon, 18 May 2020 22:03:02 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id z4so589208wmi.2 for ; Mon, 18 May 2020 12:03:02 -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=KaNUNXRwSDeyq/25A7WIDGQvozAgAjcupGBuY4o3KUU=; b=KvbqbC7mRUrc3Ls7srabkEMbP12TkR9gvvTymvYRmLRm6GiCL+C6ZWjMbD+LCCaD9Z cBN/DXpkAXY6npm0mCR7OphLGMPGqNoiZ28oDt5sa6n8pAjDaHCdsJH55s59Y8VoVBcP EP7FPlOC2cGkSszscTSmq3BX37WCmiTm5OBIPtqG5L6u88o7nZO1d86CLRZgqCGj/MGW vDmeEb2/l5qmHq2efAOYHme2iBFmwZdR3BAu9ZkAjwHmTWoBTfiPaps+KPH7aMQxsQac 5997REKxcgNmlekFuVxKzPQ9YuUKHUyPpjIuqe0RauU897INk5rPkSTHsGDajdjk9xI+ H0uA== 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=KaNUNXRwSDeyq/25A7WIDGQvozAgAjcupGBuY4o3KUU=; b=YXqwxQAu1pIulQBFCE3nI+OW1QBMgeSFHoyBjEYrMLg6bbYcSOFJsM3WpjDbHyflQN raO1P7Hm6Jr9IvRhzvp4QLo2o5j+WRoAyzp27NVTGHsZ+o7ieWY8kSul37JLh9F317wT lL6WAaFukPh01NfNkafIVpRoEzIoyje2q9tFYwwAxH7ZKjhiXeWv3uuZv1vnZbhiSf6B GqnjHTMOmCS2Em5WD+LkFgAC/RGxQC8jTuOIxrSdGry7fs6up5TyPY/v6qNHXSjdoHGo XU5oECUVBwSfK1kquHO7z/5CqpCDB51nEEoEWEDH379gvUqFjGs/WlbYJOFOJRTGAmCX 5WXQ== X-Gm-Message-State: AOAM533sWKcj3WVWYc3SK0qGZCD7Z940nCxAffZBeTAUBNJ4nsTbkVuK T8MmWsMdiP3U7FYdYRwHOwJe4TwphOJtlg== X-Google-Smtp-Source: ABdhPJzU20NULxz4Ca4LGrnXljgKrq9f3CY6dBaMlKjotdMaUsxs2SRqYTgBAYECmFSobbiMLYSSAA== X-Received: by 2002:a05:600c:2315:: with SMTP id 21mr796054wmo.143.1589828149731; Mon, 18 May 2020 11:55:49 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:49 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:01 +0100 Message-Id: <20200518185508.44779-2-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 2/9] 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 Mon May 18 18:55:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19748 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 DE34444A195 for ; Mon, 18 May 2020 21:55:58 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B6C5568A9F0; Mon, 18 May 2020 21:55:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D49B3687F2F for ; Mon, 18 May 2020 21:55:52 +0300 (EEST) Received: by mail-wm1-f47.google.com with SMTP id m185so676305wme.3 for ; Mon, 18 May 2020 11:55:52 -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=o3bD31JcMTkeRtYb38PH9wQO7yDSaQXf6zOYWbBbDQY=; b=T5Hhs3wu4MJiiA7fnSGpPigoo6OmOndUQDybQZ1D2Mr9NYVBKM3ZqedP8VgxgPxk4+ ymenRjHnI/LZEwt/wbRU9NeTxZdvtrjkr5z2+w3xVCdVIXX5nUwWhsHKAjPoEl0b760c c8RZuayk0zbWCa7nP/IuTQ4fwRXKJZq9ij070ifBO36T7Eg2yf1ulqZJa1tVt8cHrcEe NtoCEhrxWXL3AV7tMBindASO3Mzr47NHKtFsQJhOHtoGz0J4gVu9Izb047irjKCOqJxn otX5Bgt+8jGlnOnpHewO+86OpUD6C7zFkouEPht1ycERqh1YTVV+fOlfbSze+DB+d8Sk bajA== 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=o3bD31JcMTkeRtYb38PH9wQO7yDSaQXf6zOYWbBbDQY=; b=er49qXteyvoNF8ltFiepVTgHiZWd+ZZynyHsaFrS8ocD3tox2M9MWwGHcZ8L92IAQs /28SAgNJBAX7Nh6GFJCBEa/AjhkhrT9uWdBlaZ+bsQ+BqmgD6PjHKuUzQm6iIh//kZia CyofVgCqgw9VkZkiLTZMQdAPn9KiHP286c42pwPbDXJ8+XxTHxxcP5Mo54Qyd6qkoDlJ femJLixYsSo/5O8dIrjMTyQZHr45H+VAGLoEmGxAVZcFYhKzfGBIFgGRJD3znRiwV3C4 ZPY0ALihAtjAEXxhctyIkLBdbquC1nynAbSuWekpcZktdauXx5oqlB0NTYEocdaJ+bVO OSKA== X-Gm-Message-State: AOAM530zuGhb9i6yGeNilOHXLcYnryIIgCveqnZZfTCcgZy+UB0N+/UQ fZ/qm4+tO08pC4C28t2QeqTNFjPH4zlVzA== X-Google-Smtp-Source: ABdhPJxG6bjmPU7GkgsXMsDLbRaS7nfgaWbV9FnceTP3lflSCUHFMP3irkm6F4JDgOJ1MCJOYPlYeQ== X-Received: by 2002:a1c:5402:: with SMTP id i2mr828352wmb.185.1589828151960; Mon, 18 May 2020 11:55:51 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:51 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:02 +0100 Message-Id: <20200518185508.44779-3-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 3/9] libavutil/hwcontext_d3d11va: adding the vendor option to d3d11va 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; @@ -539,13 +542,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 Mon May 18 18:55:03 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19753 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 4ECAF44BA9B for ; Mon, 18 May 2020 22:01:55 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 37CE568AA24; Mon, 18 May 2020 22:01:55 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9AED96880DA for ; Mon, 18 May 2020 22:01:48 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id m12so601769wmc.0 for ; Mon, 18 May 2020 12:01: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=XrJIsbAVmM89EKNdniyaFitjCvALta80phdxCgV0G6E=; b=MP7oNkHX4h/LTcSyDw7C9UA7kEdwa8WocrMzH5THuD/UgKd57BjqRPjwYkcR/Bnf6z ytBEeQu64ONkE4CxMUeb/rt6ljugOdzqlv41eraLPXJUZe6bc9YC+AgeIi4dBoBW0lkf IcpXEQED+AQ7JAOCwd2RuDYt7oCd0HKbkrEI2JTiGTPW5wY05+DWX29zHPBnNP/DyL89 7qQOuZV53AUpOYvn4lVG6iLRB4DsUMKDhIgbP/sI7ptvXCNSFTxAzdCnNKu45rYOj/FR uuHgKgVC1/KEF/6UTBSZ/eu1PY/ikllZ5PB/xTzAkLMkx42O/2rI+y30k98QUfINVWby Dg7g== 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=XrJIsbAVmM89EKNdniyaFitjCvALta80phdxCgV0G6E=; b=hxdui4B6M7V4ne39wV28BZKBqK+4M21BUNPS4dPJER8anN6YW4GNsbCmET6PKAQ3C2 EvlMkm/i3lJpWA6eIKYwjasljEi9mFcOpH/Xjc7q6dnrxuKlLd/CIChsY1CVDSM09CiR gzfwlvDH2MaT+tGEYGVKZMZZmrY7eZR793ByYDYnez7yFDVfLV3ODY9HY6cQG2U2ahrF J1IIsbzLADgU6UsxAWvDTYtuZXtTQstdcsD0zh2XwDarWHaXS++0mqLLS3tgEp0+Myk8 vQpCqhisTYZ5XGU5wWWXn+ZY6T4SEWzGGy23eW/57TTi/FFgq3mLnomWRAZ/XI/1Y9H7 8NHQ== X-Gm-Message-State: AOAM5308bxMHEhjIKhPIulVUP64oHCrd2Evm99QyVifhC9PvDz3VtfXp jR37qW44S+n7ALYFNHz9+le6P7Qrw7mldQ== X-Google-Smtp-Source: ABdhPJwPVtGXudQVegFI/Rx9omy0DAMZTkDPqjhLBCSWUrI9htbuceGjsGNDArzRiaYxjqF/MZBB3g== X-Received: by 2002:a1c:7305:: with SMTP id d5mr823296wmb.85.1589828154033; Mon, 18 May 2020 11:55:54 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:53 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:03 +0100 Message-Id: <20200518185508.44779-4-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 4/9] libavutil/hwcontext_qsv: supporting d3d11va device 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 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 b1b67400de..d289bed8ca 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; @@ -119,24 +112,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) @@ -146,6 +126,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 +190,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 +206,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 +247,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 +280,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; @@ -274,16 +310,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 @@ -348,6 +409,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 +487,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 +686,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: { @@ -629,9 +717,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 +754,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 +788,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 +818,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 +1071,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) @@ -1005,21 +1168,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 +1218,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 +1260,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 +1289,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 +1319,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 +1390,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); } @@ -1242,7 +1443,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 Mon May 18 18:55:04 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19751 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 2A5A244BA9B for ; Mon, 18 May 2020 22:01:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 038D668AA4D; Mon, 18 May 2020 22:01:19 +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 8E73268A3DF for ; Mon, 18 May 2020 22:01:12 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id w64so679716wmg.4 for ; Mon, 18 May 2020 12:01:12 -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=pCJiNkhUY4dJAf4MmDu7KiWvpwt8r2yrBH95exol02g=; b=q6ww6DAT2BxOs8gPxzFv8028Ny8pTqtqR+I/TfXRsEIV5czKfotR0jR3DJh1VP8L+3 e8rQqIyMt3vTBieiFgsEPAz4x0wL3lOuabNQFxCFAKjOvdUQ1xC/mW4QxIuSpQ4MGA5E 8Vf3DP7L1120ljpdXUnKJ1CmhT40HLThkLMmXawnozcVX3cqcwTYccuny11e6uhz2Wa7 BXTxyXBqqtGifq3+IbKegJe4+ELeI/IDl6VAy8VD3L5KSRDiLkv7Tj/GeuOTZL8Ap1t5 JoHV9MpiXMaStwyGIvRaoAWBvmo59uK0GiO7EpHAigvPRCCbjBuhYKXfXug5C1HbQseg YhlA== 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=pCJiNkhUY4dJAf4MmDu7KiWvpwt8r2yrBH95exol02g=; b=JQ0UMmcauDwOjHLGhMD67Gu8bSRVJG2eIX5F6YPSxJ54LHONum5W+n7Kpsc8nk0w2s n5Y6RLlKM/PChRyxUnbaGhSkgLZlPt2QjMtMZL9vqP4Nd9+AVaA5NWb1S7OBB7YpdlvN t1CVBtqSjAhmhpqdkyg7xyOdNzytRY/NTENHyHg3K9LdIos0Ha2/5ghP6nhS8gGwOeCr 0DiAOtZ2yjuZSwD9QN1nCOItNQcX+WRLFlo04M3P2lNaz23mWMbviPqxdJGRGmJhxxBj OtWobO5qu0nQXEO3uy2fr8D3YINoJtLh8oPd+YYnxMRyLiBPnYzZlFQwrlyvM6BmzLTX SMvQ== X-Gm-Message-State: AOAM530HAPCQYh/ktnxkbqf2Io9C36N6j34ixJL99tbIuhGfJI1Wc0Ja uhnvutVeP4s2UGkn9gZLg31mH4NXCGuT8g== X-Google-Smtp-Source: ABdhPJz2F21xnvMUOaepBg2rxYaNbwNtrstN5U3sjYRYD1cliLbFHBt7p9KFWcZk/TADRrL4Go5auQ== X-Received: by 2002:a1c:de05:: with SMTP id v5mr776916wmg.1.1589828155596; Mon, 18 May 2020 11:55:55 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:55 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:04 +0100 Message-Id: <20200518185508.44779-5-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 5/9] 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.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. Decode, encode, transcode have been validated. child_device_type option is responsible for d3d11va/dxva2 device selection Usage examples: DirectX 11 -init_hw_device qsv:hw,child_device_type=d3d11va DirectX 9 is still supported but requires explicit selection -init_hw_device qsv:hw,child_device_type=dxva2 Signed-off-by: Artem Galin --- libavutil/hwcontext_qsv.c | 59 +++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index d289bed8ca..036dc94748 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1415,28 +1415,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 Mon May 18 18:55:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19754 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 5B50A448EC6 for ; Mon, 18 May 2020 22:02:49 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3604268AA7F; Mon, 18 May 2020 22:02:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3B5DF68A47E for ; Mon, 18 May 2020 22:02:43 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id f13so569737wmc.5 for ; Mon, 18 May 2020 12:02:43 -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=dXRL37O4kAvGNqJqX3q9b1oeAVfhewkEvTwBYqndKqM=; b=vWJ0vHXnAexdStPU+S97gAImewILpZnRzUvtrD6jXDeK2Ik0qamHNXU3y77VUOvI3B wTJlmTAhk9dC/kDrISBgq/4+pcwMIy9V9L7efKIAV9tqSKvJkuiZOw55KuAjgtIDojz/ IPO0/2XBtax3hU5enm3wKhmsOcIsOr+FlqShp1Z5x+f/MMWeoXHpyu+w6o2O5U8in/21 cFFL72VbJbiZjCMj0hfCU8QvuqsBdfJraM1jTzkrgev9Ye5WhI5l6lv7BBNk6K6vQh5S r9kh/H46XQeFegjTukWm7fpUVRojEJk8pNOZYXfUrjtxu0aRPNQq24DQp5RH41LB25T/ v4dQ== 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=dXRL37O4kAvGNqJqX3q9b1oeAVfhewkEvTwBYqndKqM=; b=gDYYCag8LlkrbDLLOF25BYjrfeju/dgAPp36NljAOMPnfeayBymY05PVnebgcPURVQ aaBke+IUQgspcEo+K8ZgQ67/9mzyEiu6JXYO9gLlXbKzsnOmGKZwYml7hl1UPOLm5E5D Mn9XCMEsarK+CPhQDBx8ggqxVFu594h2vgD3h6rimYLXt9XGEvRHgE2OWcW8nLhwxorv EfMVTTOkZjY1JHMHVKI5TPWa0mFtxvAYeXNjFKG1kp59ME6t7ttxD50sa86xGP8C0nbX liKKerpc0J4uodLdfE6AeC84LsliWuXPy7jEyz7hPBaaWRdwxTmQcvOKXw1wX5BKGKh8 SADQ== X-Gm-Message-State: AOAM532EyNQHum67BNPTJoCR2G+Ony9G2EXac3pqfizII70tATFtpniA Gt99zJxr4LAE5iw+kAwNUnU7mPwtgpKw0w== X-Google-Smtp-Source: ABdhPJxDJNfOO2j7Yni3dnMsLdSPAZHJXEnIirszWpVxNKSlVQNrTlfkd6LoDnwnD+0GZc3dtTTUjQ== X-Received: by 2002:a05:600c:2146:: with SMTP id v6mr855352wml.142.1589828157337; Mon, 18 May 2020 11:55:57 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:56 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:05 +0100 Message-Id: <20200518185508.44779-6-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 6/9] 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 036dc94748..d84de696dd 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1451,6 +1451,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 Mon May 18 18:55:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19752 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 3A1F444BA9B for ; Mon, 18 May 2020 22:01:49 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 28CC768AA78; Mon, 18 May 2020 22:01:49 +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 A40A56880DA for ; Mon, 18 May 2020 22:01:42 +0300 (EEST) Received: by mail-wm1-f68.google.com with SMTP id u188so709625wmu.1 for ; Mon, 18 May 2020 12:01:42 -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=nVmcODXny2sPtqELhYK7+ySCBdEi5kYcLPFkZPJ89xU=; b=V0fVAtETh4KuX6U3lEd0nV1T6CWL0U35a9rrXZfRqPSw6xfhSVVh+WI0n2HPTR6EU8 8f2u6lUDyDUYzaLoYgkQe3JISmIPHsZTkLT3TgTBVkifxx4MrxrjaD14qfzQ7kJOjNMJ vIWxLK0MdoJyHKMI4csytCAMVPRcKgWyPhvhLcCnzc75um6N1kj1GkZ9gYZaV9UKaYuL cJChXXRyeOgWpQZEsHhkHZqLyPZ35Nvc1FUpUApo/fvlckpOWBDQA74mBvht4InuSYcg xQyZw8RrwDwOJ5Xf5nZcWzx+2+uwmsTP3ezco4SGYS5C50GRcxxZWiUpve/DYmvq3TU+ 06GQ== 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=nVmcODXny2sPtqELhYK7+ySCBdEi5kYcLPFkZPJ89xU=; b=DW7gy2jpqdOO06PFnkQYh45FctL+n/c/BuN1v9RfKvTqtGNN3u23GfwUrUEbvRRkaB Nuk7+QgYnHk/BLjp7Pi08I7dQhefSOXVZtVcgYWZcGNarhKr7Fusm17bL6HfYu3uK+dk TvuOUr3bmYCSUe6wya/T96mz1YVCON94t/btk463NkYiq6NyzlsqxRCh8RJT0jl+PenR XHeQVIU27GWN8qLwVwWpLje8qMQhEBZrp/D5qN60GAiWWuqAH6XbU1NwU1RTFLSvsiz0 KaRt9sMNV5FG6J1mtzcknEsaZ28CrQcumwUMdKwiKs1HijAtUzSwW03eztK9He7PCVRj 43xA== X-Gm-Message-State: AOAM531jnTtLpbCVxFa3rhYvMpuqLX1qfeWx+vFV0RXrdrrO7YM1XZ08 6dTSWax9Bmsbq95HLxYse2ZwN/XVEgB7OQ== X-Google-Smtp-Source: ABdhPJzMJ9XTfjKI0AJReZE6/E5rDKDfqeS6yl5x9jq9txRsHIjIgljL6vJaSi0S0V6mtiSV9KiKkw== X-Received: by 2002:a7b:c3da:: with SMTP id t26mr761426wmj.146.1589828158864; Mon, 18 May 2020 11:55:58 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:55:58 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:06 +0100 Message-Id: <20200518185508.44779-7-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 7/9] 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 Mon May 18 18:55:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19749 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 0AAB744B459 for ; Mon, 18 May 2020 21:56:07 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E429D68A9DB; Mon, 18 May 2020 21:56:06 +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 5263C687FA0 for ; Mon, 18 May 2020 21:56:01 +0300 (EEST) Received: by mail-wr1-f67.google.com with SMTP id 50so13049363wrc.11 for ; Mon, 18 May 2020 11:56:01 -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=nT3IXd4acEuTkpLK7R9r4RddG2KQlkDY1oqdMBZ/Eug=; b=JtoLweaCTf47ELzjeSbfasFx0qYFcxzwOB6oLu0sTzWMNjpNdQDCNkDf4CZAIsDCJe QYbLW6h8gZeMfSqN9ra5AIcpv6wJt8t6RgyZrvC4Vgf8bYB6ZrtRj74+06jYnCawx7g6 2x6hl0TpGJb0xwFzUO4m8zoCZdU8wMfQKS+2IZVHf83UQpvRal9qI9icgC/+iVfm5a2j OVAEA/8UQmO9zBdZv5gfHMTFFCxEdGOnZM30qsgkpC6f2oHCR7/50CzjGQW8qLcTVaza m6370bFGNgVvECxqVfPfkZBL7cPT7J4rASWE9ctQHAvjPyTYJiRmtWyg4xLAzas39oLs ecyA== 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=nT3IXd4acEuTkpLK7R9r4RddG2KQlkDY1oqdMBZ/Eug=; b=qB0LVHA5rWzSaHIMZUbNY8GrwolRm1o+qWf9+eYtvjRRJmXQItSVDUxJwsUi7aytvx XRcHkyV+g/36W6U5KNvNAKDf6UpE+hXDNTGUHNMuYXM5Km1oKTXcr4qyXqf3esqu/gzM MZiwZFux32uAiLOTTjgYeTnUopN1Ehs0ZntFjjeDg0QilRDayMvZrecInKZOtNzsgAJx FrxS8tJlcMYdnGDVzJ8qgvYcLpFI/GtIucsWi55RPglXwrjSv3TZUJEBAK9SeqpFs22D p4FLaiQ0ECuutiDw7Ub8NA3taroR0HuGLgE0ef5Jb8QCjjXpAGDOIq0a8MpmRY8QL5Uk A0/g== X-Gm-Message-State: AOAM532eFQGwZUNFikZfwE0M928m2Iwk2zaRkMcWvH4SeQFoczUTUDhS RzqzVfqm66UZgCnkA87uQAyz/4JSUd0psQ== X-Google-Smtp-Source: ABdhPJz2EWumEkjgVXi09sbpRKA17eQekADCvdDrkmt6vbdtauveLBRGoqCknNnts4Y+ZQg4Zyx5mw== X-Received: by 2002:adf:f601:: with SMTP id t1mr22376062wrp.207.1589828160507; Mon, 18 May 2020 11:56:00 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.55.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:56:00 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:07 +0100 Message-Id: <20200518185508.44779-8-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 8/9] 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 Mon May 18 18:55:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 19750 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 D9D7344B459 for ; Mon, 18 May 2020 21:56:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C96A368AA6D; Mon, 18 May 2020 21:56:09 +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 0905B68A821 for ; Mon, 18 May 2020 21:56:03 +0300 (EEST) Received: by mail-wr1-f68.google.com with SMTP id v12so13043624wrp.12 for ; Mon, 18 May 2020 11:56: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=B/VxyoN9Ia/dACDO1xEWJ6JCQ8bC5a9VbCAqVTF4TI4=; b=mE8FPMFaEwv5/o5sMx/1d+WXw85N/hUvKxnizcKCmYv9jaYwkgcACBix6WuIzNo/Xj 9LLYR9CFmpjIFWz4UkIvUQnjtIRNgtLki+sbl3lLy9FCp30GMvZeAFwABdxgkV2td1BG SurtVCW70IKdM19iCeS5hmGk4JeuroXK6hrN+ZLw2KgAkMSkzpJIqysNgnMXgUKKKa2s q1A+wAhBGX+bN0p6LTyylyQ3s4KM13egP9k/T6hp/NWtSQ5Ld6DBSBztvynwON6O5i+l Q8FLtQ4o8ZfzfbAewOkQr1Ohi3eNu9kuSJNao4m6AQUc22wxceVSV0SrZoN9F5NH1UxE SeNw== 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=B/VxyoN9Ia/dACDO1xEWJ6JCQ8bC5a9VbCAqVTF4TI4=; b=H/AfqDgQgMAhyf4KX4zBC/FrAkFRdysnv2fc8Ft0TELpPkALVfLl5zhRFwiFqRWybM tnJtrruXghldiyIoTxrtKVmk9wF8FwWbLWW9M6s6nITGKBqVIWbQDDG6gPHFZOi2+snb lTVaIjNlrJYhhULbfJCfOyWkxnLCug3nRxsHFo7KtGW4X29XUO158i7PuL+BxHK0NUNK p4zftLuoh+RFlcUM0Rppfv0BTQuE/NEe7wtFH+RRtzrXvTQ53dqBOG1OSvmgp3rpkNEh gmnCe3vF5JYAUdyUrrxI193dOj60bsgoEiFpy5b8xvbBvxno0aBcR5PJ+MrvWZ+YoCKr vikg== X-Gm-Message-State: AOAM532INZPwL9EYM62Pubjbf4LAvigxm2qq/OPo2N9nZnWqjiYQzreU lknA4m03rb2cusi2VlOCXMt3cKCKImaYJQ== X-Google-Smtp-Source: ABdhPJzcOhr3dbh7die28nw+TtBOQ2dDgqQPixKaP7qDZj3zSIca2aXvH0YH8hZT0o6AxTfCb8cd2w== X-Received: by 2002:a5d:46cf:: with SMTP id g15mr22969347wrs.276.1589828162147; Mon, 18 May 2020 11:56:02 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7d:3e2e:7400:bc2c:26b1:105a:3e19]) by smtp.googlemail.com with ESMTPSA id x17sm17241863wrp.71.2020.05.18.11.56.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 May 2020 11:56:01 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Mon, 18 May 2020 19:55:08 +0100 Message-Id: <20200518185508.44779-9-artem.galin@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200518185508.44779-1-artem.galin@gmail.com> References: <20200415130741.27263-1-artem.galin@gmail.com> <20200518185508.44779-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 9/9] 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; }