From patchwork Mon May 17 03:24: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: 27798 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2456960iof; Sun, 16 May 2021 20:28:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxE1mjoYndcVuOuv50xhN6P76iwYU2vltw6C0U9v68DWi/hvwrGQfEHCNPBnfV9YQO39RPg X-Received: by 2002:a17:906:fccc:: with SMTP id qx12mr15987780ejb.21.1621222115407; Sun, 16 May 2021 20:28:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222115; cv=none; d=google.com; s=arc-20160816; b=wiRBzRZnvija7JviHxcyBj9S70Vvst/9aTvuBqK9xpb2BF4xPyXprgpt7yBYUISkT2 oKtA/yInZVXUgzsrDdrIHK2nQV/fa3l+rehRW8i2u82iLmIn5i7F1N794He/fVWkShZC pr8dhEozcqg0GwrSWsznXwhqHr4cttVtxTFd2ZYV9AQ/181ojZSo4GfPveewYL4YNcKx e7SgnIoLW5IqD30kAXX77XXnAxB6WnZQW8c4X6AaW8Y5o0+brb12B3hsH90FNKCvi2Ep uzjQdyY13Ysh+QSvEbyJbpduHfkerAvCzXbojGk0PKpNKTKvDI6Yls9c/HPMJv1GgpUi 2fOQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=XIAGT9gJ9RqsqgtMt49my9CWlN0RdF/kDMJDHKX1ItA=; b=wtz/94jgkvO944zOD5bHFgH/s4/HytaO7Uaxo3upHsthOQ4EPxEEqfYD7uSzGEkcta AsOvzeU1SbWwWYodbGd868EMHpMEgVZbK4UnRdV25BEhRM5YHvn6RJFoNUOYv7RJ7Gi6 HmLcj/Pg89e4zh0v0ML9aFlmDq53iLvP49KtpjAqC/sd21zTHkyaPmZ7rbJ1aTF8c5aq tnv5KIJ63CfiEKArVpdQQQ1pHcSXtc4U0plwhDpnFmBQlpKJZU3W00rPVxBRAG6JhyK1 86pUk38I5hJO6SdcUn/zuDshG7VU6dgJDk7x4sfA964Q9DsP5ZRvDYKdsberPd2Zcljr /eDw== 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 z22si12389616eja.705.2021.05.16.20.28.35; Sun, 16 May 2021 20:28:35 -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 ED347688181; Mon, 17 May 2021 06:28:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D8B5E6807B4 for ; Mon, 17 May 2021 06:28:11 +0300 (EEST) IronPort-SDR: BKXaHqxrw4NVVF5mH37emjo944vxgCxazUSzXueqg7yqKX6tQxY+kVUBzUBHmSgqU0Emr0otqL DKUKSSEBCrZQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498227" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498227" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:05 -0700 IronPort-SDR: Otebz7nQu88vkn7XYU+/LBDHpQa5kzxCapqEh8NYCM0dTI7RWSUtM69Abw0N5Q3KUIXx5M+URn dEDQjq+CzURg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277601" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:04 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:05 +0800 Message-Id: <20210517032426.3376661-2-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 01/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: olRF14k+o7v9 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 7a4afd77d4..0b978d6528 100644 --- a/libavfilter/vf_overlay_qsv.c +++ b/libavfilter/vf_overlay_qsv.c @@ -58,10 +58,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]; @@ -231,14 +230,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; } @@ -300,7 +299,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); } /* @@ -349,7 +348,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 b9ab5c6490..72df8a8373 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -48,9 +48,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; @@ -94,9 +92,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[] = { @@ -132,7 +127,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 } }; @@ -308,7 +303,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) @@ -463,8 +457,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); @@ -477,33 +472,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; } @@ -514,6 +507,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); @@ -523,7 +517,7 @@ static int activate(AVFilterContext *ctx) } } - if (s->eof) { + if (qsv->eof) { ff_outlink_set_status(outlink, status, pts); return 0; } else { @@ -561,9 +555,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 Mon May 17 03:24: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: 27796 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457066iof; Sun, 16 May 2021 20:28:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyiITNNOpYkCOpHGUUiyVmfKFZ+P94I9kLz06+gT2j3uQ9zlQkZpAo6Q3RceeOe1Ln2oooD X-Received: by 2002:a50:9f05:: with SMTP id b5mr7462866edf.24.1621222127092; Sun, 16 May 2021 20:28:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222127; cv=none; d=google.com; s=arc-20160816; b=MaSEZnDMSdpoXIIJP8Ieopval9fbVG0XYsSSGDGLdSBICLXx67uxruBeqS4STn6Do0 qmV2REnZpHp1tDWBAHhlzAL0gVz7Pps4NGaiAL2Ck8Gty1ncyHpUDWauGH6o+MXMfv0H J6OO0fLrjNfXwat88Ae4uZUkTuskB611QHGB2jwyQpWiTRRxL2zbhTNon8vb+evImvEH fJXB8QBhq+ucLdYRSqdAgvJw8lXVs3QjUFZgLZVZ8nKIdiHp4jlWXJ1i5+zdHql6+EvL C7hHzeu8mt3DM9XLbtRff6cRyRCYSUOEWB1QsbO4tDiCdepcD8L1Z9JtSdGrXqorqRoL 9W4g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=JvKn3l2l92EvQrFvbFL0Mrch/OXpdKanTzL616wkB38=; b=Q68hMLBd72TUPhavWdWaxCs4J184WYL/9wD8IJY3N98Rk7BMaosxxoxmhgIowAxsQ0 W7A75eOKJ9HIaFw7SrdZjuZzn0eQiRvLqlcKpBBk26XDbZ+kk37VxmtOYm3KfiO0ZsVG 9x/GErnkJOQ3SGxgOmQ/47nWhFSHyiF5qvuBxGeTFo8WWwAx7fitDCzHSUIfOQJD3URy 7FdvbLrFqBxMvHU7lRJGjf0shKogMzAfdb5laQP1WOkGMPG0M9/t6YHOHFTqdR/dN/OE EwTjsMVryVWoEwCq5s3VAeaA8xW+uvI6xPg6bM52Rcn/5dHI/cMD9K5Ka93Dq2YnzAxY bvtQ== 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 k19si15049342ejv.98.2021.05.16.20.28.46; Sun, 16 May 2021 20:28:47 -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 0D5C0688388; Mon, 17 May 2021 06:28:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BE631687FB5 for ; Mon, 17 May 2021 06:28:13 +0300 (EEST) IronPort-SDR: h3GMlxhlTT4B3WiBLwZAmoX7Z50Bi9Do8mun/u5tjH7fa2ZlxyQlrz+qLRG3NbpgzfJGI9pGHy 1rc/yMwDQkjQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498230" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498230" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:06 -0700 IronPort-SDR: yTCRD+ZjihZFyX4aIstOmdRqREgWS3zqrXnwSah9cyNw4ntm8emYrDz5TcrWvyeefnPIl4KGW7 Zj2J9kxZyPdw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277605" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:05 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:06 +0800 Message-Id: <20210517032426.3376661-3-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 02/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RCtFEPxE+RyX 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 Mon May 17 03:24: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: 27797 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457175iof; Sun, 16 May 2021 20:28:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxuvFbL+3/DYa+oIj06o2iyNfDXssgsNqw2+n5/UtNVvv0YPkCku2/KoyDCF6DFupkVNloJ X-Received: by 2002:a17:906:b850:: with SMTP id ga16mr59303141ejb.161.1621222139024; Sun, 16 May 2021 20:28:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222139; cv=none; d=google.com; s=arc-20160816; b=0zRXJJql5wplVdYUJvC415bKihQZzBwVRJ5GgsBXzaCHHXXsAUl9OgK19p8pZ9qiIA 0Lt9mwrbnXryg+fjdxRex7ipVGvWVsytkPXR7Fn/csyzaM3CLW+7DTS/YsNmI6zJlOx+ oDFFoRoVaSjb/7NAkHomwNn0ybSfF+k7Z3xIP7q4IZMf6k1LhalWJzSZ4t1tAhLk6Keg isbJSKA5lb4o9eQ/C6UHjO8t1xxVCSR/LfwwhOVngOobMQcu/s62BgguV1nAZ3bAbsbC 8XGH5MVnKRuGXlziUny2d4GNIqnqYQr9hWrDL46tk3rHZLAAtr0s1XK7qp+T+e8lF7AK 931A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=L+cy/Flf2sdFnWD101ONmtN7oEnQczY/S8TsOu1vJ+o=; b=h4x/m8yJKMoWC4Eim0aSxC8HQk088tEeBiJfzIf3JtNn2kBQ+ZKovgCNdYApQf73Gi xK/II0mYkh3oS5IEiTHzEz9HBR7LDQNV5jSe6ZCUS1OVdJ33OaUx38/tJb7wjpaQ51aM NI9ylAOPewh21kNzJ1Dmv7KF8/r0jtwUH/P0wFfK78kHLNH+MB+GrH7oBuAq0ucMvaAM 54sw0XZuoVw3mAg0btr/BNWoKRtwXH8VnFMIWaatTEJz4Io3NHUFqu3LyX1UZ6cZv2w2 07ZZw+QW7Gh+zlk1PrzZlqmbpGZmD748XVgdxnRsLfVD+S6scBFFeuPlIsMRi3YA4IU2 z0Gw== 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 v3si12882913ejb.173.2021.05.16.20.28.58; Sun, 16 May 2021 20:28:59 -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 122356891E2; Mon, 17 May 2021 06:28:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 04A83688385 for ; Mon, 17 May 2021 06:28:16 +0300 (EEST) IronPort-SDR: cWGs3a8eZT1lTy+gRjXgHeh02yOqIYpADy4d3z/XUxaHcaXvyhiCeLkrPdbJ5W0W9C1crJZVlU aGi+rUAfCJsQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498232" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498232" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:07 -0700 IronPort-SDR: 7QKF1NMXrTjl6Dxna16B4zEVnk+GGg5KOL0nYimrHCxKqhGpz4CC9Bx+KUgr4+thGFjw9wgZDV vZHZgRXITLVQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277615" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:06 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:07 +0800 Message-Id: <20210517032426.3376661-4-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 03/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: aD062Wl0AiA8 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 Mon May 17 03:24: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: 27803 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457256iof; Sun, 16 May 2021 20:29:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyTtn81fK0PLNoETjbL95FTEfKZT9G7yHsDpSEwGrQfRZ60ouEV2urk/1zM8mLH9jWR9QYB X-Received: by 2002:a17:906:24c7:: with SMTP id f7mr10386629ejb.511.1621222148262; Sun, 16 May 2021 20:29:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222148; cv=none; d=google.com; s=arc-20160816; b=YBJf8AFi16ncehLVoNTFM0n+YhsQ+I5HIIRe+udFmp5+G210S014YrcB7p53pYUG4t CAKzk5ocqE2Y40+rBLSh0T7KEDVZS3X6Y3wvMje/hgW5DM1h62t8USoel3aoTW4Dz6B0 t/SdRRKHRAoZrx16a04giUinPnSScfdrfG5wdAM7AOHXxUMsytVLbXHHVrBiq4HCJh1R aM9QFyb7198kDR1blGf6ZGw6gwmx7byP6s9r3tI8tNs0yIIYdyfF6CeHvk9lYkPEwUT5 ZprewBcGFfPKOeyAlkDhm04V4TPXlw4wvYqqbMeKXebYPVDOQpKXXQwq8n34EIcCc13K W51w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=d/YxUnDXRxiI3rqUlwC2YwYdgbQBdV8XPEYKs44zSzo=; b=rU8vTxbi79FDVgyHyBX75i7G1BGh6CDwA6lApKdLSqmEqNvFaZHuWEE9xB7xpazCDE u0jOo5J53ug0AQFOJ+G9GCrdlI6ypTKwF50DHd7hRb+hYA9olU+31GF5d4N1RKso60vk H8wybLGTYl7YyyQNU/qVpXqs4sDoLJAGkvIJ4/Mj37TcAWkbjLm7f9RBv72H+ijsWcrf IodDsyAQtnXv1L3qU0eBhgHjn16og6EEXvInuybGmYBncn6dGPWOhxgXfRgn4gC+1LG8 MiVvH5/qO58fEMc/Z0nP99dmbmRIrZcZEpcrTYS71WK+kJlCl753x4TXJKX/Nw2uMScy vicw== 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 z26si1957841ejr.452.2021.05.16.20.29.07; Sun, 16 May 2021 20:29:08 -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 23FC7689248; Mon, 17 May 2021 06:28:25 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C3984687FED for ; Mon, 17 May 2021 06:28:17 +0300 (EEST) IronPort-SDR: O2ELKVBpbOdaVjtOtSuEwE4ealAb/JSgKEpYJ2vxMPwZZ0CPphVHTRh3yQsNUk02/JlU3OZ+rt IBDAXZk7AK8Q== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498233" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498233" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:08 -0700 IronPort-SDR: lw6EunqNptRy/S7vtm8dwn4L0K+OMHro+coArryvkYQrGEn4hLfNrBWgrU1YIJwiGzMt3D6BoW FWsI+d0houhw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277618" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:07 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:08 +0800 Message-Id: <20210517032426.3376661-5-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 04/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zj1eSqYoZv4R 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 72df8a8373..e7d2c9385a 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -141,18 +141,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 }; @@ -184,12 +188,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); @@ -198,15 +207,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); @@ -216,7 +225,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 Mon May 17 03:24: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: 27810 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457330iof; Sun, 16 May 2021 20:29:17 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxvhjIitkkgt6DWkajw8O++9yJ7Rd7H9IBpul5TaqyeqC+ulsqRq31N8+4w8ErIBazweDU4 X-Received: by 2002:a17:906:600b:: with SMTP id o11mr59679361ejj.345.1621222157205; Sun, 16 May 2021 20:29:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222157; cv=none; d=google.com; s=arc-20160816; b=hbKwR8O0EAMcgS8c7OH6EuYrJ5JcypIffRACQsuVxLAGnF8ffOeup9Iuc2gMFvU9XI pgM5YcEEPgHmt8/dyDB4F0d5jeKLmlAtauwB/EKd5Up7KTfFY1T5YPCGTxCvMdKo8izq 62sdJuCJTCkz4Uf65ia4PLcZfe3wNqmvPgO3/skHR51XcWhvSMw0mzW/uRfzD+BIIJUK xxhn52QPMYsC9edAaLklSLFIH+yN82Eyev/Qa6buKrpPa/N12cYtyxYLM23L3qzzYSsc yUAtQJME4AD3+dpgXr8yGb6TSQfjBvnH3Q5s9UF8fmaAmwtNTTba99f6cl+ty2kqYN7q qfaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=50EvU/9Jk2jO9NJkew3KpTF5MD2Vy5hsK5R2ThA5Wos=; b=zJzMHcI4mO/ycCMvctDQxclfCqHRRx2pGGgJoqNS0qGdg51nRea7IIwDIAzsQ7kLSl MOfdCtaV+3onC0jwI/YoKgVmvYRNBEghcL+Dc9fYHKPbJsUOEW70u9embZz5LreSdB7d u5MX1WiYT+LUynj8Lc5eQovd0c0jwy7cp3ZdQ9oG4+Nx9byqGzbTZ+uapcICj8r+3nCX 4UUsCstkyM6ZtTu6c/YIvO2OBqDw4qpSh8mKTafRfi44iWwltcPuY9hfQDiHoxzKVb75 ohTdCqm8yBLVPrtIKJ/qK021wOkIVIBufDJT+BS/VD+6CI2Krien9k7xyTpxJ1ScRFHQ AFgg== 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 q19si14075038edv.466.2021.05.16.20.29.16; Sun, 16 May 2021 20: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 161E4687FC5; Mon, 17 May 2021 06:28:26 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5813687FED for ; Mon, 17 May 2021 06:28:19 +0300 (EEST) IronPort-SDR: 8BINiTaTvDNrq20JUq2cXajSrwhHE5eejNKxuZSQavyzycb+VjwYYGnAGPXh12+iXUPvopQpdV bUY8sqq0f7Yg== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498234" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498234" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:09 -0700 IronPort-SDR: vs6iLvLdAP3j8dWrDg2T0MK7gRuKTINtYji91Nu3AGmyMgNf4Q0FIIPCMx6G98k4FArfci4JAW kKQ0a36bR2wQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277624" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:08 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:09 +0800 Message-Id: <20210517032426.3376661-6-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 05/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: H7DVguz4Giic 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 e7d2c9385a..adcfd0484d 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -163,14 +163,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 }; @@ -200,30 +205,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 Mon May 17 03:24:10 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27813 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457683iof; Sun, 16 May 2021 20:29:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwQHFxoj1HDdOuHFBuAk/xFYgUXBfNYiGTGekHQ5j3UfPSwCxXPCcLskNyPHMgYsAmQU6T/ X-Received: by 2002:aa7:cc10:: with SMTP id q16mr49344720edt.53.1621222195578; Sun, 16 May 2021 20:29:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222195; cv=none; d=google.com; s=arc-20160816; b=Y2G/zdL2OiCKvmspDniQ+8pg1S6BrkIS8CYV3UEsRWG8ox5qiIi6dqHICFcLdw6F9q hcNBm7pGlqoqaMWVU0dEdBh2FWSSN+n1HxVO5hUndqgj1LtzLd139arC8YOKrgsqOszp ybtKG09Sgb8AD8QpYa6SsDiYH6luGYbM8ykk7wtjmGI7Aojk9f5L8bg3U45KKnMTABk+ 4b/SEWwPwml0N/q8XwVFMlTx0o8XBgGMHtnEA3pdZRRkJKCWZKkVF3iM1fXXWeamYdbQ 1ofz+8IWvd+o6Yu2dCNFFXcdi3MkEpQX3GGwzbhvhZl4zMiwQ6KEmZB/0Pby/+TbM3CO LQGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=QgRn3bxZ5qeZtNppIHNSF9IFACv7VNkUwt1EbK/++8Q=; b=KlDClO2h7EJrbQLWh4nkWLD8KYD2NDXCP1+3NbzmzHa6IqqnCQmV/ftbtfswDlaNGn /JA/aprGSES29k0UPz8y+R60fuXW4Gyr4+bl6mIzRwTdV3arLLSNJJvT5P7+3yOz8YOI ET5Atu//be1JudY9OZBQly8BvgAWA2eD+3/4423tm3A/VwyzD2MVIoE8daLJGY5p/dDP sEcV60k148iykb0MbtGZd/uBJeRApuAZBVNR8cr7KvyeNsMvs2h9e9Yq9PmD6FSdyFv1 5Re4s6KqdiIRA2O75sNHkzd9EfEKomV7+sImiC6NPzohF3pW1oWSMOfrOufiVpA4nQEz a2VQ== 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 hy8si6991906ejc.439.2021.05.16.20.29.55; Sun, 16 May 2021 20:29:55 -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 5B1BC689910; Mon, 17 May 2021 06:28:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E70A4689721 for ; Mon, 17 May 2021 06:28:22 +0300 (EEST) IronPort-SDR: WTPh2ueIvNEeEY2DeXfx0bVldeYDm+ho9S00KOAho2xx1az+ZK3mSwaBqAerj1HrF4f12X07eS 26IllI2sl3dQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498236" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498236" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:10 -0700 IronPort-SDR: +IWmlwD8Nf3kZDdC8qO6qP7Tr6hE4FGBWLJklHGOb90sEOuZGFJXQ3JPiK0WbXgtpijHcPzVWl 8+rBFz7bWnVg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277632" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:09 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:10 +0800 Message-Id: <20210517032426.3376661-7-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 06/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: RAS9YP6AUtv3 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 adcfd0484d..7afbb3c983 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -59,6 +59,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; /** @@ -122,10 +127,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 }, @@ -267,6 +272,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; @@ -280,11 +286,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 Mon May 17 03:24:11 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27814 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457774iof; Sun, 16 May 2021 20:30:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw78ofXWhmseubxxbVk9sUfk/QnLKUJESQ9LY7EP/t5G4JdXNBfaePqgDvLvkxHEQPR3gNy X-Received: by 2002:a17:906:5291:: with SMTP id c17mr16718005ejm.527.1621222203576; Sun, 16 May 2021 20:30:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222203; cv=none; d=google.com; s=arc-20160816; b=hVE0Rxq0iMbMFxpU5pbf4UFMGK6istTQ5GWsoLh3HpmkzG1cNMO5TLhrbUoK21czOl h6QmwMgw7DU035HmVrmDZIC9nXqzJ6MFO41j/p4mvEBsIO6JQJbRJuEHeVaT26klN2Gk +WZ2o4V86V98NLKYrDC6bJzud1ZpYS6LHMihuMZQQklnXj5DIofqHN26Dseg/xbOUOiL L+UeoF5BaDVPLmt44xQjg/CZPSwkf2fU7uDwXose02ugveJfUutYWMHW1Th+5lKC0LD5 yW8b8n9m6AMIJIIkwPNAtR/Eu8Hg0cQE7yoEoigRr7g6xRmbfZDecfGjgu8tw8Ib/3Qo yJLQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=9YRI4kAEWH5Ij++lxNVqv9FDI3gbsjcQ9MYr3zWsA/U=; b=PzRo16Slkm7SZKFZAfTA4Jsl6mBeFlFJUVL6n+OcpxLenBHSIzdTiJ8ojiEclcgqTR F7X347Nv+ZnpQC3FZi0OXvAp0ISbYsgumLfZLTB24KCKQ8Pvgx8PQdTMBAkDeCf6c0uJ k5qqhwtcxuS3iOFHO5JNRaDGnplWBXXvZn7U1w4KvppNeWLmt0bRH0/+ikofQOPVLVtB b7FMKq+Com/OgJX6uHEGhLm4WKe5Ri6b7NJGaNcJQPi1LVbr3TsS/5fVFGmEny8/HhJF exChrEyGqbC1uGhmljULchWoEefHgkTDIFMQovm9yluz3l6qoN4w3hcc/v4kE/N2+uNs JGjg== 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 ds10si16154785ejc.719.2021.05.16.20.30.03; Sun, 16 May 2021 20:30:03 -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 6161968994D; Mon, 17 May 2021 06:28:33 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D488068981E for ; Mon, 17 May 2021 06:28:23 +0300 (EEST) IronPort-SDR: /Hw15ibZqKBvjaPUnbjcQTw24BBl/NeNZBTk87R+hIUNnIq6kEFnZCzHihU55qhnClNCuo/Ki0 AA54pRDcm3vQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498237" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498237" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:11 -0700 IronPort-SDR: jbF9V7B2TyQ+lt6dJLgkTi+Oa9DZtrmxXp7dIZ7ARZem56GNpGP3mO855xzNIgBmxfaCjtL1D1 +H5mswlz3ZKQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277639" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:10 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:11 +0800 Message-Id: <20210517032426.3376661-8-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 07/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: jByo8j5NjrRX 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 7afbb3c983..c9a7b0ceb9 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -373,53 +373,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) { @@ -466,18 +457,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"); @@ -487,12 +474,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"); @@ -500,6 +483,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 Mon May 17 03:24:12 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27812 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457428iof; Sun, 16 May 2021 20:29:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxizlOkW0ReEMGw+ybNMAaDh5PX5IjnyTtea/k0pXCfeHDBA0vTAREardUF9CvH6jLX8sOB X-Received: by 2002:a17:906:f894:: with SMTP id lg20mr22691432ejb.355.1621222166456; Sun, 16 May 2021 20:29:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222166; cv=none; d=google.com; s=arc-20160816; b=g6HI/ARtf0Tqw48rS4paS7T3BqFFKoIByubTEiy6pZ9IkWzmHNxtaP3w1v+I7m4caD O77UId7bZTjkfqP/p+81xdyRtnEsg5zDzpTQoiTUJjb9qzuWrmgpOHz3U/ALLO0ekDEY Z/OSSObmCLZYhWYYFys3N1LA9KftYS4MziHsGTQKr5MVUpg9AQ7DCqDC4A22+Vygt4u+ 5wuM2jO9pjLY7VIL77v/jNorba8Re5KfpXAM6cCqE6Aa01Zs50oOg16jcN7nX+zFRgW/ ioR+MGPgTB9i7ih2R39Pjh3+Ut6NJjP+FoZe35LHXm4sLVwavhc+502OQblhcplRPuWx wWpQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=4GjT3PbphGlNTsGEuRSevxvk34tvelPiCsi747kej8Y=; b=yz4Fw251RYsWp8dZu4yKEUlLc0PPfMHRQUh7KEQNaA8byxGBpMnncDonv8L54jOOi6 T7E8xtZmM/y1D4KHMev5ciPXNgEdpJRiLoYS2w3Nk5aqGT8b5CaKw4ftA3pDhxaC4tYh 25aDPHBVNA05MCB0xVh8NxMO/mnL+9Otl8Ha9pYYvwTc03kOW5qs9v2UADAw2BNnN49Y Ta31AcSZJGTjyiLLgPafAYi6r/dWcx6yEiCLpPImqA3x6PE5cT8fyxnW0mvHzDU0m+0c janIHYmvXDNvALNAVq7Ba4/tvENInLvw2M7rS1CBMmHveFhZV6wplEuS800qiRVkEQaH cY5w== 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 w13si6789090edt.101.2021.05.16.20.29.26; Sun, 16 May 2021 20:29:26 -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 12385689247; Mon, 17 May 2021 06:28:27 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CC859689247 for ; Mon, 17 May 2021 06:28:25 +0300 (EEST) IronPort-SDR: hp1JpAP1eWfrMz2YR9QPZfaL1EZ4sxhlrRJv4QvMHo+A3LS2W0SrhRa7WWHg5uunP9/q6od8lI l1HiwogpjH0g== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498238" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498238" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:12 -0700 IronPort-SDR: /15pzcTj9pN5rL+nuhd6kM1O4LYNXReovFIcJhRNNn1QY5PM3VjTYFcHUaZtFm4TDaNfFpwIiV mBIe3MYHcXfw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277643" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:11 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:12 +0800 Message-Id: <20210517032426.3376661-9-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 08/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Nk9D8ArO81Sk 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 c9a7b0ceb9..fd45c4f352 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -43,9 +43,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; @@ -58,6 +59,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: @@ -97,6 +101,8 @@ typedef struct VPPContext{ char *cx, *cy, *cw, *ch; char *ow, *oh; char *output_format_str; + + int scaling_mode; } VPPContext; static const AVOption options[] = { @@ -483,6 +489,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 Mon May 17 03:24:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27801 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457499iof; Sun, 16 May 2021 20:29:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw9kWO3/sbiOZTubzv8smDzijCdi1/XaUyVeyeVsBMQOc4Jo/+eYktU6YYsUj6CoK4U61D8 X-Received: by 2002:a05:6402:12cf:: with SMTP id k15mr69078239edx.130.1621222175757; Sun, 16 May 2021 20:29:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222175; cv=none; d=google.com; s=arc-20160816; b=gkSpjAlwfXw4F/Rpaj5Zq7yb5eiDXZeEUlmpfgmCk1S1B7bY4Opt3SK4inzNpp2r6X fiGvKhmqNqgf945UiUJwySpiXC5CU4OUHCJUNVdO9ym95xPvmTJDILpNmp/Upa2XCDHY hyL68mUp0s8tLpv/mTTRENTF3YhxMn6QHrjbkwejkvD1UVQ1y8ISZkPBbBRHEopnwyhS aVFlJl7VBD+WYRPWosptBSWOe/HTimrHJeD6cDi1915B9api260PPV1cTzWpx+ChZ5ZV Bj4fJp6OjmxydYCcxG+pdMtHiQ9m0wcsFZgiuuZpSRaegUGe2rimn8pR+8XSGQO50WQ3 ilFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=Z2YgO9VBeiW4AQYjIzia+71C4ItfNoltX7EIHz4gr7c=; b=sw+zdU4dOcHYGcIo6PB+/LLAKsXX1vsqKLi9gzyDV5ccg4j8kDYXfBrv+kKYfwA5Hq qzkNx62JPFvtXLOgK460r2wthJBkNVaBw4fy2KgbUdjUxAHkInuqnjY88VY/e9aUXnNZ kRuZEIqTj2rduXi1nTIFXlgqM91OQ3OrvqDFCa8xXT4Ojilpb4oE3v2QNqTayEP7RU44 lCTP7qKrIMPvZP5s1Fs+a4oijTy1eu107lzE76tCeCZdsYy27PPJ3b5WVpEqZB38mZEI m4uYx99qujhEAQnXFLBQdfy7jxKaO7pyYCla7LlAMHX7oo8WQ0c15lhXopQXOztzUTNO ogGw== 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 o6si15228876edi.18.2021.05.16.20.29.35; Sun, 16 May 2021 20:29:35 -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 33C4C6897BB; Mon, 17 May 2021 06:28:30 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CE5016897E8 for ; Mon, 17 May 2021 06:28:26 +0300 (EEST) IronPort-SDR: FedbemoFdP9wu3WwO0S/yqn0WHRdDlcxMVCbilzHLgFF2zcTi1SEZ45uobxI+emJfF7eoiZX4R NhM1UP2UOHkg== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498239" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498239" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:12 -0700 IronPort-SDR: Scksvzy/J+0cSEXpWvh0KzjzRPjDc6F+kyU9Sd3ypuIRUsevOgUMwIdovCl8+isoSUtDEBHp7e 0y2jGys5WL6Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277652" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:12 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:13 +0800 Message-Id: <20210517032426.3376661-10-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 09/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CrxPXrY0QWG4 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 fd45c4f352..fb950001c0 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -256,6 +256,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; @@ -637,6 +650,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 Mon May 17 03:24:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27817 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457600iof; Sun, 16 May 2021 20:29:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwqDdCkTrPFZFefdPXb4v8E0fifbdSg4hvPj9XMJWQkuDCpA7HasO/9AuBjq8LV/cfgz0jn X-Received: by 2002:a17:907:abc:: with SMTP id bz28mr7393351ejc.262.1621222185999; Sun, 16 May 2021 20:29:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222185; cv=none; d=google.com; s=arc-20160816; b=mjtkQpiZwqzD55xSq1BjWT495uKq99emaLt36jbdFx/A052ikH2sOSTa4tmALDD/fj igOWusVQCACuUd+jUoQgdnh4Gl8+vZpsNuXnRqGnaDgaqykAVG3fEqpMK1nGpG0p1SNY mSqsFQhLbkY14oMNpWJcZ2+uFgm/2ejDxze+uHceqb/GD3v9eaOtjXQr+z+m+uaoLVaG 44amfjWiP0xYhkXq+hh2vPvTMKDj4upKQ3RbQ+g2QlYMcjTYXLpA/Opj3hXkdsnti3iM nA8xNozhUBKGGHwn23k3MF3Vb1GmhYb+rY745aHAWPN4uIQKyAIaA5Fu20a8fmiMhYIm O/Zw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=WmZks1lSTt2lujcv7Ls0LcJaqjMm1/RbnmTB7oavlVs=; b=Y3RIWukbISoSkY++KhpK9ZLGYD/FZW3s+aumydIeivlMxXNlse07SYI1DkGvk0fVJd h6OgXp1BK3x2ez9SRG/nr9cFNiEY9YEGpsvTG57dVnLTmmaDr1prJVFXafWmLeg2aXtm EsRPJzAJIGDWxgBcQuSrOsZnP3HriLizUL3iPerDclMGORnSyfhI90OwYSjGA/pteh2O z62qhe1/rDntkJ9TQASXESfpBx/pgpcTIktOmoKYCD41FwtPmH12UJgrat57NLjsVuJy ovzn3UoEPmklIDTeobdPho3nAuKq2QbEtdEv8KhEDwdIL4+T+75G3+UnSH54m1oWJXjL clog== 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 hb7si12780198ejc.507.2021.05.16.20.29.45; Sun, 16 May 2021 20:29:45 -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 423046807B4; Mon, 17 May 2021 06:28:31 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D1DB06897BB for ; Mon, 17 May 2021 06:28:27 +0300 (EEST) IronPort-SDR: ZSZx6gOMH2WQylAdQ5WMuIf3S3rROYxT3aoeWOz2i6rQgxjJkPR3i8PfE+LSeuf5TzjOXhh3xa mnosUqI8VQQw== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498240" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498240" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:13 -0700 IronPort-SDR: +nHiLvwIs7xZnhTgwTX+zqj3pcSxqDaINabN6memE5Bmls5DPou9nv8O9Z0MgN+heZqhz+kKFe UgVFn3OcPjLg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277657" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:13 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:14 +0800 Message-Id: <20210517032426.3376661-11-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 10/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: JCKo8IDOS1Bx 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 bc81033e3f..9e6bb87c4c 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -396,7 +396,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 vf_scale_cuda_bicubic.ptx.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 fb950001c0..dd3afb5e10 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -659,3 +659,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 Mon May 17 03:24:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27807 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457856iof; Sun, 16 May 2021 20:30:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyyUepNJRoG26hYuTvvSvs4q/RpqduOB+gTYk+9J6ScSNkVSH9gjh7QDrHi/EKXBBZedlto X-Received: by 2002:a50:c446:: with SMTP id w6mr65387387edf.62.1621222213011; Sun, 16 May 2021 20:30:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222213; cv=none; d=google.com; s=arc-20160816; b=VjhNk5vbXhdKf3Coe5lcPZxhXGcLdX9AsXLqlXzn3DnKdN65sXmKjck6IER+6coxje jSXczzuaC9pFj8q5S72jK7rgNAO3fzD7pYAGCssIM394rCr+8ZeAOE6qLRZe728omwhm QHvjOwkS24Ts+jMG1r9lKLNA88WBTbJwP1W6GGutixu/5uf/LXF6TyV/gGKIqiotF+PZ o7yXW6O9rsXQrdVH5ddtt2VktsezpTQf3TaLvjHKLaf2D39ekVtERpox4HWSiQrGF1Ma 6ySDaSGByMqkh0X9Z0wEJBpDkC/KEtILtc6+nU27/Y3FM4QqaZ5ZSyq0SfejBAsHR6qM HcFg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=acYB9MbD7clQvQQzEE2URAEV78hMpPPPfWNLiGdi80g=; b=gadhSNW0xvGtW0qN1YRbd7hCUs2ENeDLCGdYigdlxFOixk2CP0DxrER7pmUXxVhokr X2I7T2v/UHuNY7YyJXJCKSPwF6HmaN9p/jD9XagmEMjh8TrFH3zGyxUA8ipBqR/xtGrR YHWr0mih0e+xz2YsjeQ7JuPXLqLcHMEsYvWzKgj0A9qj9C2UmhVVlYizfbAEhLtmNa0f uTHclIBGeWngqeNspvOtryzjbGGeG9L3ndWkkD3mVFsDWvyOMjKqAmLVbubvSt7+8Nc7 6sC59HiluyqGHkv9OTHQZOGm5ELtbNk63splSElL0lnLL37CaMB28hUIy8BXxWQqC1BU BHEQ== 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 bx6si12658779edb.419.2021.05.16.20.30.12; Sun, 16 May 2021 20:30:13 -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 5E4DD6899A2; Mon, 17 May 2021 06:28:34 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 545DA689884 for ; Mon, 17 May 2021 06:28:29 +0300 (EEST) IronPort-SDR: /tZlafUq8IoaDlISXZBnmgvfyWiYmWF1BS0Hc9DYt6MjmSWEnazF4hwNij9KKKFMW+sRFXvwaw 4BGh+eQ+N1Tg== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498241" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498241" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:14 -0700 IronPort-SDR: CFTVFvB+IqNQrW7BkWDfXxRMLYzX6UWrxlxObYjb852T7qJHRnLdzRy4qhivWWMjOrjVIz6maS DmELi+wyZ/IA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277662" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:14 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:15 +0800 Message-Id: <20210517032426.3376661-12-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 11/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: IMb1dbMO2Zu3 --- 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 dd3afb5e10..03785e9398 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -105,44 +105,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", @@ -589,7 +551,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[] = { @@ -615,50 +660,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) { @@ -688,29 +690,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 Mon May 17 03:24:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27809 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457911iof; Sun, 16 May 2021 20:30:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjYaMNF5VN47cSOBKXe1KA8+LZ3isgShDojrF7SqSAP7DuTVL8xQ4bqVtCl5+1iaC4kdra X-Received: by 2002:a50:fe05:: with SMTP id f5mr67605390edt.288.1621222221995; Sun, 16 May 2021 20:30:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222221; cv=none; d=google.com; s=arc-20160816; b=AibN6VeBRiVFg570e6E0zOGTwbeBT+7o4R9Ne6C/htKAhc+p40SF34FGag5hJMUxg6 FYg6gDjFqWx/d+QCW9veD1iUGY/Y/j3W9pNbzLvGXGWMG/WSx/cuAEF3Tk5WxmpPDTgO UkDoTFLM6iOoh7PNaxji94/5krFQo4JFki3k39nRfD1R1YPZNQI3ghFH/SkF9+c5oPYz Q0oXwjW4WzRWlKOGqa+kLEZfPQf5uGR9vXqNsXbf5LyjEO9nsTZ5cv9OS6OUsnfgIn1x IB62pKJaCIl5JQzUxZPC8cvxD98nVX7mDRDQr88OzbgLas6g1s0YVDzwjPtg9i1X35gj PIiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=gH0L3tTLUIdf1ftHWjTxe6Ms0AQJeJwpTblTZQN4mrA=; b=L7OvFBJLJk4qLNbfU8iztaeJ49sngt4XhGlVLlYIjSFjQHmS611LbYRzlrWUG9xDhI QAVZzQxlBdcfA2EiP0ZE5cBD8leN9rM0dgo5H4NH2N6F2mLf/0HHK7KVlo3m02sVgs5L kXuD+UPuJAbES/8jqWk+VM69kNAO58sRfhlGeoItRTHOrG2guQRX29QIydntsBV3+ax/ pHTm0kftmy/YeGX9dtltXjv8Sja9R3Ns6tERMa5t0OUBrptImV8F9nfRlTJAZ04Uv2Ao xrgvPusojcJeSuD8WOO4dQfBzMMsg6s2v70uWEcL9E+gPpEMKtzLPDWV73BUoACirzVE /6ZA== 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 i13si12680485ejj.567.2021.05.16.20.30.21; Sun, 16 May 2021 20:30:21 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; 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 3A7186899A4; Mon, 17 May 2021 06:28:35 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4CD21689721 for ; Mon, 17 May 2021 06:28:29 +0300 (EEST) IronPort-SDR: 4IM6BlP91aZ3XtlLWQpJWtJs0IGo00WsJVZaIt88S8bg5VQ5ghekN4PDyhh5St/nduTECuje5X ijNOqHlBKGjQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498242" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498242" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:15 -0700 IronPort-SDR: p8JPIPdhMLMQnA1rPBcLblJkEQUtb1lLOHO+b/wd1eKHb7dCKIquhfdVYQsGGKI9LDq25TmBcF 1PU40ZFJk/8g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277668" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:14 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:16 +0800 Message-Id: <20210517032426.3376661-13-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 12/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: szy9bP8dV9xY 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 03785e9398..bceee8c4df 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -675,6 +675,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 @@ -687,6 +691,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 Mon May 17 03:24:17 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27811 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2457988iof; Sun, 16 May 2021 20:30:31 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzx6pH+PGVfaiHR+Zkl0kKTxCc5/BEXgudg5J/bRnjMrEtmKYY9VVru9l2oEs48ihLzLfpd X-Received: by 2002:a17:906:26d3:: with SMTP id u19mr61003474ejc.128.1621222231318; Sun, 16 May 2021 20:30:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222231; cv=none; d=google.com; s=arc-20160816; b=PFJzrlTbcsRNsis3rAtVWppmfOLugSZB3pPliwmXB1mrena5EYhnwGo7CoX0qKIGZH we7Foiz2eMTPDxURqykD7eAAjWVqoeUyQLdX5t2XAEZVDCj2BT+y4o6x7SyKPagA3bHo k7RYDj0t1PeavvVIc75uj7SDPd3UnZVUyL2wFQH+u8jmQYGScMFyx9g6LFZCUk8zGuGF MWYNGTf/0Nfoq5/PdtnBtxNLqWSqW1uznhPcKDduCXSDfGVJb1YscsIFORYKZkI29nMl M01+ZeumPBqzxqirzaPhbdaHIRosINAT66LD2VZOyHwFUiqX44QT3wzaEechvrivMe/K Xucg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=3qmRUCF09tVwZ3P0WZzCbUoXYM25EHZbPsvyOWol+qc=; b=GZAqL6ZOb2qc7K2zZGe8xNkPRJAq0FRqcQmnlz6xYrqrwgjaFnB6NFdexOGpqh96UC 2CLAYlAH3bVYKk6i6p/j0SaUOsQ9ReV9esB+HR2zXKdVq5Z8zmS/aK4wx+mACsZuto3a 3PHb/pJpsVL8gEygCPCDknL3E4B9repVpbZedAOk0je90pWqDwI6FB0ABOBUUnZHR/FK uBnDQm1Knghiezhv6EcZ3LcabjRHbMGtfVE3KHG+4iXRk8du0uPP8XIn5eR1Gl9dFrQA ZFyn/vv18m2cGxLkb3poTgGmZ+3qyw7vQha7EBp3/XAuy80Jj0GWpNX+I54W4PgZunva OQfg== 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 gx23si15382040ejb.47.2021.05.16.20.30.30; Sun, 16 May 2021 20:30:31 -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 6D237689721; Mon, 17 May 2021 06:28:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C1D806807B4 for ; Mon, 17 May 2021 06:28:29 +0300 (EEST) IronPort-SDR: /guggiW/A12lGF89+WW/szaQ+Z7bNziZ53qszqd9VTCx+XB8j3nvHdLBcahjPslw8by7+y7+IK ycGPISXh/lMA== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498243" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498243" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:16 -0700 IronPort-SDR: t5101vAd76rBdoO424+e32+jaAr/l1cNv0MLOos6f1If68KFKnYG3rlGP0YzaAt7UF8ndQ1eMa Tu4sr+/SktMA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277673" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:15 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:17 +0800 Message-Id: <20210517032426.3376661-14-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 13/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: A/2zllLQ/X+m 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 bceee8c4df..29ba220665 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -665,7 +665,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 Mon May 17 03:24:18 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27799 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458180iof; Sun, 16 May 2021 20:30:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx2oCVEUS61z8cnwqf38tBst7xrxi7Q/EOur4i0wmjKjZUVd/y/xDuX/MmDW1+X9D4VdfXc X-Received: by 2002:a05:6402:10c9:: with SMTP id p9mr69717775edu.268.1621222251290; Sun, 16 May 2021 20:30:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222251; cv=none; d=google.com; s=arc-20160816; b=IpBWmA+zmxN1Uf3zQb9my/11GqmeI1w/YWcero3O3xs3X+Cl4xCzCyhZ2lgzdV8FEv Xo8SS8D+rjILKrc0x+H6KWf9IUKJF71RNIHY+fTUR+Bq5LGMpRDM8HAkYp0M2b3h/KFJ nDGYyimDyUjWPTww4DeKIIcTGTyZpbdSGkPYf6sUHeAv4QPsX1qsej/2lVtx8PlGIFRV 9hYUwNlWGwMgs/bsEsjB3eIGVScDH44jtnRev7NbXHZp7+iQ3eYXGYm6Sj0YwJrNhkHC jgx7BSFg2GbhtBBibDWsYNtOANE1xKAdPMyVB1oIguBI3hNFi7knYpzaA/Ot0/zfHJpk HQfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=TOEP7uhI9HTVoumxq374/A5o1hHFUf20LmngXG+8tMQ=; b=H7i/tnQUJS4OvwCsX/QCIwmCM9yrNHTU3B/zFrkBGYMV7QFv1bSURhGRTGz2k8QiJc ghByRQa3/CS++SXn3UjL3es2TFbeInqQMyBiZ7rmXBpKb4/LzMBiArD2dZSQBMLI1izJ WW3gW8V7d4h4p5A+adB0FlMLyYfrWvPq4g2cln2E8m4hDk9rMVNE3XRZ4Ls9e7td7eKg 1yHgw+YLWl/vC1uTcPkT5hyl6a1Sx5P3eAL2gBp2ETWyc6agy30yFwkA2J+xJyCSCNek YFLooSFmu5y1A4idsdyg6tPs6rDVuY2VSTe/umjaDK+f7/oBFrk2VRQP9Nhjbz2h9d85 gG9A== 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 l3si14863315ejd.313.2021.05.16.20.30.50; Sun, 16 May 2021 20:30:51 -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 921CF6898E0; Mon, 17 May 2021 06:28:38 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 08551689907 for ; Mon, 17 May 2021 06:28:30 +0300 (EEST) IronPort-SDR: W1eimSHUns8EXhbju5BKxFXgA89OeTclK4OgJTc9eZXW7F2R+kw6mRlvznn2qE8xHGYq07Aa8M WxlhTuoVsKRQ== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498244" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498244" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:17 -0700 IronPort-SDR: B+y7OZShp0ozyQkwYBDaspLdIxnJV7PajY0zgJz+t0/8BDi17fvTOktuOk+8vjx0GXMynOj/mt vJmdN62cleRQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277681" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:16 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:18 +0800 Message-Id: <20210517032426.3376661-15-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 14/22] lavfi/vpp_qsv: double the framerate for deinterlacing 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: pPKdDPFcLbC6 --- libavfilter/vf_vpp_qsv.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index 29ba220665..ec35f85b04 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -255,10 +255,14 @@ static int config_input(AVFilterLink *inlink) int ret; int64_t ow, oh; - if (vpp->framerate.den == 0 || vpp->framerate.num == 0) + /* Ignore user's setting for framerate when deinterlacing is used */ + if (vpp->deinterlace) + vpp->framerate = av_mul_q(inlink->frame_rate, + (AVRational){ 2, 1 }); + else 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->deinterlace && av_cmp_q(vpp->framerate, inlink->frame_rate)) vpp->use_frc = 1; ret = eval_expr(ctx); From patchwork Mon May 17 03:24:19 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27800 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458086iof; Sun, 16 May 2021 20:30:41 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyZ/Miio6y0lynnzFY0dcDMU/CwJb9BzFixydMgEDvcXBKA0nnmtZBR1vzGMr7qo9E5uKbi X-Received: by 2002:a17:907:3e06:: with SMTP id hp6mr59480014ejc.273.1621222241197; Sun, 16 May 2021 20:30:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222241; cv=none; d=google.com; s=arc-20160816; b=NcH/+U4nD5TzVyWzs8m4ovLEtPD0aowlCHH06cppNi1tSwF8g7elG6EZYe28I8XPYn ckVIYJkP/lZFkokYEXh1RxeqdWJJscs+91ha7Fz8r5db/EPoOuFRHY74GLT0ziFJz3kV VokuSdp790IK/p1nk87imz9sgjGs7r+1b26Bn3tki2Dz9V2ZwzS7BGkoJrhg5w/37oZT sNERbnd8LPDG0tskZBiHnUMpJp2XS7sH50XSZ8shnDJMpwC4nPfTBP1mrpKXbBICEdTu pBbeJNObYjJ/h9shlZn7+XJb/Vwu1YlfAImLvWVt2fb837jgbvQ00yLe9DdIFGYpc5ds bAsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=ybami8k8WVidrbGitr1/6i0kygZ64D9llK71Q5+HfRU=; b=Sg3wbgdWBhTtCdH5zjK2CZ1uAp8WljZIFZtPXWvuB+UPsfvuBjgTnWzoIoZrVrEa6L 8AxphLWbS19HXp2qE08tbSbWddnxQ/rNBmwz4jZyfY1TEzLHP7mKBwMMpdm42GAESbgV 4JCXH2Ku0Xso6x81TNp8n2wlMMiKD6WIHtzgDMpsZAHQv4rtD9zqB5DQSNDIDNc3COOj VxL9zcQElj6IVjDedurLKVF3m36jb+xmV9KRbjVT/ThMUTL+N88MfWisHJY+0mvsR9+I SveEgNV9fIUPhm9dNQpfywX2N6gKqJ5GTr7DJFIbFjZa3+6DCW7RXYdA/5l75exvvxuG zhUA== 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 u11si13552000edq.89.2021.05.16.20.30.40; Sun, 16 May 2021 20:30: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 A37DF689966; Mon, 17 May 2021 06:28:37 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 08105689905 for ; Mon, 17 May 2021 06:28:30 +0300 (EEST) IronPort-SDR: nHlba2ISUntel5Fczk4hMjaploUSDWXF75dBjqgjZ0eOwIwdDrdEpHFAgwfFkiVvAAny6c4EE1 /ubtDyHZwUgA== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498247" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498247" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:18 -0700 IronPort-SDR: JhhXxP1EC6+0SzuCHUlAEaiICOjSFhIv4D0DbMaqvkxoCdi0vipocZyz+mwoxGTsAxkb7LNM9X eaiq1NzK1GBw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277689" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:17 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:19 +0800 Message-Id: <20210517032426.3376661-16-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 15/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 6zSPzwmVm//J 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 Mon May 17 03:24:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27805 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458280iof; Sun, 16 May 2021 20:30:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwPLoFgjG6/rSDJ+Fcpe4VDAfWs8/ErpGv1uGFb4OI9AzX5OfdH4Qr6atBVJkTLElNli+ZH X-Received: by 2002:a05:6402:1b1e:: with SMTP id by30mr33937447edb.277.1621222259004; Sun, 16 May 2021 20:30:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222259; cv=none; d=google.com; s=arc-20160816; b=jISsAmnf4anD12cNo/9S/Sp8m5tXbwin4jDPTVQqX4Gm2NX654lRyQhLgnOA7bM5Wn ThUs038Ph6ivmY/p4KfWgCsLZRdNP2UM5DbhHQR9K3+b24LnDWxED7aG6eFxLabTJdTF ayTnuRbPajmqYA0DtPvqCOik0QqCY6wi0/6My3ONcMKjHfyL49vNKgsexdWRZ4iJGwtM lPplXPzTW2JRYydCUEniqg4Y/ntgqHA++i09ZvwLeO2pmEe0W2fUQtT2/ho8AVrpRg9A eiB7NveG+PCgZThd2C4XVcEpxePxK6EXX/Ck6BKOWwEOewHEw06aHhhAmO4peZCyFDmI 7AiQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=dV9m04+79fEEebdrWtIWwkJKlvAa5CIViLI1V79pWNg=; b=Ham0CwAG8tqC0Q5CMylma+Sq441L3xLfG0ILM9ORWtTQ4GmZ+K0O3XiuzwTehLFuIv d/tVEVQD5dZoBttTNGLuqqyvcjG0oJ+inZxCCdmsRTI+DvPG2vyTctAy68uqZDbEZ+iq VAtJjKbAc0QwAOtwUDUt+pvNu2xXfRX/ukk1kU8Jxgi26tubRahbUlPWlDiJiDj0Dja5 X+jLpdVyXX1qCiTWn8axCohNRg1q12/qiOT57sZrVm1ck68/aojZN2xiwT5sF2+8VH5o 70OK20679U2tbjDR1m+m0rCoNLe9QS7eVq+QeCXtlNCJp0RShrE/Xw6MDIrFieclkg4t zt+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 s24si13420396ejd.357.2021.05.16.20.30.58; Sun, 16 May 2021 20:30:58 -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 C27916899DD; Mon, 17 May 2021 06:28:39 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 51BDD68990E for ; Mon, 17 May 2021 06:28:31 +0300 (EEST) IronPort-SDR: LROGMHBex0In460BjC82+Lvri2/dYt2SXnBurwDH7JmvoDh4SO67p+B/LjGUAiBMppZ364BiVI VeZfvkYEiFzA== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498249" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498249" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:19 -0700 IronPort-SDR: K86mPLE0nyhWbofy0bC757b06nndbheFshMxOzuiL9CDOEWkMjupZHhnKVWWV4O9p9C4w9VFyr wjfnBniqK6Sg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277698" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:18 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:20 +0800 Message-Id: <20210517032426.3376661-17-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 16/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: HIXX+qT62q20 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 ec35f85b04..018b0e8689 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -369,6 +369,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 Mon May 17 03:24:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27808 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458402iof; Sun, 16 May 2021 20:31:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzn/7ab1fRX3qXBylsD47+LpRJQ7QsdBMACpqEiPo9EY3YByaYu7MFh/Z9i8AM9n45KO2DH X-Received: by 2002:a05:6402:3594:: with SMTP id y20mr373152edc.63.1621222267319; Sun, 16 May 2021 20:31:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222267; cv=none; d=google.com; s=arc-20160816; b=WPikbbqdVfmKca5Z1aLccdrCRT4vjcXHmy7UxL85B0l3wnM0bWbgVs4Xn9y29kFmkT wJyzWUbwcg9GAPQ4SSrThHouX66X5VKir5rfD2nnh7wiMLWQFpNXRUebh7sGciPEfTcp n6jrr/bH8dPLP2SCB2enT+pBy6G+juzkZvrpy7GGWO+/KazOv8pnsfjO+iUsm64KEHbQ wM8tHtjfoKZeGO3gSb2fZvAScakslhPwmq7j5sF60ff7N+hC4I5uVOTNlpR2JrlvVMKr xD8UJ56W7MNG2EEAfuT2ZKFWy5iNRu9KzVHh+zx4w1df4pTE1zbQ1jU7y9JHD4UOGfib 4w6A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=KTCldByLnKg4SJTBqf/sqHXM8r/QOyYPQ8vwZV2u9eA=; b=M85ili+U2Fj83o7ytGyPL4m6jMNIXh4zjB+Cm0V0QzxbOHz10toDkiASABEQJ+SUUG JeRrM9r+LIaheEm9okzmTBpnYrAaVvpTTL0vr5BQDS2eWIlCcBsouc/OfActcEPiIHym 8j/5G9g2HPLmqBqxzP3SVFVraxgg+tkFTMMxr6gXi0/VzBWjDkBAUok3xK8LHANSIZLh 8v9vwgX7d0mv6qX2A2A8fGC2o+xwHCHMactgqinLu08F2SiGWSt4th71ZtbYDWIQH8Z7 9m1lROTRsoUz/ufoZ7DXdQp8QRqUOnMXf8+Nt9cKlSTy/3lgE6ZjzC4L/MNCtb75nbbY 7ebw== 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 gs16si12783356ejc.156.2021.05.16.20.31.07; Sun, 16 May 2021 20:31:07 -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 B559E6899EF; Mon, 17 May 2021 06:28:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E7487689903 for ; Mon, 17 May 2021 06:28:31 +0300 (EEST) IronPort-SDR: rTb0ccK9yx1zD+2Bsx/0VeLZ3nXNT69HHtD/uVCplqyDsD/FCyLpt5ZB+sGUuhEOXE5Tz12PCW DIvDmT0NsR2Q== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498250" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498250" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:20 -0700 IronPort-SDR: 3RWs+nH5w1vqkBw/6rJUIoOsfjkQmEKi3FNdeDC0vJ6Fzyxdo+/qULE/XiOIED7MNB8X1/05w6 HXa+o6LY2fDg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277703" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:19 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:21 +0800 Message-Id: <20210517032426.3376661-18-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 17/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: H0NSKVciWjBf 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 018b0e8689..90b0b25210 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -235,7 +235,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 Mon May 17 03:24:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27804 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458499iof; Sun, 16 May 2021 20:31:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwC73naacgFVzkSJFOdIemF54UCUqaR6SylKQ8HiWMSNbX4uGnc44kFvzGyyBlJW00kc4UU X-Received: by 2002:a17:906:2811:: with SMTP id r17mr1937150ejc.321.1621222276657; Sun, 16 May 2021 20:31:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222276; cv=none; d=google.com; s=arc-20160816; b=hLOo4Lt6oDa//qm/U4d0EZXFeFkh759hVfHAo9fmrwKQCsgE5y+eelcW0lgXBYT+PK jijzzOvSRyDfwpvs62kqocP9I2PyH1jdLmzvE7A0tbHoziPc3ZLHuF32FxWBP8e8AJnZ tufZ0ZA6wpEZhyYW/Xm+0peye6xBQQsdOAeDHbeb8pp3cjx1ihbsUXAAtAQ2Dj0H3ura wOLzG5Ks+Jlf6hqUKdMwH8M0R7Kryg8uW3VwuYLiTQWKiA2VXU97zxlgkd38rhU0yPu4 ABVMJ1hBQTfUfuGcKE6hooGaMBhj21iMVZGYd0ZTF/pnPLGVQ8JEUxUVp0yDjxAr5RmG 86JA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=GbKJlcDtfglXU6Loty4us2vKREikcgD+AZQKvYPOwuk=; b=LiITEEPRGQ8ck2mdLTlAm9w3f2qfyWH3f3sKB4BwfNnSmY/n0SXAKRWHjc96toDJkd 6/wXtzv13eFAZmTSY6sEJ2lWCtN0NknuDwYhuWqFB/otWUmjRUYTG87ztl+iPhf5fD+6 MLbFq2DaSSbTglFJAK90ffwVKjfnjtiJtc9tYekMHvIHtasv+pj7VDf+LBE+FaGJngs0 JQzln4Nc6xsrPaOusd6gN+7XG6/bhE1JSqA0JLamUSiPuxteZMd2LdrjQueIguuSV9ld wz0bsBVBRB6wUOdgvFKoqODpDfXBDDDqdMLCiPEusTqGw5i1/NCF2uXNCgzGAq06In5J 9ELQ== 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 r25si4187481edw.467.2021.05.16.20.31.16; Sun, 16 May 2021 20:31:16 -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 8E010689A0F; Mon, 17 May 2021 06:28:41 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E790B689907 for ; Mon, 17 May 2021 06:28:31 +0300 (EEST) IronPort-SDR: G1UM9jmlM/id5R+SGZIN67GJ2CQsOfsmaSjSBl/K4HY59+grV3he8XKm8mSg9TA9TGI41XAwXe sDUl2H7NmDng== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498256" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498256" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:21 -0700 IronPort-SDR: FS2PTDHgvG+872ZJpvYi/Zo6Py4GtXAUuG2acJVYQ6rk3uz2Xwm4Bp04ImeykgLGwmtSm0l//V LND+wNlci6/A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277709" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:20 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:22 +0800 Message-Id: <20210517032426.3376661-19-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 18/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 67X+Df17b31d 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 Mon May 17 03:24:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27802 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458603iof; Sun, 16 May 2021 20:31:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw7po1UtaNXFtMjAfYABenr85X7f3nHDMbI6qlRghba3jpw6SdBXjVgiz+DmY4fy3PV9Gi2 X-Received: by 2002:a17:906:ecf9:: with SMTP id qt25mr6383255ejb.55.1621222286776; Sun, 16 May 2021 20:31:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222286; cv=none; d=google.com; s=arc-20160816; b=kgYUy4RBvte3sWL7zhE9UxyuKOWAyNk3ahY11CW7Gsy4oeMPaO3ihgs5N5dQJxTZIh 0vvnzVIpP1Bc4na5z3YJr6IASHT8aWhZc25nQU8dn8lEwhWNaI74wS3bA+v/TGzL43Wv 0MYLqTPmmHBl96DiDncae3qRfDCBQDrUIVZWFMA7t6qVNWe/zBvz6eEkMmuJQqpVxn2X 2PS/dDcHRZ5HJTRaxkimluO83U5n0ItauC2Tvfe7Et4Yz1ZKP9lys7LNY+id0qIFUT70 7dbGnazZmGm6l8ifokOZdef+YCEudVJxsq54/3BHKBTGxqahPCMC9Ud1uPFGvdBXJjS7 E1Uw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=EvUmr/N1aJh+CzKNv53YiBqucl27EPjd8fwGLHjpLg8=; b=aGCkkDmwNshXlBXLKdk3NYrZUAgTOm7NxIIWn9GqA9eDw6kCqvkvGp5nKoBCeantj2 78SSREIQlGBorkCB09T5zZlJMdC7jO0AA4HnKziOGhQITegC95Kk7m5yxq6YrGgMVjpu jGA15114qSJr78+G3QHwhl+hVwB2ArMDlYs38P4ynXb+FN5IwKK4Bby+SMqsvEvAaThz ZAe7yTvm+e7DI2Ac2W/qpYM8Qla3xG/4ZXxPTFhT/bkPW85wnremIGvOOr86c9ricKst 3Pz2uWl0e5dP9YhJqshGdJXQDO/CGUpSv13ZnMwN9vLCfeSYXGQtUbmgS+28hV1aUHkD iN7g== 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 hp22si12382385ejc.174.2021.05.16.20.31.26; Sun, 16 May 2021 20:31:26 -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 6EED46898E4; Mon, 17 May 2021 06:28:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 53E6C689810 for ; Mon, 17 May 2021 06:28:32 +0300 (EEST) IronPort-SDR: cR0dPjk0ipzNRbTGexptdXQIXW6P1lSiGhBQeMU5/3ISd//LbJMRVbmk4RQioNqMZFS0HD1OpD GdIPDwlJaaYg== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498261" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498261" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:21 -0700 IronPort-SDR: Hyx1Jk8PAfoFTD15Ow9yB+47aQhFLKLidNSQb15C+JmhyH2AcSX3fjyrPfLqWx/erOy3ajmBP9 TStoEsjPUBAQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277713" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:21 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:23 +0800 Message-Id: <20210517032426.3376661-20-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 19/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 9t4c331VGWRe 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 --- libavfilter/Makefile | 2 +- libavfilter/vf_deinterlace_qsv.c | 179 ------------------------------- libavfilter/vf_vpp_qsv.c | 19 ++++ 3 files changed, 20 insertions(+), 180 deletions(-) delete mode 100644 libavfilter/vf_deinterlace_qsv.c diff --git a/libavfilter/Makefile b/libavfilter/Makefile index 9e6bb87c4c..feaf6c71a8 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -229,7 +229,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 90b0b25210..c0afb001b9 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -706,3 +706,22 @@ 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"}, + { 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 Mon May 17 03:24:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27815 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458704iof; Sun, 16 May 2021 20:31:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzmejUlNBR1rHDeL1gkty+ZnIFvfSFRt96lWgM7cnKQFBEQwJgU+homFFP4b3bSxuMl6ix8 X-Received: by 2002:a17:907:628a:: with SMTP id nd10mr60469268ejc.326.1621222296238; Sun, 16 May 2021 20:31:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222296; cv=none; d=google.com; s=arc-20160816; b=OKty8eaBBQ++L+CbB5vmHp+9nhOiorq84/ytK5HTSggb3baxvG9CDHYpqSN65GyeTL w/55JeH5D6aYmsSrrrHQZgtxcqlpFLO9wR7w3SO+otCB3XTa3wgs4nX7WN4flKpFYpJx v9uuaXVTzrcdhGzXRnACsMZHNMcvNCCE4N8WrmZUXtSu8l7fpK4qX9RRhv4kkXmZ9wZs is8h1GeiKAVqmNKq4VCAbjx5yVNpauO51Uzr6THdqPg0aAhgLtc8LgUsc9QxX4Lwulk5 8XdpN90onEDIE4HYH7l7C1cp+EqArk7g5/v63C6wUJnUUKKKHIj+OTZJxbdC3/PIR1Ju GvTQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=0YdX/Ee5AdG842Ai0LjQ5AB03FJJdfcw1r/vnYUa6ew=; b=Tv0+WN/OxMxRb5udWE98aFr1k+dQ3JHLIwEkK+NbZ5k9vW+oa0usN4F6VAfcBz82s5 xibR5IPxvBE/IFyYVSKLqa907f9I/B8oaVVY38NEOrgjbTQtTgv2Q1N2RpmVRyMn3qB8 Px+lf5gMLHnuTYCzErK/C9ot5sY3OHeQIaZ7w+rtv0n2xAm6HQd5ciDTjwdqgueQe5tC U2/BLDFGu4PGdU4F7GqyO33G3iByDO2GqR9JNB4fnlWacCbnxt5JRVMadNEqUZv3jSlf bdjKaSPyww10mplCFd+tQGNXFn0wob20imH67F7gh03q032VcM8w+loroCpED2D7TafJ joOw== 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 ji22si1977522ejc.711.2021.05.16.20.31.36; Sun, 16 May 2021 20:31:36 -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 66E39689A4E; Mon, 17 May 2021 06:28:43 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D3CD4689815 for ; Mon, 17 May 2021 06:28:32 +0300 (EEST) IronPort-SDR: YaBf0Tglcmfjk+OIAtjZgwRJba8MOGlzM6RP6pCaLrEqCX8bRU1OI0OFqmNeL7w77dcrxDN008 34bRT439dQmg== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498264" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498264" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:22 -0700 IronPort-SDR: 4iMb4jbxcZrDKHw+jlhdRFmUjtPQoSbEBa+YhZDqo8ibZez77jdfTB/FNUHXe3DeDzBHrQgGwq tSgLy5bIry5w== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277721" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:22 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:24 +0800 Message-Id: <20210517032426.3376661-21-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 20/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5HoEZYscmzUr 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 c0afb001b9..bb3aebf047 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -711,6 +711,7 @@ 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"}, + { "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 Mon May 17 03:24:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27806 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458818iof; Sun, 16 May 2021 20:31:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzCxq5kXIiTdhFojG39RhDlgpK8yp1eYIlrRqITCovCORQmodaLcgiQd8KJTOguF0rbfJ18 X-Received: by 2002:a50:fb0a:: with SMTP id d10mr3696299edq.47.1621222305336; Sun, 16 May 2021 20:31:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222305; cv=none; d=google.com; s=arc-20160816; b=NbFVk7JxnNl51Z8LsSkaDZ4sPCrwoQsq6sg9Qi3yBSMRMvJZYYT9vurXTBxR4jR5NA xVgP4Isx676kaL0kECGxm3TsNpJshCOxIu1WmsTNuGOPyzSmB/Y1XnE8okwIK8IZ2K6I vc14H3Nx8ha4OtOeU41kHw54uFGHXAjmi5BkydrZZAtVRnDfS79/7Wkomk5ook8veWxt Tyle2lamZ3uFHmYnfv2zimP1nXAhO/WNuP2qqG/tbD97y9R3E41pW9bC/H7eLwBnSjB8 +RnTKXRZ87lgo0wr0uaFb95Hp6KC/i9Z1JLAXqV9S/q4IYF90F8umLaA40VuUxDna+oH 9Zdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=1SXPliBV3v4LH20Ipxp3WrsKPnkf3TH3xV7maiYOszc=; b=v9EUNIiifB7BplXb2y5Bpz8h3q2P0oJwbzAXhora+yJlXS2hQ5jzljwoTwGtTPffPU hKe9uTGSY7CLOb4z0oM17LwtfVJYfkYTs1q8HQdvwCgX6x65PmR42ZOjVCVYKCrLKWvV Z7nqtKYg7N/3G2b/ZFHp7SKM5mvglINexi/rGzaLv8qF9vj+nGhdDhnynHkvA10pbtCx rYo4fog/wYZJeIb+hlVqfgGIhMp5cO1BqejAU7bLvSRp1IgCziHamCDEwMQ6tRTnqcbG vz54d1MAVSBqUshHr/weaFfOlP5dzbtWP2aqJKQWsPD3R56Az/kyeGQiRqK7sO3bvpxI gs3w== 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 a29si12295228edb.492.2021.05.16.20.31.45; Sun, 16 May 2021 20:31:45 -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 42E12689A6F; Mon, 17 May 2021 06:28:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 183E8689810 for ; Mon, 17 May 2021 06:28:32 +0300 (EEST) IronPort-SDR: KuLK+y9Q5hvBHh7DLJlDPDB0suva8StUDbZN6NggdKwu+v33P8+SPNBXo2wJYhTr0aORGEYe8A NiwmPzjr1Ugw== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498266" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498266" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:23 -0700 IronPort-SDR: jZH5xgAB8m+5Z5UDzDCjQEAiHVPIl+s1xP+IMDsFU+QvdJhxFtcvhPWGlyJy+aZVraH72gjKMq rvl0MHkpEw+A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277728" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:22 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:25 +0800 Message-Id: <20210517032426.3376661-22-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 21/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: udsI8GPetDMd 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 bb3aebf047..4607ece1c5 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -718,7 +718,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 Mon May 17 03:24:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 27816 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:b214:0:0:0:0:0 with SMTP id b20csp2458904iof; Sun, 16 May 2021 20:31:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbAMeiKJzSCL0Kk8i1/bGQ3iMfTo2uyyXA631H+vs3B4x/NAc7Wl+W6W7mFgBMIJJExM6C X-Received: by 2002:a17:906:268c:: with SMTP id t12mr29106037ejc.441.1621222314584; Sun, 16 May 2021 20:31:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1621222314; cv=none; d=google.com; s=arc-20160816; b=L8/lGmNZwzG+msnZ/lMCf085cOaTlAnCgiUJ6IhhTDiSmPdyYtuVrHrGMZM0g69Go6 JvU9M6kD9baPMrvOUC+malCDAa4GyjwNcjL7nsKF73JvCwz+F5Cs3J7XAV7MTsCN3lET WyfckonmKe4IqDhnHeCokRnoO6L/upa5R4AJ6pLlFssoE6oJDxvHRVti4WtRMX/mDTDQ NwJqH3IzJ0mQ3h9N1+1kCoPRZz78ujC9d9BTwtTLKh/yTUMLkKxugdQmqPeZKF2/8nXS 9IzXYyK1LQ9T5v/grK+7iIbJRROolDSHQb8vnDYQbtB9Qs9dHGnVqWSLnlkH6bdAwQzs 4L5w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:ironport-sdr:ironport-sdr:delivered-to; bh=EiFWwOW3UebmGFdYXg3oIfucDsyGZ1/msjNqhouQjO8=; b=q+tbYIAORlSei0OT9uwNPY7mB6CAzhAMn9ePSDxjgYM39rIBtBxtkfd098vplDglds Vz7U6gELylzobo5J0og1w3TGxSB99/513+JeCQB4N+Wf3ib7e5cfmj9DHNK9eKPxy1kw Dc4jtywWlhGdXbrVi1Gd5fd3bsAEbDbho/yu88DHiBKvCYkoVROvPkRYjYX0MFsJp7LI 3jY9iP+mxBU1M3JUxlH6GTsZooh0PqLXVKiB2364grf4e5/kFrxXKkJ2I5ljhhOTHlFI N+0fzE3Txl7GDE59G60G3/TWAh3FpbV5O5i7c+B8q/onY2/WMbc9/hHeSLfO60Zf5IAy FxUA== 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 j17si12256037ejv.300.2021.05.16.20.31.54; Sun, 16 May 2021 20:31:54 -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 2BCF1689AB4; Mon, 17 May 2021 06:28:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 497C668994A for ; Mon, 17 May 2021 06:28:33 +0300 (EEST) IronPort-SDR: tlHxRLB5kXR2+Jctdrf6Lm9721ygRF0H5ixjqXRRLW9NLWFMwqvVbLWCKYBbImLiqaKLQSYN9q F8xlz1IMXc0g== X-IronPort-AV: E=McAfee;i="6200,9189,9986"; a="187498267" X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="187498267" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2021 20:28:24 -0700 IronPort-SDR: AHvu8oUy9zpAMhv8Kkqx+yfHcRuGw//diP3B1HhiLXR/N6swtbe/xNgnW3HV1dFCbu5mOHD6qO fiIAYUFf6ehQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,306,1613462400"; d="scan'208";a="626277738" Received: from xhh-tgl64.sh.intel.com ([10.239.159.130]) by fmsmga006.fm.intel.com with ESMTP; 16 May 2021 20:28:23 -0700 From: Haihao Xiang To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 May 2021 11:24:26 +0800 Message-Id: <20210517032426.3376661-23-haihao.xiang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210517032426.3376661-1-haihao.xiang@intel.com> References: <20210517032426.3376661-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 22/22] 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zrXQ8NoXUJvK 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 4607ece1c5..b994f1e408 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 } };