From patchwork Fri Aug 20 21:48:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29650 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6114iov; Fri, 20 Aug 2021 14:50:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx2/bbJOvDZ4ywpxq4HYaBkXCakx7a+x46wOi+Yl/EHx0jVOTUdmleZrcwfD5uKIthtRQJb X-Received: by 2002:a17:906:2441:: with SMTP id a1mr23834393ejb.550.1629496221019; Fri, 20 Aug 2021 14:50:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496221; cv=none; d=google.com; s=arc-20160816; b=pPTcYq+0OtCcaSHs2OWY5FQT+Wq4vRRPx+m6FT1zkJ9/lfIQzcgr83t5zoTqwExfbb bG9ZToIfxQtJgj+Rc2og4SQVWbB90U1uJWDXxznuaon+ReGJvsQzrorqTjZ8JX6wHC1n +6n5VFHETlxQfPywhTQxmzbC4pY3qzNBNZ7ttk8j7g1YKeY+MjiZTtFFsUPY7EzqsMnD peFsdkESL/Tsp8IhuNhBTT0P84ii9eZvVA+sYOHUynmKvkpnmkPYEYbuwyKSV8vy7nZW eEElUgpE3Mho9CdCepfHCQffA/MaJuMfzvDk2LYlrDm2fZEyCzWePEVxgTcI68q0r4Po CmPQ== 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=wQSnFAZTjHziNUOJxZphfGdPanfvd7DlBfGTREFAea4=; b=UmMuM2DzssqLvpT9Z1fBpOg6D6OSCyj9RZHLahokxwdtuXPibEuvRqQzNDO9FN59r6 i/N1b881XEXCMtVUaQpUTZAZWc17y7VfikbYSxKD2DL1T8OBhuFY+WEQzJOhP/KiWxwl CTdSTD7E04/Z/9iJWvvq67ruf96oXSNVUJISAbCqLjMCK0YV/ztV1SS5wy9b6SifzmXy XsQm2S3mWZQjcnsaJ0ZPY7B91lE5MTOU4tQeCopWk8P8RkD2u0DRbnz3RbeZkCmvhKcA FmkVQbwBFWzLSvKMXCKtx6itfHBJbwcu87N5GV7fZsqC+Otgcv1jr65UeIWFZnEzGgfJ 4FAQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="gmSA/BGl"; 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 ds7si9801897ejc.524.2021.08.20.14.50.20; Fri, 20 Aug 2021 14:50:20 -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="gmSA/BGl"; 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 2704C68A369; Sat, 21 Aug 2021 00:50:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5B5EE68924E for ; Sat, 21 Aug 2021 00:50:09 +0300 (EEST) Received: by mail-wr1-f47.google.com with SMTP id f5so16050814wrm.13 for ; Fri, 20 Aug 2021 14:50:09 -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=UwJkUh3N3qHo42GtdZP16Q3B+6J01HA+agMREhdHAOE=; b=gmSA/BGlxQSdK4OW7drNb/ZrsNS42p2ViSWOQwSDAvAe+SNu5fquwzPyRCmOkeTKn8 eac64UiLqsSVtBNvbZX33VLj3t6FLWaGajH0/B4kjJ9uB5dAQa5hsjUZs+zaXDqV2OE8 pN8cIR9ib3KR1FDxJFEB3FqFUjDgr3WUg0LNE60zEd8S76ggwPXRQhElHCXD77jIEv9P SDB0iUJkI1/XfeExW/9VASyIi7KjmePHY1tYTO2ah6lW22YBe19Okhfjkljdz0aUVaDN 4VPjrqv1hvesW+LtmMqp5qssfN926T1xVMtaBhUKFtxNl6WXxH284uguiEaPbKh65Dlh FeGw== 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=UwJkUh3N3qHo42GtdZP16Q3B+6J01HA+agMREhdHAOE=; b=XsAa8AY+qDLyO7xq+Lhf2gXVKHePgSGLeLDrEC+oYZAUl7xeBcJv2rNc/Fw+A6J0CM thHZ0HPGRvh4olBevPEa0JKKp5hUXcuUypcEVbH8kFa6jbY3Bgpx/DuXMFiLGirQjwfe IiPCv4YqK6OLjDV36RgmoWcC/fK10RwusCNvA/YVEUzBpn0Cq/zyGo8Z6Ynp1xF18Unr OUtIVRi44Js5AfVLy+y55SMyAsBj+mzqkYHgqktvx9hW9FGk1e22OkO5u96l5SPRYumw uvk2EU7FBDIML16OgeQR0AKtlrEqvH8Ec7KJ6N4qVgKr0OBSZ3yNCbqKGcULLrstS8us UnQw== X-Gm-Message-State: AOAM531h451NnzlK2Wkt7FiZuvtE6Rp+AXVwLUEl9n2lVWxEU6V1yjHv Hu15fC0keNARnz8LgnfeKvscLlLFcFO2tA== X-Received: by 2002:a5d:618f:: with SMTP id j15mr883451wru.80.1629496208665; Fri, 20 Aug 2021 14:50:08 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:08 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:02 +0100 Message-Id: <20210820214810.9733-1-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/9] 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: OgYWah8R5sex 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 c53e2e3b07..139c4971de 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 @@ -230,7 +232,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; @@ -370,7 +374,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 }; @@ -459,7 +467,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; } @@ -636,7 +644,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, @@ -669,7 +677,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; } @@ -677,24 +691,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) @@ -703,13 +712,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 327a8d3385..6b96c413c5 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 Fri Aug 20 21:48:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29653 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6224iov; Fri, 20 Aug 2021 14:50:32 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyPZ/n9U5N4nJikGb3iKmCjy4xHto/evYU5vW+DabJbbFV1Mcm8GcMDSM+T9pYHyBvGuRXR X-Received: by 2002:aa7:d40b:: with SMTP id z11mr4870774edq.224.1629496232536; Fri, 20 Aug 2021 14:50:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496232; cv=none; d=google.com; s=arc-20160816; b=iyIoq+1Li2m2FtClxX7hBbYGIPKhxLf07TjAJ0yAlNAXJGZG5IDdn5yC8m+mlKwd2/ BzFcnU+KbUv58XdjzJ4wV082fgvrJ+qrXAlEIG3nhGCQFHDVnTNp7dOs4JxMtyMJJdLw 9PGLZ6ss2nqK57Op0Dz1XGxPLFxjJ2shyVa/sngtWGhJD91oBuP9vfxRLMlqXzW8LoNI HomoJhA2PZRc0EWsXayz7k9IMWm4a01VqaIQzLpLkydVBV2f0FV3I27fBgX1cvcqyRn9 jwWwbGBuAVPDjPZWx9wIAE+0k/3zJLDU/4h269morOEOOeYXXQznOU54lSkJ1aN/EwNu FU2Q== 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=MiFI835iuznmeeDSg0ZvegUJnp+KzF1parIWSvauLv4=; b=i4XelZ4PcRuAtY5fMaIBQlg0y+56HW2qpmu6/iUcq9IINwtHJyGLya/1FDSGfnE84t 3vjRpBQT5TmPE5XZlhCnk6kVNiPqMBFklKt5DfyXo2b72KaFbQnnTx3iinf6AMQRBrdx L7Im/+BVKM033dAiBNSKEFvYKMJRP8ZhesV7TO4p6Vwnino15opM/PjwSr6/ytcB0hdl XieKTkYYiQqb2kcuybmWW63O1VCX78EI9sgmclmTHEgJuKEnAaoq2etBgwm3sOjb/wIG wpFcnQDjw45eNU8HNhmP8r8s7oB7T7ejOxjAMbizr/Qpt6G5blBPgVDQMevGBt7/tgrx hm1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=BIqMrUSD; 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 t19si9311366edd.501.2021.08.20.14.50.32; Fri, 20 Aug 2021 14:50:32 -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=BIqMrUSD; 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 4254268A2F6; Sat, 21 Aug 2021 00:50:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EC09E68924E for ; Sat, 21 Aug 2021 00:50:09 +0300 (EEST) Received: by mail-wr1-f50.google.com with SMTP id n5so3761317wro.12 for ; Fri, 20 Aug 2021 14:50:09 -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=uLY2LYyuyKXV1wm1i7xdUGef5lIzUyDgXyE1AfYGNTA=; b=BIqMrUSDZ5f7q523TfUDdZy1Ge92qG0+CxUasXeTmJdRXc6nW8mlsAFMXODCJ/5A6k mdJn2K72yWrVfyo4LWGWIJvHmCVW0O/Dp3f0n+vruROj5F8ZaFFxlI6SsSoEay9nt61F N0zSED+Dyqrpp1e/HhEVxsD9922TqkMK0GjyHsaSiYGUgQkfJ1lqi0MaHTknblqxMG0f LB2muLFSZOGGbddE5r3TeRJz4qVrQePxMDiWgfBV3mSSkd+8f7Fg5xUKT7EePweFlheD 0+CCVwRrqQX6BokS+KWCmKyRNcoQL3vipHEMxQWU9zhytSKX7CEzWt1bLaUTsx9tPAao 9Z7g== 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=uLY2LYyuyKXV1wm1i7xdUGef5lIzUyDgXyE1AfYGNTA=; b=ODAiV93W6r4A/Q/WRagQnYx2yU0MlJ+IwF82R8akahDvuO5SQHdyRiK5k0MmyhOM6l IqB7bxW9+1kguyVRy0yoNGr3d9pv3zz9Qz35+AsMTts2SEi5znHr2oa+R2jhv8kSOMz1 rH7Tfb9mPeH58TLPjIXYcLsnxtFmNMHSAveb8Iqu/R4sGVgdSeQlv/V47nBJbqb8q2Sf Dc1K7x6jwK9qUcBrpw78XbU7FB1KwxIwbOQcI9N3mx5nbGG5cW3GUbDwXqN3OTUzdBSd IJfcazbGe1E5MHePVrQAwLd5YqBrKjAjOlYPQo9sMdBMHKf8plGzFjR0k/kEHybR/+ha Bgug== X-Gm-Message-State: AOAM532IuBMDtVJdesYv4X0eyTSLGfyA+/fC8K8ZgP93125e9dVrJ+rM 9lfgyrw81LdyoxxH1DaB2GZUVWV4LXtt7A== X-Received: by 2002:adf:f005:: with SMTP id j5mr3591wro.48.1629496209154; Fri, 20 Aug 2021 14:50:09 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:08 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:03 +0100 Message-Id: <20210820214810.9733-2-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/9] 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: UXSaHWXNVIQv 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 | 326 +++++++++++++++++++++++++++++++------- 1 file changed, 265 insertions(+), 61 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 08a6e0ee1c..0ca805e277 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,13 @@ static mfxIMPL choose_implementation(const char *device) impl = strtol(device, NULL, 0); } + if (impl != MFX_IMPL_SOFTWARE) { + if (child_device_type == AV_HWDEVICE_TYPE_D3D11VA) + impl |= MFX_IMPL_VIA_D3D11; + else if (child_device_type == AV_HWDEVICE_TYPE_DXVA2) + impl |= MFX_IMPL_VIA_D3D9; + } + return impl; } @@ -1153,6 +1346,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 +1418,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 +1471,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 Fri Aug 20 21:48:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29652 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6351iov; Fri, 20 Aug 2021 14:50:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw901MWE+L4HYzFWg80uICrcLefEsU9L0CMg/05xUHlN7A4w0Iz3p2cl67tQf/w3lOPAiB1 X-Received: by 2002:a17:906:144e:: with SMTP id q14mr24090519ejc.19.1629496243264; Fri, 20 Aug 2021 14:50:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496243; cv=none; d=google.com; s=arc-20160816; b=GneCjW/xC9trJ0C+SA5MbJBGwMzlZ+fQs2Kqn+K6c0KmiyGMfnBV1wQk3NYiKgsEhu DyRH/fDIbsXVjldfDZzAbtPbyUwHXhX089ViEwDdTQX6ifX0yuyJrbhcH+XYHszMpHRx e5gM3BZphFGYfiRqWrUfAvfNbCH4gzfTvaUFq10YLT3uO8xyEp2bqFrQeGLEPolbDoL1 I/oSeEILHtzDKcRwf/AOzkZoUN4BbQlimLWWgbXBJwYCIyVUqykq8dt3gPXe+8bvdD1o HHh2b5a4oxQ6LAJryJ7Rgz56yq8yK3BPd7/xbtxzu6Ex01eMi2gdglpCMoDpxEsmgkpu e/ug== 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=LCbDYMz29TpU0CUPArrFBAnPMA6/lHmTmQhujaSljdQ=; b=Q4kgeXUZqD/HenlIjq8609N1HE6iUbU2PKaua/ZolYoTNeASdDNUB6IlqnU3Ho9eme 7xBWavAQZm37b8aEhzeW80xmzyvsPrpV115yAcwSL1YdZveinZoBA4PVI1mIXOY56KQo 6PMvxmxR1ZI2AoCwHkmSOMZA4snAk5g0B2HKfHmibcsXxBsO3tTTQ4TjVXz9asDSNhe7 aIH+Gftb9DjOA5m7MQIAn8IKzmvRIw9o8Z9HVx5nFLPTDG73orKfU5WITMzeywFWxT+L A9kblQvQtOYbOQ6nPHODXE6V4F8F0wLJtixWlrQpM166MMa5Wi2XibJo5kqZod2Z5Yuo FdkA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=NgpqmbWD; 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 s10si4864796edd.167.2021.08.20.14.50.42; Fri, 20 Aug 2021 14:50:43 -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=NgpqmbWD; 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 6948668A44A; Sat, 21 Aug 2021 00:50:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f44.google.com (mail-wr1-f44.google.com [209.85.221.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 758F7680518 for ; Sat, 21 Aug 2021 00:50:10 +0300 (EEST) Received: by mail-wr1-f44.google.com with SMTP id f5so16050853wrm.13 for ; Fri, 20 Aug 2021 14:50:10 -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=L4wji9Q3irgUuSaWOlr+iCssML5tmtYhLdTexpPb4JY=; b=NgpqmbWDwzp+coDYY7HPrCz7YsKZYI7336l7Xy0e2pZAAaHYB2tEHQyZd2bqmdmARA RG1VpyCO4nAx+MGtX7ycX5lkMp7DqlIP3WVvcuU+6YDmpicaF/u2IcWeSgxIDbpjXfjd roGfJ7kqA9Q33c6iamENs++DFyS7r30QzhcMDjqOGKRJaFz0uZcTUukocVRLqg6U9uNZ KRcgPCvU0MOAoSdslphEhyeN9Zc0q5yDwR9TZgM1AD9+tx26P9xWMYGdYSzb1r4Nrv8g bnFxHkvtHgnHGN5VUvbZQhS/0pgrxbjwej2IsZJi5iEiArR9Vnda2iEEMAr0H4lzWsjz T8aQ== 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=L4wji9Q3irgUuSaWOlr+iCssML5tmtYhLdTexpPb4JY=; b=eYxDnoOXgz5l1C5kJhIj0uKNOKARgowoMxdDpxe/wYPXORE1r9IA6hT34fiORgIZTk DyQFd+OX7JpTnZskoH+doi6cbX3UPBX9py4f+TBHymccQ+MZgDbgCwbS0GZzAdo1vh12 e0IQazZsYjG+z17K0hwfVtU9Qia8GYv5Khlwm8sSxPWsLDhgft1icIhU30X9Fs1VNkVV Hxv1Ef7EC3fqlP63NkbPDRP6MbXmcTEluxkXFKR/YgtgllL3HJ1PTe1WOoehQMlJTJDO 9R/FjtWa5gTFM33ih1TH5iVu2gQkCfwDN2tct20TltVaO8o1N2iYX966uWXjMJ/szTLr D1fA== X-Gm-Message-State: AOAM533tPKjMlHbbIXbeJgO14Y3G6vV5BjjiK7ErNqXyUw/RwegX2qu3 wooiuB4W4ukw33ioyAk9BikZ52sbBLrDGg== X-Received: by 2002:adf:fc89:: with SMTP id g9mr848389wrr.239.1629496209764; Fri, 20 Aug 2021 14:50:09 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:09 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:04 +0100 Message-Id: <20210820214810.9733-3-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/9] libavutil/hwcontext_qsv: add usage child_device_type argument to explicitly select d3d11va/DX11 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: eLN0lYUMPzXO From: Artem Galin UPD: Rebase of last patch set over current master and use DX9 as default device type. Makes selection of dxva2/DX9 device type by default as before with explicit d3d11va/DX11 usage to cover more HW configurations. Added warning message to expect changing default device type in the future. Fixes TGL / AV1 decode as requires DX11 with explicit DX11 type selection. 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. 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 | 62 +++++++++++++++++++++++++++++++-------- 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/doc/ffmpeg.texi b/doc/ffmpeg.texi index c896aede3b..62d9703b7a 100644 --- a/doc/ffmpeg.texi +++ b/doc/ffmpeg.texi @@ -1104,6 +1104,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}) @@ -1127,9 +1130,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}. @@ -1232,6 +1247,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 0ca805e277..77b540fef9 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -1443,25 +1443,61 @@ 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_DXVA2) { + av_log(NULL, AV_LOG_WARNING, + "WARNING: defaulting child_device_type to AV_HWDEVICE_TYPE_DXVA2 for compatibility " + "with old commandlines. This behaviour will be removed " + "in the future. Please explicitly set device type via \"-init_hw_device\" option.\n"); child_device_type = AV_HWDEVICE_TYPE_DXVA2; - else { + } else if (CONFIG_D3D11VA) { + child_device_type = AV_HWDEVICE_TYPE_D3D11VA; + } 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); From patchwork Fri Aug 20 21:48:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29656 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6459iov; Fri, 20 Aug 2021 14:50:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxz3R7l4ePQfR1tiVgyJh3+H12LSj78jYm8NoEesQLuqY1Yf9goY9mIsi2wJOL7WY9uhpSn X-Received: by 2002:a05:6402:185a:: with SMTP id v26mr292678edy.271.1629496252824; Fri, 20 Aug 2021 14:50:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496252; cv=none; d=google.com; s=arc-20160816; b=YjfL6naV10in+NATSWpU2DgA9/C2bWPlLUy61kHiM6y3mcy2si8boTF+Ta3VUE+npe wbpJbe1F9v+JPQ99gU+xaDyCGGspYq2vex3hd4UTpddsWshTmd9CLyBmmbZHIZsOdLRW fe4bXnLYrEwr31xtFZv2uMwPOUR8ggK9WVoWGMc2DH6UOCdyASkcB4LpvWKPHBBzWwt/ SkOhYWqnjAcuVJ2Pt/mej9j60gPiXWrLfj7q0fp2zc2OFD5e6q/1lS+Lt/eAmdQBRxNB 90veHXp/NzXmkJdRm5nG0t+7wdPFdlcBrkyIAZsOgzizcRDpbXCl+MbTkCoM+GBHOSA8 RPjQ== 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=atstYd70zGkrTC4TsBoAD3YAq4tEeTS69yLalRuigtk=; b=vx3UDQA5NYsBIlXF0p6XmhJA/II7fQZmLEQRssRRBegZp24QE0FRSjKnweHV/Wuiz8 ee5CMmDGkJi97j7FLpBfGCuiSTCmhbdzQk6JoeAN5TM8ZbqxRajFnRWpXgOdoU7ovIc8 DSDSOSTX/58LBYNwf2MSRlZ0L5O5eiVfuuU41h5dgMbq/G0ouUW45QInChuYg0+0hIcd VI2eZePFfTVxAIiVsKCpzHKfLjfKJnGdl23VogI4C0kTEuR76lo5pzU6AyedIoXswAzl PY8dKJRMkT3nn4XmNzFSg2v7cxin/LirZdEW7quOt033zuFQhPU4GBsrKe3zrWgCRhxJ T8iQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=LaMdJrc1; 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 v26si7684900ejr.342.2021.08.20.14.50.52; Fri, 20 Aug 2021 14:50:52 -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=LaMdJrc1; 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 6B91568A543; Sat, 21 Aug 2021 00:50:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EBE2E68A369 for ; Sat, 21 Aug 2021 00:50:10 +0300 (EEST) Received: by mail-wr1-f47.google.com with SMTP id r7so16213746wrs.0 for ; Fri, 20 Aug 2021 14:50:10 -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=bqxU6fXRX0JgZgKmJU80Oh3ASvbHMXF7gYRC/vtZhZc=; b=LaMdJrc1FPC+HolupA45G4MQ71EQXFfnmWxbdQIUS037nrrxQjMjplY/1T2c8D+N2v GauVDM+Xi7+xiB3LR9JasZbl491mpaZZN07QvXCTc5OvyR4akO3ZGFIaYJkE7ZbyMy+v DdgHCPrOfO1FjfjJnZKIJT3gptyjZKp4VP7asok4BOnS+lwmJvphhE9F4j31p7kN9j8F N6k7CdH7YwPvMlGfX+gXKIivnbaHcpK+BPz5BJ8i5r2a4YHjMdgl0sU9+Wbz3sq9a9WW OOjo66rHHDh5WfInpURiZ7u6xWci0bvc0QaxAVW3sDQk/nI/LK3OGyz7CQSTC1tFXMEk wnJw== 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=bqxU6fXRX0JgZgKmJU80Oh3ASvbHMXF7gYRC/vtZhZc=; b=Jowi5I0yg/RQqudlZwk0TJBxdGsjXflV4iSlTQfcJNKBCANF9SnGXuCxryZ6PrZJAI P+IV2ywzPBtNxAklExBCl6caHQ4Z0+AI/OIJf2T4CjgKUtTjB51uQEXlns5Rtw1OmO9o m9eAkbH4hMvsapfRDAvGPTaMjh8H2L5dmPPjWGhqxmJXnjnUoy710jCXP7XVPrkRJRrh EFDCuyZjlgP9W3qFYuMb4RWZ8lKw1eUtdl1ea4qlQvYDoHdw8je1gg1FYDTip7DTJ8XF ptN3iLGywPvshrZm/4j+RKu3mm7uBBtizcHshnDY5MqibsABVonoeIDm/eNEfRGy2JyN VzZw== X-Gm-Message-State: AOAM532DWsMmdWPkky4u1/+KyJHcW+X/wgE1T9Dy5zg5VgwLLQM3Owib 1Z30eRwxmkuQMyU5TJlbhHf2U71b4zG4kA== X-Received: by 2002:adf:d4ce:: with SMTP id w14mr853476wrk.407.1629496210300; Fri, 20 Aug 2021 14:50:10 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:09 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:05 +0100 Message-Id: <20210820214810.9733-4-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/9] 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: 0GpTOfdGEPr7 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 77b540fef9..d431e71eab 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 Fri Aug 20 21:48:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29654 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6540iov; Fri, 20 Aug 2021 14:51:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyeBzzg97YlQPHYWXqy5Q0C6ZVv03Jm9IyUjp0dfwgg1lnt5a85s9DNr6is2V2finXqoUag X-Received: by 2002:a05:6402:30b6:: with SMTP id df22mr23765148edb.375.1629496262301; Fri, 20 Aug 2021 14:51:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496262; cv=none; d=google.com; s=arc-20160816; b=zMfuOKzY2Wu8MGzCLNk1k6VvxSDK9PZMJPTd1y1PlHB+BUxWGFcv4HnmOTRuiX+3X5 +pWmyaIA+pfPJEsfq5jAD+uyJPyAoMXfsaxYGMkqGC+45gz5Esqf4iYnF9hsLiQCh1aU jD21MajM86LalKaCxkyspy8vKYxYx2wQeKKY8HPXlJtRHKXl0wSJrX967nh7z0gFxvYG c7OEjLXOMfjpwU48ey+PVu06purGqTVbsbRXX+LH/gNtqtmkT+yc4B99Q0mR7h2b+Ulo L04A0p9Pu3OiI+NrzYjp6tF8ojsJXssirxNZbXq/glfozmdnxEA+Z7ZLWc4Mb57DY4GL FPIw== 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=wkRVDA00jri1dKcD/R5sM1q6dtj9M9KA5R8dLjUq/Qg=; b=mfSTsFQEUNLu7W+A0fb51YvqcU0SPoxhSkJpS/T4femW7JLFi6VQ1AJI5L7XwlrQtS 6jqbV3sSvOHDSyLfYjjl3rsV35+BoV19mqK443bp4rpHkTk7d/OoT+c9M0l4aO45dTP6 QlFXPNLQAUuCHsvf2wmw0clU2P+/EwSxZ72+iAH6Qs/0Tt9YzXaK0N0nR74K95YBorYt IVsr9SbsSHJ6dmDl1FdHDxd68QvOlyCeCLUlc/oiH7mXxlQh5jWAHRPk8oC6xxO/C3LL pXMzHWGrw6oQGOtB5MM0UtdDQSQB9j4mFuH+VmvQH7Y/k/md4MHBI3V1rjRwmdS3/7WR uApw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=mkYOUXex; 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 hc18si679766ejc.461.2021.08.20.14.51.02; Fri, 20 Aug 2021 14:51:02 -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=mkYOUXex; 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 7E2AC68A3B3; Sat, 21 Aug 2021 00:50:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 787C168A3B0 for ; Sat, 21 Aug 2021 00:50:11 +0300 (EEST) Received: by mail-wr1-f43.google.com with SMTP id r7so16213766wrs.0 for ; Fri, 20 Aug 2021 14:50:11 -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=OvoyQnYP/H816ySu/hRJISwY6NtpkTVPQPx3fs1BQe4=; b=mkYOUXex00F2BFGyfCB5hzDVDBBg6ZhRQbZ6rugfTBuyb4zVyOA6Vo/HfcPap+OJTn u53BEZX/PbiJW/Egq1o5nVEBWzioc1s6VGfSMiK5vHyWN7yjUUG7xqCrLYSOxz07J9iO cNyPepRaQrrGJKkGfNDteGtMGp8LWkBkUy3SCUT7Q+0ftTB2ZBEi1S5PdlJeCSRz6nop v5MiVyMW3RmOIZ18y/2v4Ji4cyQJ6Ck81o8l9rstf5TotFJ8nphhmwT1qC12MJZCNAk6 EvaRcnq2tu5Lgi4d2a/rIUI0DtPjGj1KVOZGp437eNayQtrR363nTxJC4DEfUSlEkdcY jCjg== 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=OvoyQnYP/H816ySu/hRJISwY6NtpkTVPQPx3fs1BQe4=; b=FpRZtsqarG/96z0qg67186o1Mx2pHZ1i7wZMcbkSsi75Ix9rpWTz3tGr70CFvfBqg6 U3he/4tdtFSPaXVfsYQ2mndVbhqldQ+FTkwnll17LiK64TC03h1n6PpStUc54liffAHx f0VbPV5sn3yJqgugnRTcPH4NsAXY9Kj/RhCbiJdhUD+YSYSZkbQUDB4kyXhDsyhE9X6W ZnASUTThQAvvrGVbRfjYlh8gU60OdfLL2JpNX1NJ61Q2Zfl2gJvrvmx0MCjCidsPt808 ev6hnC9sLbDhBfF6bnaHmXMSHvr7Lq9y6HTg2p7xdXqWDnuICdFkKgB9dT8/T4pY0BBx E1pg== X-Gm-Message-State: AOAM531FZp4J16/oWsZ1/bxfUjllslAgU0wraHImpKH4nvssO2ORs5S7 0ygQFzQOeO3fseh9jzHEkEwykrL8poi1pw== X-Received: by 2002:a5d:4c4e:: with SMTP id n14mr862539wrt.226.1629496210849; Fri, 20 Aug 2021 14:50:10 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:10 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:06 +0100 Message-Id: <20210820214810.9733-5-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/9] 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: aRYl9igCqADd 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 c7ef8a915f..66b8673d4e 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 Fri Aug 20 21:48:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29657 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6606iov; Fri, 20 Aug 2021 14:51:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzACwRalqEZ1Q5BwCiOKjAeucg/Khqq4YxekWzXLMQnRv+zVXCsollqKjGIeHJ0n0wK/vEH X-Received: by 2002:a05:6402:b88:: with SMTP id cf8mr24803203edb.281.1629496271683; Fri, 20 Aug 2021 14:51:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496271; cv=none; d=google.com; s=arc-20160816; b=pv9Bu/iqFlq26WhDHKZexB9ySJyOjhZRikBcR7DmuKUPkmn3U/SRpcY7Y3d/I8WpSG W3iGBqZoEwE8crqOpxAMXJ88pgPDOmPLEEYCM9XZvfm8Q93DKn116pELvo70smk6a33K DAhoFUMFIkdyf07oCSxaZgd8WbNeyoWy19NJOqRef4469hZMUDLkJgLPRWN1+nC+qUdx V3aBNZeMdMx8ICKYZnLBlENTqapjGM/21T157zcne06TPV+hOIRYg7xX/g/xC7MooVXO 40M2UuZEuMFrGf1SyjTUdgufJaAVhtxC1VlqX4d+UOQIyGrUBk56UfnIWHTWjfqtUVTY O9nA== 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=p3/eYLu93jXVkfb0FIbqQIeQWDo0JpGsE79CBQPtlFw=; b=rY0ps0ynxUVujw242vQJxoEdlIgeCCAuvX0FTIHJWGvMePtTIwfmlb4R9lKtQnXW/D GKE7owQL6rJo+GX2oA3F31FCQl+ZUfCoFHnH58Q0VAX5b6ng9tMhkyVw+NAOeFBpe4PG ZotZ8gek+FNqzadTNRWE9Q3uEqi35mfxeTXyjXQD0xgZUdtcP8G23CeLj9PC9nvLPDq5 GDC0V3KgkwcxdXzVltK53Rv8auJHgEdyczdDfDy7l6Sp86neivBrs442NRVMs9eaNjS1 LetusGN+URDwD94ZEdzz8FLMDnMfeO3UQCx0g8MOXpFnEAhVXySV712nrnnYhtbzhMOB K24g== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ixTemkMB; 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 ga35si599801ejc.695.2021.08.20.14.51.11; Fri, 20 Aug 2021 14:51:11 -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=ixTemkMB; 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 7985068A57B; Sat, 21 Aug 2021 00:50:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EC54E68A2F6 for ; Sat, 21 Aug 2021 00:50:11 +0300 (EEST) Received: by mail-wr1-f54.google.com with SMTP id f5so16050909wrm.13 for ; Fri, 20 Aug 2021 14:50:11 -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=nRPaIvgO70JrGtjuLVqZ3V57/oJlcTUd7fuaHbsPsLE=; b=ixTemkMBS1hXsHAHy2BAmhmy7cmcBUUJw7t2Iz/VDbeKXU4g0Pbt9SJcnFJRTewb+d A2Ps5ljhye/ThQxKEqaMsnKyjET1bgCf77L8zGiJcfimYc1EdFYGLYtdZP00cSOML1Mv tjseE5iD0+3c+S4KL8/pg7tDZPdmgtoVBjkI8qBw3UeOt+t89UajxOhfaZRFsj91K3ty zYwg602tCrzCOUw7+IzXLNnkGZ+2WjeixGbZfFnxMSV3GU+wcZihNe9FyklqaKJNJOHR k93pUOMVs3vqf8veQ0Hf2+vVP5hvSy0Inh1PC9BBQi6yyaGwbcmUDkfW0d84WmbkB5nV vaIA== 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=nRPaIvgO70JrGtjuLVqZ3V57/oJlcTUd7fuaHbsPsLE=; b=UViRCob+o7y36q2uv3xloE82yisNN++n4eOdeiwF+1jOdXx13HpgysB7n+/1L0hGcE a33kiJrEQ+pCXNQyAY945bOmeYSMC4RD0v8ap10rVyfjQ6L+qR3DiUrHrC228JwobIIf SuWOgFRcdPJbu8JCp8VM4M8kktBIeCC5nY9mzH1uPxTtXZaSCxJt60UCXx/m48IepJyS wu7pSaTBeXsTZmOTJl2hxVla1UeG2HY6K6xfcI5Mcj6UbjCpSSta2dvvp0mEfsY72CwO mDmQA2GvwOeLoq7hd1ANbJkYE7eVPE48HhGMzPG+6hNbRKnUQNd4FaCp0vE/Qz5RPaY3 uAoQ== X-Gm-Message-State: AOAM530k5DK+NqnC0Bw3a4suxmdOxbdFXlvUaP6kjjX+y55eG7QlhBYf 50LJce7FJ8tPrErdOxcbUjcnczOdeFHgBA== X-Received: by 2002:adf:f748:: with SMTP id z8mr880301wrp.25.1629496211336; Fri, 20 Aug 2021 14:50:11 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:11 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:07 +0100 Message-Id: <20210820214810.9733-6-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 6/9] libavfilter/qsvvpp: add MFX_MEMTYPE_FROM_VPPOUT flag to output frames 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: IYeSbsnf6Ydx From: Artem Galin In case of DX11 device type, Media SDK is sensitive to these flags. Signed-off-by: Artem Galin --- libavfilter/qsvvpp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 66b8673d4e..135d4c4e36 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -527,7 +527,7 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) s->out_mem_mode = IS_OPAQUE_MEMORY(s->in_mem_mode) ? MFX_MEMTYPE_OPAQUE_FRAME : - MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET; + MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET | MFX_MEMTYPE_FROM_VPPOUT; out_frames_ctx = (AVHWFramesContext *)out_frames_ref->data; out_frames_hwctx = out_frames_ctx->hwctx; From patchwork Fri Aug 20 21:48:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29651 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6694iov; Fri, 20 Aug 2021 14:51:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxXd1PlBwz1S6NQdllZoCmf4a3oE5EASzQ0w2lc2ncSKtTkxpYmgEwj5idy5Wde4No7AZRe X-Received: by 2002:a17:907:72ce:: with SMTP id du14mr24427814ejc.523.1629496281442; Fri, 20 Aug 2021 14:51:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496281; cv=none; d=google.com; s=arc-20160816; b=xcmss1q+Kx5cEEJvkTVe1InFndGRmss2lEYn3AKolIcpGMglOw/u91s99DUjkVc3pg 3B0BB+/4S7aqC8FcXAmCzBMVtJgwqIcVGvZ1jfZ9H2+C8oab6ZHIZLQB0Zrwfj+ZaO0f 1+xTPwLTdP9UZDTgsTQxufu+KAre03rdpvFYwc5BP85ldKjQ6f3xLY82xuTeclg8+mKI in+mZsBtSBLbR+Ms4bw8ZT5hipqL+Erq7Y3NwfAK+cNcGy3hQU9gM6dS4u++K6zRDT4i At3rQunaBKddjo2FJAylhbutfkNREuMTjHZoJtqmMPg9CluYTMLDIVnYHUZBU/n80ucR lPYQ== 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=sDB+R69U8Ah1nRp46EYxzJGfGraAsTUu2Ucbwf0t/x0=; b=iTEe4C2WwwjFmyhF0f6Ji/1SFeuIc9npFByYCCVkDc3cjx2MmclxLKyP6i0XZvTpsM F+IDQsb0cMV6vwSz3VHet1jhZ8H1LNC55x00FtUmw5THUBPYwT1TnyuCvKE/qypMwFx9 Jf84vLSlrHwdZ4mepHbGLr4/ASsKNBJ0wrEn7hS56nxrfx184tYe79lSPaHhEA61elXt O4O5F5J63BUddTPBw9+zKlvqjpkZ81i4n+vM1zi8phL4MbV5Rv6yhCXsxV9sFLRzlYyM zRFoH8B7NxGbJ7TRO0eZoAfZeGMb2ys+lz5tJg9ZE2R/spoj0OzbKCQz6MSYBWQBIVX4 /yzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=inNM2T8m; 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 c4si1421385edx.555.2021.08.20.14.51.20; Fri, 20 Aug 2021 14:51:21 -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=inNM2T8m; 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 68F9A68A590; Sat, 21 Aug 2021 00:50:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5E16868A40E for ; Sat, 21 Aug 2021 00:50:12 +0300 (EEST) Received: by mail-wr1-f50.google.com with SMTP id f5so16050921wrm.13 for ; Fri, 20 Aug 2021 14:50: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=SX1ERstp/GFQKfWhl5upYXDs5aIy0MDhvK/i9Og4Sy8=; b=inNM2T8mRUoP2JL1G4wqC+HQ/kyWfSr0DG+kJrUSVkmY/ldjnkZya18xabxvAxXn4F JqZ2UzljgvRvMI/t75wrWz94GLitDTqHQ3PD7L2qYZnoH9Pkbo8xkFLH2HHwatFGis2F ft0gXlEaRoLTqmXtyuHGHIUCkZ3dXkcKJi1Gn+otQoU59x3FD9HegPm7oofM8gkBrHlB NvN5nDlujtqHBQ0u6QCqBBMKWnLyGRi36kgsWkKz4Z7MBYgNqmOqpHffQsHgb5R6s+Wo SrjPeOC4tZrIJihO0udU+2/R2efNYC9DzMykbwaUvpijzuzHUvsxu+fYf0Hm6UJZRhs7 PQ1A== 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=SX1ERstp/GFQKfWhl5upYXDs5aIy0MDhvK/i9Og4Sy8=; b=P2aqJcbtwLoQPnDJ8g1vb8vyr5qA4ZEqkUGAf1U6PSYrv1Q7mas5tiMsI4St1sgPaV R/zMw/nFmU8GjUh/TWCEe1zXgfeJXp6WkPtlGrLiWZtjVxdmBdCSrSWYD80ZMV30kfGM EqXVcPt739JPy8wd79OFkzT9p1wSukIE1AEJce9kN75rO7YDGHWGwYgxVg0QooGPSzqH Qg9snBy/ELYwtgCdo1LiMN8O4Bc9HE50UzCS4YrgCjwioKZTTZh7S2LcXIZsjwtUQ/cI VwIYod+KsDxwxPoxVokxAB+h6a/lBo5VuvCmrUgxOOITP8gZkOdrLHKVCTW8xgia8A16 SE8w== X-Gm-Message-State: AOAM533xpcOVKx979fYw45eaphkD+KdpESsQSj8aANgN4z+Cuy8lhbUv qgvI4PLZ8Sw9mdFAmqty6LZEDe9hwXwSMg== X-Received: by 2002:adf:ea8e:: with SMTP id s14mr866594wrm.353.1629496211837; Fri, 20 Aug 2021 14:50:11 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:11 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:08 +0100 Message-Id: <20210820214810.9733-7-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 7/9] 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: d2Wqdw7hwIgr 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 2c9f8e153b..fe8ed37418 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; @@ -259,16 +260,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) { @@ -300,14 +301,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 Fri Aug 20 21:48:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29658 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6789iov; Fri, 20 Aug 2021 14:51:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwAE5i5zNfD0m2WeTsJwlaRtSKrNMuAjWUvUjm5gVsqlGCJXwe0ujXxSfVJNNi4C+sdik8o X-Received: by 2002:a17:907:1043:: with SMTP id oy3mr4635196ejb.116.1629496290466; Fri, 20 Aug 2021 14:51:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496290; cv=none; d=google.com; s=arc-20160816; b=ZmDc5x8HDlwSu3gYT4cp8NOMiBBue6tQMulfdEzZ9ETB9hUK9LQSKh0avhvThB6F0j 37HVvzvdyqJssQ9VBKj+1Egtbhrgcut/eerrKZHWEwY4PoFpFkzB4rFrSY2Mx9QJcNoh +ZN0wktuAbSI8oNhzXhSDK/Yr6dScCSq8B9HNbnsYozuURyjxq4QL/xqPvzKRi4WVJsf cKcAUnuGMd+GKXWpGR0aBA7COw/gabNMnlmTJrPAB57fKZ5Rr18EcrvRa0U9hMa78UVM ffTo434z7jmqYQsTCgUi2/DRO8hEkdjTQt6SW0kSs+6kp9wYA4NUwlRxVM6p9zaBhyBD kVtA== 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=fIi4rjov14ElFig9ZmTeSjCh61blVZm2unB8rUmaOmw=; b=gjoq2/aV01evu/heD8+01pfKXFBzuVrGV2yPBbbrw5ohLjyYHzufHbFRVFzpUqZ4fJ 05/WpkXCJM1DF/bAewsYjy+1Xmc19OMbgbbKJaCLQyGuum5/jdFtZCkqPd4/baZh7bi/ Hmn3o9TmZupHJwZTbKPv+iaKW3U0MrTWhIiYr8QMLWe67GykDpcW+7TL2QtDoTBT5oXl piBWJB4nov2CBLjlbCrFRHvIlUzdKxtfYVQ7Hqf/XYTFqNY3CEnddy4WdRPN88Bqoh4m lrkp6k2jmGFfqK6FieXxl12RZblGq2o0MQlVajznz2a0CNXoq1wCEN7s8RS8kZErcW7o G6DA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="JFTCF/Qc"; 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 h20si7797045ejt.70.2021.08.20.14.51.30; Fri, 20 Aug 2021 14:51:30 -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="JFTCF/Qc"; 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 4FBC668A5AB; Sat, 21 Aug 2021 00:50:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0F26168A44A for ; Sat, 21 Aug 2021 00:50:13 +0300 (EEST) Received: by mail-wm1-f52.google.com with SMTP id k5-20020a05600c1c85b02902e699a4d20cso6858063wms.2 for ; Fri, 20 Aug 2021 14:50:13 -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=rf1JI2Je15eCPOC+dvDNytyW3+1kgj4C3QJbIeMFaPc=; b=JFTCF/Qc79Q7/ZZnuEaK+wjA8mfCCSHgdG0CxKZ7E7zjqHOBPoLURVqEmI62oCSUxI uj5JYfr3VCAKfnWh4daT1uy9E5mMz90+paPNZpdQcIfHdLvaj79G/aHyJUoIJhmRq+eA N/JUAr1u1GNI8OJQ/R78jegKVwBCyPNgAzU9fbFCcZ46LgCBdAc76IJN0rjR0NsyDN0z 7tc8/bK847AKh4k/CwJ4tCGv/ZZvaFqmDAsZ/4LZTC6oABOUozD81K9rkoafZj0ZQv7P vSPfY0ZuiwEiiOckAURq2ExDRVFgjGkfo3yDOFoBXRoxJkocZ7uUgACOdESGE0FJZJ8e luJw== 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=rf1JI2Je15eCPOC+dvDNytyW3+1kgj4C3QJbIeMFaPc=; b=giOwcCfoZgegCd8LDqGpa9OinA4GpINoEiKzKYmAxNBi4xkavw+i/qe4x1jUpv6goY rN7JFofOmSTpxJetRQtHnkC9wx+uIXxyCbC6moDH+7ZxIS+D2SczWAkb2qPN+ILW7zzN nRn5FQeaCPA0+EfN5SLkWB9wSUJgLpN6slWB9n/ws0H5e9UXBd3/vP0duLEV1+ZjckYW O6Jk/Zb6ZLQnCsAyZjURnJ82DCSs0UgVd76rMquaeOi3ls6xbA4qSF2HQUu6OfprNdTn 2c4MwZTNbVIwNDxYaqEQkv39fGJHeF8rTUUSyJK283VRDA0jE4BuS3KFCeHdovprCEHx tujg== X-Gm-Message-State: AOAM532aPQp8U+PhDNuctAuDiaggEU9PG9p4ZJygofyHeNSScJa7PCc8 UgrRY8YWV9eEJU8Ts0eTwnPF2yRWA/oU4g== X-Received: by 2002:a05:600c:1ca9:: with SMTP id k41mr5600310wms.39.1629496212295; Fri, 20 Aug 2021 14:50:12 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:11 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:09 +0100 Message-Id: <20210820214810.9733-8-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 8/9] 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: rMRoEJHVd8QS 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 fe8ed37418..2ab04457a9 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -202,7 +202,7 @@ static int init_out_pool(AVFilterContext *ctx, out_frames_ctx->sw_format = out_format; out_frames_ctx->initial_pool_size = 4; - out_frames_hwctx->frame_type = in_frames_hwctx->frame_type; + out_frames_hwctx->frame_type = in_frames_hwctx->frame_type | MFX_MEMTYPE_FROM_VPPOUT; ret = ff_filter_init_hw_frames(ctx, outlink, 32); if (ret < 0) From patchwork Fri Aug 20 21:48:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 29655 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6602:2a4a:0:0:0:0 with SMTP id k10csp6921iov; Fri, 20 Aug 2021 14:51:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzhd4zO393oiHtST9ar5LfjVwvovlSCOmXIKpKN5tx69a6rbtpXtuPsGHTKJmlGe7xKxFyk X-Received: by 2002:a05:6402:1add:: with SMTP id ba29mr24808224edb.145.1629496300748; Fri, 20 Aug 2021 14:51:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1629496300; cv=none; d=google.com; s=arc-20160816; b=Rvf9m0QOMn4KYFT25Gkip0jU6V/wVMCfID09p8V9zEfogVk0HTvi2vzf9pDJp1yydo EufY/Bkp4XV7P+md5zga0pWi3YtSAhiEbwWO59Xmn03JALURSN5+zyektEevwJ375PQ8 KondfCaCFdpTa9KAySOJkLvHAmcWTQAi1tcMiGR6AC3PK0EX55waxrJ0BFvp/hIHOZ1S ClX1F0X9hizkujXdAkrBTbgvFzXKGuy1qK1vl0Tb7pF/K5292+9wm0ABlQhmMDAzCzmb 5cJ32fFFrIq/H5znrF9cFX2iz495eGcjcn/koQ4++UiQFE7iTw+nks/psdeD7o+XNySV KgEQ== 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=v2fQLkdWw6hJ66Ue6QnmNhsPvXh2Yuhrx0Zfjec9nSw=; b=mxcghdRJaaHfmbmwW20gRjlkUNxa4HA678dlpq4Qft45YUanIvh+DKmekhyZfQUdWg ABeM86iybZcTN60KbxuFQZwKlRMa97hSgvF+sDZi9dgNXnQoO9Cd7FrthjRJVk6ZzYDm A6j1FYFx0OpfgRHUbFFoH0VT64J/Nt1yTWgbhbmTulSY0bqzbM4X/LXgwMBOTMyggrsd k7KTRMszw2g7g+KH9cuMamDr3aFAxorZ1yuhJzUciO1PWMFWqWi6TFSrBozvCB2dTrHO OzRSLnUcoGciqy1LOvUFbVDn14+3/XAQtWRWzBs7UFY+ui3z52NQqLhOeKAruGZ1Z8KY xLbw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=fdgi5eYn; 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 f19si8311053ejq.680.2021.08.20.14.51.40; Fri, 20 Aug 2021 14:51:40 -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=fdgi5eYn; 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 2B9C568A5BF; Sat, 21 Aug 2021 00:50:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8B6AE68A44A for ; Sat, 21 Aug 2021 00:50:13 +0300 (EEST) Received: by mail-wr1-f48.google.com with SMTP id x10so16111771wrt.8 for ; Fri, 20 Aug 2021 14:50:13 -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=a/t+yCGF3PU5Tnc+IAP8FJQ4T/h4KQD0KPizpxCVTHk=; b=fdgi5eYns0Macz+ohcW8p0g08TWSl1Lf4H50qTcW+te0dEURWniq5Uig4b+aMyn1qO n6E9hWtG5g6llZOsJyI0upD1kS5UEjLvK0Fouz3ngNQu1GjQNDci8Vi8bxtGnM1jAhRf 7U4b66i366y2vwvXDmk9jq3TytoL5qYVOEmwjlzTWJU4EnA7UUDRz2agZ8kbO4CbXVzF nnB4HsvteeqtddCE2hhSFBfaVxZffB/epmQZyvYBh497FQA5rkw2BjXcai0U6hgH3HaR /idWdAWcParFFL9I0MDHKSrSd2SObczrNuDq784xM5vJDvTBut4gukJa5VtSMm3PCg29 QV7A== 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=a/t+yCGF3PU5Tnc+IAP8FJQ4T/h4KQD0KPizpxCVTHk=; b=sYCoMt55B2OnAQCmPyXmsUDjLhJ8uNMDKRzbVM1YBHBdUlLvlX4nnDs8ROAWhbuqHw nAr+sHwRNbCS8g81PpylDxBJo3SvAdq5tWvcsztH3+KpQlSe3xnaY5PxHjknUUqE3BdN iz5ZGXABcBkeTsw9bwX0h4Xr01C4VNLctJ14ggZMl1CVL0O5HezFEme+d2kpAHbDFhjI 1fYATOHfUD7CsgVLlDwPKiv1briZnRNPs0cN92+XEin4fj2tonlVP9i4Uv27el0tB5UL zrCDWobOk4TzidZNJ4KS/5EXf9uwACnWR55m7M+GmBkcGfKtSb5dt8NWHwQydG5bCZju szPQ== X-Gm-Message-State: AOAM532k0FaDfyYcFa4vNbqth2/il4KDNuCAiViGx+a+TzBiQUGuNFd1 j4QXSCR+b54LdLVWhgLG8arCgR2RHskbog== X-Received: by 2002:a5d:4010:: with SMTP id n16mr847475wrp.378.1629496212869; Fri, 20 Aug 2021 14:50:12 -0700 (PDT) Received: from localhost.localdomain ([2a02:c7f:3015:4e00:5f5:a7a2:8cb1:892d]) by smtp.googlemail.com with ESMTPSA id x19sm6046796wmi.30.2021.08.20.14.50.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 20 Aug 2021 14:50:12 -0700 (PDT) From: Artem Galin To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Aug 2021 22:48:10 +0100 Message-Id: <20210820214810.9733-9-artem.galin@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210820214810.9733-1-artem.galin@gmail.com> References: <20210820214810.9733-1-artem.galin@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 9/9] 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: pPCEocqE7qCG 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 ea0a9f4345..18b9a17760 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, @@ -144,16 +146,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) { @@ -181,14 +183,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) {