From patchwork Fri Jan 7 07:01:31 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aman Karmani X-Patchwork-Id: 33143 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp143900iog; Thu, 6 Jan 2022 23:01:50 -0800 (PST) X-Google-Smtp-Source: ABdhPJwY1S6V5TB6KrQTemrbSNEXOWEgwYID2kqe5lJJnZU+Auo+OuKd5oZsCJNzx22RyC1iUQ3e X-Received: by 2002:a17:906:4781:: with SMTP id cw1mr51946677ejc.116.1641538909976; Thu, 06 Jan 2022 23:01:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1641538909; cv=none; d=google.com; s=arc-20160816; b=GP8KsgwmYO7BxvcbrugNGy0JWVunYSWskSho9XQkF2vgOuMWczIWmo/J9GleoVObZT S2kYSOo50Y61LBLvKx6gsCDcJkTcEAZ8iU5fbGBK7NxymZU4uO214/w7b2kea5QEogEX 7lS10wN9PutHbl9zlDwKoK5cYibjo9CHZxWXnY/waRWzNoSbD+STFZoXrDyI6kT2yWIq YLhBUejy9OhLCxAzhTaD0pV1sIui5V+lZ2jP2Ns7lA7yprIUCdEhZEX7OXsu9SiBSvYn nU5wFKnx+lPkOizUhDKhHvN9uAzYnN8DLciwjYdC7zV0fOok9N0WjrTZ+0TuyMUpZfwf L7gg== 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:to:mime-version:fcc:date:from:references :in-reply-to:message-id:dkim-signature:delivered-to; bh=aSB5W00I8/WommHlGatarVUFkrEOW8vCy5ObHxAPCMA=; b=SKjXr01nThoY/pYDuudCFJprZtEcjcKZ2fsDV4CIg4twArD86hbZP2rRlA6p8iuMS8 7l0jflgB46u9Miogx+HA7MmaDh4gW39QG/u6mytXqeN2Z9mzPafJSc9XH+I+Ukryynqb 4WDHMq9Ib+5dOOSX+ZgCWOtFa9xhvk0o4feDSRDf6Z65NsXjUM5j1gYGjIcG6NQ0q+qP QySsu8UIj+ywDjn+V3SWnBF+Y8d752GBh5ECxrsUnuOG5RRu8ByjeVp7HFGlHTEMyTuu tiS1TQhsrDtKBPp5Vg0umvZkcRXP0JL61Du5PYPh1HoMP1a5nYLLeSuwH3PqzKgx57ek UqZw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=KiJx+hyx; 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 i16si2271025edj.186.2022.01.06.23.01.47; Thu, 06 Jan 2022 23:01:49 -0800 (PST) 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=20210112 header.b=KiJx+hyx; 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 5707E68AE4A; Fri, 7 Jan 2022 09:01:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B6C7A68A896 for ; Fri, 7 Jan 2022 09:01:33 +0200 (EET) Received: by mail-pl1-f182.google.com with SMTP id h1so4219764pls.11; Thu, 06 Jan 2022 23:01:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=gJ6FDe2aS1z1/FF3A2wN0oHMNzkxyJ546jPlciup+Hw=; b=KiJx+hyxNFRdsmyA0IVqv7rHESavhmrMijNCa+beZ8Mv3bmrmA46wRIM6XPyCfbdA2 7biEjY82rMQHM+sLmhT9khfE57brgxNnDlNwbuqZrVkEgT1wGaGdOLzMd6mOAV/LUDa/ 7+CaxxRzM+5SS2RjlHOYDj/dCBDQNVIP4WKBUmu/gVxSRbbi4qmRtuj/ofncoFfM60MP 2TCH+7ggq4RwtEWugz7a5mBpmAxzD2aucwqrv0X8y9dkSZd1Ul8l5VZK4840AnZlKO+f b9EZwbspsip84jRct/UI7+p+ZwST53eKJ/WhShzK+ahyPqfHa+3G0339YO1qS7kn/OXf V1MQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=gJ6FDe2aS1z1/FF3A2wN0oHMNzkxyJ546jPlciup+Hw=; b=T8KsHc5/LPdnwZs1JhVxh+FFsN1KPBEV+Chqj7AcVujaOzoQHaRiYURq5uDWiTrXqO VVRD94AC7V4F+vxIofYS3AP9h6uVFyheX0tyFVtXqTTiMPJ1I0pVoq9GYYxZaht529my r6HbSTJB7dqACNzs6dFZNm9FQeKMuMXs0aFeCYa9x4tubmZfw0RhHj+a0Op4mi/GFBtH J8T22HSaYsx0hQgkDU++QJlRI2IVRwozA/ZoiPMyWsQzWNJP6FKZooTNtJNulaXdnEGq IimZ78qQijH4mYEutI6EkbnsxLyBsLwXr4tepBfv/6QDsqNxy2k3eU9W83pn4RpqbWko CJxg== X-Gm-Message-State: AOAM5322/lMqB8rFTaoHvwZ9eyCxqB996aNWIe2dLdaf0QIHDCQ3/5P5 cpcfMCeGz3zisMw+MGcJmOR/EJPjEbdFeA== X-Received: by 2002:a17:90b:3907:: with SMTP id ob7mr14010225pjb.176.1641538891969; Thu, 06 Jan 2022 23:01:31 -0800 (PST) Received: from [127.0.0.1] (master.gitmailbox.com. [34.83.118.50]) by smtp.gmail.com with ESMTPSA id e20sm4605187pfv.219.2022.01.06.23.01.31 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 06 Jan 2022 23:01:31 -0800 (PST) Message-Id: In-Reply-To: References: From: ffmpegagent Date: Fri, 07 Jan 2022 07:01:31 +0000 Fcc: Sent MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v4] avfilter/vpp_qsv: fix regression on older api versions (e.g. 1.11) 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: softworkz , "Xiang, Haihao" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 1mY7nL3EbvuJ From: softworkz Commit 8b83dad82512a6948b63408f964463b063ad24c9 introduced a regression in a way that scaling via vpp_qsv doesn't work any longer for devices with an MSDK runtime version lower than 1.19. This is true for older CPUs which are stuck at 1.11. The commit added checks for the compile-sdk version but it didn't test for the runtime version. Signed-off-by: softworkz --- avfilter/vpp_qsv: fix regression on older api versions (e.g. 1.11) Fix a recently introduced regression when using QSV VPP. v2: Fixed commit message wrapping v3: Use different way to acquire runtime version v4: Use mfxStatus as return type for get_mfx_version() Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-15%2Fsoftworkz%2Fqsv_vpp_regression-v4 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-15/softworkz/qsv_vpp_regression-v4 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/15 Range-diff vs v3: 1: cbf53d8ef4 ! 1: bf53154420 avfilter/vpp_qsv: fix regression on older api versions (e.g. 1.11) @@ libavfilter/vf_vpp_qsv.c: static int config_input(AVFilterLink *inlink) return 0; } -+static int get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version) ++static mfxStatus get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version) +{ + const AVFilterLink *inlink = ctx->inputs[0]; + AVBufferRef *device_ref; @@ libavfilter/vf_vpp_qsv.c: static int config_input(AVFilterLink *inlink) + // so don't error here but let runtime version checks fail by setting to 0.0 + mfx_version->Major = 0; + mfx_version->Minor = 0; -+ return 0; ++ return MFX_ERR_NONE; + } + + device_ctx = (AVHWDeviceContext *)device_ref->data; @@ libavfilter/vf_vpp_qsv.c: static int config_output(AVFilterLink *outlink) param.ext_buf = ext_buf; param.async_depth = vpp->async_depth; -+ if (get_mfx_version(ctx, &mfx_version) < 0) { ++ if (get_mfx_version(ctx, &mfx_version) != MFX_ERR_NONE) { + av_log(ctx, AV_LOG_ERROR, "Failed to query mfx version.\n"); + return AVERROR(EINVAL); + } libavfilter/vf_vpp_qsv.c | 59 ++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 12 deletions(-) base-commit: 242ed971cb005157488b9a21942d9fb4be4d0347 diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index ab58a5777e..5c96703fd3 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -26,6 +26,7 @@ #include "libavutil/opt.h" #include "libavutil/eval.h" #include "libavutil/hwcontext.h" +#include "libavutil/hwcontext_qsv.h" #include "libavutil/pixdesc.h" #include "libavutil/mathematics.h" @@ -139,8 +140,9 @@ static const AVOption options[] = { { "height", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, +#ifdef QSV_HAVE_SCALING_CONFIG { "scale_mode", "scale mode: 0=auto, 1=low power, 2=high quality", OFFSET(scale_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT }, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, .flags = FLAGS, "scale mode" }, - +#endif { NULL } }; @@ -297,6 +299,32 @@ static int config_input(AVFilterLink *inlink) return 0; } +static mfxStatus get_mfx_version(const AVFilterContext *ctx, mfxVersion *mfx_version) +{ + const AVFilterLink *inlink = ctx->inputs[0]; + AVBufferRef *device_ref; + AVHWDeviceContext *device_ctx; + AVQSVDeviceContext *device_hwctx; + + if (inlink->hw_frames_ctx) { + AVHWFramesContext *frames_ctx = (AVHWFramesContext *)inlink->hw_frames_ctx->data; + device_ref = frames_ctx->device_ref; + } else if (ctx->hw_device_ctx) { + device_ref = ctx->hw_device_ctx; + } else { + // Unavailable hw context doesn't matter in pass-through mode, + // so don't error here but let runtime version checks fail by setting to 0.0 + mfx_version->Major = 0; + mfx_version->Minor = 0; + return MFX_ERR_NONE; + } + + device_ctx = (AVHWDeviceContext *)device_ref->data; + device_hwctx = device_ctx->hwctx; + + return MFXQueryVersion(device_hwctx->session, mfx_version); +} + static int config_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; @@ -304,6 +332,7 @@ static int config_output(AVFilterLink *outlink) QSVVPPParam param = { NULL }; QSVVPPCrop crop = { 0 }; mfxExtBuffer *ext_buf[ENH_FILTERS_COUNT]; + mfxVersion mfx_version; AVFilterLink *inlink = ctx->inputs[0]; enum AVPixelFormat in_format; @@ -317,6 +346,11 @@ static int config_output(AVFilterLink *outlink) param.ext_buf = ext_buf; param.async_depth = vpp->async_depth; + if (get_mfx_version(ctx, &mfx_version) != MFX_ERR_NONE) { + av_log(ctx, AV_LOG_ERROR, "Failed to query mfx version.\n"); + return AVERROR(EINVAL); + } + if (inlink->format == AV_PIX_FMT_QSV) { if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) return AVERROR(EINVAL); @@ -467,19 +501,20 @@ static int config_output(AVFilterLink *outlink) #endif } - if (inlink->w != outlink->w || inlink->h != outlink->h) { #ifdef QSV_HAVE_SCALING_CONFIG - memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling)); - vpp->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; - vpp->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); - vpp->scale_conf.ScalingMode = vpp->scale_mode; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->scale_conf; -#else - av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale option is " - "not supported with this MSDK version.\n"); -#endif + if (inlink->w != outlink->w || inlink->h != outlink->h) { + if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) { + memset(&vpp->scale_conf, 0, sizeof(mfxExtVPPScaling)); + vpp->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; + vpp->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); + vpp->scale_conf.ScalingMode = vpp->scale_mode; + + param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->scale_conf; + } else + av_log(ctx, AV_LOG_WARNING, "The QSV VPP Scale option is " + "not supported with this MSDK version.\n"); } +#endif if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||