From patchwork Thu Jul 29 05:24:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29093 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501404ios; Wed, 28 Jul 2021 22:28:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy+tjzU80PKBnp5QJlJDI+UaVYWlrCJXg7hDDjECOgdWgZc1Atw/Xf4GvZn9RdN++/tWZKV X-Received: by 2002:a05:6402:361:: with SMTP id s1mr3965050edw.172.1627536530536; Wed, 28 Jul 2021 22:28:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536530; cv=none; d=google.com; s=arc-20160816; b=NRTKuJ31lkDF2cIE+qix/0WrDrm1nnzoOAJPD1m+V44rhlxORyxEiKl9gbEbeExOUJ vTg4UYBu9e6iy2Eq6zcIKEp3B/W/UIfCqaguU1+E//sJkHQvATI36wYmdEM1nEVFmnnE corDqL4FlEO3iOrpjKeeICsWcgCUFOMsIzKOPgP7tC7oXBF4fv01PCOW2eRqfCHACrSD Jf5YT5q7DvMiNV+k2VTf5gp01KXSUvioWKr9Yo8zx4Vrps5DPRol2IR/8eo4GFcJNFJD hLh7mnRCi1HCnuBpIyoUtARY/wuiH6z2bfDSuuWbU1qeOixkAgBA6iQuWzEPYYPlczsZ udhA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=UzwyoB/wi3XqbNpJchzmKqrYCGBQvviKLQ2jik/ALjc=; b=RKnwFs/KJGGwZRFSAsSPP+O/S5K9Vq44r/TVJp2JZ/35KF6HpoPIhowHUywg9Eqj5b q+1dXMK50woPcIXsLkSX34qpfY/4mtcPlxiN7+78A0rinUwZyEIpcc32TEJDk0MnxX/n OPngXW820TNMqb6u3iGJJHC2KJNn0KnLCsTkr7Se5FLGMtWeIeyBQhDVIbvkhnXjp0A9 pMhjxsByCUrhIAltJex7lEMyllTDtPXHCd1AHIgISOoNVkQo1/OylmB/bjcHLUYFUeH2 h2zvaolibIK6TxDYLuUsTm8iAtvCexlIHLrNv4mgS224X5/rMB2QIat+KOSz3oWhECRX UDfw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o2si2150784ejy.80.2021.07.28.22.28.50; Wed, 28 Jul 2021 22:28:50 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D52EA68A46B; Thu, 29 Jul 2021 08:26:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1DA1068A4C2 for ; Thu, 29 Jul 2021 08:26:11 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023580" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023580" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:46 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730039" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:45 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:49 +0800 Message-Id: <20210729052509.30992-2-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 01/21] lavfi/qsv: use QSVVPPContext as base context in vf_vpp_qsv/vf_overlay_qsv 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lWkIxOO2+OXS The same members between QSVVPPContext and VPPContext are removed from VPPContext, and async_depth is moved from QSVVPPParam to QSVVPPContext so that all QSV filters using QSVVPPContext may support async depth. In addition we may use QSVVPPContext as base context in other QSV filters in the future. --- libavfilter/qsvvpp.c | 25 ++++++++----------------- libavfilter/qsvvpp.h | 8 ++++---- libavfilter/vf_overlay_qsv.c | 11 +++++------ libavfilter/vf_vpp_qsv.c | 34 +++++++++++++--------------------- 4 files changed, 30 insertions(+), 48 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 4768f6208b..5b0b30e23c 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -647,15 +647,11 @@ static unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) return av_fifo_size(fifo)/qsv_fifo_item_size(); } -int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param) +int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) { int i; int ret; - QSVVPPContext *s; - - s = av_mallocz(sizeof(*s)); - if (!s) - return AVERROR(ENOMEM); + QSVVPPContext *s = avctx->priv; s->filter_frame = param->filter_frame; if (!s->filter_frame) @@ -722,14 +718,13 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p s->got_frame = 0; /** keep fifo size at least 1. Even when async_depth is 0, fifo is used. */ - s->async_fifo = av_fifo_alloc((param->async_depth + 1) * qsv_fifo_item_size()); - s->async_depth = param->async_depth; + s->async_fifo = av_fifo_alloc((s->async_depth + 1) * qsv_fifo_item_size()); if (!s->async_fifo) { ret = AVERROR(ENOMEM); goto failed; } - s->vpp_param.AsyncDepth = param->async_depth; + s->vpp_param.AsyncDepth = s->async_depth; if (IS_SYSTEM_MEMORY(s->in_mem_mode)) s->vpp_param.IOPattern |= MFX_IOPATTERN_IN_SYSTEM_MEMORY; @@ -756,25 +751,22 @@ int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *p } else if (ret > 0) ff_qsvvpp_print_warning(avctx, ret, "Warning When creating qsvvpp"); - *vpp = s; return 0; failed: - ff_qsvvpp_free(&s); + ff_qsvvpp_close(avctx); return ret; } -int ff_qsvvpp_free(QSVVPPContext **vpp) +int ff_qsvvpp_close(AVFilterContext *avctx) { - QSVVPPContext *s = *vpp; - - if (!s) - return 0; + QSVVPPContext *s = avctx->priv; if (s->session) { MFXVideoVPP_Close(s->session); MFXClose(s->session); + s->session = NULL; } /* release all the resources */ @@ -785,7 +777,6 @@ int ff_qsvvpp_free(QSVVPPContext **vpp) av_freep(&s->ext_buffers); av_freep(&s->frame_infos); av_fifo_free(s->async_fifo); - av_freep(vpp); return 0; } diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h index e0f4c8f5bb..b6fe0d3fa7 100644 --- a/libavfilter/qsvvpp.h +++ b/libavfilter/qsvvpp.h @@ -48,6 +48,8 @@ typedef struct QSVFrame { } QSVFrame; typedef struct QSVVPPContext { + const AVClass *class; + mfxSession session; int (*filter_frame) (AVFilterLink *outlink, AVFrame *frame); /**< callback */ enum AVPixelFormat out_sw_format; /**< Real output format */ @@ -95,15 +97,13 @@ typedef struct QSVVPPParam { /* Crop information for each input, if needed */ int num_crop; QSVVPPCrop *crop; - - int async_depth; } QSVVPPParam; /* create and initialize the QSV session */ -int ff_qsvvpp_create(AVFilterContext *avctx, QSVVPPContext **vpp, QSVVPPParam *param); +int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param); /* release the resources (eg.surfaces) */ -int ff_qsvvpp_free(QSVVPPContext **vpp); +int ff_qsvvpp_close(AVFilterContext *avctx); /* vpp filter frame and call the cb if needed */ int ff_qsvvpp_filter_frame(QSVVPPContext *vpp, AVFilterLink *inlink, AVFrame *frame); diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c index 14c4c37a3c..e7db6adf4b 100644 --- a/libavfilter/vf_overlay_qsv.c +++ b/libavfilter/vf_overlay_qsv.c @@ -57,10 +57,9 @@ enum var_name { }; typedef struct QSVOverlayContext { - const AVClass *class; + QSVVPPContext qsv; FFFrameSync fs; - QSVVPPContext *qsv; QSVVPPParam qsv_param; mfxExtVPPComposite comp_conf; double var_values[VAR_VARS_NB]; @@ -230,14 +229,14 @@ static int config_overlay_input(AVFilterLink *inlink) static int process_frame(FFFrameSync *fs) { AVFilterContext *ctx = fs->parent; - QSVOverlayContext *s = fs->opaque; + QSVVPPContext *qsv = fs->opaque; AVFrame *frame = NULL; int ret = 0, i; for (i = 0; i < ctx->nb_inputs; i++) { ret = ff_framesync_get_frame(fs, i, &frame, 0); if (ret == 0) - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + ret = ff_qsvvpp_filter_frame(qsv, ctx->inputs[i], frame); if (ret < 0 && ret != AVERROR(EAGAIN)) break; } @@ -299,7 +298,7 @@ static int config_output(AVFilterLink *outlink) if (ret < 0) return ret; - return ff_qsvvpp_create(ctx, &vpp->qsv, &vpp->qsv_param); + return ff_qsvvpp_init(ctx, &vpp->qsv_param); } /* @@ -348,7 +347,7 @@ static av_cold void overlay_qsv_uninit(AVFilterContext *ctx) { QSVOverlayContext *vpp = ctx->priv; - ff_qsvvpp_free(&vpp->qsv); + ff_qsvvpp_close(ctx); ff_framesync_uninit(&vpp->fs); av_freep(&vpp->comp_conf.InputStream); av_freep(&vpp->qsv_param.ext_buf); diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 11ee490935..fa4288f69f 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -47,9 +47,7 @@ #define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19) typedef struct VPPContext{ - const AVClass *class; - - QSVVPPContext *qsv; + QSVVPPContext qsv; /* Video Enhancement Algorithms */ mfxExtVPPDeinterlacing deinterlace_conf; @@ -93,9 +91,6 @@ typedef struct VPPContext{ char *cx, *cy, *cw, *ch; char *ow, *oh; char *output_format_str; - - int async_depth; - int eof; } VPPContext; static const AVOption options[] = { @@ -131,7 +126,7 @@ static const AVOption options[] = { { "h", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, { "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 }, + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, { NULL } }; @@ -307,7 +302,6 @@ static int config_output(AVFilterLink *outlink) param.filter_frame = NULL; param.num_ext_buf = 0; param.ext_buf = ext_buf; - param.async_depth = vpp->async_depth; if (inlink->format == AV_PIX_FMT_QSV) { if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) @@ -462,8 +456,9 @@ static int config_output(AVFilterLink *outlink) if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip || inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) - return ff_qsvvpp_create(ctx, &vpp->qsv, ¶m); + return ff_qsvvpp_init(ctx, ¶m); else { + /* No MFX session is created in this case */ av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n"); if (inlink->hw_frames_ctx) outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); @@ -476,33 +471,31 @@ static int activate(AVFilterContext *ctx) { AVFilterLink *inlink = ctx->inputs[0]; AVFilterLink *outlink = ctx->outputs[0]; - VPPContext *s =ctx->priv; - QSVVPPContext *qsv = s->qsv; + QSVVPPContext *qsv = ctx->priv; AVFrame *in = NULL; int ret, status; int64_t pts; FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink); - if (!s->eof) { + if (!qsv->eof) { ret = ff_inlink_consume_frame(inlink, &in); if (ret < 0) return ret; if (ff_inlink_acknowledge_status(inlink, &status, &pts)) { if (status == AVERROR_EOF) { - s->eof = 1; + qsv->eof = 1; } } } - if (qsv) { - if (in || s->eof) { - qsv->eof = s->eof; + if (qsv->session) { + if (in || qsv->eof) { ret = ff_qsvvpp_filter_frame(qsv, inlink, in); av_frame_free(&in); - if (s->eof) { + if (qsv->eof) { ff_outlink_set_status(outlink, status, pts); return 0; } @@ -513,6 +506,7 @@ static int activate(AVFilterContext *ctx) } } } else { + /* No MFX session is created in pass-through mode */ if (in) { if (in->pts != AV_NOPTS_VALUE) in->pts = av_rescale_q(in->pts, inlink->time_base, outlink->time_base); @@ -522,7 +516,7 @@ static int activate(AVFilterContext *ctx) } } - if (s->eof) { + if (qsv->eof) { ff_outlink_set_status(outlink, status, pts); return 0; } else { @@ -560,9 +554,7 @@ static int query_formats(AVFilterContext *ctx) static av_cold void vpp_uninit(AVFilterContext *ctx) { - VPPContext *vpp = ctx->priv; - - ff_qsvvpp_free(&vpp->qsv); + ff_qsvvpp_close(ctx); } static const AVClass vpp_class = { From patchwork Thu Jul 29 05:24:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29121 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6902:1243:0:0:0:0 with SMTP id t3csp144553ybu; Wed, 28 Jul 2021 22:29:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwMyjuOibGoV8Qz4zmEmoB1jgigMa5P8crz7hkZU+wcOfYT6CZi9LyfcwXKep52LdlLklno X-Received: by 2002:a05:6402:291d:: with SMTP id ee29mr4041731edb.289.1627536552577; Wed, 28 Jul 2021 22:29:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536552; cv=none; d=google.com; s=arc-20160816; b=D773vPOgG1+CW2nkAAvBxnM1Sb2tRDTKBjIveq+aOgTpXBLY4AAPoiBrPj9VAo8ljW EEXR6lA63NcFSChik7t7J2ax3z1a9Nhexw0EEmskxG+yOKm0M2Yy5Ep83xSEK7bWMo7U ANSIHKpa/+Q9cNyNSGwynqZbJBsQxWHrQxQ0QMFpSRhW2t+ylvKwwcoAaTVPjw/2y0KQ H4EtQCXcjO2nJePKtLutG3Vp6aRVE6gX66+IfL3qz9tTvDMVKsX6QxVcxI1fxpI6tQG6 /5XANoUa3qPxO1uIHC0WD+2DyT1lgWbS7oJt8flipb2lwR8o8/z67+UzhrazHBB7Ok6C xBZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=KR/Be3xIlmx3LU4eyxczqKEegBW+6nvHHpWtwwcmJSU=; b=Xm7My4aXIcsX35z7ms/Xt9DTlyfi0Tm3BRMxn1IlK4EgMhl93oCNWNhxZ3K0PJMrgD 7jUdVHjraFTul+t9TAzgoSz/tLr4TELQWh6V8jPutTS80k1rv/L9EUa8rpmAFH8fk0lR tFpuGKWX7yLO7dmhKKs7/vAlcUV53+NfeL5DTuUx6IJKXsYln+HcG1jap7gIptjoNiCS IC8bR+APuYRwtdhByevXbfqtlIRISUcTnYxK7Dvaq4KBiIUzzeFmaIUJmYxK1LpRw78d lNXDrZCbdxouydc9z2iUUO8ALpAiLNWkMb5rU5/1LB4skKzeIMqjQDrYRRAxb11DfWDI Fdgw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ho43si2102599ejc.615.2021.07.28.22.29.12; Wed, 28 Jul 2021 22:29:12 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DD7B268A5C0; Thu, 29 Jul 2021 08:26:28 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BEC7E68A48A for ; Thu, 29 Jul 2021 08:26:17 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023583" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023583" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:47 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730059" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:46 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:50 +0800 Message-Id: <20210729052509.30992-3-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 02/21] lavfi/scale_qsv: simplify scale_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: dC1+nEnTIiid Content-Length: 17870 Use QSVVPPContext as a base context of QSVScaleContext, hence we may re-use functions defined for QSVVPPContext to manage MFX session for scale_qsv filter too. Because system memory is taken into account in QSVVVPPContext, we may add support for non-QSV pixel formats in the future --- libavfilter/vf_scale_qsv.c | 456 +++++-------------------------------- 1 file changed, 57 insertions(+), 399 deletions(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 189223a58a..77a782aa58 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -72,35 +72,13 @@ enum var_name { #define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19) typedef struct QSVScaleContext { - const AVClass *class; - - /* a clone of the main session, used internally for scaling */ - mfxSession session; - - mfxMemId *mem_ids_in; - int nb_mem_ids_in; - - mfxMemId *mem_ids_out; - int nb_mem_ids_out; - - mfxFrameSurface1 **surface_ptrs_in; - int nb_surface_ptrs_in; - - mfxFrameSurface1 **surface_ptrs_out; - int nb_surface_ptrs_out; - - mfxExtOpaqueSurfaceAlloc opaque_alloc; + QSVVPPContext qsv; #if QSV_HAVE_SCALING_CONFIG mfxExtVPPScaling scale_conf; #endif int mode; - mfxExtBuffer *ext_buffers[1 + QSV_HAVE_SCALING_CONFIG]; - int num_ext_buf; - - int shift_width, shift_height; - /** * New dimensions. Special values are: * 0 = original width/height @@ -137,22 +115,7 @@ static av_cold int qsvscale_init(AVFilterContext *ctx) static av_cold void qsvscale_uninit(AVFilterContext *ctx) { - QSVScaleContext *s = ctx->priv; - - if (s->session) { - MFXClose(s->session); - s->session = NULL; - } - - av_freep(&s->mem_ids_in); - av_freep(&s->mem_ids_out); - s->nb_mem_ids_in = 0; - s->nb_mem_ids_out = 0; - - av_freep(&s->surface_ptrs_in); - av_freep(&s->surface_ptrs_out); - s->nb_surface_ptrs_in = 0; - s->nb_surface_ptrs_out = 0; + ff_qsvvpp_close(ctx); } static int qsvscale_query_formats(AVFilterContext *ctx) @@ -169,313 +132,20 @@ static int qsvscale_query_formats(AVFilterContext *ctx) return 0; } -static int init_out_pool(AVFilterContext *ctx, - int out_width, int out_height) -{ - QSVScaleContext *s = ctx->priv; - AVFilterLink *outlink = ctx->outputs[0]; - - AVHWFramesContext *in_frames_ctx; - AVHWFramesContext *out_frames_ctx; - AVQSVFramesContext *in_frames_hwctx; - AVQSVFramesContext *out_frames_hwctx; - enum AVPixelFormat in_format; - enum AVPixelFormat out_format; - int i, ret; - - /* check that we have a hw context */ - if (!ctx->inputs[0]->hw_frames_ctx) { - av_log(ctx, AV_LOG_ERROR, "No hw context provided on input\n"); - return AVERROR(EINVAL); - } - in_frames_ctx = (AVHWFramesContext*)ctx->inputs[0]->hw_frames_ctx->data; - in_frames_hwctx = in_frames_ctx->hwctx; - - in_format = in_frames_ctx->sw_format; - out_format = (s->format == AV_PIX_FMT_NONE) ? in_format : s->format; - - outlink->hw_frames_ctx = av_hwframe_ctx_alloc(in_frames_ctx->device_ref); - if (!outlink->hw_frames_ctx) - return AVERROR(ENOMEM); - out_frames_ctx = (AVHWFramesContext*)outlink->hw_frames_ctx->data; - out_frames_hwctx = out_frames_ctx->hwctx; - - out_frames_ctx->format = AV_PIX_FMT_QSV; - out_frames_ctx->width = FFALIGN(out_width, 16); - out_frames_ctx->height = FFALIGN(out_height, 16); - out_frames_ctx->sw_format = out_format; - out_frames_ctx->initial_pool_size = 4; - - out_frames_hwctx->frame_type = in_frames_hwctx->frame_type; - - ret = ff_filter_init_hw_frames(ctx, outlink, 32); - if (ret < 0) - return ret; - - ret = av_hwframe_ctx_init(outlink->hw_frames_ctx); - if (ret < 0) - return ret; - - for (i = 0; i < out_frames_hwctx->nb_surfaces; i++) { - mfxFrameInfo *info = &out_frames_hwctx->surfaces[i].Info; - info->CropW = out_width; - info->CropH = out_height; - } - - return 0; -} - -static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, - mfxFrameAllocResponse *resp) -{ - AVFilterContext *ctx = pthis; - QSVScaleContext *s = ctx->priv; - - if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) || - !(req->Type & (MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_FROM_VPPOUT)) || - !(req->Type & MFX_MEMTYPE_EXTERNAL_FRAME)) - return MFX_ERR_UNSUPPORTED; - - if (req->Type & MFX_MEMTYPE_FROM_VPPIN) { - resp->mids = s->mem_ids_in; - resp->NumFrameActual = s->nb_mem_ids_in; - } else { - resp->mids = s->mem_ids_out; - resp->NumFrameActual = s->nb_mem_ids_out; - } - - return MFX_ERR_NONE; -} - -static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) -{ - return MFX_ERR_NONE; -} - -static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) -{ - return MFX_ERR_UNSUPPORTED; -} - -static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) -{ - return MFX_ERR_UNSUPPORTED; -} - -static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) -{ - *hdl = mid; - 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) -{ - - QSVScaleContext *s = ctx->priv; - AVHWFramesContext *in_frames_ctx = (AVHWFramesContext*)ctx->inputs[0]->hw_frames_ctx->data; - AVHWFramesContext *out_frames_ctx = (AVHWFramesContext*)ctx->outputs[0]->hw_frames_ctx->data; - AVQSVFramesContext *in_frames_hwctx = in_frames_ctx->hwctx; - AVQSVFramesContext *out_frames_hwctx = out_frames_ctx->hwctx; - AVQSVDeviceContext *device_hwctx = in_frames_ctx->device_ctx->hwctx; - - int opaque = !!(in_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME); - - mfxHDL handle = NULL; - mfxHandleType handle_type; - mfxVersion ver; - mfxIMPL impl; - mfxVideoParam par; - mfxStatus err; - int i; - - s->num_ext_buf = 0; - - /* extract the properties of the "master" session given to us */ - err = MFXQueryIMPL(device_hwctx->session, &impl); - if (err == MFX_ERR_NONE) - err = MFXQueryVersion(device_hwctx->session, &ver); - if (err != MFX_ERR_NONE) { - av_log(ctx, AV_LOG_ERROR, "Error querying the session attributes\n"); - return AVERROR_UNKNOWN; - } - - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], &handle); - if (err == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } - } - - if (err < 0) - return ff_qsvvpp_print_error(ctx, err, "Error getting the session handle"); - else if (err > 0) { - ff_qsvvpp_print_warning(ctx, err, "Warning in getting the session handle"); - return AVERROR_UNKNOWN; - } - - /* create a "slave" session with those same properties, to be used for - * actual scaling */ - err = MFXInit(impl, &ver, &s->session); - if (err != MFX_ERR_NONE) { - av_log(ctx, AV_LOG_ERROR, "Error initializing a session for scaling\n"); - return AVERROR_UNKNOWN; - } - - if (handle) { - err = MFXVideoCORE_SetHandle(s->session, handle_type, handle); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - } - - if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { - err = MFXJoinSession(device_hwctx->session, s->session); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - } - - memset(&par, 0, sizeof(par)); - - if (opaque) { - s->surface_ptrs_in = av_mallocz_array(in_frames_hwctx->nb_surfaces, - sizeof(*s->surface_ptrs_in)); - if (!s->surface_ptrs_in) - return AVERROR(ENOMEM); - for (i = 0; i < in_frames_hwctx->nb_surfaces; i++) - s->surface_ptrs_in[i] = in_frames_hwctx->surfaces + i; - s->nb_surface_ptrs_in = in_frames_hwctx->nb_surfaces; - - s->surface_ptrs_out = av_mallocz_array(out_frames_hwctx->nb_surfaces, - sizeof(*s->surface_ptrs_out)); - if (!s->surface_ptrs_out) - return AVERROR(ENOMEM); - for (i = 0; i < out_frames_hwctx->nb_surfaces; i++) - s->surface_ptrs_out[i] = out_frames_hwctx->surfaces + i; - s->nb_surface_ptrs_out = out_frames_hwctx->nb_surfaces; - - s->opaque_alloc.In.Surfaces = s->surface_ptrs_in; - s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs_in; - s->opaque_alloc.In.Type = in_frames_hwctx->frame_type; - - s->opaque_alloc.Out.Surfaces = s->surface_ptrs_out; - s->opaque_alloc.Out.NumSurface = s->nb_surface_ptrs_out; - s->opaque_alloc.Out.Type = out_frames_hwctx->frame_type; - - s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION; - s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc); - - s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->opaque_alloc; - - par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY; - } else { - mfxFrameAllocator frame_allocator = { - .pthis = ctx, - .Alloc = frame_alloc, - .Lock = frame_lock, - .Unlock = frame_unlock, - .GetHDL = frame_get_hdl, - .Free = frame_free, - }; - - s->mem_ids_in = av_mallocz_array(in_frames_hwctx->nb_surfaces, - sizeof(*s->mem_ids_in)); - if (!s->mem_ids_in) - return AVERROR(ENOMEM); - for (i = 0; i < in_frames_hwctx->nb_surfaces; i++) - s->mem_ids_in[i] = in_frames_hwctx->surfaces[i].Data.MemId; - s->nb_mem_ids_in = in_frames_hwctx->nb_surfaces; - - s->mem_ids_out = av_mallocz_array(out_frames_hwctx->nb_surfaces, - sizeof(*s->mem_ids_out)); - if (!s->mem_ids_out) - return AVERROR(ENOMEM); - for (i = 0; i < out_frames_hwctx->nb_surfaces; i++) - s->mem_ids_out[i] = out_frames_hwctx->surfaces[i].Data.MemId; - s->nb_mem_ids_out = out_frames_hwctx->nb_surfaces; - - err = MFXVideoCORE_SetFrameAllocator(s->session, &frame_allocator); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - - par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; - } - -#if QSV_HAVE_SCALING_CONFIG - memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling)); - s->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; - s->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); - s->scale_conf.ScalingMode = s->mode; - s->ext_buffers[s->num_ext_buf++] = (mfxExtBuffer*)&s->scale_conf; - av_log(ctx, AV_LOG_VERBOSE, "Scaling mode: %d\n", s->mode); -#endif - - par.ExtParam = s->ext_buffers; - par.NumExtParam = s->num_ext_buf; - - par.AsyncDepth = 1; // TODO async - - par.vpp.In = in_frames_hwctx->surfaces[0].Info; - par.vpp.Out = out_frames_hwctx->surfaces[0].Info; - - /* Apparently VPP requires the frame rate to be set to some value, otherwise - * init will fail (probably for the framerate conversion filter). Since we - * are only doing scaling here, we just invent an arbitrary - * value */ - par.vpp.In.FrameRateExtN = 25; - par.vpp.In.FrameRateExtD = 1; - par.vpp.Out.FrameRateExtN = 25; - par.vpp.Out.FrameRateExtD = 1; - - /* Print input memory mode */ - ff_qsvvpp_print_iopattern(ctx, par.IOPattern & 0x0F, "VPP"); - /* Print output memory mode */ - ff_qsvvpp_print_iopattern(ctx, par.IOPattern & 0xF0, "VPP"); - err = MFXVideoVPP_Init(s->session, &par); - if (err < 0) - return ff_qsvvpp_print_error(ctx, err, - "Error opening the VPP for scaling"); - else if (err > 0) { - ff_qsvvpp_print_warning(ctx, err, - "Warning in VPP initialization"); - return AVERROR_UNKNOWN; - } - - return 0; -} - -static int init_scale_session(AVFilterContext *ctx, int in_width, int in_height, - int out_width, int out_height) -{ - int ret; - - qsvscale_uninit(ctx); - - ret = init_out_pool(ctx, out_width, out_height); - if (ret < 0) - return ret; - - ret = init_out_session(ctx); - if (ret < 0) - return ret; - - return 0; -} - static int qsvscale_config_props(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; AVFilterLink *inlink = outlink->src->inputs[0]; - QSVScaleContext *s = ctx->priv; + QSVScaleContext *s = ctx->priv; + QSVVPPParam param = { NULL }; +#if QSV_HAVE_SCALING_CONFIG + mfxExtBuffer *ext_buf[1]; +#endif int64_t w, h; double var_values[VARS_NB], res; char *expr; int ret; + enum AVPixelFormat in_format; var_values[VAR_PI] = M_PI; var_values[VAR_PHI] = M_PHI; @@ -534,9 +204,44 @@ static int qsvscale_config_props(AVFilterLink *outlink) outlink->w = w; outlink->h = h; - ret = init_scale_session(ctx, inlink->w, inlink->h, w, h); - if (ret < 0) - return ret; + if (inlink->format == AV_PIX_FMT_QSV) { + if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) + return AVERROR(EINVAL); + else + in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format; + } else + in_format = inlink->format; + + if (s->format == AV_PIX_FMT_NONE) + s->format = in_format; + + outlink->frame_rate = inlink->frame_rate; + outlink->time_base = av_inv_q(inlink->frame_rate); + param.out_sw_format = s->format; + +#if QSV_HAVE_SCALING_CONFIG + param.ext_buf = ext_buf; + memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling)); + s->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; + s->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); + s->scale_conf.ScalingMode = s->mode; + param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&s->scale_conf; + av_log(ctx, AV_LOG_VERBOSE, "Scaling mode: %d\n", s->mode); +#endif + + if (inlink->w != outlink->w || + inlink->h != outlink->h || + in_format != s->format) { + ret = ff_qsvvpp_init(ctx, ¶m); + + if (ret < 0) + return ret; + } else { + /* No MFX session is created in this case */ + av_log(ctx, AV_LOG_VERBOSE, "scale_qsv pass through mode.\n"); + if (inlink->hw_frames_ctx) + outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); + } av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d -> w:%d h:%d\n", inlink->w, inlink->h, outlink->w, outlink->h); @@ -558,67 +263,20 @@ fail: static int qsvscale_filter_frame(AVFilterLink *link, AVFrame *in) { - AVFilterContext *ctx = link->dst; - QSVScaleContext *s = ctx->priv; - AVFilterLink *outlink = ctx->outputs[0]; - - mfxSyncPoint sync = NULL; - mfxStatus err; - - AVFrame *out = NULL; - int ret = 0; - - out = ff_get_video_buffer(outlink, outlink->w, outlink->h); - if (!out) { - ret = AVERROR(ENOMEM); - goto fail; - } - - do { - err = MFXVideoVPP_RunFrameVPPAsync(s->session, - (mfxFrameSurface1*)in->data[3], - (mfxFrameSurface1*)out->data[3], - NULL, &sync); - if (err == MFX_WRN_DEVICE_BUSY) - av_usleep(1); - } while (err == MFX_WRN_DEVICE_BUSY); - - if (err < 0) { - ret = ff_qsvvpp_print_error(ctx, err, "Error during scaling"); - goto fail; - } - - if (!sync) { - av_log(ctx, AV_LOG_ERROR, "No sync during scaling\n"); - ret = AVERROR_UNKNOWN; - goto fail; - } + int ret = 0; + AVFilterContext *ctx = link->dst; + QSVVPPContext *qsv = ctx->priv; + AVFilterLink *outlink = ctx->outputs[0]; - do { - err = MFXVideoCORE_SyncOperation(s->session, sync, 1000); - } while (err == MFX_WRN_IN_EXECUTION); - if (err < 0) { - ret = ff_qsvvpp_print_error(ctx, err, "Error synchronizing the operation"); - goto fail; + if (qsv->session) { + ret = ff_qsvvpp_filter_frame(qsv, link, in); + av_frame_free(&in); + } else { + /* No MFX session is created in pass-through mode */ + if (in) + ret = ff_filter_frame(outlink, in); } - ret = av_frame_copy_props(out, in); - if (ret < 0) - goto fail; - - out->width = outlink->w; - out->height = outlink->h; - - av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, - (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w, - (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h, - INT_MAX); - - av_frame_free(&in); - return ff_filter_frame(outlink, out); -fail: - av_frame_free(&in); - av_frame_free(&out); return ret; } From patchwork Thu Jul 29 05:24:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29094 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500434ios; Wed, 28 Jul 2021 22:26:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzNpHgz9QGLtSFMj7afFSuH/ejFJlRHjQQFhdoSjjHJJFaOc2fpBjNORPA8UcZwx+1Tlf8E X-Received: by 2002:a05:6402:cab:: with SMTP id cn11mr3817959edb.369.1627536412799; Wed, 28 Jul 2021 22:26:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536412; cv=none; d=google.com; s=arc-20160816; b=hLBIiCZyy7p6zurRKpwtNsGgSY2LfQElQIuifMw6O+HRLAJk21eNB2AWTH6LLy/xxP Pifqc2qK4vMWnH+UBDIDQteganYQpY7RR/cNrutDtPWA3g6EiXCj1EoxHHft5JIPHQlo zp8BsYx5JFUwTNwza4EyB/FYCybZH9vHfkF5HsnETqQ/xcBJ6Kp1Jtf/uARzhw9xMCeH F4/M0Xxp7btV+9eDkBCqpQCjUv54N1cjL6vdTS3vXZgpWNjiqOlOKH/L4LOlCO5BoOzh YRAMQ6YifQbWbOIM8SmTVXfR2JLq+ajU8mtjguivEv0n1+Vif1XO7XynJIzlm+mp25yY MAMg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=8GXmAxeWDOUNxn6O3oGzHrrflAarUu/Eadic3C1E2d4=; b=OgM4/byZ8etgj9utSDtivbQp+iouCXwpGmRB2wywEHN7wu/PGlQnPCT90VNHsGbL1a azjx6o//xmeXwp23v+J/d2yOVIhZ17hdscXd6SpKmb3ai5V+wl8pHVhOrqlHvjUBpatS ZCXfm3xvkCOEKYqilvWZ7mjN25vU7KqMG9S7hnZIIm+zkoJWjvh+TYuoyP9frn1UTYO3 Z7C+fJxrkzNgtXrWXDM6RZDD0aN++7kKzakdLIF2CmtdVxprk3sJzIRRGOhsne6HaqxO nKN2gDDavj2nWMmObg9h53ov6iQS60Nyhz7C8PLvs/F5+GiffTtqt9PJEPl/dldSC2oS i8+w== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m27si1847508eje.688.2021.07.28.22.26.51; Wed, 28 Jul 2021 22:26: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 62F5168A351; Thu, 29 Jul 2021 08:26:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3351968A2F6 for ; Thu, 29 Jul 2021 08:26:06 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023584" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023584" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:49 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730071" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:48 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:51 +0800 Message-Id: <20210729052509.30992-4-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 03/21] lavfi/scale_qsv: don't need variables for constants in FFmpeg 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +KPGTC49eSDT PI, PHI and E are defined in FFmpeg --- libavfilter/vf_scale_qsv.c | 9 --------- 1 file changed, 9 deletions(-) diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index 77a782aa58..f8e937e40e 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -44,9 +44,6 @@ #include "video.h" static const char *const var_names[] = { - "PI", - "PHI", - "E", "in_w", "iw", "in_h", "ih", "out_w", "ow", @@ -57,9 +54,6 @@ static const char *const var_names[] = { }; enum var_name { - VAR_PI, - VAR_PHI, - VAR_E, VAR_IN_W, VAR_IW, VAR_IN_H, VAR_IH, VAR_OUT_W, VAR_OW, @@ -147,9 +141,6 @@ static int qsvscale_config_props(AVFilterLink *outlink) int ret; enum AVPixelFormat in_format; - var_values[VAR_PI] = M_PI; - var_values[VAR_PHI] = M_PHI; - var_values[VAR_E] = M_E; var_values[VAR_IN_W] = var_values[VAR_IW] = inlink->w; var_values[VAR_IN_H] = var_values[VAR_IH] = inlink->h; var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN; From patchwork Thu Jul 29 05:24:52 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29096 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501094ios; Wed, 28 Jul 2021 22:28:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy0WqqEuRHjd4B1ocySmJiF4yTkYxontVtq3fQTXRwzgkkgfNJ5lptKajDjJNw7+3NB6m4l X-Received: by 2002:a17:906:95cf:: with SMTP id n15mr2882300ejy.531.1627536490316; Wed, 28 Jul 2021 22:28:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536490; cv=none; d=google.com; s=arc-20160816; b=k8yN3Vl8NMLvyCl9FkZJfQ4DwhSpto0cu3EenZKE6WUBEh8lWw3s/JmJsKsjCmO/Yw gkQl+bpJK09+jx2ku7ITTs1H8ntpkvaHW0luY0nKvyrStn4yrzMW9iT6fbhcYMHQYtTL lrIinlb+nOShq/YMLQs5ucCt+mb5LxxM/nBEygIzcwF0k3GHYxRutk6iRYJ5aVWuUDq7 6K2WdVJhLX3RKaVk6Jy61qHA1J16s9KBZnMRJh8HskDCm6l1y9p5PWQ3SGrZPvcNGkhs lHSpIIoaT4PCnecStkKo2wSNdZY6/gCjl2c4FWoBZOQ7A9DN+JuUavXHe/Q8ElWXhFfa lsCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=0HTyhSD9gXvzFH6aHtAWxSFpehaf3j8LhhMys+98AiE=; b=j7GWY4NLNjKBeUDjrz1JG3BhCcqY1RUG7HSD7qLo1Je5xBRlnpPuTS/o1kh4Vhhy3G ht5pgdmFClLk+YK3Auh13OQ2MBZZ6B2noP5UkrR38Qrx7jzs396nM68B2PNaW+oxPfhU igu+dO47Up9Bi3f19RUqu6Xsvg73uvUwT/qgItQFtUegJBwD8EzrNVe2ixIXsY3UnpXT Qa8EGVKf0mJw3P321TD/q1elqNM3ZWrs3rl5RADRaq1AMy6vbr6aZp02DWrFajMshPYG 2RMhprBGKD6dejsXei3b4evOPfsN8Ly+YZCjnTiMsAigHUx2EVratN0EICn75uUiQg0w 5Itw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ee43si1786084edb.264.2021.07.28.22.28.10; Wed, 28 Jul 2021 22:28:10 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1157668A57B; Thu, 29 Jul 2021 08:26:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CC538689D48 for ; Thu, 29 Jul 2021 08:26:10 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023585" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023585" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:50 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730077" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:49 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:52 +0800 Message-Id: <20210729052509.30992-5-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 04/21] lavfi/vpp_qsv: add "a", "dar" and "sar" variables 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: FI/k0UpuuF6I Also fix the coding style for VAR index. This is in preparation for re-using VPPContext for scale_qsv filter --- libavfilter/vf_vpp_qsv.c | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index fa4288f69f..cc8fe1645e 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -140,18 +140,22 @@ static const char *const var_names[] = { "ch", "cx", "cy", + "a", "dar", + "sar", NULL }; enum var_name { - VAR_iW, VAR_IN_W, - VAR_iH, VAR_IN_H, - VAR_oW, VAR_OUT_W, VAR_W, - VAR_oH, VAR_OUT_H, VAR_H, + VAR_IW, VAR_IN_W, + VAR_IH, VAR_IN_H, + VAR_OW, VAR_OUT_W, VAR_W, + VAR_OH, VAR_OUT_H, VAR_H, CW, CH, CX, CY, + VAR_A, VAR_DAR, + VAR_SAR, VAR_VARS_NB }; @@ -183,12 +187,17 @@ static int eval_expr(AVFilterContext *ctx) PASS_EXPR(cx_expr, vpp->cx); PASS_EXPR(cy_expr, vpp->cy); - var_values[VAR_iW] = + var_values[VAR_IW] = var_values[VAR_IN_W] = ctx->inputs[0]->w; - var_values[VAR_iH] = + var_values[VAR_IH] = var_values[VAR_IN_H] = ctx->inputs[0]->h; + var_values[VAR_A] = (double)var_values[VAR_IN_W] / var_values[VAR_IN_H]; + var_values[VAR_SAR] = ctx->inputs[0]->sample_aspect_ratio.num ? + (double)ctx->inputs[0]->sample_aspect_ratio.num / ctx->inputs[0]->sample_aspect_ratio.den : 1; + var_values[VAR_DAR] = var_values[VAR_A] * var_values[VAR_SAR]; + /* crop params */ CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w); CALC_EXPR(ch_expr, var_values[CH], vpp->crop_h); @@ -197,15 +206,15 @@ static int eval_expr(AVFilterContext *ctx) CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w); CALC_EXPR(w_expr, - var_values[VAR_OUT_W] = var_values[VAR_oW] = var_values[VAR_W], + var_values[VAR_OUT_W] = var_values[VAR_OW] = var_values[VAR_W], vpp->out_width); CALC_EXPR(h_expr, - var_values[VAR_OUT_H] = var_values[VAR_oH] = var_values[VAR_H], + var_values[VAR_OUT_H] = var_values[VAR_OH] = var_values[VAR_H], vpp->out_height); /* calc again in case ow is relative to oh */ CALC_EXPR(w_expr, - var_values[VAR_OUT_W] = var_values[VAR_oW] = var_values[VAR_W], + var_values[VAR_OUT_W] = var_values[VAR_OW] = var_values[VAR_W], vpp->out_width); @@ -215,7 +224,7 @@ static int eval_expr(AVFilterContext *ctx) /* calc again in case cx is relative to cy */ CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x); - if ((vpp->crop_w != var_values[VAR_iW]) || (vpp->crop_h != var_values[VAR_iH])) + if ((vpp->crop_w != var_values[VAR_IW]) || (vpp->crop_h != var_values[VAR_IH])) vpp->use_crop = 1; release: From patchwork Thu Jul 29 05:24:53 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29095 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501249ios; Wed, 28 Jul 2021 22:28:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJykVm+BUGJhoGLDgzq5DvacIIiOBrG+ISnBBgDKP9f6YNzuPPHPm1A92qMGeGhaEyrNilSK X-Received: by 2002:a17:906:9b1:: with SMTP id q17mr2896471eje.546.1627536509061; Wed, 28 Jul 2021 22:28:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536509; cv=none; d=google.com; s=arc-20160816; b=o8LsH3lqJSusHwy3K3k0WnOJOvaOi1TOgPZ6WgPo1wmV6JeYuHmMBB348JXfl4LsIt uL0wpNmsKaVWkb+U0W//3Fwl77Fn0q4l0AEtd1DOpxeUX6RAJjnIqrUhQx88ptbkZhVP Ruj4roOYRjUzlyJwvGAmJ5jqDu5z/rBPNYRqkKjDLXoVM7bFYLDLYTmfn4BvWSL93cts Fszx3IAZ4Z5d+qOK4mHy5dObPakGPBaMh4KeIgwilKp/0W6H3ZXFdRiSg0Fec75HuLE/ WEgWJvjat3q2BK6tSMY0pR6WGjlHwDHnQOJ6tNjAEM5X2OIjUC5qRhJVBHkemZfxTZvV PHVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=9oIAj5G0T0pqT4yHqmywP+/50ryEJ5wTBbqFEfO1crM=; b=tHrv75KWPCjBgk/k3LWGxjF4nRiVr8Z6hSKyMgV5JbwAfvElD+VVmpgfNdBBGt/O+k C4YSIzNa320BaUltgSjBBLY3D102ICfnkHxP2RLev5GVXFcKde+QaYOb8fxFVl4jmgzV Hc0UitakUFU7eCjpAFeftFw8Ntei+Y53VJvJHIMBPClkyt28NQmRP3ALLZ+7MuR0/aTg I5gpdmAbAm0f4WTJT+39pffcKaxsIZxiMXiLYM03dBdNlZ3PEMcJraSdDR1lFddqZEhH 2un974iBKKqhYdpsa37aInS7lUc6IvlfGt9Yfrb5TP2C8xPQ83H1Tnb8XMo8xTNrby2h ggEg== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id dm18si1793356edb.411.2021.07.28.22.28.28; Wed, 28 Jul 2021 22:28:29 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D7E5868A56A; Thu, 29 Jul 2021 08:26:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C40D868A4A3 for ; Thu, 29 Jul 2021 08:26:16 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023586" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023586" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:51 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730082" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:50 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:53 +0800 Message-Id: <20210729052509.30992-6-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 05/21] lavfi/vpp_qsv: handle NULL pointer when evaluating an expression 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 2vszhV1Pxr5k This is in preparation for re-using VPPContext but with a different option array for scale_qsv filter --- libavfilter/vf_vpp_qsv.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index cc8fe1645e..c0fc0d4154 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -162,14 +162,19 @@ enum var_name { static int eval_expr(AVFilterContext *ctx) { #define PASS_EXPR(e, s) {\ - ret = av_expr_parse(&e, s, var_names, NULL, NULL, NULL, NULL, 0, ctx); \ - if (ret < 0) {\ - av_log(ctx, AV_LOG_ERROR, "Error when passing '%s'.\n", s);\ - goto release;\ + if (s) {\ + ret = av_expr_parse(&e, s, var_names, NULL, NULL, NULL, NULL, 0, ctx); \ + if (ret < 0) { \ + av_log(ctx, AV_LOG_ERROR, "Error when passing '%s'.\n", s); \ + goto release; \ + } \ }\ } -#define CALC_EXPR(e, v, i) {\ - i = v = av_expr_eval(e, var_values, NULL); \ +#define CALC_EXPR(e, v, i, d) {\ + if (e)\ + i = v = av_expr_eval(e, var_values, NULL); \ + else\ + i = v = d;\ } VPPContext *vpp = ctx->priv; double var_values[VAR_VARS_NB] = { NAN }; @@ -199,30 +204,29 @@ static int eval_expr(AVFilterContext *ctx) var_values[VAR_DAR] = var_values[VAR_A] * var_values[VAR_SAR]; /* crop params */ - CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w); - CALC_EXPR(ch_expr, var_values[CH], vpp->crop_h); + CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w, var_values[VAR_IW]); + CALC_EXPR(ch_expr, var_values[CH], vpp->crop_h, var_values[VAR_IH]); /* calc again in case cw is relative to ch */ - CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w); + CALC_EXPR(cw_expr, var_values[CW], vpp->crop_w, var_values[VAR_IW]); CALC_EXPR(w_expr, var_values[VAR_OUT_W] = var_values[VAR_OW] = var_values[VAR_W], - vpp->out_width); + vpp->out_width, var_values[CW]); CALC_EXPR(h_expr, var_values[VAR_OUT_H] = var_values[VAR_OH] = var_values[VAR_H], - vpp->out_height); + vpp->out_height, var_values[CH]); /* calc again in case ow is relative to oh */ CALC_EXPR(w_expr, var_values[VAR_OUT_W] = var_values[VAR_OW] = var_values[VAR_W], - vpp->out_width); + vpp->out_width, var_values[CW]); - - CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x); - CALC_EXPR(cy_expr, var_values[CY], vpp->crop_y); + CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x, (var_values[VAR_IW] - var_values[VAR_OW]) / 2); + CALC_EXPR(cy_expr, var_values[CY], vpp->crop_y, (var_values[VAR_IH] - var_values[VAR_OH]) / 2); /* calc again in case cx is relative to cy */ - CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x); + CALC_EXPR(cx_expr, var_values[CX], vpp->crop_x, (var_values[VAR_IW] - var_values[VAR_OW]) / 2); if ((vpp->crop_w != var_values[VAR_IW]) || (vpp->crop_h != var_values[VAR_IH])) vpp->use_crop = 1; From patchwork Thu Jul 29 05:24:54 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29100 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500194ios; Wed, 28 Jul 2021 22:26:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQf9fG8m8q/Q4fwN15vhvsejfTS1x/jHNx9zHd2hp9pWfShVv/4HDuex6XamMpldPH45Ia X-Received: by 2002:a05:6402:524b:: with SMTP id t11mr3882522edd.361.1627536378375; Wed, 28 Jul 2021 22:26:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536378; cv=none; d=google.com; s=arc-20160816; b=QnYpj12Ecsu7oLtb7oq/tCZ2ZWasvHR1fOBsnHUtRG9k4SEL/PE4phTN7I0r1U+3XC EaA2zF1xb39jAIg0s8G8iWRrHwx9kHIMyDMNDd9I4Rm8F+C9Fo4Pq7TtNnLtQPAgRGmV H3XibYC5IEzXitTfKSNJv8+U0KAsWUYvjwkUVmXGd4ukacpbzQqP9dYFqibgsd1ZfZPB aYQi4M88oHycigAvAlHxt9C47oh0AxRKiaXYccHVYo6mT+DxvBZjWQ/7ptPYa6iEGeXn HcKYboFDIREFr7evf/FDj0kbKl4YXOfkVulEdEQ50VaMly7unTdhl4QLoJdL7bY/wSzm Htng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=ge7+XNQwhyWnRSfRFnA6hFAlpOPfx6lu9eR4bV9GX2I=; b=ddCA8EFtJ+pPCGQbfzQX6lv7MbUBDrLq7V83gg5RmM/bodOcgKFdDVh8OQgybUdlqH 6OsDe8xQ0WvGvIC395ohshDhIAwvhWvIGSnJYyzXR1LZ98hFg4OQP/taPePZuUP4Eil1 2IFmVt6b1QE1VT+kTCGA6JqFNLckfLAuukG8IbdYCCHrbKHTiFS0c5PrrgDJO8zwPWmn T4OVWTIwvO9fDy472Tk1kYFQF5KbZwc44mv3y0EYoNEBAxa0/TbPJ4BngM15OmttVXJA FKmFnPZTeqqDltVazTumMiX+Y0wpSXYf+P4xY8vpxCdcZxJjvAPkC7Lyam0cTH9brEuZ h1CQ== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cx5si1279231edb.163.2021.07.28.22.26.18; Wed, 28 Jul 2021 22:26:18 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3DF7168A2DE; Thu, 29 Jul 2021 08:26:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0298A689D05 for ; Thu, 29 Jul 2021 08:25:58 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023589" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023589" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:52 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730096" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:51 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:54 +0800 Message-Id: <20210729052509.30992-7-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 06/21] lavfi/vpp_qsv: allow special values for the output dimensions 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 601Fj9pXV+Vg Special values are: 0 = original width/height -1 = keep original aspect This is in preparation for re-using VPPContext for scale_qsv filter --- libavfilter/vf_vpp_qsv.c | 47 ++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index c0fc0d4154..3505c9fd12 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -58,6 +58,11 @@ typedef struct VPPContext{ mfxExtVPPRotation rotation_conf; mfxExtVPPMirroring mirroring_conf; + /** + * New dimensions. Special values are: + * 0 = original width/height + * -1 = keep original aspect + */ int out_width; int out_height; /** @@ -121,10 +126,10 @@ static const AVOption options[] = { { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS }, { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS }, - { "w", "Output video width", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, - { "width", "Output video width", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, - { "h", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, - { "height", "Output video height", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, + { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, + { "width", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, + { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, + { "height", "Output video height(0=input video height, -1=keep input video aspect)", 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(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, @@ -266,6 +271,7 @@ static int config_input(AVFilterLink *inlink) AVFilterContext *ctx = inlink->dst; VPPContext *vpp = ctx->priv; int ret; + int64_t ow, oh; if (vpp->framerate.den == 0 || vpp->framerate.num == 0) vpp->framerate = inlink->frame_rate; @@ -279,11 +285,38 @@ static int config_input(AVFilterLink *inlink) return ret; } - if (vpp->out_height == 0 || vpp->out_width == 0) { - vpp->out_width = inlink->w; - vpp->out_height = inlink->h; + ow = vpp->out_width; + oh = vpp->out_height; + + /* sanity check params */ + if (ow < -1 || oh < -1) { + av_log(ctx, AV_LOG_ERROR, "Size values less than -1 are not acceptable.\n"); + return AVERROR(EINVAL); } + if (ow == -1 && oh == -1) + vpp->out_width = vpp->out_height = 0; + + if (!(ow = vpp->out_width)) + ow = inlink->w; + + if (!(oh = vpp->out_height)) + oh = inlink->h; + + if (ow == -1) + ow = av_rescale(oh, inlink->w, inlink->h); + + if (oh == -1) + oh = av_rescale(ow, inlink->h, inlink->w); + + if (ow > INT_MAX || oh > INT_MAX || + (oh * inlink->w) > INT_MAX || + (ow * inlink->h) > INT_MAX) + av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n"); + + vpp->out_width = ow; + vpp->out_height = oh; + if (vpp->use_crop) { vpp->crop_x = FFMAX(vpp->crop_x, 0); vpp->crop_y = FFMAX(vpp->crop_y, 0); From patchwork Thu Jul 29 05:24:55 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29104 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500264ios; Wed, 28 Jul 2021 22:26:29 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzxMKXfX96MbjvDs8pY5WpXVSlWudSAAL5cFb4avxOgF4hbDJGR6+5B9xRwnyawFNcjyu/B X-Received: by 2002:aa7:d519:: with SMTP id y25mr3886929edq.191.1627536389596; Wed, 28 Jul 2021 22:26:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536389; cv=none; d=google.com; s=arc-20160816; b=rEPb7iX1icdZ3N7mOGlvu20asJRPKls9PLE/VXUbJthW+kDzzGDlAU0qN3fNYBYm0x 9fY5MdXeFja7u6lxzQcKaXbj0aJuU2SIBiCZo2MbDsvXM6bRrpS1Hpmk5hUJ2D2E0sL7 Avtu3DPlrLx/KMNl0xKO2JvoF723NHGrRzm53q876BEbuYEgFCHBEWU9TBFzbEMZRQqP bjHDgY7LqzdxlPhCaxKkw6qOU96AQoVHQMY/klKA10AyT+K/aoke1JWa1MlS7RoX2F/t 0Q9tbRxkyFc8niC7moSob3dTJlnXsOf0OX/xTa4DAgKZnTwtYdT9hpaT5KYy7qGIT9Zu hWOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=+SxMq9hTfHj3sGT32kQvaM6ewLUbOhy3KHX9baVEqCg=; b=vjMLqKtpNe6MHo4R1bnrzjbp3wSj+8qoacbWb7jrGGPMjw904LMcSspzQYizWXn8Pk tJcB1+yP4q2coT0VLLz5HrGn2slktI2IwoZBlb8uMED9nMpGSjcIYHEw91CS7uQVCkMl 7vlfPYItiQplPuCbENtq/3PwI6bZwz6Y7sA77wGlkJi23y8gd02tAXZRtK1RUTdsy/iZ FJcfFo0whJoQz9kd9l9qSYe246vWN4jrk5q4BnPhh+2WYoAsrsfOrWI6CQtBGfUtM+OM cnM8VHeZYQB25UECPjsxq8TBF6UtY3YKexnugftFu9DFtimXYUn83c+f+mNkk7QN6LOe B9lg== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m19si1849571ejn.748.2021.07.28.22.26.29; Wed, 28 Jul 2021 22:26:29 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6A0AC689CFE; Thu, 29 Jul 2021 08:26:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E196068A15F for ; Thu, 29 Jul 2021 08:26:04 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023603" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023603" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:53 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730103" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:52 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:55 +0800 Message-Id: <20210729052509.30992-8-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 07/21] lavfi/vpp_qsv: factorize extra MFX configuration 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: q/4dMMRZmCAJ This is in preparation for re-using VPPContext for scale_qsv filter --- libavfilter/vf_vpp_qsv.c | 78 +++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 3505c9fd12..0c2614c95f 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -372,53 +372,44 @@ static int config_output(AVFilterLink *outlink) param.crop = &crop; } - if (vpp->deinterlace) { - memset(&vpp->deinterlace_conf, 0, sizeof(mfxExtVPPDeinterlacing)); - vpp->deinterlace_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; - vpp->deinterlace_conf.Header.BufferSz = sizeof(mfxExtVPPDeinterlacing); - vpp->deinterlace_conf.Mode = vpp->deinterlace == 1 ? - MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED; +#define INIT_MFX_EXTBUF(extbuf, id) do { \ + memset(&vpp->extbuf, 0, sizeof(vpp->extbuf)); \ + vpp->extbuf.Header.BufferId = id; \ + vpp->extbuf.Header.BufferSz = sizeof(vpp->extbuf); \ + param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->extbuf; \ + } while (0) + +#define SET_MFX_PARAM_FIELD(extbuf, field, value) do { \ + vpp->extbuf.field = value; \ + } while (0) - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->deinterlace_conf; + if (vpp->deinterlace) { + INIT_MFX_EXTBUF(deinterlace_conf, MFX_EXTBUFF_VPP_DEINTERLACING); + SET_MFX_PARAM_FIELD(deinterlace_conf, Mode, (vpp->deinterlace == 1 ? + MFX_DEINTERLACING_BOB : MFX_DEINTERLACING_ADVANCED)); } if (vpp->use_frc) { - memset(&vpp->frc_conf, 0, sizeof(mfxExtVPPFrameRateConversion)); - vpp->frc_conf.Header.BufferId = MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION; - vpp->frc_conf.Header.BufferSz = sizeof(mfxExtVPPFrameRateConversion); - vpp->frc_conf.Algorithm = MFX_FRCALGM_DISTRIBUTED_TIMESTAMP; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->frc_conf; + INIT_MFX_EXTBUF(frc_conf, MFX_EXTBUFF_VPP_FRAME_RATE_CONVERSION); + SET_MFX_PARAM_FIELD(frc_conf, Algorithm, MFX_FRCALGM_DISTRIBUTED_TIMESTAMP); } if (vpp->denoise) { - memset(&vpp->denoise_conf, 0, sizeof(mfxExtVPPDenoise)); - vpp->denoise_conf.Header.BufferId = MFX_EXTBUFF_VPP_DENOISE; - vpp->denoise_conf.Header.BufferSz = sizeof(mfxExtVPPDenoise); - vpp->denoise_conf.DenoiseFactor = vpp->denoise; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->denoise_conf; + INIT_MFX_EXTBUF(denoise_conf, MFX_EXTBUFF_VPP_DENOISE); + SET_MFX_PARAM_FIELD(denoise_conf, DenoiseFactor, vpp->denoise); } if (vpp->detail) { - memset(&vpp->detail_conf, 0, sizeof(mfxExtVPPDetail)); - vpp->detail_conf.Header.BufferId = MFX_EXTBUFF_VPP_DETAIL; - vpp->detail_conf.Header.BufferSz = sizeof(mfxExtVPPDetail); - vpp->detail_conf.DetailFactor = vpp->detail; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->detail_conf; + INIT_MFX_EXTBUF(detail_conf, MFX_EXTBUFF_VPP_DETAIL); + SET_MFX_PARAM_FIELD(detail_conf, DetailFactor, vpp->detail); } if (vpp->procamp) { - memset(&vpp->procamp_conf, 0, sizeof(mfxExtVPPProcAmp)); - vpp->procamp_conf.Header.BufferId = MFX_EXTBUFF_VPP_PROCAMP; - vpp->procamp_conf.Header.BufferSz = sizeof(mfxExtVPPProcAmp); - vpp->procamp_conf.Hue = vpp->hue; - vpp->procamp_conf.Saturation = vpp->saturation; - vpp->procamp_conf.Contrast = vpp->contrast; - vpp->procamp_conf.Brightness = vpp->brightness; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf; + INIT_MFX_EXTBUF(procamp_conf, MFX_EXTBUFF_VPP_PROCAMP); + SET_MFX_PARAM_FIELD(procamp_conf, Hue, vpp->hue); + SET_MFX_PARAM_FIELD(procamp_conf, Saturation, vpp->saturation); + SET_MFX_PARAM_FIELD(procamp_conf, Contrast, vpp->contrast); + SET_MFX_PARAM_FIELD(procamp_conf, Brightness, vpp->brightness); } if (vpp->transpose >= 0) { @@ -465,18 +456,14 @@ static int config_output(AVFilterLink *outlink) if (vpp->rotate) { #ifdef QSV_HAVE_ROTATION - memset(&vpp->rotation_conf, 0, sizeof(mfxExtVPPRotation)); - vpp->rotation_conf.Header.BufferId = MFX_EXTBUFF_VPP_ROTATION; - vpp->rotation_conf.Header.BufferSz = sizeof(mfxExtVPPRotation); - vpp->rotation_conf.Angle = vpp->rotate; + INIT_MFX_EXTBUF(rotation_conf, MFX_EXTBUFF_VPP_ROTATION); + SET_MFX_PARAM_FIELD(rotation_conf, Angle, vpp->rotate); if (MFX_ANGLE_90 == vpp->rotate || MFX_ANGLE_270 == vpp->rotate) { FFSWAP(int, vpp->out_width, vpp->out_height); FFSWAP(int, outlink->w, outlink->h); av_log(ctx, AV_LOG_DEBUG, "Swap width and height for clock/cclock rotation.\n"); } - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->rotation_conf; #else av_log(ctx, AV_LOG_WARNING, "The QSV VPP rotate option is " "not supported with this MSDK version.\n"); @@ -486,12 +473,8 @@ static int config_output(AVFilterLink *outlink) if (vpp->hflip) { #ifdef QSV_HAVE_MIRRORING - memset(&vpp->mirroring_conf, 0, sizeof(mfxExtVPPMirroring)); - vpp->mirroring_conf.Header.BufferId = MFX_EXTBUFF_VPP_MIRRORING; - vpp->mirroring_conf.Header.BufferSz = sizeof(mfxExtVPPMirroring); - vpp->mirroring_conf.Type = vpp->hflip; - - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->mirroring_conf; + INIT_MFX_EXTBUF(mirroring_conf, MFX_EXTBUFF_VPP_MIRRORING); + SET_MFX_PARAM_FIELD(mirroring_conf, Type, vpp->hflip); #else av_log(ctx, AV_LOG_WARNING, "The QSV VPP hflip option is " "not supported with this MSDK version.\n"); @@ -499,6 +482,9 @@ static int config_output(AVFilterLink *outlink) #endif } +#undef INIT_MFX_EXTBUF +#undef SET_MFX_PARAM_FIELD + if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise || vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip || inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) From patchwork Thu Jul 29 05:24:56 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29102 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501496ios; Wed, 28 Jul 2021 22:29:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxK05dcTg/JtuME7m3HjTh7FYMy9KXQuCqx3fTOKHPJwMFgAV0Lw5lfAqgef+/fdqs4z+bj X-Received: by 2002:a17:906:a04f:: with SMTP id bg15mr2956125ejb.417.1627536541033; Wed, 28 Jul 2021 22:29:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536541; cv=none; d=google.com; s=arc-20160816; b=AlMfAXIR6QSBP8rtLCUtPbgZrGCQphNxF6fl9MpDCCKKFOK1W9VQFYBRDNUMCGAcL4 q9olYBPira7lFPQ1a2H7WyVNu9hdlHEoSdeiT4/yF1wp0WEdAMIrxdy7sQsUZYfABcsS TGCwuXvU7cPfVQcuxAgvf+MgrKt54OI5c4Sk1QUT2t+pY5pwiwhn7HeVZhYnMauJR4FC IVkpV81WvFj2Y+Wav4Gn8XPq2+nBbMdNaQmEqXUE/ZGpwjPjvkyMRWyKnOrj0ejKD/jN m/iqznpINeUvhVmZ862to5JhQBNPZ0QXC6YWGlGGlNQh7TlSs2TrjJBWD4Z/tRGyOzX6 sdXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=rfh+j/0M4aj1JZOtBC83IIdKcBBeM7PuPoT4YS3Ns/o=; b=wK5PXvCVQJqyeMnUTrXwPr1evQoysG5Yu58JUQXszmEPfgC50WA6/+7iit9N97OgdU YxzLURFfQm6TUExAs6umG51Q6SXSAS3EZhAwsSn0PYCQ7GFpieFPGkHGibO8ItUahj/X h/LyRsreegz3Mn5HYwVjbqlGapAH1NmjDAt2Yj17d80C3ltt1GQ8Nxr0IBxndC6yKrri xVRT6jaFZ10lZJWx/1OOJp6pZjbPqBVlZYa7cyj6WHKdXeb8vNYmbq6+kWJYGxG2wABt hpszgm/vhxlNvMOytxF8dRyHPbVmzvSVij3wGtSbDBdzW3wZ+eig3gqtrmh68c8Zu6XO wbDg== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id u16si1966385ejt.97.2021.07.28.22.29.00; Wed, 28 Jul 2021 22:29:01 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CA0EA689CDD; Thu, 29 Jul 2021 08:26:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 21A2468A4C5 for ; Thu, 29 Jul 2021 08:26:11 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023637" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023637" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:54 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730106" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:53 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:56 +0800 Message-Id: <20210729052509.30992-9-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 08/21] lavfi/vpp_qsv: pass scaling mode to the SDK 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NMWZP45B0Qqr After this patch, the scaling mode will be passed to the SDK when the scaling mode is not equal to the default mode. This is in preparation for re-using VPPContext for scale_qsv filter --- libavfilter/vf_vpp_qsv.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 0c2614c95f..96908556f9 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -42,9 +42,10 @@ #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM) /* number of video enhancement filters */ -#define ENH_FILTERS_COUNT (7) +#define ENH_FILTERS_COUNT (8) #define QSV_HAVE_ROTATION QSV_VERSION_ATLEAST(1, 17) #define QSV_HAVE_MIRRORING QSV_VERSION_ATLEAST(1, 19) +#define QSV_HAVE_SCALING QSV_VERSION_ATLEAST(1, 19) typedef struct VPPContext{ QSVVPPContext qsv; @@ -57,6 +58,9 @@ typedef struct VPPContext{ mfxExtVPPProcAmp procamp_conf; mfxExtVPPRotation rotation_conf; mfxExtVPPMirroring mirroring_conf; +#if QSV_HAVE_SCALING + mfxExtVPPScaling scaling_conf; +#endif /** * New dimensions. Special values are: @@ -96,6 +100,8 @@ typedef struct VPPContext{ char *cx, *cy, *cw, *ch; char *ow, *oh; char *output_format_str; + + int scaling_mode; } VPPContext; static const AVOption options[] = { @@ -482,6 +488,17 @@ static int config_output(AVFilterLink *outlink) #endif } + if (vpp->scaling_mode) { +#ifdef QSV_HAVE_SCALING + INIT_MFX_EXTBUF(scaling_conf, MFX_EXTBUFF_VPP_SCALING); + SET_MFX_PARAM_FIELD(scaling_conf, ScalingMode, vpp->scaling_mode); +#else + av_log(ctx, AV_LOG_WARNING, "The scaling_mode option is " + "not supported with this MSDK version.\n"); + vpp->scaling_mode = 0; +#endif + } + #undef INIT_MFX_EXTBUF #undef SET_MFX_PARAM_FIELD From patchwork Thu Jul 29 05:24:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29125 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6902:1243:0:0:0:0 with SMTP id t3csp144604ybu; Wed, 28 Jul 2021 22:29:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwOG7JDcYIJCdI/auNpqdWHj3mjc6dsp4xJJdlTBk+/HcmLl9hUdvQmoiqfPDA24/dQ/p6F X-Received: by 2002:a05:6402:1d0d:: with SMTP id dg13mr4008484edb.312.1627536557822; Wed, 28 Jul 2021 22:29:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536557; cv=none; d=google.com; s=arc-20160816; b=P0n9h1L0Tc/FYveRiYdpTzZ+kuizEBNf+oUaGL5bOCTv4/bJtFG87HaQ7GnwjWCIp5 rtNyF/VPhNqMi9mT1f+/r2iR7N1FfzFMh+hN4v2HphUgklWdt6zRGZ5i24CegrgZwQgg NzmO+QsYxbHpgnn85mxm274uIVYY2D+kM2eCaex1tqm2HF/MCcBGAMSFEFbSA9OasPHi LoYYwEG7vHF98ElruTW6+p3h7sdDOU1Kh2j48GVrRrklNdejxpRg8UHmsX4XzWNYEs/m dNHuqFnE6ejDno7nI3RL4QndA9jzp5eKSM3UB7ywizvZHsMff4O2miqPZ/sUaqfs81Dh Ichg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=mZaPQYmMflsB2DOLdDJMQvH0LaeX2n4rv1Ul9e2CrvA=; b=yEolwAI+VrZICdnhaRpvp/qN1SRkAgv8qOMGZNme0I9jVgdwBPEyxqtXSIDXJn1IpM R3PL4J0QnyTmuIDbKHqWZTgyeC3NTAQe44btuT8JOhjSOBHzDM8qjAjUGSR4Ymtph29X orD4ro7JtxmucDMSvQX1iV4JMmMiJQ5P4eKopuPcZdpb1HQ7Wr8NHyZQlaDMvmzu48D+ m5YMBnGXgK6+deJJPfO5yF2ECukGaACTwqqTMw5T7CgBtufHtxk/rEMq6FXiuV1sE8eY /R7v8nfNqbFgt711HKA4X4jpd+Jl504IJnSN03Sqx42HtiyVu9l/5Rqm3Ute2eLIhBC5 fKaA== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id h23si1849638ejq.337.2021.07.28.22.29.17; Wed, 28 Jul 2021 22:29:17 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4FB5E68A5C2; Thu, 29 Jul 2021 08:26:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2910768A4B0 for ; Thu, 29 Jul 2021 08:26:17 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023645" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023645" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:55 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730109" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:54 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:57 +0800 Message-Id: <20210729052509.30992-10-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 09/21] lavfi/vpp_qsv: add vpp_preinit callback 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0oi3JQIuRe/4 Content-Length: 1563 Set the expected default value for options in this callback, hence we have the right values even if these options are not included in the option arrray. This is in preparation for re-using VPPContext but with a different option array for other QSV filters --- libavfilter/vf_vpp_qsv.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 96908556f9..8b18cc296c 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -255,6 +255,19 @@ release: return ret; } +static av_cold int vpp_preinit(AVFilterContext *ctx) +{ + VPPContext *vpp = ctx->priv; + /* For AV_OPT_TYPE_STRING options, NULL is handled in other way so + * we needn't set default value here + */ + vpp->saturation = 1.0; + vpp->contrast = 1.0; + vpp->transpose = -1; + + return 0; +} + static av_cold int vpp_init(AVFilterContext *ctx) { VPPContext *vpp = ctx->priv; @@ -636,6 +649,7 @@ const AVFilter ff_vf_vpp_qsv = { .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."), .priv_size = sizeof(VPPContext), .query_formats = query_formats, + .preinit = vpp_preinit, .init = vpp_init, .uninit = vpp_uninit, .inputs = vpp_inputs, From patchwork Thu Jul 29 05:24:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29135 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6902:1243:0:0:0:0 with SMTP id t3csp144695ybu; Wed, 28 Jul 2021 22:29:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz/pyr2Q7VcuF9FPiUTtCqMzcEBpNFuKTxEnV3V/o6e0hXOtIOuA2HG8F+HPyXRNqiwlNNI X-Received: by 2002:a05:6402:4cb:: with SMTP id n11mr3980364edw.292.1627536570319; Wed, 28 Jul 2021 22:29:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536570; cv=none; d=google.com; s=arc-20160816; b=lu6a9+SkwYT040Dp+wMCuMhDN3WgWTw9jthF4q9PuJu9MctGarVZMLTARoH0fAVmAH T2F8wGWguKHqJffJ9xNacSorty6rTPHmKXZNalspPjR45C3DkDSyLJwkpkHISrvuk4Wt 2i+f7tHKg6XKaBWS2FcjryniZPrkFKueWyQbSyDKZy0Ie/eu3nDN+bTYA58LH1Or7Q69 6369sH95GqRDCAlEoHVed2QrYQhadvgfbA6BE0kVhZugi9SElOxLJWzzWMQdZDJeaUpN ylQOfyWSstfGde+HfSst0xgYLFVCUu357FW6c8wAP3k1/UMAEWmN6W7X8rl+zvttT2Ln 1BKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=ePBTNbKeVGHQtYnh4tohiev5T9AUE70Fm69/JJsw2oQ=; b=qq4D28uT1cUPz3F95pdl3ZO98ghiF1areMNL3XCMEEcxBEvPoWbUQnNxsQ4ZJsQH/H IX4ykalMG5RE2hiI0mxXwETY3eNcrYfZjab4W8xWToGGygS1EG6W2+YjOXnfvgzCbmrX b+zs63cx1mCK7pbYXIr0sJg6SLPy3I5V/KGybhc66u2xFNKvDggjJ/tfxmFR1iju8sL6 vRbiyza2ihTS5iax+rxeb51e9KAv70lcMwxkP/cGjYyO12uZ0MW3lM3oIvaKKcg3hN8f VfNns1K99k5RH1SAzY7unSQ3R3bJpA7xU97VczckkRQ+pfVXE6exbo8hn97dzzO/GM/7 biqw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id mp19si2142618ejc.630.2021.07.28.22.29.29; Wed, 28 Jul 2021 22:29: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EAE7668A5E4; Thu, 29 Jul 2021 08:26:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 28FE168A3BF for ; Thu, 29 Jul 2021 08:26:17 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023648" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023648" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:57 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730112" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:56 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:58 +0800 Message-Id: <20210729052509.30992-11-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 10/21] lavfi/scale_qsv: re-use VPPContext for scale_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rHMlB41cfr9/ Content-Length: 15566 All features are implemented in vpp_qsv filter, scale_qsv can be taken as a special case of vpp_qsv filter now, we re-use VPPContext with a different option arrary and pixel formats --- libavfilter/Makefile | 2 +- libavfilter/vf_scale_qsv.c | 334 ------------------------------------- libavfilter/vf_vpp_qsv.c | 55 ++++++ 3 files changed, 56 insertions(+), 335 deletions(-) delete mode 100644 libavfilter/vf_scale_qsv.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 49c0c8342b..760099ba2c 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -398,7 +398,7 @@ OBJS-$(CONFIG_SCALE_FILTER) += vf_scale.o scale_eval.o OBJS-$(CONFIG_SCALE_CUDA_FILTER) += vf_scale_cuda.o scale_eval.o \ vf_scale_cuda.ptx.o cuda/load_helper.o OBJS-$(CONFIG_SCALE_NPP_FILTER) += vf_scale_npp.o scale_eval.o -OBJS-$(CONFIG_SCALE_QSV_FILTER) += vf_scale_qsv.o +OBJS-$(CONFIG_SCALE_QSV_FILTER) += vf_vpp_qsv.o OBJS-$(CONFIG_SCALE_VAAPI_FILTER) += vf_scale_vaapi.o scale_eval.o vaapi_vpp.o OBJS-$(CONFIG_SCALE_VULKAN_FILTER) += vf_scale_vulkan.o vulkan.o OBJS-$(CONFIG_SCALE2REF_FILTER) += vf_scale.o scale_eval.o diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c deleted file mode 100644 index f8e937e40e..0000000000 --- a/libavfilter/vf_scale_qsv.c +++ /dev/null @@ -1,334 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * scale video filter - QSV - */ - -#include - -#include -#include - -#include "libavutil/avstring.h" -#include "libavutil/common.h" -#include "libavutil/eval.h" -#include "libavutil/hwcontext.h" -#include "libavutil/hwcontext_qsv.h" -#include "libavutil/internal.h" -#include "libavutil/mathematics.h" -#include "libavutil/opt.h" -#include "libavutil/pixdesc.h" -#include "libavutil/time.h" -#include "libavfilter/qsvvpp.h" - -#include "avfilter.h" -#include "formats.h" -#include "internal.h" -#include "video.h" - -static const char *const var_names[] = { - "in_w", "iw", - "in_h", "ih", - "out_w", "ow", - "out_h", "oh", - "a", "dar", - "sar", - NULL -}; - -enum var_name { - VAR_IN_W, VAR_IW, - VAR_IN_H, VAR_IH, - VAR_OUT_W, VAR_OW, - VAR_OUT_H, VAR_OH, - VAR_A, VAR_DAR, - VAR_SAR, - VARS_NB -}; - -#define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19) - -typedef struct QSVScaleContext { - QSVVPPContext qsv; - -#if QSV_HAVE_SCALING_CONFIG - mfxExtVPPScaling scale_conf; -#endif - int mode; - - /** - * New dimensions. Special values are: - * 0 = original width/height - * -1 = keep original aspect - */ - int w, h; - - /** - * Output sw format. AV_PIX_FMT_NONE for no conversion. - */ - enum AVPixelFormat format; - - char *w_expr; ///< width expression string - char *h_expr; ///< height expression string - char *format_str; -} QSVScaleContext; - -static av_cold int qsvscale_init(AVFilterContext *ctx) -{ - QSVScaleContext *s = ctx->priv; - - if (!strcmp(s->format_str, "same")) { - s->format = AV_PIX_FMT_NONE; - } else { - s->format = av_get_pix_fmt(s->format_str); - if (s->format == AV_PIX_FMT_NONE) { - av_log(ctx, AV_LOG_ERROR, "Unrecognized pixel format: %s\n", s->format_str); - return AVERROR(EINVAL); - } - } - - return 0; -} - -static av_cold void qsvscale_uninit(AVFilterContext *ctx) -{ - ff_qsvvpp_close(ctx); -} - -static int qsvscale_query_formats(AVFilterContext *ctx) -{ - static const enum AVPixelFormat pixel_formats[] = { - AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, - }; - AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); - int ret; - - if ((ret = ff_set_common_formats(ctx, pix_fmts)) < 0) - return ret; - - return 0; -} - -static int qsvscale_config_props(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - AVFilterLink *inlink = outlink->src->inputs[0]; - QSVScaleContext *s = ctx->priv; - QSVVPPParam param = { NULL }; -#if QSV_HAVE_SCALING_CONFIG - mfxExtBuffer *ext_buf[1]; -#endif - int64_t w, h; - double var_values[VARS_NB], res; - char *expr; - int ret; - enum AVPixelFormat in_format; - - var_values[VAR_IN_W] = var_values[VAR_IW] = inlink->w; - var_values[VAR_IN_H] = var_values[VAR_IH] = inlink->h; - var_values[VAR_OUT_W] = var_values[VAR_OW] = NAN; - var_values[VAR_OUT_H] = var_values[VAR_OH] = NAN; - var_values[VAR_A] = (double) inlink->w / inlink->h; - var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ? - (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1; - var_values[VAR_DAR] = var_values[VAR_A] * var_values[VAR_SAR]; - - /* evaluate width and height */ - av_expr_parse_and_eval(&res, (expr = s->w_expr), - var_names, var_values, - NULL, NULL, NULL, NULL, NULL, 0, ctx); - s->w = var_values[VAR_OUT_W] = var_values[VAR_OW] = res; - if ((ret = av_expr_parse_and_eval(&res, (expr = s->h_expr), - var_names, var_values, - NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) - goto fail; - s->h = var_values[VAR_OUT_H] = var_values[VAR_OH] = res; - /* evaluate again the width, as it may depend on the output height */ - if ((ret = av_expr_parse_and_eval(&res, (expr = s->w_expr), - var_names, var_values, - NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) - goto fail; - s->w = res; - - w = s->w; - h = s->h; - - /* sanity check params */ - if (w < -1 || h < -1) { - av_log(ctx, AV_LOG_ERROR, "Size values less than -1 are not acceptable.\n"); - return AVERROR(EINVAL); - } - if (w == -1 && h == -1) - s->w = s->h = 0; - - if (!(w = s->w)) - w = inlink->w; - if (!(h = s->h)) - h = inlink->h; - if (w == -1) - w = av_rescale(h, inlink->w, inlink->h); - if (h == -1) - h = av_rescale(w, inlink->h, inlink->w); - - if (w > INT_MAX || h > INT_MAX || - (h * inlink->w) > INT_MAX || - (w * inlink->h) > INT_MAX) - av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n"); - - outlink->w = w; - outlink->h = h; - - if (inlink->format == AV_PIX_FMT_QSV) { - if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) - return AVERROR(EINVAL); - else - in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format; - } else - in_format = inlink->format; - - if (s->format == AV_PIX_FMT_NONE) - s->format = in_format; - - outlink->frame_rate = inlink->frame_rate; - outlink->time_base = av_inv_q(inlink->frame_rate); - param.out_sw_format = s->format; - -#if QSV_HAVE_SCALING_CONFIG - param.ext_buf = ext_buf; - memset(&s->scale_conf, 0, sizeof(mfxExtVPPScaling)); - s->scale_conf.Header.BufferId = MFX_EXTBUFF_VPP_SCALING; - s->scale_conf.Header.BufferSz = sizeof(mfxExtVPPScaling); - s->scale_conf.ScalingMode = s->mode; - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&s->scale_conf; - av_log(ctx, AV_LOG_VERBOSE, "Scaling mode: %d\n", s->mode); -#endif - - if (inlink->w != outlink->w || - inlink->h != outlink->h || - in_format != s->format) { - ret = ff_qsvvpp_init(ctx, ¶m); - - if (ret < 0) - return ret; - } else { - /* No MFX session is created in this case */ - av_log(ctx, AV_LOG_VERBOSE, "scale_qsv pass through mode.\n"); - if (inlink->hw_frames_ctx) - outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); - } - - av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d -> w:%d h:%d\n", - inlink->w, inlink->h, outlink->w, outlink->h); - - if (inlink->sample_aspect_ratio.num) - outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h*inlink->w, - outlink->w*inlink->h}, - inlink->sample_aspect_ratio); - else - outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; - - return 0; - -fail: - av_log(ctx, AV_LOG_ERROR, - "Error when evaluating the expression '%s'\n", expr); - return ret; -} - -static int qsvscale_filter_frame(AVFilterLink *link, AVFrame *in) -{ - int ret = 0; - AVFilterContext *ctx = link->dst; - QSVVPPContext *qsv = ctx->priv; - AVFilterLink *outlink = ctx->outputs[0]; - - if (qsv->session) { - ret = ff_qsvvpp_filter_frame(qsv, link, in); - av_frame_free(&in); - } else { - /* No MFX session is created in pass-through mode */ - if (in) - ret = ff_filter_frame(outlink, in); - } - - return ret; -} - -#define OFFSET(x) offsetof(QSVScaleContext, x) -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM -static const AVOption options[] = { - { "w", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS }, - { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS }, - { "format", "Output pixel format", OFFSET(format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, - -#if QSV_HAVE_SCALING_CONFIG - { "mode", "set scaling mode", OFFSET(mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"}, - { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"}, - { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "mode"}, -#else - { "mode", "(not supported)", OFFSET(mode), AV_OPT_TYPE_INT, { .i64 = 0}, 0, INT_MAX, FLAGS, "mode"}, - { "low_power", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1}, 0, 0, FLAGS, "mode"}, - { "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, FLAGS, "mode"}, -#endif - - { NULL }, -}; - -static const AVClass qsvscale_class = { - .class_name = "scale_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -static const AVFilterPad qsvscale_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .filter_frame = qsvscale_filter_frame, - }, - { NULL } -}; - -static const AVFilterPad qsvscale_outputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = qsvscale_config_props, - }, - { NULL } -}; - -const AVFilter ff_vf_scale_qsv = { - .name = "scale_qsv", - .description = NULL_IF_CONFIG_SMALL("QuickSync video scaling and format conversion"), - - .init = qsvscale_init, - .uninit = qsvscale_uninit, - .query_formats = qsvscale_query_formats, - - .priv_size = sizeof(QSVScaleContext), - .priv_class = &qsvscale_class, - - .inputs = qsvscale_inputs, - .outputs = qsvscale_outputs, - - .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, -}; diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 8b18cc296c..df23dd1e58 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -658,3 +658,58 @@ const AVFilter ff_vf_vpp_qsv = { .priv_class = &vpp_class, .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; + +static int qsvscale_query_formats(AVFilterContext *ctx) +{ + static const enum AVPixelFormat pixel_formats[] = { + AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, + }; + AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); + + return ff_set_common_formats(ctx, pix_fmts); +} + +static const AVOption qsvscale_options[] = { + { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS }, + { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS }, + { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, + +#if QSV_HAVE_SCALING + { "mode", "set scaling mode", OFFSET(scaling_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"}, + { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"}, + { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "mode"}, +#else + { "mode", "(not supported)", OFFSET(scaling_mode), AV_OPT_TYPE_INT, { .i64 = 0}, 0, INT_MAX, FLAGS, "mode"}, + { "low_power", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1}, 0, 0, FLAGS, "mode"}, + { "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, FLAGS, "mode"}, +#endif + + { NULL }, +}; + +static const AVClass qsvscale_class = { + .class_name = "scale_qsv", + .item_name = av_default_item_name, + .option = qsvscale_options, + .version = LIBAVUTIL_VERSION_INT, +}; + +const AVFilter ff_vf_scale_qsv = { + .name = "scale_qsv", + .description = NULL_IF_CONFIG_SMALL("Quick Sync Video scaling and format conversion"), + + .preinit = vpp_preinit, + .init = vpp_init, + .uninit = vpp_uninit, + .query_formats = qsvscale_query_formats, + + .priv_size = sizeof(VPPContext), + .priv_class = &qsvscale_class, + + .inputs = vpp_inputs, + .outputs = vpp_outputs, + + .activate = activate, + + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, +}; From patchwork Thu Jul 29 05:24:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29138 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a05:6902:1243:0:0:0:0 with SMTP id t3csp144751ybu; Wed, 28 Jul 2021 22:29:37 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz8aYWodbSJXM51B0t3az8gmyqAugc7Ab435fdFT8tfwBzMl2bexnaCbAM0jchv4okUiwrn X-Received: by 2002:aa7:cd5c:: with SMTP id v28mr3959922edw.305.1627536577696; Wed, 28 Jul 2021 22:29:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536577; cv=none; d=google.com; s=arc-20160816; b=yb4I9+fojPMrDV6i9ipqVH/jaET1iltG+BG355MmBv2f+aiI7+VUjIk4wqHENyGhK/ LOR/Ja3aJiDCv9HGbP7AiG4LRE59majx8eEYvu5OFqFb/PFw8dRPrtSiET++OfcWKlal p/566BTZQU1vNIlkgf/bLx7hKNXRTtwQwmp7bo7L8G1sOo20uQoTcRf5vURCAULfFz9X iYjJCZGSinlKDK0ho0sVebxLXOWuCyqFIZX2Xcw6DLK0RkdTC2aLU9dF4Wt3RjD68f28 lG0NlPARJxjN10hMwIUpVsV7P8WWAP5szb65meo/ua7PXB2T8gfwDqpG1Tql3o6h+3nf oh0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=Aj6ftcdmwQ3mQFBt3zSTICjerCtiI+Dt9g6d3NrTU0Y=; b=sUgRWC5NHfjLV0P9fy6Yhj1aAaa8OzeKX3GjKRtBwQZ4C3Pvk433ORt2gibl/E2Aqz bE2uAeXLknyYVT15zo8thmvzHGtVzaQ/8TtryMxt6FUaLgEAMfXq5x2BnWBIa39WE//R wfjmB/1kOSKiTXi0dGyBaiJnQGbLJQo3JfjzsQM/JnyIFn8vdlhacbv7+WXWvzRg1k0c 5pi5IEMcY0NJT34luaEJ0hZPGrg4F8et9GtTB+EYCi+IlBOMGoI2+uuUjCzFBwEkimid O/998/6b5/akTFmwRBetTraAIBH8z5U8iamosFVyhIigdhO909JoUZbMus6zIU6RFIDP 2+sQ== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id k4si1681523edv.523.2021.07.28.22.29.37; Wed, 28 Jul 2021 22:29:37 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D768C68A5F6; Thu, 29 Jul 2021 08:26:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A97D968A457 for ; Thu, 29 Jul 2021 08:26:18 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="200023650" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="200023650" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:58 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730124" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:57 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:24:59 +0800 Message-Id: <20210729052509.30992-12-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 11/21] lavfi/vpp_qsv: factor common QSV filter definition 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zkeAvCbqt0XM Content-Length: 13806 --- libavfilter/vf_vpp_qsv.c | 195 +++++++++++++++++---------------------- 1 file changed, 86 insertions(+), 109 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index df23dd1e58..25c819d1a0 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -104,44 +104,6 @@ typedef struct VPPContext{ int scaling_mode; } VPPContext; -static const AVOption options[] = { - { "deinterlace", "deinterlace mode: 0=off, 1=bob, 2=advanced", OFFSET(deinterlace), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags = FLAGS, "deinterlace" }, - { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" }, - { "advanced", "Advanced deinterlace mode. ", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags = FLAGS, "deinterlace" }, - - { "denoise", "denoise level [0, 100]", OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, - { "detail", "enhancement level [0, 100]", OFFSET(detail), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, - { "framerate", "output framerate", OFFSET(framerate), AV_OPT_TYPE_RATIONAL, { .dbl = 0.0 },0, DBL_MAX, .flags = FLAGS }, - { "procamp", "Enable ProcAmp", OFFSET(procamp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS}, - { "hue", "ProcAmp hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -180.0, 180.0, .flags = FLAGS}, - { "saturation", "ProcAmp saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, - { "contrast", "ProcAmp contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, - { "brightness", "ProcAmp brightness", OFFSET(brightness), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS}, - - { "transpose", "set transpose direction", OFFSET(transpose), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 6, FLAGS, "transpose"}, - { "cclock_hflip", "rotate counter-clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, - { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK }, .flags=FLAGS, .unit = "transpose" }, - { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK }, .flags=FLAGS, .unit = "transpose" }, - { "clock_hflip", "rotate clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, - { "reversal", "rotate by half-turn", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL }, .flags=FLAGS, .unit = "transpose" }, - { "hflip", "flip horizontally", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP }, .flags=FLAGS, .unit = "transpose" }, - { "vflip", "flip vertically", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP }, .flags=FLAGS, .unit = "transpose" }, - - { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS }, - { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS }, - { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS }, - { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS }, - - { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, - { "width", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, - { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, - { "height", "Output video height(0=input video height, -1=keep input video aspect)", 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(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, - - { NULL } -}; - static const char *const var_names[] = { "iw", "in_w", "ih", "in_h", @@ -588,7 +550,90 @@ static int activate(AVFilterContext *ctx) return FFERROR_NOT_READY; } -static int query_formats(AVFilterContext *ctx) +static av_cold void vpp_uninit(AVFilterContext *ctx) +{ + ff_qsvvpp_close(ctx); +} + +static const AVFilterPad vpp_inputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = config_input, + }, + { NULL } +}; + +static const AVFilterPad vpp_outputs[] = { + { + .name = "default", + .type = AVMEDIA_TYPE_VIDEO, + .config_props = config_output, + }, + { NULL } +}; + +#define DEFINE_QSV_FILTER(x, sn, ln) \ +static const AVClass x##_class = { \ + .class_name = #sn "_qsv", \ + .item_name = av_default_item_name, \ + .option = x##_options, \ + .version = LIBAVUTIL_VERSION_INT, \ +}; \ +const AVFilter ff_vf_##sn##_qsv = { \ + .name = #sn "_qsv", \ + .description = NULL_IF_CONFIG_SMALL("Quick Sync Video " #ln), \ + .preinit = vpp_preinit, \ + .init = vpp_init, \ + .uninit = vpp_uninit, \ + .query_formats = x##_query_formats, \ + .priv_size = sizeof(VPPContext), \ + .priv_class = &x##_class, \ + .inputs = vpp_inputs, \ + .outputs = vpp_outputs, \ + .activate = activate, \ + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, \ +}; + +static const AVOption vpp_options[] = { + { "deinterlace", "deinterlace mode: 0=off, 1=bob, 2=advanced", OFFSET(deinterlace), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, MFX_DEINTERLACING_ADVANCED, .flags = FLAGS, "deinterlace" }, + { "bob", "Bob deinterlace mode.", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_BOB }, .flags = FLAGS, "deinterlace" }, + { "advanced", "Advanced deinterlace mode. ", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_DEINTERLACING_ADVANCED }, .flags = FLAGS, "deinterlace" }, + + { "denoise", "denoise level [0, 100]", OFFSET(denoise), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, + { "detail", "enhancement level [0, 100]", OFFSET(detail), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100, .flags = FLAGS }, + { "framerate", "output framerate", OFFSET(framerate), AV_OPT_TYPE_RATIONAL, { .dbl = 0.0 },0, DBL_MAX, .flags = FLAGS }, + { "procamp", "Enable ProcAmp", OFFSET(procamp), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, .flags = FLAGS}, + { "hue", "ProcAmp hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -180.0, 180.0, .flags = FLAGS}, + { "saturation", "ProcAmp saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, + { "contrast", "ProcAmp contrast", OFFSET(contrast), AV_OPT_TYPE_FLOAT, { .dbl = 1.0 }, 0.0, 10.0, .flags = FLAGS}, + { "brightness", "ProcAmp brightness", OFFSET(brightness), AV_OPT_TYPE_FLOAT, { .dbl = 0.0 }, -100.0, 100.0, .flags = FLAGS}, + + { "transpose", "set transpose direction", OFFSET(transpose), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 6, FLAGS, "transpose"}, + { "cclock_hflip", "rotate counter-clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, + { "clock", "rotate clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK }, .flags=FLAGS, .unit = "transpose" }, + { "cclock", "rotate counter-clockwise", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CCLOCK }, .flags=FLAGS, .unit = "transpose" }, + { "clock_hflip", "rotate clockwise with horizontal flip", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_CLOCK_FLIP }, .flags=FLAGS, .unit = "transpose" }, + { "reversal", "rotate by half-turn", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_REVERSAL }, .flags=FLAGS, .unit = "transpose" }, + { "hflip", "flip horizontally", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_HFLIP }, .flags=FLAGS, .unit = "transpose" }, + { "vflip", "flip vertically", 0, AV_OPT_TYPE_CONST, { .i64 = TRANSPOSE_VFLIP }, .flags=FLAGS, .unit = "transpose" }, + + { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, 0, 0, FLAGS }, + { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, 0, 0, FLAGS }, + { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(in_w-out_w)/2" }, 0, 0, FLAGS }, + { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(in_h-out_h)/2" }, 0, 0, FLAGS }, + + { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, + { "width", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str="cw" }, 0, 255, .flags = FLAGS }, + { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS }, + { "height", "Output video height(0=input video height, -1=keep input video aspect)", 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(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, + + { NULL } +}; + +static int vpp_query_formats(AVFilterContext *ctx) { int ret; static const enum AVPixelFormat in_pix_fmts[] = { @@ -614,50 +659,7 @@ static int query_formats(AVFilterContext *ctx) &ctx->outputs[0]->incfg.formats); } -static av_cold void vpp_uninit(AVFilterContext *ctx) -{ - ff_qsvvpp_close(ctx); -} - -static const AVClass vpp_class = { - .class_name = "vpp_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -static const AVFilterPad vpp_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = config_input, - }, - { NULL } -}; - -static const AVFilterPad vpp_outputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = config_output, - }, - { NULL } -}; - -const AVFilter ff_vf_vpp_qsv = { - .name = "vpp_qsv", - .description = NULL_IF_CONFIG_SMALL("Quick Sync Video VPP."), - .priv_size = sizeof(VPPContext), - .query_formats = query_formats, - .preinit = vpp_preinit, - .init = vpp_init, - .uninit = vpp_uninit, - .inputs = vpp_inputs, - .outputs = vpp_outputs, - .activate = activate, - .priv_class = &vpp_class, - .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, -}; +DEFINE_QSV_FILTER(vpp, vpp, "VPP"); static int qsvscale_query_formats(AVFilterContext *ctx) { @@ -687,29 +689,4 @@ static const AVOption qsvscale_options[] = { { NULL }, }; -static const AVClass qsvscale_class = { - .class_name = "scale_qsv", - .item_name = av_default_item_name, - .option = qsvscale_options, - .version = LIBAVUTIL_VERSION_INT, -}; - -const AVFilter ff_vf_scale_qsv = { - .name = "scale_qsv", - .description = NULL_IF_CONFIG_SMALL("Quick Sync Video scaling and format conversion"), - - .preinit = vpp_preinit, - .init = vpp_init, - .uninit = vpp_uninit, - .query_formats = qsvscale_query_formats, - - .priv_size = sizeof(VPPContext), - .priv_class = &qsvscale_class, - - .inputs = vpp_inputs, - .outputs = vpp_outputs, - - .activate = activate, - - .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, -}; +DEFINE_QSV_FILTER(qsvscale, scale, "scaling and format conversion") From patchwork Thu Jul 29 05:25:00 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29105 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501335ios; Wed, 28 Jul 2021 22:28:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw61ZnVCCGvlHlXFnwlRGFYpZ1Aa8m9OMGJC1fwFdIk0nssURLF8CpXw3IRxOdOz6RAzUzI X-Received: by 2002:a05:6402:1487:: with SMTP id e7mr3973022edv.285.1627536519798; Wed, 28 Jul 2021 22:28:39 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536519; cv=none; d=google.com; s=arc-20160816; b=Zm192zEYdPu9rKhlqJqq3dr/ElbTNwDiyOHvzisZ31fcH69Hev3IDZ5cJFMXDVfPvL xyM0kZ4RbqngG8EsbqrH1cvU60zIj4LKKiHaPCZuVuHDmSdtgfq0//Ag2YuFoVXcrpxf Rk31RhQuOJIOQsetcwFIq7MiuiC66zpgHsrXIDsALoPvFwD0y2Rzi8/kId9FMV99njaK alwd8Tn5icbZFw2xdEyfMn0dc6LXhxcvy5wj2R4LF40PFxuzMWadbmhIgjrOJlfBRJei u/yHDxtKBxc7w1QpDXbY41ohEWGOoEhLCmiQQMJ2Au/060THArE3p3M/HJltY9Ndx375 WOnA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=mfLjPiLHG7Axm//EMfYINxpnwNp3RRnGkAGYclYPUjM=; b=IMNvXo73+VTh1TyBGRKt44n32YoS6bpgDuCBQ9Nz/zvlVuSCt4cJGinwDLY5RNvy1i yW+eqH02xGfXG/yssuN4A/64AowfKw/Wq0XRPohbm26pxQq/VTu8q2pchius5Wn0knfR 0VDubPRBGaE0FSC1UwFTJuOK2Wiv0v2cicoh4WJLcjr1GPIq6pBrq9QTy3Q+eErglOcc m3V5bsQ59AGcfNC5+X0gDi5EAO4AMTc+x0HV2fDa0y04tHdILxwNeEpHMlcUNjMH8MWj JkX6XXleBU/khBKeNVl0DgcvAhLb1G8htakqw3tL61+oFJ/mDItDA80PtFeJa4b8eeB7 IPkg== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id bl4si2437824ejb.17.2021.07.28.22.28.39; Wed, 28 Jul 2021 22:28:39 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EB93E68A59A; Thu, 29 Jul 2021 08:26:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1224E68A464 for ; Thu, 29 Jul 2021 08:26:11 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922204" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922204" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:03 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730134" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:25:58 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:00 +0800 Message-Id: <20210729052509.30992-13-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 12/21] lavfi/scale_qsv: add new options for scale_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: EE1YNfGmqQgy Allow user to set crop area and async depth --- libavfilter/vf_vpp_qsv.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 25c819d1a0..a8d8cf7b98 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -674,6 +674,10 @@ static int qsvscale_query_formats(AVFilterContext *ctx) static const AVOption qsvscale_options[] = { { "w", "Output video width(0=input video width, -1=keep input video aspect)", OFFSET(ow), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS }, { "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS }, + { "cw", "set the width crop area expression", OFFSET(cw), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS }, + { "ch", "set the height crop area expression", OFFSET(ch), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS }, + { "cx", "set the x crop area expression", OFFSET(cx), AV_OPT_TYPE_STRING, { .str = "(iw-ow)/2" }, .flags = FLAGS }, + { "cy", "set the y crop area expression", OFFSET(cy), AV_OPT_TYPE_STRING, { .str = "(ih-oh)/2" }, .flags = FLAGS }, { "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS }, #if QSV_HAVE_SCALING @@ -686,6 +690,8 @@ static const AVOption qsvscale_options[] = { { "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, FLAGS, "mode"}, #endif + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, + { NULL }, }; From patchwork Thu Jul 29 05:25:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29097 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500670ios; Wed, 28 Jul 2021 22:27:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/8KbiF5EV89K6wkejwO4yMsIQi7mYCfCaP7GE8iMoQ2hUQL2LFC4op2N6LcJJUZXywXMx X-Received: by 2002:a05:6402:13c3:: with SMTP id a3mr3947305edx.187.1627536440922; Wed, 28 Jul 2021 22:27:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536440; cv=none; d=google.com; s=arc-20160816; b=DELl8VDiA+tnqWgY2Wl1dZG1IeP0S0HptrtOblAr1v2Iuf1zQO/OCXOkL+Wu7bpiKR P6wmUt03hRtYQMU1FxPUFXzDfbtAkRoRoM6HksD1rN9FYtT78bzpvYDp1a/dYzEgFu63 nV39peCAcJ+iaEY4ek91rfeaxVvGx6QjGf7DK54SpKm9cgG5KDaRAFDCChiHhCOKFa9m thGfzrlAfXcdxl0XFl1B0Br2LBe1D+jvhM4/3vhC2iTNY5DvlHzyplxZAuf+OKB8PoM8 WTcIJ6aCt9Bc4/vPgjeTtfs7XqqGaBus3z6chFJh6LuwxT4wiLyhj7Udd9sm5Py37UNr o0/w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=r3FEtxfe4o+ee+sIGypvP92RuX3nQ15yVZt4sDfYh6s=; b=n+3SENmD6yN2jppfgDIcAKCfNkCJxXFoK3/mfSiNRCOS4vm4Kf+kQIe5l9mE9cMggg kJfsIZTqjCI0/oboRiH13HIP0D48b8oeOgSGiJpUkUuZI+wI0PQVvpq+1p7GPdvBzxcb lOLP3oNk6DoXMZJxIwvAIF9DItuBml7g9AzqPO9MjamSwHH3fc5s6n0ltQcxf3VCW6xP GfICLwm3tBkj57RsSpcFgJQix8LESzdbkzZN9lg2zPDUq+N1YfnvKRxr1PGYHdqxR5cJ eIBdle2inhX0YHN9khKq2EuenKqDqVQWDj8nI6tI0EQD1jkgPdZmJmzEJh7SMPsr51fV TSLA== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id g17si2281093ejr.586.2021.07.28.22.27.20; Wed, 28 Jul 2021 22:27: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E297F68A4C5; Thu, 29 Jul 2021 08:26:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C022868A196 for ; Thu, 29 Jul 2021 08:26:08 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922206" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922206" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:04 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730147" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:00 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:01 +0800 Message-Id: <20210729052509.30992-14-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 13/21] lavfi/scale_qsv: add more input / output pixel formats 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9i/NlJ3CH2Ur NV12 and P010 are added $ ffmpeg -init_hw_device qsv -c:v h264_qsv -i input.h264 -vf "scale_qsv=format=p010" -f null - --- libavfilter/vf_vpp_qsv.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index a8d8cf7b98..e16bd09585 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -664,7 +664,10 @@ DEFINE_QSV_FILTER(vpp, vpp, "VPP"); static int qsvscale_query_formats(AVFilterContext *ctx) { static const enum AVPixelFormat pixel_formats[] = { - AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, + AV_PIX_FMT_NV12, + AV_PIX_FMT_P010, + AV_PIX_FMT_QSV, + AV_PIX_FMT_NONE, }; AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); From patchwork Thu Jul 29 05:25:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29108 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500345ios; Wed, 28 Jul 2021 22:26:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxJfRWvWaO84pFEqXskzXz3cCfEU7IIetb9aIvwKJQ3KhfJoY2P+uTo/H6bW2BeunXxJeDq X-Received: by 2002:a05:6402:d67:: with SMTP id ec39mr3939455edb.117.1627536401256; Wed, 28 Jul 2021 22:26:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536401; cv=none; d=google.com; s=arc-20160816; b=C+PKJ7Cn0n0jc8IqCbDb7EpqOC7HrunLIaKokscLzxJUWbEPGRzlKcVWm/kzW+TWB1 TflOVQIvZolS6/n/I8L5Dmlh0ARDdB6KuBmyGX4B6eybNB+gKA72P2NzzwvYC86wY7MZ f6uV+RHDFaSj8JLnzMhxHhwT8zfX5rbskgZ8DTx276SdgWgJubg+SBNQ06QRW+mEqiHw FJ9gIXSyBOi6CB6qPKSNd7/ZRWa7cZk5N3Ff8ZfTaZUESlda0L6XVnM1DcdIcv9aMeKR thEkkSCq3qu5iH0LASc33MRbZmbnDTFThQuvmY0AuwXWjPnsdRerqW4aSF3X+3rXLlaI kB+Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=sxQmYALpxW1nN2YfJX3cW6fYgAxOB1vq9s0iMUWOSDY=; b=Da6vFR8nkJkyCjnGEo31L2xzAfq2YbTycRAdYjmUcD87wJWRiQnfhDrf7O6bwluFsB FZVlKc47VnmizN/hy5T2E1e+Oa9qW5x4bR0piJkto8bzeipIpryKlbSfrD7x5JqPQkx9 8XiP7QS6/lGmk+MYV2hxVCflpWYLQIHbEdldMeiD2Gykg3V77IlJ3gdxOezQ4l2MUD1D thJCsAcqLyar/FUI3yLRtLC4GpWDu4xTI754DS8sUSWPZPP4iy5LulqCD4JMClSpweUS Ia4F4r1hWG6rF+ka1M+qQAMNpNcqqEwFjqK22GmXNRJXNy5e8UVD00PEuyeS9CPBj0dI 94Fw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f3si1778922eje.693.2021.07.28.22.26.40; Wed, 28 Jul 2021 22:26:41 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7EB4668A3AF; Thu, 29 Jul 2021 08:26:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2AB97689CFE for ; Thu, 29 Jul 2021 08:26:05 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922205" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922205" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:03 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730162" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:01 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:02 +0800 Message-Id: <20210729052509.30992-15-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 14/21] lavfi/qsvvpp: avoid overriding the returned value 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: hq5LGMIv/hi6 Currently the returned value from MFXVideoVPP_RunFrameVPPAsync() is overridden, so the check of 'ret == MFX_ERR_MORE_SURFACE' is always false when MFX_ERR_MORE_SURFACE is returned from MFXVideoVPP_RunFrameVPPAsync() --- libavfilter/qsvvpp.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 5b0b30e23c..82a8e29387 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -787,7 +787,7 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr AVFilterLink *outlink = ctx->outputs[0]; mfxSyncPoint sync; QSVFrame *in_frame, *out_frame, *tmp; - int ret, filter_ret; + int ret, ret1, filter_ret; while (s->eof && qsv_fifo_size(s->async_fifo)) { av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); @@ -849,8 +849,13 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr av_fifo_generic_read(s->async_fifo, &sync, sizeof(sync), NULL); do { - ret = MFXVideoCORE_SyncOperation(s->session, sync, 1000); - } while (ret == MFX_WRN_IN_EXECUTION); + ret1 = MFXVideoCORE_SyncOperation(s->session, sync, 1000); + } while (ret1 == MFX_WRN_IN_EXECUTION); + + if (ret1 < 0) { + ret = ret1; + break; + } filter_ret = s->filter_frame(outlink, tmp->frame); if (filter_ret < 0) { From patchwork Thu Jul 29 05:25:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29109 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500586ios; Wed, 28 Jul 2021 22:27:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwUmtfrooea8LSknA83x13lTwntEMNy9jkLFy9khNdvVVju/2hby8x/l1ipNB3EGj8oAF0g X-Received: by 2002:a05:6402:49a:: with SMTP id k26mr3876455edv.279.1627536431111; Wed, 28 Jul 2021 22:27:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536431; cv=none; d=google.com; s=arc-20160816; b=htwT9MYcdJZ2T5M6yH6OED1hEGaFl7yztj8YsWdAdMaxsgTL/vWY6lohSwkHFTdb7o HH94N5o3QDrS7tYXYq5ipd9wQUf8udjcYWMZjlSP8y9Sz2QtG5s3cSaRwj/d9z0MqpwI b7uZ/nJYB8M0v2taV1QnmziFiExJtdV0Ra6c1Tz9hgcEwUbTFD/VMqK8J12e5C/isyUO Mm7FTPrke9JIXMpAry+ccC5rKoX/VaziMvtupVFpNnUu1HaIXAh8kmjAk2IbmpEq21Lm WOJvpwIizkL+2uIW+NNVoac7+jHP2Uw8BHRQEqHvAXTOYKpD8g8zNNg/SoWmGsDCfW22 z6gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=rLy/pM/wIlzvms0B3QnXMB8QADF3ccICMTVAmGAspG8=; b=vWssiE3CFk1I5CxK5LdcIBNb3ciwGScW9rnal0X6ww9ctPsZPqIOHzqhDI45r1QPgW 4V8EhCrJXpv7SSJvecgiDhg2cMTlVlyriIzGUf/3fJZf4ht9CmFb8Kg6Xa6Y9s1fEUOm /mS/iAY3U1N6E+4DhqXbmy8z+Ju4RnJu9iDmslSC3Q6axKUAq04vYf0CbASBoZ7u6kkG q8M3SwdBRyDzlOl/LxH2nr9zyD0LAr/YjYy5vmAcn9tUbol4JoZWbJv/Uwxy/SlTKyvt 4m24q9zw2If77TeErYQp+wuWIE1pJFc8Z5tHAsqrMxS1aJv+3btOa/oJCTAKpb6HOz/A Y5Ig== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id da22si1756345edb.500.2021.07.28.22.27.10; Wed, 28 Jul 2021 22:27: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C0A5668A3E8; Thu, 29 Jul 2021 08:26:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9F4EC689D48 for ; Thu, 29 Jul 2021 08:26:13 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922207" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922207" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:04 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730166" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:02 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:03 +0800 Message-Id: <20210729052509.30992-16-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 15/21] lavfi/qsvvpp: set PTS for output frame 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: NBCr1yNsfAlC When the SDK returns MFX_ERR_MORE_SURFACE, the PTS is not set for the output frame. We assign a PTS calculated from the input frame to the output frame. After applying this patch, we may avoid the error below: [null @ 0x56395cab4ae0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: 456 >= 0 Note this patch only fixes PTS issue when deinterlacing is enabled --- libavfilter/qsvvpp.c | 21 +++++++++++++++++++-- libavfilter/qsvvpp.h | 3 +++ libavfilter/vf_vpp_qsv.c | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 82a8e29387..01d9d754d3 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -653,6 +653,7 @@ int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) int ret; QSVVPPContext *s = avctx->priv; + s->last_in_pts = AV_NOPTS_VALUE; s->filter_frame = param->filter_frame; if (!s->filter_frame) s->filter_frame = ff_filter_frame; @@ -769,6 +770,8 @@ int ff_qsvvpp_close(AVFilterContext *avctx) s->session = NULL; } + s->last_in_pts = AV_NOPTS_VALUE; + /* release all the resources */ clear_frame_list(&s->in_frame_list); clear_frame_list(&s->out_frame_list); @@ -788,6 +791,7 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr mfxSyncPoint sync; QSVFrame *in_frame, *out_frame, *tmp; int ret, ret1, filter_ret; + int64_t dpts = 0; while (s->eof && qsv_fifo_size(s->async_fifo)) { av_fifo_generic_read(s->async_fifo, &tmp, sizeof(tmp), NULL); @@ -836,8 +840,19 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr ret = AVERROR(EAGAIN); break; } - out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, - default_tb, outlink->time_base); + + /* TODO: calculate the PTS for other cases */ + if (s->deinterlace_enabled && + s->last_in_pts != AV_NOPTS_VALUE && + ret == MFX_ERR_MORE_SURFACE && + out_frame->surface.Data.TimeStamp == MFX_TIMESTAMP_UNKNOWN) + dpts = (in_frame->frame->pts - s->last_in_pts) / 2; + else + dpts = 0; + + out_frame->frame->pts = av_rescale_q(in_frame->frame->pts - dpts, + inlink->time_base, + outlink->time_base); out_frame->queued++; av_fifo_generic_write(s->async_fifo, &out_frame, sizeof(out_frame), NULL); @@ -870,5 +885,7 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr } } while(ret == MFX_ERR_MORE_SURFACE); + s->last_in_pts = in_frame->frame->pts; + return ret; } diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h index b6fe0d3fa7..8627c8c868 100644 --- a/libavfilter/qsvvpp.h +++ b/libavfilter/qsvvpp.h @@ -74,8 +74,11 @@ typedef struct QSVVPPContext { int got_frame; int async_depth; int eof; + int deinterlace_enabled; /** order with frame_out, sync */ AVFifoBuffer *async_fifo; + + int64_t last_in_pts; } QSVVPPContext; typedef struct QSVVPPCrop { diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index e16bd09585..b234417663 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -364,6 +364,8 @@ static int config_output(AVFilterLink *outlink) vpp->extbuf.field = value; \ } while (0) + vpp->qsv.deinterlace_enabled = !!vpp->deinterlace; + if (vpp->deinterlace) { INIT_MFX_EXTBUF(deinterlace_conf, MFX_EXTBUFF_VPP_DEINTERLACING); SET_MFX_PARAM_FIELD(deinterlace_conf, Mode, (vpp->deinterlace == 1 ? From patchwork Thu Jul 29 05:25:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29098 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500509ios; Wed, 28 Jul 2021 22:27:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXGQeWS7anSkBOImo9e19D5Dvq9CbvQ0jOBPwgI0H5kKJPQTYRe1OElxNhBwSSqRQQitAw X-Received: by 2002:a17:906:1c07:: with SMTP id k7mr2858013ejg.173.1627536421729; Wed, 28 Jul 2021 22:27:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536421; cv=none; d=google.com; s=arc-20160816; b=rLvsbcB9N6sd2dAi/nyQ4ij8plL8WHzYxWcrmEAA/ppC/AoRbncSrb0cuzyDIQazXg YQ1f33YwB+RaBuJXyfPhXPxKToIViTf+QdEAKpu33mRyXmGVU+G490cHbCaWs2WJtTPN 7EKtQK/SUqV4VRJSScOMUuDEVE5ZU1iwss3Tc/YnPKEMsmc+c5t0RMBrOmQOYYP1CugE KOWR1seFDjckGKHPa1aLVYCyic9HW3hLWSeqZ7isw9PkvflY+s1JzQz96zMWlqBpQqYi ccQVOrETjqvr16m8wJev9nfvxnBtHEJlHFyzxRdS2S7dSieTV8A/dHgzA4J602DP8EEy KSeQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=+NL2OWmE2xX4i5PEAodKvn9AZaQfkMd2s6eIDH+QJjQ=; b=BLHGaku5Jg5NjdRBpgfiAaIPQ1wZij3bDGPoXP/livdGpiqUh0JajIMjV95ON7GikF 783rMhqwrjtBR9/ADUJhMlE+Tme85pK4nU7YFb9mw+Z3SkaNZ+npk8SXLX5go5/3hBxA kYI1pDl5R0ymhPR1FZMkABxHhLnvkd9HOpkHWVjT3nuz8J6x+hew2aynJom0WDiNFZaU lE3IAC8jOib65O9JXkzzVhVoMvjjyqlRJJURcmh/bnxcfuWVl3AcyP/23UNXgoVQUZB5 hqpkFOp+4GS/wwdl0gzQ3Mh/t0isPOJkk/GIGp1DsViwuh0frql2px/jjXnVC9Xshjpo BWLA== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cm19si1702479edb.410.2021.07.28.22.27.01; Wed, 28 Jul 2021 22:27:01 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7CD3F68A196; Thu, 29 Jul 2021 08:26:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id ADB7368A35C for ; Thu, 29 Jul 2021 08:26:07 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922208" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922208" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:04 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730170" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:03 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:04 +0800 Message-Id: <20210729052509.30992-17-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 16/21] lavfi/vpp_qsv: check output format string against NULL pointer 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: BzQzjnnG7CbD This is in preparation for re-using VPPContext but with a different option array for deinterlacing_qsv filter --- libavfilter/vf_vpp_qsv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index b234417663..704db8fdaf 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -234,7 +234,7 @@ static av_cold int vpp_init(AVFilterContext *ctx) { VPPContext *vpp = ctx->priv; - if (!strcmp(vpp->output_format_str, "same")) { + if (!vpp->output_format_str || !strcmp(vpp->output_format_str, "same")) { vpp->out_format = AV_PIX_FMT_NONE; } else { vpp->out_format = av_get_pix_fmt(vpp->output_format_str); From patchwork Thu Jul 29 05:25:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29101 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500857ios; Wed, 28 Jul 2021 22:27:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxTGly6cJUYw7AHVpmrZVTdsvtGyJFN82TYlX9ZHXJCMcodgYjIdwk89KTXCH7mzgCXgCVl X-Received: by 2002:a17:907:20f2:: with SMTP id rh18mr2981765ejb.136.1627536461807; Wed, 28 Jul 2021 22:27:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536461; cv=none; d=google.com; s=arc-20160816; b=GpEuR8hXa/pgV8Tcf3hN7U36AX6ZmoWYMuaLr1LkcWwpRh37Hw7c5hAVejFtzI7d/D 5HPyZ4zjqJxkGFhZaLonkuISaGoBoqzm0masmB6Ew9wibSt56N1WVfZOMTUuhBrRbcRs ziUZxQp1wjy7asUxnUFgs0WDUFYfHdvs3i4ofZYSyapTKrX+g+95abtWBiqsAtZH7AGl 6SNMS9hBo15ee5gM/xak8PDvQ5r3sTZQL37AjaCECYYgySXM/C/4Hwor95KOPHtpZMTx AQUIS8XUx51ti4JcnMkIxgQB6CFyAlGvTUPwlLBcoSb7cXecaLO7j7Tl1uJvLxvWsdy0 uleg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=QE3s47J1sTmG0FTxMiokldJ9Way6fwohS4vVz7WY7hM=; b=rDztKJfECtddgnX586kI/CwXteftEPMSpT4HIgaV99tfNtOlQKRb9m/p2n+6UjdPu+ 3Y/uc9fmEySFPYKnn+kK1DFUDSKqcZmGy4VSQcwHsDAa0K89TQdFBiql0e2UkZ3DqVtw lyqZ3WNTdDF4LjjIKAbrj0a8ZsWJIKTi3upAI3+sN6j2IA0sGnkj+NQ52aZa6V1o/4jG lKXy7UjJvW7KgxxsuHd9KWe7LvEzq2SCHPybf+OS82ZF+A83ZZh2h2v7h05rU/nStAyd SEbTASZRZcF1qQM2Ea9Evv9u4QMZbpbhCKFkd0itaP8qlD1U6GEaQbjpPj7DhEoMett7 /TbA== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id d2si1588449ejr.606.2021.07.28.22.27.41; Wed, 28 Jul 2021 22:27:41 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0FEB468A3BF; Thu, 29 Jul 2021 08:26:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9469968A196 for ; Thu, 29 Jul 2021 08:26:14 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922210" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922210" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:05 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730175" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:04 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:05 +0800 Message-Id: <20210729052509.30992-18-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 17/21] lavfi/deinterlace_qsv: simplify deinterlace_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zl8M/DKmPjn9 Like what we did for scale_qsv filter, we use QSVVPPContext as a base context to manage MFX session for deinterlace_qsv filter --- libavfilter/vf_deinterlace_qsv.c | 492 ++----------------------------- 1 file changed, 30 insertions(+), 462 deletions(-) diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c index 3c2d87c7c8..50ff553e6a 100644 --- a/libavfilter/vf_deinterlace_qsv.c +++ b/libavfilter/vf_deinterlace_qsv.c @@ -42,34 +42,10 @@ #include "internal.h" #include "video.h" -enum { - QSVDEINT_MORE_OUTPUT = 1, - QSVDEINT_MORE_INPUT, -}; - typedef struct QSVDeintContext { - const AVClass *class; - - AVBufferRef *hw_frames_ctx; - /* a clone of the main session, used internally for deinterlacing */ - mfxSession session; - - mfxMemId *mem_ids; - int nb_mem_ids; - - mfxFrameSurface1 **surface_ptrs; - int nb_surface_ptrs; + QSVVPPContext qsv; - mfxExtOpaqueSurfaceAlloc opaque_alloc; - mfxExtVPPDeinterlacing deint_conf; - mfxExtBuffer *ext_buffers[2]; - int num_ext_buffers; - - QSVFrame *work_frames; - - int64_t last_pts; - - int eof; + mfxExtVPPDeinterlacing deint_conf; /* option for Deinterlacing algorithm to be used */ int mode; @@ -77,28 +53,7 @@ typedef struct QSVDeintContext { static av_cold void qsvdeint_uninit(AVFilterContext *ctx) { - QSVDeintContext *s = ctx->priv; - QSVFrame *cur; - - if (s->session) { - MFXClose(s->session); - s->session = NULL; - } - av_buffer_unref(&s->hw_frames_ctx); - - cur = s->work_frames; - while (cur) { - s->work_frames = cur->next; - av_frame_free(&cur->frame); - av_freep(&cur); - cur = s->work_frames; - } - - av_freep(&s->mem_ids); - s->nb_mem_ids = 0; - - av_freep(&s->surface_ptrs); - s->nb_surface_ptrs = 0; + ff_qsvvpp_close(ctx); } static int qsvdeint_query_formats(AVFilterContext *ctx) @@ -115,441 +70,54 @@ static int qsvdeint_query_formats(AVFilterContext *ctx) return 0; } -static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req, - mfxFrameAllocResponse *resp) -{ - AVFilterContext *ctx = pthis; - QSVDeintContext *s = ctx->priv; - - if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) || - !(req->Type & (MFX_MEMTYPE_FROM_VPPIN | MFX_MEMTYPE_FROM_VPPOUT)) || - !(req->Type & MFX_MEMTYPE_EXTERNAL_FRAME)) - return MFX_ERR_UNSUPPORTED; - - resp->mids = s->mem_ids; - resp->NumFrameActual = s->nb_mem_ids; - - return MFX_ERR_NONE; -} - -static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp) -{ - return MFX_ERR_NONE; -} - -static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) -{ - return MFX_ERR_UNSUPPORTED; -} - -static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr) -{ - return MFX_ERR_UNSUPPORTED; -} - -static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl) -{ - *hdl = mid; - 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) -{ - - QSVDeintContext *s = ctx->priv; - AVHWFramesContext *hw_frames_ctx = (AVHWFramesContext*)s->hw_frames_ctx->data; - AVQSVFramesContext *hw_frames_hwctx = hw_frames_ctx->hwctx; - AVQSVDeviceContext *device_hwctx = hw_frames_ctx->device_ctx->hwctx; - - int opaque = !!(hw_frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME); - - mfxHDL handle = NULL; - mfxHandleType handle_type; - mfxVersion ver; - mfxIMPL impl; - mfxVideoParam par; - mfxStatus err; - int i; - - /* extract the properties of the "master" session given to us */ - err = MFXQueryIMPL(device_hwctx->session, &impl); - if (err == MFX_ERR_NONE) - err = MFXQueryVersion(device_hwctx->session, &ver); - if (err != MFX_ERR_NONE) { - av_log(ctx, AV_LOG_ERROR, "Error querying the session attributes\n"); - return AVERROR_UNKNOWN; - } - - for (i = 0; i < FF_ARRAY_ELEMS(handle_types); i++) { - err = MFXVideoCORE_GetHandle(device_hwctx->session, handle_types[i], &handle); - if (err == MFX_ERR_NONE) { - handle_type = handle_types[i]; - break; - } - } - - if (err < 0) - return ff_qsvvpp_print_error(ctx, err, "Error getting the session handle"); - else if (err > 0) { - ff_qsvvpp_print_warning(ctx, err, "Warning in getting the session handle"); - return AVERROR_UNKNOWN; - } - - /* create a "slave" session with those same properties, to be used for - * actual deinterlacing */ - err = MFXInit(impl, &ver, &s->session); - if (err < 0) - return ff_qsvvpp_print_error(ctx, err, "Error initializing a session for deinterlacing"); - else if (err > 0) { - ff_qsvvpp_print_warning(ctx, err, "Warning in session initialization"); - return AVERROR_UNKNOWN; - } - - if (handle) { - err = MFXVideoCORE_SetHandle(s->session, handle_type, handle); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - } - - if (QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { - err = MFXJoinSession(device_hwctx->session, s->session); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - } - - memset(&par, 0, sizeof(par)); - - s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; - s->deint_conf.Header.BufferSz = sizeof(s->deint_conf); - s->deint_conf.Mode = s->mode; - - s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->deint_conf; - - if (opaque) { - s->surface_ptrs = av_mallocz_array(hw_frames_hwctx->nb_surfaces, - sizeof(*s->surface_ptrs)); - if (!s->surface_ptrs) - return AVERROR(ENOMEM); - for (i = 0; i < hw_frames_hwctx->nb_surfaces; i++) - s->surface_ptrs[i] = hw_frames_hwctx->surfaces + i; - s->nb_surface_ptrs = hw_frames_hwctx->nb_surfaces; - - s->opaque_alloc.In.Surfaces = s->surface_ptrs; - s->opaque_alloc.In.NumSurface = s->nb_surface_ptrs; - s->opaque_alloc.In.Type = hw_frames_hwctx->frame_type; - - s->opaque_alloc.Out = s->opaque_alloc.In; - - s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION; - s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc); - - s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer *)&s->opaque_alloc; - - par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY; - } else { - mfxFrameAllocator frame_allocator = { - .pthis = ctx, - .Alloc = frame_alloc, - .Lock = frame_lock, - .Unlock = frame_unlock, - .GetHDL = frame_get_hdl, - .Free = frame_free, - }; - - s->mem_ids = av_mallocz_array(hw_frames_hwctx->nb_surfaces, - sizeof(*s->mem_ids)); - if (!s->mem_ids) - return AVERROR(ENOMEM); - for (i = 0; i < hw_frames_hwctx->nb_surfaces; i++) - s->mem_ids[i] = hw_frames_hwctx->surfaces[i].Data.MemId; - s->nb_mem_ids = hw_frames_hwctx->nb_surfaces; - - err = MFXVideoCORE_SetFrameAllocator(s->session, &frame_allocator); - if (err != MFX_ERR_NONE) - return AVERROR_UNKNOWN; - - par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY; - } - - par.ExtParam = s->ext_buffers; - par.NumExtParam = s->num_ext_buffers; - - par.AsyncDepth = 1; // TODO async - - par.vpp.In = hw_frames_hwctx->surfaces[0].Info; - - par.vpp.In.CropW = ctx->inputs[0]->w; - par.vpp.In.CropH = ctx->inputs[0]->h; - - if (ctx->inputs[0]->frame_rate.num) { - par.vpp.In.FrameRateExtN = ctx->inputs[0]->frame_rate.num; - par.vpp.In.FrameRateExtD = ctx->inputs[0]->frame_rate.den; - } else { - par.vpp.In.FrameRateExtN = ctx->inputs[0]->time_base.num; - par.vpp.In.FrameRateExtD = ctx->inputs[0]->time_base.den; - } - - par.vpp.Out = par.vpp.In; - - if (ctx->outputs[0]->frame_rate.num) { - par.vpp.Out.FrameRateExtN = ctx->outputs[0]->frame_rate.num; - par.vpp.Out.FrameRateExtD = ctx->outputs[0]->frame_rate.den; - } else { - par.vpp.Out.FrameRateExtN = ctx->outputs[0]->time_base.num; - par.vpp.Out.FrameRateExtD = ctx->outputs[0]->time_base.den; - } - - /* Print input memory mode */ - ff_qsvvpp_print_iopattern(ctx, par.IOPattern & 0x0F, "VPP"); - /* Print output memory mode */ - ff_qsvvpp_print_iopattern(ctx, par.IOPattern & 0xF0, "VPP"); - err = MFXVideoVPP_Init(s->session, &par); - if (err < 0) - return ff_qsvvpp_print_error(ctx, err, - "Error opening the VPP for deinterlacing"); - else if (err > 0) { - ff_qsvvpp_print_warning(ctx, err, - "Warning in VPP initialization"); - return AVERROR_UNKNOWN; - } - - return 0; -} - static int qsvdeint_config_props(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; AVFilterLink *inlink = ctx->inputs[0]; - QSVDeintContext *s = ctx->priv; - int ret; + QSVDeintContext *s = ctx->priv; + QSVVPPParam param = { NULL }; + mfxExtBuffer *ext_buf[1]; + enum AVPixelFormat in_format; qsvdeint_uninit(ctx); - s->last_pts = AV_NOPTS_VALUE; + outlink->w = inlink->w; + outlink->h = inlink->h; outlink->frame_rate = av_mul_q(inlink->frame_rate, (AVRational){ 2, 1 }); outlink->time_base = av_mul_q(inlink->time_base, (AVRational){ 1, 2 }); - /* check that we have a hw context */ - if (!inlink->hw_frames_ctx) { - av_log(ctx, AV_LOG_ERROR, "No hw context provided on input\n"); - return AVERROR(EINVAL); - } - - s->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); - if (!s->hw_frames_ctx) - return AVERROR(ENOMEM); - - av_buffer_unref(&outlink->hw_frames_ctx); - outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx); - if (!outlink->hw_frames_ctx) { - qsvdeint_uninit(ctx); - return AVERROR(ENOMEM); - } - - ret = init_out_session(ctx); - if (ret < 0) - return ret; - - - return 0; -} - -static void clear_unused_frames(QSVDeintContext *s) -{ - QSVFrame *cur = s->work_frames; - while (cur) { - if (!cur->surface.Data.Locked) { - av_frame_free(&cur->frame); - cur->queued = 0; - } - cur = cur->next; - } -} - -static int get_free_frame(QSVDeintContext *s, QSVFrame **f) -{ - QSVFrame *frame, **last; - - clear_unused_frames(s); + if (inlink->format == AV_PIX_FMT_QSV) { + if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) + return AVERROR(EINVAL); + else + in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format; + } else + in_format = inlink->format; - frame = s->work_frames; - last = &s->work_frames; - while (frame) { - if (!frame->queued) { - *f = frame; - return 0; - } + param.out_sw_format = in_format; + param.ext_buf = ext_buf; - last = &frame->next; - frame = frame->next; - } + memset(&s->deint_conf, 0, sizeof(mfxExtVPPDeinterlacing)); + s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; + s->deint_conf.Header.BufferSz = sizeof(s->deint_conf); + s->deint_conf.Mode = s->mode; + param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&s->deint_conf; - frame = av_mallocz(sizeof(*frame)); - if (!frame) - return AVERROR(ENOMEM); - *last = frame; - *f = frame; - - return 0; -} - -static int submit_frame(AVFilterContext *ctx, AVFrame *frame, - mfxFrameSurface1 **surface) -{ - QSVDeintContext *s = ctx->priv; - QSVFrame *qf; - int ret; - - ret = get_free_frame(s, &qf); - if (ret < 0) - return ret; - - qf->frame = frame; - - qf->surface = *(mfxFrameSurface1*)qf->frame->data[3]; - - qf->surface.Data.Locked = 0; - qf->surface.Info.CropW = qf->frame->width; - qf->surface.Info.CropH = qf->frame->height; - - qf->surface.Info.PicStruct = !qf->frame->interlaced_frame ? MFX_PICSTRUCT_PROGRESSIVE : - (qf->frame->top_field_first ? MFX_PICSTRUCT_FIELD_TFF : - MFX_PICSTRUCT_FIELD_BFF); - if (qf->frame->repeat_pict == 1) { - qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FIELD_REPEATED; - qf->surface.Info.PicStruct |= qf->frame->top_field_first ? MFX_PICSTRUCT_FIELD_TFF : - MFX_PICSTRUCT_FIELD_BFF; - } else if (qf->frame->repeat_pict == 2) - qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_DOUBLING; - else if (qf->frame->repeat_pict == 4) - qf->surface.Info.PicStruct |= MFX_PICSTRUCT_FRAME_TRIPLING; - - if (ctx->inputs[0]->frame_rate.num) { - qf->surface.Info.FrameRateExtN = ctx->inputs[0]->frame_rate.num; - qf->surface.Info.FrameRateExtD = ctx->inputs[0]->frame_rate.den; - } else { - qf->surface.Info.FrameRateExtN = ctx->inputs[0]->time_base.num; - qf->surface.Info.FrameRateExtD = ctx->inputs[0]->time_base.den; - } - - qf->surface.Data.TimeStamp = av_rescale_q(qf->frame->pts, - ctx->inputs[0]->time_base, - (AVRational){1, 90000}); - - *surface = &qf->surface; - qf->queued = 1; - - return 0; -} - -static int process_frame(AVFilterContext *ctx, const AVFrame *in, - mfxFrameSurface1 *surf_in) -{ - QSVDeintContext *s = ctx->priv; - AVFilterLink *inlink = ctx->inputs[0]; - AVFilterLink *outlink = ctx->outputs[0]; - - AVFrame *out; - mfxFrameSurface1 *surf_out; - mfxSyncPoint sync = NULL; - mfxStatus err; - int ret, again = 0; - - out = ff_get_video_buffer(outlink, outlink->w, outlink->h); - if (!out) { - ret = AVERROR(ENOMEM); - goto fail; - } - - surf_out = (mfxFrameSurface1*)out->data[3]; - surf_out->Info.CropW = outlink->w; - surf_out->Info.CropH = outlink->h; - surf_out->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; - - do { - err = MFXVideoVPP_RunFrameVPPAsync(s->session, surf_in, surf_out, - NULL, &sync); - if (err == MFX_WRN_DEVICE_BUSY) - av_usleep(1); - } while (err == MFX_WRN_DEVICE_BUSY); - - if (err == MFX_ERR_MORE_DATA) { - av_frame_free(&out); - return QSVDEINT_MORE_INPUT; - } - - if (err < 0 && err != MFX_ERR_MORE_SURFACE) { - ret = ff_qsvvpp_print_error(ctx, err, "Error during deinterlacing"); - goto fail; - } - - if (!sync) { - av_log(ctx, AV_LOG_ERROR, "No sync during deinterlacing\n"); - ret = AVERROR_UNKNOWN; - goto fail; - } - if (err == MFX_ERR_MORE_SURFACE) - again = 1; - - do { - err = MFXVideoCORE_SyncOperation(s->session, sync, 1000); - } while (err == MFX_WRN_IN_EXECUTION); - if (err < 0) { - ret = ff_qsvvpp_print_error(ctx, err, "Error synchronizing the operation"); - goto fail; - } - - ret = av_frame_copy_props(out, in); - if (ret < 0) - goto fail; - - out->width = outlink->w; - out->height = outlink->h; - out->interlaced_frame = 0; - - out->pts = av_rescale_q(out->pts, inlink->time_base, outlink->time_base); - if (out->pts == s->last_pts) - out->pts++; - s->last_pts = out->pts; - - ret = ff_filter_frame(outlink, out); - if (ret < 0) - return ret; - - return again ? QSVDEINT_MORE_OUTPUT : 0; -fail: - av_frame_free(&out); - return ret; + return ff_qsvvpp_init(ctx, ¶m); } static int qsvdeint_filter_frame(AVFilterLink *link, AVFrame *in) { - AVFilterContext *ctx = link->dst; - - mfxFrameSurface1 *surf_in; - int ret; + AVFilterContext *ctx = link->dst; + QSVVPPContext *qsv = ctx->priv; + int ret = 0; - ret = submit_frame(ctx, in, &surf_in); - if (ret < 0) { - av_frame_free(&in); - return ret; - } - - do { - ret = process_frame(ctx, in, surf_in); - if (ret < 0) - return ret; - } while (ret == QSVDEINT_MORE_OUTPUT); + ret = ff_qsvvpp_filter_frame(qsv, link, in); + av_frame_free(&in); - return 0; + return ret; } static int qsvdeint_request_frame(AVFilterLink *outlink) From patchwork Thu Jul 29 05:25:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29107 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500741ios; Wed, 28 Jul 2021 22:27:30 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjGgbDTiH3RK4L7lfmqgVXPaQn155jXJOMpYloksOAlfGM1KdWSAZzbxlMdCN5NSG/wvUk X-Received: by 2002:a17:906:a445:: with SMTP id cb5mr3053276ejb.320.1627536450413; Wed, 28 Jul 2021 22:27:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536450; cv=none; d=google.com; s=arc-20160816; b=oXzzmUtpz6lBMjHdblm5MBDWwbNXgiHPUfq5sgvLlQgdhfpXVGR2jwHQVQxJYKO2Dz RZqxBpqdB//MaGtNJWSkUJfI5jvNC84x7632GqpKIUfnTHEHfUy+Y3G1PjVyynleI+P3 wwAwnZDBNMYXGkIoQIvFMuZW+plJYOmK8sWhdcTowQ7CfFnO1TPReOjaht9LqDJ/NBCZ q06V+yZ95PMNaO9thS6ah9VZRqwsTZ0U9/TrLLajkxmk9qZoQUEN6QelQ39DK/SYxgjF petsQo9rQVpl4mgpVweHZzmwuCmZlY4vRuereZgjBU9aBrf/y+T73BBjXjxNCLujClQJ RFeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=vhxAvKZHeAOtiXEAXeiuEGi5iD+MZt8ATEYJ22q9T34=; b=GLBs2Bue/WcdAjCVqSZhH0C2vIQuiFn19NvnhIYCauka1W7fCrwcWHtOFeVMLthu/X gXemf5nV1e9J9HaFCsEXCgGdnsRwGteRW9pjgyDY+VsZSPfNNpq/514E6tGuDGXBVdz8 qjLAEOROlcoFyLEBqVy8qMZa8FxZW/KTHu/DVKugeUi3UZLc3ewqXUExf5cpNb0csOKt bClwqcAdQhFFV2J+wSBJGLvBu+H5OzpyA63PIFh3yjoDuwUdDXcmVOdMOOp+GsbR6BQn V3HYo7ytsmQ10RHJ7GYBNamAhMHBE7oQUBG95iN5zCMAjFzO8fXSbvAC9si1NaMMdGhF gfgw== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v12si1932192ejv.679.2021.07.28.22.27.30; Wed, 28 Jul 2021 22:27: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1197968A39C; Thu, 29 Jul 2021 08:26:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A30AB68A39C for ; Thu, 29 Jul 2021 08:26:14 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922213" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922213" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:07 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730178" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:06 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:06 +0800 Message-Id: <20210729052509.30992-19-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 18/21] lavfi/deinterlace_qsv: re-use VPPContext for deinterlace_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5WC6wzKzqhFX All features are implemented in vpp_qsv filter now, so deinterlace_qsv can be taken as a specical case of vpp_qsv filter, we re-use VPPContext with a different option array and pix formats for deinterlace_qsv filter A new option -rate is used to control the output frame rate, by default it will output frame for each field --- libavfilter/Makefile | 2 +- libavfilter/vf_deinterlace_qsv.c | 179 ------------------------------- libavfilter/vf_vpp_qsv.c | 34 +++++- 3 files changed, 34 insertions(+), 181 deletions(-) delete mode 100644 libavfilter/vf_deinterlace_qsv.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 760099ba2c..dafd0c610c 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -230,7 +230,7 @@ OBJS-$(CONFIG_DECONVOLVE_FILTER) += vf_convolve.o framesync.o OBJS-$(CONFIG_DEDOT_FILTER) += vf_dedot.o OBJS-$(CONFIG_DEFLATE_FILTER) += vf_neighbor.o OBJS-$(CONFIG_DEFLICKER_FILTER) += vf_deflicker.o -OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_deinterlace_qsv.o +OBJS-$(CONFIG_DEINTERLACE_QSV_FILTER) += vf_vpp_qsv.o OBJS-$(CONFIG_DEINTERLACE_VAAPI_FILTER) += vf_deinterlace_vaapi.o vaapi_vpp.o OBJS-$(CONFIG_DEJUDDER_FILTER) += vf_dejudder.o OBJS-$(CONFIG_DELOGO_FILTER) += vf_delogo.o diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c deleted file mode 100644 index 50ff553e6a..0000000000 --- a/libavfilter/vf_deinterlace_qsv.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * This file is part of FFmpeg. - * - * FFmpeg is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * FFmpeg is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -/** - * @file - * deinterlace video filter - QSV - */ - -#include - -#include -#include - -#include "libavutil/avstring.h" -#include "libavutil/common.h" -#include "libavutil/hwcontext.h" -#include "libavutil/hwcontext_qsv.h" -#include "libavutil/internal.h" -#include "libavutil/mathematics.h" -#include "libavutil/opt.h" -#include "libavutil/pixdesc.h" -#include "libavutil/time.h" -#include "libavfilter/qsvvpp.h" - -#include "avfilter.h" -#include "formats.h" -#include "internal.h" -#include "video.h" - -typedef struct QSVDeintContext { - QSVVPPContext qsv; - - mfxExtVPPDeinterlacing deint_conf; - - /* option for Deinterlacing algorithm to be used */ - int mode; -} QSVDeintContext; - -static av_cold void qsvdeint_uninit(AVFilterContext *ctx) -{ - ff_qsvvpp_close(ctx); -} - -static int qsvdeint_query_formats(AVFilterContext *ctx) -{ - static const enum AVPixelFormat pixel_formats[] = { - AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, - }; - AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); - int ret; - - if ((ret = ff_set_common_formats(ctx, pix_fmts)) < 0) - return ret; - - return 0; -} - -static int qsvdeint_config_props(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - AVFilterLink *inlink = ctx->inputs[0]; - QSVDeintContext *s = ctx->priv; - QSVVPPParam param = { NULL }; - mfxExtBuffer *ext_buf[1]; - enum AVPixelFormat in_format; - - qsvdeint_uninit(ctx); - - outlink->w = inlink->w; - outlink->h = inlink->h; - outlink->frame_rate = av_mul_q(inlink->frame_rate, - (AVRational){ 2, 1 }); - outlink->time_base = av_mul_q(inlink->time_base, - (AVRational){ 1, 2 }); - - if (inlink->format == AV_PIX_FMT_QSV) { - if (!inlink->hw_frames_ctx || !inlink->hw_frames_ctx->data) - return AVERROR(EINVAL); - else - in_format = ((AVHWFramesContext*)inlink->hw_frames_ctx->data)->sw_format; - } else - in_format = inlink->format; - - param.out_sw_format = in_format; - param.ext_buf = ext_buf; - - memset(&s->deint_conf, 0, sizeof(mfxExtVPPDeinterlacing)); - s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING; - s->deint_conf.Header.BufferSz = sizeof(s->deint_conf); - s->deint_conf.Mode = s->mode; - param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&s->deint_conf; - - return ff_qsvvpp_init(ctx, ¶m); -} - -static int qsvdeint_filter_frame(AVFilterLink *link, AVFrame *in) -{ - AVFilterContext *ctx = link->dst; - QSVVPPContext *qsv = ctx->priv; - int ret = 0; - - ret = ff_qsvvpp_filter_frame(qsv, link, in); - av_frame_free(&in); - - return ret; -} - -static int qsvdeint_request_frame(AVFilterLink *outlink) -{ - AVFilterContext *ctx = outlink->src; - - return ff_request_frame(ctx->inputs[0]); -} - -#define OFFSET(x) offsetof(QSVDeintContext, x) -#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM -static const AVOption options[] = { - { "mode", "set deinterlace mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, - { "bob", "bob algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, - { "advanced", "Motion adaptive algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, - { NULL }, -}; - -static const AVClass qsvdeint_class = { - .class_name = "deinterlace_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -static const AVFilterPad qsvdeint_inputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .filter_frame = qsvdeint_filter_frame, - }, - { NULL } -}; - -static const AVFilterPad qsvdeint_outputs[] = { - { - .name = "default", - .type = AVMEDIA_TYPE_VIDEO, - .config_props = qsvdeint_config_props, - .request_frame = qsvdeint_request_frame, - }, - { NULL } -}; - -const AVFilter ff_vf_deinterlace_qsv = { - .name = "deinterlace_qsv", - .description = NULL_IF_CONFIG_SMALL("QuickSync video deinterlacing"), - - .uninit = qsvdeint_uninit, - .query_formats = qsvdeint_query_formats, - - .priv_size = sizeof(QSVDeintContext), - .priv_class = &qsvdeint_class, - - .inputs = qsvdeint_inputs, - .outputs = qsvdeint_outputs, - - .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, -}; diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 704db8fdaf..59bf83d7af 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -102,6 +102,7 @@ typedef struct VPPContext{ char *output_format_str; int scaling_mode; + int field_rate; } VPPContext; static const char *const var_names[] = { @@ -226,6 +227,7 @@ static av_cold int vpp_preinit(AVFilterContext *ctx) vpp->saturation = 1.0; vpp->contrast = 1.0; vpp->transpose = -1; + vpp->field_rate = 1; return 0; } @@ -257,7 +259,10 @@ static int config_input(AVFilterLink *inlink) if (vpp->framerate.den == 0 || vpp->framerate.num == 0) vpp->framerate = inlink->frame_rate; - if (av_cmp_q(vpp->framerate, inlink->frame_rate)) + if (vpp->field_rate == 2) + vpp->framerate = av_mul_q(inlink->frame_rate, + (AVRational){ 2, 1 }); + else if (av_cmp_q(vpp->framerate, inlink->frame_rate)) vpp->use_frc = 1; ret = eval_expr(ctx); @@ -701,3 +706,30 @@ static const AVOption qsvscale_options[] = { }; DEFINE_QSV_FILTER(qsvscale, scale, "scaling and format conversion") + +static const AVOption qsvdeint_options[] = { + { "mode", "set deinterlace mode", OFFSET(deinterlace), AV_OPT_TYPE_INT, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, + { "bob", "bob algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, + { "advanced", "Motion adaptive algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"}, + + { "rate", "Generate output at frame rate or field rate", + OFFSET(field_rate), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, 2, FLAGS, "rate" }, + { "frame", "Output at frame rate (one frame of output for each field-pair)", + 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "rate" }, + { "field", "Output at field rate (one frame of output for each field)", + 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, FLAGS, "rate" }, + + { NULL }, +}; + +static int qsvdeint_query_formats(AVFilterContext *ctx) +{ + static const enum AVPixelFormat pixel_formats[] = { + AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, + }; + AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); + + return ff_set_common_formats(ctx, pix_fmts); +} + +DEFINE_QSV_FILTER(qsvdeint, deinterlace, "deinterlacing") \ No newline at end of file From patchwork Thu Jul 29 05:25:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29092 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501014ios; Wed, 28 Jul 2021 22:28:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyMcTPXdDM/JKuXt4qXUlza0SLFYPLyoKH6UCdGk2sHpAK43iI1xybKXZkJFPlOA7GYOFN6 X-Received: by 2002:a17:906:a283:: with SMTP id i3mr2848691ejz.528.1627536481670; Wed, 28 Jul 2021 22:28:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536481; cv=none; d=google.com; s=arc-20160816; b=P6WVSiEWpkaIvO5/LBV4xd6msiwRNkOYo6i1h06WDh5M7jeIqgks4J7yID6u2o6xGk WZ51FFDiOdlcjFTZxMSR5hJTSS9fOkdlfvSKUDwHsOM/fQRuk7iW/TMXB5u2dxG1NEpy CeQdRmZu5E8mkb/C9JtO6bpLfGMdK1igh4DGopzhPW2GodqzBDUhYnfY1rswL3G8ZWNw Qh+mkIFDebKLHAzEXTwkUlUgDWGDVpujVKDG0IoXdymtLW9FuVHlohoH4W8dKVEsLoFh 4FR3xj09qCCmOLNfqfwOqVOxXmarnA69yFiqKKSKNGN/qKoV0DkqCtwbOidHijYE+OgL nRHQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=TFjHFcA+IipgzI+EjCaDW2TYvGap0SJhRqQFRXnIniY=; b=m8UzI1ofM/2dMez/qjnG418n1e+/AVzm1ea8HO9bQdgbX8kJRwbBrhYsqFDxAQX4Zt AVCABPq20eFu88iCOHh42jdNUCNhSD57qM51L6aRv5P0sDPXX7yqb4Pl5FtJtyeVUIlA tYPHTb6iPS0zMR4SFMBRJ7IeNosMd4vU1szRp3Fw1wgWGWHGznfUQFd1kiAybnorlUDA JcfdjA99KEHvZDOpu3eSRoY4MqHRp0vkJO2U4bNDYzZVcbBoQj95LtaOPFGmP+vzL+Ca pWO8ggNkQ0c99YzDrFdkWSo+MmlTCoomCxRIpkXhDlbvRZb4qzwDe5OLj7z60iysvGyq vT+A== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j4si2015935ejm.726.2021.07.28.22.28.01; Wed, 28 Jul 2021 22:28:01 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F337D68A54D; Thu, 29 Jul 2021 08:26:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 935C568A464 for ; Thu, 29 Jul 2021 08:26:15 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922214" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922214" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:08 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730181" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:07 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:07 +0800 Message-Id: <20210729052509.30992-20-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 19/21] lavfi/deinterlace_qsv: add async_depth option 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4rqqDo6PKQQo Allow user to set async depth for deinterlace_qsv --- libavfilter/vf_vpp_qsv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 59bf83d7af..67e362596e 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -719,6 +719,7 @@ static const AVOption qsvdeint_options[] = { { "field", "Output at field rate (one frame of output for each field)", 0, AV_OPT_TYPE_CONST, { .i64 = 2 }, 0, 0, FLAGS, "rate" }, + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, { NULL }, }; From patchwork Thu Jul 29 05:25:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29099 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5500949ios; Wed, 28 Jul 2021 22:27:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyOVAlmUWBUNdXzOrNkUcuwUiaxBKbJnECSJo6ii0lYqPiReSvY1J7TEJGrNzxxfiTDE04P X-Received: by 2002:a05:6402:4c5:: with SMTP id n5mr3972807edw.322.1627536472811; Wed, 28 Jul 2021 22:27:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536472; cv=none; d=google.com; s=arc-20160816; b=Gq0WFq7Yt5iR/sBJ3UsobUH+uy7f4dU/r1xC9oKXTYUQAqKsprzr3JMqbG9BrSLQC/ +wxzJuAaQO6WtqCjNExPTkwlOTm/sXU8xINxBnHODooLx1NqurE/9arE5vuueCm+m6Wm LnMzlsL2B3sPj6wKgqZkhL9iPSUIrn3hOXJBVNWDmStufcT3TbhCcSppY6LS5rOI8Mlv n03hWi+MX2oKAK9xqJZn7Drm6m1TnVCwxKHtOCtg5FuY++teNT5LatniHqVxIvAHtUS/ tEYPiFzB69Tsjle0x6lQJg6z+JQYfRJeurw+XVw04J+f0ZM1ik7iGjTgOLFIVN2vWD2h q6Ew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=cn8KKUAeDtYbBGypC+SrjWv1rG8eqBbaqOk2xPxSQtI=; b=kPVmIGtGyyzfkOF6IHftd1aBESZ7EX/f3pknJXZoTBrURI73dQJsA/NZbjG1NswjKt +gZBV+C20iowO9N/RIdWo8AJNC/4DOgbUi3kD/7BUFpDYnOfMu0GNsHDUR9JDfW8LO7W zXn4Dk1h0+del5AFyQTiInL8UY/Dyvqm/RYcOTYqvhtWDuVNXie15gnH0DIlEDu+3aBh BezvFet5wTxuLX/6xFvIkdzP/ImXAzhDGYQ3mnbDtXrY1tXduhLdeYxFInBJhBYfVVo7 O5aY8oGwhdLwHGJIwvenUwKY+yzWJ/qc5iN44OFUmhqP0+FC0amwsACJKBhIHudAEP2v 8R9Q== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y15si1904650ejq.648.2021.07.28.22.27.52; Wed, 28 Jul 2021 22:27: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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 08C9668A544; Thu, 29 Jul 2021 08:26:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9378368A466 for ; Thu, 29 Jul 2021 08:26:15 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922215" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922215" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:09 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730191" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:08 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:08 +0800 Message-Id: <20210729052509.30992-21-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 20/21] lavfi/deinterlace_qsv: add more input / output pixel formats 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 7eK8RyND2HrI NV12 is added in system memory and the command below may work now. $ ffmpeg -init_hw_device qsv -c:v h264_qsv -i input.h264 -vf deinterlace_qsv -f null - --- libavfilter/vf_vpp_qsv.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 67e362596e..062a7a1fc5 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -726,7 +726,9 @@ static const AVOption qsvdeint_options[] = { static int qsvdeint_query_formats(AVFilterContext *ctx) { static const enum AVPixelFormat pixel_formats[] = { - AV_PIX_FMT_QSV, AV_PIX_FMT_NONE, + AV_PIX_FMT_NV12, + AV_PIX_FMT_QSV, + AV_PIX_FMT_NONE, }; AVFilterFormats *pix_fmts = ff_make_format_list(pixel_formats); From patchwork Thu Jul 29 05:25:09 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 29106 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a5d:965a:0:0:0:0:0 with SMTP id d26csp5501177ios; Wed, 28 Jul 2021 22:28:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzqd2YWWtMJmoe5M3OoH26DSZr5SxkyNFVL8VI07wr/7oZauLuwQF3o9S6p3phha57Vt7h4 X-Received: by 2002:a17:907:7895:: with SMTP id ku21mr2859568ejc.265.1627536499519; Wed, 28 Jul 2021 22:28:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627536499; cv=none; d=google.com; s=arc-20160816; b=j+vJn+4mLGKwL6DYuqrKJOOwXzGrF//4JDB7s0tiCRObdE0Wtjw7Y3s73Pcp48Afu5 gMuR59lcIKRObLA5aPq6RZ1Z5ozOTA/Lok0k7yfhfwRRb2B+gVHPcTBvGS2TbNIPBv1h 1sSMVvg6XxHSS7erfWrzJPqcJarq6MgfYAKdXVU5pPxdeWGsdX0VLS6bWoVmrTSi1bHJ 9tsYNX+pqrkkxNptsjHjThlyMJNQiOCAU8cN4Nk2bxVhkF3aucbcw9DANH3yfBbhx6IA 8szzkQNxjcBTn0KAwgHi0bhwE7qfATxaKfQbDe462kLLRx6hG80DtYacT1ZA2TTrmtSd 64Ag== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=k7GQZR7axFCNSyqtJbuoMcXV5U1us7nBWP5hRoUlZqA=; b=tSTWpimmg/TG7wYL9bI59MqEVuj8qcc/73OOnONdk7u5/8lBCd1jiALweg0puwoIGw 99nV5gXV1WhhAAT8T8osA6Qv19nlEJP3/JLOYcX3Ag9XW/ZzzKPvzrbth2/mZ0HzHtSv qlNrJgAW4MPC9V5RhhF4D+dukupN9Fno2K6Qc6ehqk0Nj51HM1qI3LbGq426LmjiWIeL Y5aOEM6qmp3zdALBqRNUuAGv2e5Dqaqm9uauUixqMIXeMUc0RFSmaBmmqNfd3vq3prX8 FX2Bmb4ZHuDVFrcEVWH6iV7jrB3YD74X7nq/Pg+AeIuLBcq6nWS1UnN9qUeJ/IRD4X8v TQzA== ARC-Authentication-Results: i=1; mx.google.com; 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=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id l15si1940844edc.559.2021.07.28.22.28.19; Wed, 28 Jul 2021 22:28:19 -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; 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=NONE dis=NONE) header.from=intel.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F22EF68A588; Thu, 29 Jul 2021 08:26:23 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 857E768A473 for ; Thu, 29 Jul 2021 08:26:16 +0300 (EEST) X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="210922216" X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="210922216" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:10 -0700 X-IronPort-AV: E=Sophos;i="5.84,278,1620716400"; d="scan'208";a="456730198" Received: from xhh-dg164.sh.intel.com ([10.239.159.167]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 22:26:09 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Thu, 29 Jul 2021 13:25:09 +0800 Message-Id: <20210729052509.30992-22-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210729052509.30992-1-haihao.xiang@intel.com> References: <20210729052509.30992-1-haihao.xiang@intel.com> Subject: [FFmpeg-devel] [PATCH v4 21/21] lavfi/vpp_qsv: allow user to set scaling mode for vpp_qsv filter 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: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6eDlhaevR5Kp option 'scaling' accepts one of low_power and hq $ ffmpeg -init_hw_device qsv -hwaccel qsv -c:v h264_qsv -i input.h264 -vf "vpp_qsv=scaling=hq" -f null - --- libavfilter/vf_vpp_qsv.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 062a7a1fc5..fa2effa270 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -637,6 +637,16 @@ static const AVOption vpp_options[] = { { "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(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, .flags = FLAGS }, +#if QSV_HAVE_SCALING + { "scaling", "set scaling mode", OFFSET(scaling_mode), AV_OPT_TYPE_INT, { .i64 = MFX_SCALING_MODE_DEFAULT}, MFX_SCALING_MODE_DEFAULT, MFX_SCALING_MODE_QUALITY, FLAGS, "mode"}, + { "low_power", "low power mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_LOWPOWER}, INT_MIN, INT_MAX, FLAGS, "mode"}, + { "hq", "high quality mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCALING_MODE_QUALITY}, INT_MIN, INT_MAX, FLAGS, "mode"}, +#else + { "scaling", "(not supported)", OFFSET(scaling_mode), AV_OPT_TYPE_INT, { .i64 = 0}, 0, INT_MAX, FLAGS, "mode"}, + { "low_power", "", 0, AV_OPT_TYPE_CONST, { .i64 = 1}, 0, 0, FLAGS, "mode"}, + { "hq", "", 0, AV_OPT_TYPE_CONST, { .i64 = 2}, 0, 0, FLAGS, "mode"}, +#endif + { NULL } };