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;