From patchwork Mon Aug 22 06:29:18 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 37381 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:139a:b0:8f:1db5:eae2 with SMTP id w26csp1120275pzh; Sun, 21 Aug 2022 23:30:43 -0700 (PDT) X-Google-Smtp-Source: AA6agR6ZpEPSjjD37KQJm5yYQpnlwwbyVodKRV46TsGOexxzu5YJXCZdURtgQHp8sfL8U4uCP/iA X-Received: by 2002:a17:906:35ca:b0:73d:66a:121e with SMTP id p10-20020a17090635ca00b0073d066a121emr9242930ejb.655.1661149843261; Sun, 21 Aug 2022 23:30:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1661149843; cv=none; d=google.com; s=arc-20160816; b=XD02rBLk7BkKhvUyvST7x3Cul2qVVa+VuwR98WnfUJcPrshzpHg2/0k1QDnrogGNkQ YDNzvsAyUusSYrytlHPTZ6ScsfRNwPnJ272uaDb5uWVtKgDXqQ1nt2P2bQEeXISFhmym 9LXdPmRmsvdfyGUc0htFqJ7KKO9eLJI+S8hkJQOHk1mQBbTEbuGPCpHHHURtGBDglm16 maNwwTgjgU/0nuiBSVJpZRlgseXxzpXTqrDDv2PFQ/h0pZugARTD7RqJ03eKqpmcYevT vq64hfgqjF84ejqzy3E0GGGtTyr+M5J3QWpzPUU7T2Oq0fVw+44A/FgSiNXEqjTr/zvA 2bpA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to; bh=Iv19KSPncPGCCDUChlOa3FrBN16qBqp2rcvQIzSLTvQ=; b=qjLvQKb4alhi6g393SCpXwX5iIv8BNPeIm0xuYkh6PI6Vt3sj5ytbyk0kmoHJp4FVs PDfPZChqMkHm3HbhNuvDQ33kuDC8gvIk/GlF4EonnwAI3Yuym+0oPIwOwYZSd6bf/ef/ J3zwaPwQAQC6XS2zWLYNJz4p4o+SkVGuF8u5UE8s9+Tf49pm64f34DE6vsZFV0BRvKG6 f+DCAOuseNex21Sgy6IHSYuAJS1HMCEt1VK/kzw4gGOCPHzCDDPgH6DlSxjOqycvEEAV HAFsNXZe3h4SONFAHINLdXE8TXAkkNWug66MwnguXhE1022r9V5vIDbPgjKvgtOZaNhP NtPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=QjVG5ayh; 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 cr19-20020a170906d55300b006feb76dbd51si6859622ejc.289.2022.08.21.23.30.37; Sun, 21 Aug 2022 23:30:43 -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=QjVG5ayh; 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 1835068B993; Mon, 22 Aug 2022 09:30: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 D05FA68B8AC for ; Mon, 22 Aug 2022 09:30:26 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1661149832; x=1692685832; h=from:to:cc:subject:date:message-id; bh=jkeVOtWKTd4j3F+NiLmCdH0yV7B9yNa4BFygO7oJivo=; b=QjVG5ayhB3i6e8sjRa0pM1/N92mSeSO5PHM1r6KW++K/osqzWBicaUqC g99gglkRLFMPbsjeDbGGtJ71qF8WPKfaDFt2Eg7tuHnD+md9uGdb00E1u YM4ZqonvE+EuZ5tt5Y74yWf0Jz9blqJ9WWCJ12qSjdaukkRJXx60KOD6m wgwnrjLB8TqK6AVF14SVikkpGPFR4DCCadTrO6DwgEWDXYuD8rkUZqv09 ooumFiufwQwYn7CEJS5azezG4vpRMSYD/Xq8nEzt6HgHniN/TDRLHdppz ZduFF2S8oDElScce9FuhyKrDHpE6jKBsJ0b1Ua6EVvGCjccAFqyN24/JQ Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10446"; a="280303631" X-IronPort-AV: E=Sophos;i="5.93,254,1654585200"; d="scan'208";a="280303631" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Aug 2022 23:30:15 -0700 X-IronPort-AV: E=Sophos;i="5.93,254,1654585200"; d="scan'208";a="605190537" Received: from xhh-dg164.sh.intel.com ([10.238.5.169]) by orsmga007-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Aug 2022 23:30:14 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Mon, 22 Aug 2022 14:29:18 +0800 Message-Id: <20220822062918.9675-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH v2] qsvenc_{hevc,h264}: add scenario option X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Haihao Xiang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: uuLD/xowhsYT From: Haihao Xiang User may get better experience after providing corresponding senario hint to encoder for the encoding session. See [1] for scenario support in the SDK [1]https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#scenarioinfo --- doc/encoders.texi | 30 ++++++++++++++++++++++++++++++ libavcodec/qsvenc.c | 3 +++ libavcodec/qsvenc.h | 14 ++++++++++++++ libavcodec/qsvenc_h264.c | 1 + libavcodec/qsvenc_hevc.c | 1 + 5 files changed, 49 insertions(+) diff --git a/doc/encoders.texi b/doc/encoders.texi index 6d73f74196..1a7e34a272 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -3503,6 +3503,21 @@ Maximum video quantizer scale for B frame. @item @var{min_qp_b} Minimum video quantizer scale for B frame. + +@item @var{scenario} +Provides a hint to encoder about the scenario for the encoding session. +@table @samp +@item unknown +@item displayremoting +@item videoconference +@item archive +@item livestreaming +@item cameracapture +@item videosurveillance +@item gamestreaming +@item remotegaming +@end table + @end table @subsection HEVC Options @@ -3644,6 +3659,21 @@ Maximum video quantizer scale for B frame. @item @var{min_qp_b} Minimum video quantizer scale for B frame. + +@item @var{scenario} +Provides a hint to encoder about the scenario for the encoding session. +@table @samp +@item unknown +@item displayremoting +@item videoconference +@item archive +@item livestreaming +@item cameracapture +@item videosurveillance +@item gamestreaming +@item remotegaming +@end table + @end table @subsection MPEG2 Options diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 4831640868..fc9a59c483 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -337,6 +337,7 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q, av_log(avctx, AV_LOG_VERBOSE, "LowDelayBRC: %s\n", print_threestate(co3->LowDelayBRC)); av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeI: %d; ", co3->MaxFrameSizeI); av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeP: %d\n", co3->MaxFrameSizeP); + av_log(avctx, AV_LOG_VERBOSE, "ScenarioInfo: %"PRId16"\n", co3->ScenarioInfo); } if (exthevctiles) { @@ -924,6 +925,8 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q) q->extco3.MaxFrameSizeI = q->max_frame_size_i; if (q->max_frame_size_p >= 0) q->extco3.MaxFrameSizeP = q->max_frame_size_p; + + q->extco3.ScenarioInfo = q->scenario; } if (avctx->codec_id == AV_CODEC_ID_HEVC) { diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index d35a1318f2..a983651dda 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -111,6 +111,19 @@ { "max_qp_b", "Maximum video quantizer scale for B frame", OFFSET(qsv.max_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \ { "min_qp_b", "Minimum video quantizer scale for B frame", OFFSET(qsv.min_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, +#define QSV_OPTION_SCENARIO \ +{ "scenario", "A hint to encoder about the scenario for the encoding session", OFFSET(qsv.scenario), AV_OPT_TYPE_INT, { .i64 = MFX_SCENARIO_UNKNOWN }, \ + MFX_SCENARIO_UNKNOWN, MFX_SCENARIO_REMOTE_GAMING, VE, "scenario" }, \ +{ "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_UNKNOWN }, .flags = VE, "scenario" }, \ +{ "displayremoting", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_DISPLAY_REMOTING }, .flags = VE, "scenario" }, \ +{ "videoconference", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_VIDEO_CONFERENCE }, .flags = VE, "scenario" }, \ +{ "archive", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_ARCHIVE }, .flags = VE, "scenario" }, \ +{ "livestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_LIVE_STREAMING }, .flags = VE, "scenario" }, \ +{ "cameracapture", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_CAMERA_CAPTURE }, .flags = VE, "scenario" }, \ +{ "videosurveillance", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_VIDEO_SURVEILLANCE }, .flags = VE, "scenario" }, \ +{ "gamestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_GAME_STREAMING }, .flags = VE, "scenario" }, \ +{ "remotegaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_REMOTE_GAMING }, .flags = VE, "scenario" }, + extern const AVCodecHWConfigInternal *const ff_qsv_enc_hw_configs[]; typedef int SetEncodeCtrlCB (AVCodecContext *avctx, @@ -179,6 +192,7 @@ typedef struct QSVEncContext { int max_frame_size_p; int max_slice_size; int dblk_idc; + int scenario; int tile_cols; int tile_rows; diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c index ad9cf629df..a0dc31e24a 100644 --- a/libavcodec/qsvenc_h264.c +++ b/libavcodec/qsvenc_h264.c @@ -114,6 +114,7 @@ static const AVOption options[] = { QSV_OPTION_DBLK_IDC QSV_OPTION_LOW_DELAY_BRC QSV_OPTION_MAX_MIN_QP + QSV_OPTION_SCENARIO { "cavlc", "Enable CAVLC", OFFSET(qsv.cavlc), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, #if QSV_HAVE_VCM diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c index e11f5dec4a..a46df18a09 100644 --- a/libavcodec/qsvenc_hevc.c +++ b/libavcodec/qsvenc_hevc.c @@ -233,6 +233,7 @@ static const AVOption options[] = { QSV_OPTION_DBLK_IDC QSV_OPTION_LOW_DELAY_BRC QSV_OPTION_MAX_MIN_QP + QSV_OPTION_SCENARIO { "idr_interval", "Distance (in I-frames) between IDR frames", OFFSET(qsv.idr_interval), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT_MAX, VE, "idr_interval" }, { "begin_only", "Output an IDR-frame only at the beginning of the stream", 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, VE, "idr_interval" },