From patchwork Fri Aug 12 04:52:53 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 37240 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp776301pzi; Thu, 11 Aug 2022 21:53:18 -0700 (PDT) X-Google-Smtp-Source: AA6agR5yeC/v36qUaX5R3lZL2GNFYjyydxnQOCvEUExvsNeqD97C4RS1emIRpejyBdmU3yCrn2p8 X-Received: by 2002:a17:907:97d5:b0:730:9eac:d965 with SMTP id js21-20020a17090797d500b007309eacd965mr1442298ejc.353.1660279998034; Thu, 11 Aug 2022 21:53:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660279998; cv=none; d=google.com; s=arc-20160816; b=cU1RNTdtxR58/ZeRxeIRy4euMGZMAuRE1qL/usDPA5iU/2sLv79pgzJxK5d4VEIfZM Cfv1aProlKU6qz7V0/9mGkVFgu0l5QxcwVhocGcFde5wfglS8FSZjMiNV+NDqeU7N4OZ HEQmDgMeAXPS7U7GlO9GXYS3bFVAYtRuxcCwdSQ/ybnySPmumGljITgOAYXF8TxYiWwo wj0Llx1lCxas+ZTtVYo2t2y5IL7bEE4lFfsq0j4+K2hjCp42HUXr3ViZgK9FOc2HsjgA Hmj+xLa4nDt5DSOKNf02jHC0YQf9Ht48QhS0sTdPKuMmXIl34FXqoQ/sqamSdPqAlOD+ mztg== 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=ekyP5FUZTlvoLcZFEXTHW1X3LEZekNuNS0ZgKZVNk64=; b=ubZck4+F3+MUzOvhbgpGpL+bUyzN3r3kMCJREvNLPt+lliaYA9LRHx1v2zZ1NXJdEc S/kdvT3af/EkAZ/xLnDBmVYxFNip0drZxoU2XQhkfeVrdKEq3zAoS6DbCaufIVMF6sNE 7AnVbDjIHdYXQ+y8AES+h9fCnWsvzxtI5mArQ/pk1K1nbnqbUzBVzjoU6trTnyVxHueh wYCN5InqPbvSp1IGrIOj4MC1G2JkLYfvfw3BwrvirjbabIKyktIXObPNNcLrr3q+5zXk j54Ze27wPelplI0rY6dMHwZ6zv8fhcdf+RK4u4bwFvswQkXicqaP58gBfrxlSyHsFCZc YKKw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="F/hqqFVw"; 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 hq28-20020a1709073f1c00b0072e674c9ecasi1136659ejc.239.2022.08.11.21.53.16; Thu, 11 Aug 2022 21:53:18 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b="F/hqqFVw"; 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 CB7CE68B947; Fri, 12 Aug 2022 07:53:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B716068B595 for ; Fri, 12 Aug 2022 07:53:05 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1660279990; x=1691815990; h=from:to:cc:subject:date:message-id; bh=5iPFZNJyT5vZtoU7wsF+BNEQZ21BVRseo8ePqfeL9KI=; b=F/hqqFVwJ5YtgdndDgLR8uROYxwJIOjQorf8zfQ5pHiywZgKJQVUtk19 OIK1z9Z9MLuBIAMB24UW3EL65PF0hTUIxB19kcYwmsukJ2jyEYx8jtowk XxhH4GSX9x7icvNr9iUhap0+4WJyYAt+nRZq76igZu1IQ8N5WdhJtYN8C Tpy89nhn+lu54pbpBix2FQfUWmlFYj1h5kLkgCAavBmZist/oa63SVeoI zTgYFQYvVNCynx6e7M1/9j6G2ap7i9obxTj9ZUxBha1V1ivRWi5P9X9pz tI97Xo9b9jOQSdNna1hw/R+q8qR6xXKFrFb09Adr8aofSvmau37DPJAtq A==; X-IronPort-AV: E=McAfee;i="6400,9594,10436"; a="271905323" X-IronPort-AV: E=Sophos;i="5.93,231,1654585200"; d="scan'208";a="271905323" Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga107.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Aug 2022 21:53:02 -0700 X-IronPort-AV: E=Sophos;i="5.93,231,1654585200"; d="scan'208";a="602400190" 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; 11 Aug 2022 21:53:01 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Fri, 12 Aug 2022 12:52:53 +0800 Message-Id: <20220812045253.11870-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH] 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: UWKZ7Ks672kw 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 | 13 +++++++++++++ libavcodec/qsvenc_h264.c | 1 + libavcodec/qsvenc_hevc.c | 1 + 5 files changed, 48 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..53c0955e87 100644 --- a/libavcodec/qsvenc.h +++ b/libavcodec/qsvenc.h @@ -111,6 +111,18 @@ { "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 = 0 }, 0, 8, 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 +191,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" },