From patchwork Wed Jul 26 07:15:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 42985 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7528:b0:130:ccc6:6c4b with SMTP id r40csp341033pzd; Wed, 26 Jul 2023 00:16:24 -0700 (PDT) X-Google-Smtp-Source: APBJJlFxze0b97NugGt8pZDQho42HIwoCkxR2N8gka4xOeBZFNJSxd5hkh7amp2dQNIvhKYta3Wx X-Received: by 2002:a17:906:5594:b0:957:1df0:9cbf with SMTP id y20-20020a170906559400b009571df09cbfmr907548ejp.19.1690355784031; Wed, 26 Jul 2023 00:16:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690355784; cv=none; d=google.com; s=arc-20160816; b=r4CQCt1D2Jez66TpTgYVBY5WxbyMPv5xjttbl7pWuMS/SIp1qft1L2RCWzFoaD+Nja QSSZ2mvrxAFW8PD44qlzCDtnKGmGXcwYMadofgNFRpNKCVJM6uW21GHUyGNw7CiBXBzE AkzMXnSVBkb0sqgvyIsMwE6UUp17Q+flMJMV5PPG8IwyB6jadFBljcGbMszIYR3wsxS6 d3cWQWVcar36Pv8XaQp83uj8Sn5pB0xqtpYiSWzhJF/+eyi/b7TQeDxXTUz2VD2TGk5O rZy3DVKqijghYe3ETZV/Uz22O0ysPSoZK30OJMkxaNsD9AHioTveYgdMOQD58vNjd2kK 0KpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=UwTpAOd+FoufH22JHprSfoblHHrIiuL72Iw58fdmEf0=; fh=Tt4aWcAPplwJLYowQh9cIyedJjsIqBA8GlwfHZgTuYo=; b=q9/J35ZOrRvd+b/skdA8wfBkvI5msOFMCbnswgHcpRz1YgOz0YgA1JIp/fJxOovLjR 3sewYc1SPppc3uUKoFxl1d6Z2rZ8ikgB984KwLch1+YLgqPnf0MO0NhZ0ugKnP/W1F4t 2G3lXKzJ1b1vKCPlqselLINXB8RCOXnaOx/mC+a28U3eZYoRCA/1ULOpvRbm5p9x9fTK k90NRL2GJaOFlPEo+AqbP8zFWWk/kz7oL3cK5xwcAzab5S6Gbrzn4rwBCNQmd0nGo9pu PouC+gjpcZCkKZeK/kiYE1nk0F5WQl5ZAelOUHb9FCwtT2AT27w3pFXzUz+Zn7xz/Zym kU1Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=F2mqz+pn; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n21-20020a170906119500b00992e21b04aasi9093425eja.720.2023.07.26.00.16.23; Wed, 26 Jul 2023 00:16:24 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=F2mqz+pn; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 06F4768C911; Wed, 26 Jul 2023 10:16:11 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9D31568C90D for ; Wed, 26 Jul 2023 10:16:04 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1690355769; x=1721891769; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1DOb6GUn18ILppVTE7VbC4wMneuXlondYxVBHBLHNqQ=; b=F2mqz+pn3ETntm23JCjes0mGLX9vQBD3K02HF18U6tjcBe4TQQBILMnv 7Mr3ejvofeaMqcbNpEdQnhF5ys3abxsyI5pg5lHXM0m5NdBwgXcE9J6RD /jRooeKfI3oQXpuS6p3kKQwWjLYWNgtR/jVswGIETIy2LPZj3tenyd9Sw uMzHhFs8sq+6+/IfWrg7Ug8uhOsafhrVtcvmG9EAUcZpw0bG+dkDREryc ySIuQYGnv66nUStNOOXrbP6v3ZYG1Z/vEdrW+mPPwnPkY7xlsWsZBpqN5 edpK/fgKk8BrJ4lnxKqoOKeMtYXIH0wYF9Bmwyyw6RzVMgiMBrkkBwWiO Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="347551669" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="347551669" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2023 00:15:59 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="756106891" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="756106891" Received: from xhh-tgl64.sh.intel.com ([10.238.2.19]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2023 00:15:57 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Wed, 26 Jul 2023 15:15:21 +0800 Message-Id: <20230726071522.38149-3-haihao.xiang@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230726071522.38149-1-haihao.xiang@intel.com> References: <20230726071522.38149-1-haihao.xiang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] lavfi/vf_vpp_qsv: set color properties for output 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: o2Uh2Mcm6i1K From: Haihao Xiang User may set color range / matrix coefficient set / primaries / transfer characteristics for output. Signed-off-by: Haihao Xiang --- libavfilter/vf_vpp_qsv.c | 90 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 87 insertions(+), 3 deletions(-) diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c index bf4264efc5..795b859de1 100644 --- a/libavfilter/vf_vpp_qsv.c +++ b/libavfilter/vf_vpp_qsv.c @@ -61,6 +61,8 @@ typedef struct VPPContext{ #if QSV_ONEVPL /** Video signal info attached on the input frame */ mfxExtVideoSignalInfo invsi_conf; + /** Video signal info attached on the output frame */ + mfxExtVideoSignalInfo outvsi_conf; #endif /** @@ -104,6 +106,16 @@ typedef struct VPPContext{ char *ow, *oh; char *output_format_str; + /** The color properties for output */ + char *color_primaries_str; + char *color_transfer_str; + char *color_matrix_str; + + int color_range; + enum AVColorPrimaries color_primaries; + enum AVColorTransferCharacteristic color_transfer; + enum AVColorSpace color_matrix; + int has_passthrough; /* apply pass through mode if possible */ int field_rate; /* Generate output at frame rate or field rate for deinterlace mode, 0: frame, 1: field */ } VPPContext; @@ -231,6 +243,11 @@ static av_cold int vpp_preinit(AVFilterContext *ctx) vpp->contrast = 1.0; vpp->transpose = -1; + vpp->color_range = AVCOL_RANGE_UNSPECIFIED; + vpp->color_primaries = AVCOL_PRI_UNSPECIFIED; + vpp->color_transfer = AVCOL_TRC_UNSPECIFIED; + vpp->color_matrix = AVCOL_SPC_UNSPECIFIED; + vpp->has_passthrough = 1; return 0; @@ -250,6 +267,24 @@ static av_cold int vpp_init(AVFilterContext *ctx) } } +#define STRING_OPTION(var_name, func_name, default_value) do { \ + if (vpp->var_name ## _str) { \ + int var = av_ ## func_name ## _from_name(vpp->var_name ## _str); \ + if (var < 0) { \ + av_log(ctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \ + return AVERROR(EINVAL); \ + } \ + vpp->var_name = var; \ + } else { \ + vpp->var_name = default_value; \ + } \ + } while (0) + + STRING_OPTION(color_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED); + STRING_OPTION(color_transfer, color_transfer, AVCOL_TRC_UNSPECIFIED); + STRING_OPTION(color_matrix, color_space, AVCOL_SPC_UNSPECIFIED); + +#undef STRING_OPTION return 0; } @@ -353,11 +388,11 @@ static int vpp_set_frame_ext_params(AVFilterContext *ctx, const AVFrame *in, AVF #if QSV_ONEVPL VPPContext *vpp = ctx->priv; QSVVPPContext *qsvvpp = &vpp->qsv; - mfxExtVideoSignalInfo invsi_conf; + mfxExtVideoSignalInfo invsi_conf, outvsi_conf; fp->num_ext_buf = 0; - if (!in || + if (!in || !out || !QSV_RUNTIME_VERSION_ATLEAST(qsvvpp->ver, 2, 0)) return 0; @@ -370,9 +405,32 @@ static int vpp_set_frame_ext_params(AVFilterContext *ctx, const AVFrame *in, AVF invsi_conf.MatrixCoefficients = (in->colorspace == AVCOL_SPC_UNSPECIFIED) ? AVCOL_SPC_BT709 : in->colorspace; invsi_conf.ColourDescriptionPresent = 1; - if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo))) { + if (vpp->color_range != AVCOL_RANGE_UNSPECIFIED) + out->color_range = vpp->color_range; + if (vpp->color_primaries != AVCOL_PRI_UNSPECIFIED) + out->color_primaries = vpp->color_primaries; + if (vpp->color_transfer != AVCOL_TRC_UNSPECIFIED) + out->color_trc = vpp->color_transfer; + if (vpp->color_matrix != AVCOL_SPC_UNSPECIFIED) + out->colorspace = vpp->color_matrix; + + memset(&outvsi_conf, 0, sizeof(mfxExtVideoSignalInfo)); + outvsi_conf.Header.BufferId = MFX_EXTBUFF_VIDEO_SIGNAL_INFO_OUT; + outvsi_conf.Header.BufferSz = sizeof(mfxExtVideoSignalInfo); + outvsi_conf.VideoFullRange = (out->color_range == AVCOL_RANGE_JPEG); + outvsi_conf.ColourPrimaries = (out->color_primaries == AVCOL_PRI_UNSPECIFIED) ? AVCOL_PRI_BT709 : out->color_primaries; + outvsi_conf.TransferCharacteristics = (out->color_trc == AVCOL_TRC_UNSPECIFIED) ? AVCOL_TRC_BT709 : out->color_trc; + outvsi_conf.MatrixCoefficients = (out->colorspace == AVCOL_SPC_UNSPECIFIED) ? AVCOL_SPC_BT709 : out->colorspace; + outvsi_conf.ColourDescriptionPresent = 1; + + if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo)) || + memcmp(&vpp->outvsi_conf, &outvsi_conf, sizeof(mfxExtVideoSignalInfo))) { vpp->invsi_conf = invsi_conf; fp->ext_buf[fp->num_ext_buf++] = (mfxExtBuffer*)&vpp->invsi_conf; + + vpp->outvsi_conf = outvsi_conf; + fp->ext_buf[fp->num_ext_buf++] = (mfxExtBuffer*)&vpp->outvsi_conf; + } #endif @@ -560,6 +618,10 @@ 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 || + vpp->color_range != AVCOL_RANGE_UNSPECIFIED || + vpp->color_primaries != AVCOL_PRI_UNSPECIFIED || + vpp->color_transfer != AVCOL_TRC_UNSPECIFIED || + vpp->color_matrix != AVCOL_SPC_UNSPECIFIED || !vpp->has_passthrough) return ff_qsvvpp_init(ctx, ¶m); else { @@ -745,6 +807,28 @@ static const AVOption vpp_options[] = { { "field", "Output at field rate (one frame of output for each field)", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "rate" }, + { "out_range", "Output color range", + OFFSET(color_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, + AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" }, + { "full", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "limited", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "jpeg", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "mpeg", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "tv", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "pc", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "out_color_matrix", "Output color matrix coefficient set", + OFFSET(color_matrix_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, + { "out_color_primaries", "Output color primaries", + OFFSET(color_primaries_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, + { "out_color_transfer", "Output color transfer characteristics", + OFFSET(color_transfer_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, + { NULL } };