From patchwork Thu Apr 9 17:50:53 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: galinart X-Patchwork-Id: 18798 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 81D3344A3C0 for ; Thu, 9 Apr 2020 20:57:03 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 67AEF68B89B; Thu, 9 Apr 2020 20:57:03 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1995268B814 for ; Thu, 9 Apr 2020 20:56:57 +0300 (EEST) Received: by mail-wm1-f67.google.com with SMTP id d77so660894wmd.3 for ; Thu, 09 Apr 2020 10:56:57 -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; bh=Dd/b5mwI9ji3tnFq3VJrGalL7oPEdVNdHMqrS/7Mljs=; b=aR5vrhEjZ7RrKOJOk59YOHZu35/RBnRynlxsJUl8LTaoYfw8ax4cLtIXaIjDz+iz7F XLoIOMGAv0xIKgTOSFfwTm0AGECpmWPvHACiR8mXfJucecKvXoYd8Z3CYBxQ2DY5lkBX gXJ+lp7zRS1H5CM4+/9xK1YEYPObp4eGZpB1CRl3h8kPrEmlhOLu7MJfYf5Ok1HGZy2g IqkRhgpZBy8KU9grK3DP5GhY2q4m8UNCocB6NyuT157vttfT9nGcYKTLCTWAre7MXg73 yxxZ/Bv2+rCwjR0v4KFo/tg5wJv3y0vPsaTl0jQGb9Z2XuCnwvgqVemvuDp+xVWJqHOA wSWA== 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; bh=Dd/b5mwI9ji3tnFq3VJrGalL7oPEdVNdHMqrS/7Mljs=; b=h/6ZtIrWVZ26xI5/X5GB16vblGAxAoPhQCXTioDiUKTLy+HNHTLM8+MyP35icbiXhV uzAcnS5Fo1Y6CASla6YeCE/Z7xWJvkrdvmknd1wwGj7UeBf+MDeK45y1cMnX16eOk811 a3/XW/znj9hp8Z96XW7x5JGvCUoD66y/+HpWh9oKhX/ELScaxh8P6t4k4OdWKh0s0J77 abP+1IABS0CguwImtFQ8sJfv5lJHvee+EZQYE5Q7lwkGidh/iilytvpau8pKXp/t7Ur+ M75fPfvFHwDicvYnyIgllrYF0PxYDerluYiq+O15L53OGaBkTx6stYiExPH5w3aUX8PH KRFQ== X-Gm-Message-State: AGi0PubCD377jGWTHkKT1P6LjfupzCn7dEcFwDcPPFzV9E0/oFzepSpI B6Tzmegi4Hwzw/ljg5pPD7z3SCn3dtg= X-Google-Smtp-Source: APiQypLvQZ/HGwQQP2OlVDsPCSl0TuCzRaMqJSyaOYKHwUHhiIGh2+h4nwfqKv7WLqLOlulEb69ccQ== X-Received: by 2002:a1c:668a:: with SMTP id a132mr1069138wmc.46.1586454682908; Thu, 09 Apr 2020 10:51:22 -0700 (PDT) Received: from galinart-MOBL.ger.corp.intel.com ([90.219.218.77]) by smtp.googlemail.com with ESMTPSA id z11sm25622574wrv.58.2020.04.09.10.51.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Apr 2020 10:51:22 -0700 (PDT) From: artem.galin@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Thu, 9 Apr 2020 18:50:53 +0100 Message-Id: <20200409175054.23468-3-artem.galin@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200409175054.23468-1-artem.galin@gmail.com> References: <20200409175054.23468-1-artem.galin@gmail.com> Subject: [FFmpeg-devel] [PATCH 3/4] libavcodec/qsv: enabling d3d11va support, added mfxhdlpair X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Artem Galin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Artem Galin Adding DX11 relevant device type checks and adjusting callbacks with proper MediaSDK pair type support. Extending structure for proper MediaSDK pair type support. Signed-off-by: Artem Galin --- libavcodec/qsv.c | 52 ++++++++++++++++++++++++++++++++++++--- libavcodec/qsv_internal.h | 1 + 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c index db98c75073..ceef1b7fd9 100644 --- a/libavcodec/qsv.c +++ b/libavcodec/qsv.c @@ -36,6 +36,8 @@ #include "avcodec.h" #include "qsv_internal.h" +#define MFX_IMPL_VIA_MASK(impl) (0x0f00 & (impl)) + #if QSV_VERSION_ATLEAST(1, 12) #include "mfx/mfxvp8.h" #endif @@ -221,8 +223,15 @@ 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 CONFIG_VAAPI if (mid->handle == frame->surface.Data.MemId) return i; +#else + mfxHDLPair *pair = (mfxHDLPair*)frame->surface.Data.MemId; + if ((mid->handle_pair.first == pair->first) && + (mid->handle_pair.second == pair->second)) + return i; +#endif } return AVERROR_BUG; } @@ -362,7 +371,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) { +#ifdef AVCODEC_QSV_LINUX_SESSION_HANDLE mfxIMPL impl = MFX_IMPL_AUTO_ANY; +#else + mfxIMPL impl = MFX_IMPL_AUTO_ANY | MFX_IMPL_VIA_D3D11; +#endif mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; mfxInitParam init_par = { MFX_IMPL_AUTO_ANY }; @@ -449,11 +462,19 @@ static AVBufferRef *qsv_create_mids(AVBufferRef *hw_frames_ref) return NULL; } +#if CONFIG_VAAPI for (i = 0; i < nb_surfaces; i++) { QSVMid *mid = &mids[i]; mid->handle = frames_hwctx->surfaces[i].Data.MemId; mid->hw_frames_ref = hw_frames_ref1; } +#else + for (i = 0; i < nb_surfaces; i++) { + QSVMid *mid = &mids[i]; + mid->handle_pair = *((mfxHDLPair*)frames_hwctx->surfaces[i].Data.MemId); + mid->hw_frames_ref = hw_frames_ref1; + } +#endif return mids_buf; } @@ -628,7 +649,11 @@ static mfxStatus qsv_frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) goto fail; qsv_mid->surf.Info = hw_frames_hwctx->surfaces[0].Info; +#if CONFIG_VAAPI qsv_mid->surf.Data.MemId = qsv_mid->handle; +#else + qsv_mid->surf.Data.MemId = &qsv_mid->handle_pair; +#endif /* map the data to the system memory */ ret = av_hwframe_map(qsv_mid->locked_frame, qsv_mid->hw_frame, @@ -661,7 +686,17 @@ 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; +#if CONFIG_VAAPI *hdl = qsv_mid->handle; +#else + 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; +#endif return MFX_ERR_NONE; } @@ -695,11 +730,20 @@ int ff_qsv_init_session_device(AVCodecContext *avctx, mfxSession *psession, return ff_qsv_print_error(avctx, err, "Error querying the session attributes"); + 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 if (MFX_IMPL_VIA_VAAPI == MFX_IMPL_VIA_MASK(impl)) { + handle_type = MFX_HANDLE_VA_DISPLAY; + } + 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 (handle_types[i] == handle_type) { + err = MFXVideoCORE_GetHandle(parent_session, handle_types[i], &handle); + if (err == MFX_ERR_NONE) { + break; + } } handle = NULL; } diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h index 6489836a67..7a4a66e9d6 100644 --- a/libavcodec/qsv_internal.h +++ b/libavcodec/qsv_internal.h @@ -61,6 +61,7 @@ typedef struct QSVMid { AVBufferRef *hw_frames_ref; mfxHDL handle; + mfxHDLPair handle_pair; AVFrame *locked_frame; AVFrame *hw_frame;