From patchwork Wed Jun 15 07:25:55 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Chen, Wenbin" X-Patchwork-Id: 36236 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp205248pzb; Wed, 15 Jun 2022 00:26:27 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxGyeTOgIn7eR+V49LJ+w165di685EPgWOLK57bBRcWWtC5YK1dqt+EXGj0WkxIdosIEY+u X-Received: by 2002:a17:907:9813:b0:711:d5ac:b9ef with SMTP id ji19-20020a170907981300b00711d5acb9efmr7743463ejc.95.1655277986670; Wed, 15 Jun 2022 00:26:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1655277986; cv=none; d=google.com; s=arc-20160816; b=ChxgLeSJRfg4w50Qd+golFbB7+LbfzIXaW7kEEFJ1kAQdwEkuAmwswv+Pk5T27sMty yunwQr3XiXO9ont8YPOCKl9aX4zungmYLq2QBxqt0AlTkupLrokiE/j0kuSEVbEc4r+O BRfbvQHk4TZsUE3xjS1g+MHn6L6Hetqz6EqpaaqiHiBBXlvR36OBZEZxDphXv9S7fg7p iFcPtQt2w79RQ6l+XLJPmS3iSuL6YLGsj86QzzF2qNq0nsmYB4SQAb6WhLIgu0X9bh9k i2eDsdTEIMYPqR8gfEGRdi8XpHHK8GTCFZJw6RG7FzjVE85lR604mWPWwBo7t6SvQbfI FgAA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=NrA0Ii2EgpC1zUcQqelYGM4zbYKIGXNfZkTKyhy6oHc=; b=L03I/9YSp4E8HI3ITN+xtij4sOH7rwS14gCWtjhVfe7h+OB2o8UCNh1W4Nlw8h+H5k e8w5arcZiA3ExXgoPgPuys/mspuD9sXgqLWcYDtsse0aUuDvfxMoqPbY0BUX2h0/sLnO E1x/bIlabUYjYgZ3qCXm9qinkDnEk1P0VdRkszjw//p7uFf01nj+VcDC+ezE7fMh/hdi Na/KinXYmFwWcMWuaq+mUtUI31R6mjkbc6eTarhnxpgxXRBl5dZR92GfRm/Xy1nFkyls 8W8ht+bfjHl4+RM5hkbzp61O3fMNlq5XjQxE3SqRhQr5f6wt3FR30qEKR5PxVrKtJKDJ V3dg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=I+ShEf0w; 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 dr8-20020a170907720800b00711da8bb5easi15601022ejc.871.2022.06.15.00.26.25; Wed, 15 Jun 2022 00:26: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; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=I+ShEf0w; 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 44BB868B6E3; Wed, 15 Jun 2022 10:26:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4C8E868B655 for ; Wed, 15 Jun 2022 10:26:13 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1655277979; x=1686813979; h=from:to:subject:date:message-id:mime-version: content-transfer-encoding; bh=hneKjFW3jIgmzKKR1E6nIpZ2bRN4HH89qRtht/IjfxI=; b=I+ShEf0wPy6u66lLl25FWaYVXYND4KpSSecHrxeZLLThcqBcwiHRrDra gG5CsYz3uAhPNC3nNt48ylxo7IkqRll9PtFF7oHBeebglBs/xxuS0NG+t kgcMyx6dSO3Ju+NhK1yEeeojKSIoeWJ7dUgub+gekHJJW5BXRQfv+WuwO FU6N96xwBurxwHZhtwdif07wDs+khowP3yqqehwFaPOerfkZ+/4eDG3nU nsU1yjr0uqczOwZcpsaywLUQiqyXPgzSHD8EGvguCKZtm7cU+24WY93tr A0EBjU2dLfKJu06r4Vchy3cdyNLbsznv5LO7SbwWb5Um99W29c6kKyEXz A==; X-IronPort-AV: E=McAfee;i="6400,9594,10378"; a="276439465" X-IronPort-AV: E=Sophos;i="5.91,300,1647327600"; d="scan'208";a="276439465" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jun 2022 00:26:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.91,300,1647327600"; d="scan'208";a="652504157" Received: from wenbin-z390-aorus-ultra.sh.intel.com ([10.239.35.4]) by fmsmga004.fm.intel.com with ESMTP; 15 Jun 2022 00:26:10 -0700 From: Wenbin Chen To: ffmpeg-devel@ffmpeg.org Date: Wed, 15 Jun 2022 15:25:55 +0800 Message-Id: <20220615072555.4013250-1-wenbin.chen@intel.com> X-Mailer: git-send-email 2.32.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] libavcodec/qsvenc: Enable fixed QP configure in qsv CQP runtime 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: rtf+YZ+8sC93 From: Yue Heng Enable dynamic QP configuration in runtime on qsv encoder. Through AVFrame->metadata, we can set key "qsv_config_qp" to change QP configuration when we encode video in CQP mode. Signed-off-by: Yue Heng Signed-off-by: Wenbin Chen --- doc/encoders.texi | 9 +++++++ libavcodec/qsvenc.c | 59 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/doc/encoders.texi b/doc/encoders.texi index 9796a606fa..1eb75e199a 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -3333,6 +3333,15 @@ Forcing I frames as IDR frames. For encoders set this flag to ON to reduce power consumption and GPU usage. @end table +@subsection Runtime Options +Following options can be used durning qsv encoding. + +@table @option +@item @var{qsv_config_qp} +This option can be set in per-frame metadata. QP parameter can be dynamically +changed when encode in CQP mode. +@end table + @subsection H264 options These options are used by h264_qsv diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index 2b3b06767d..52462950be 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -146,6 +146,14 @@ static const struct { { MFX_RATECONTROL_QVBR, "QVBR" }, }; +#define UPDATE_PARAM(a, b) \ +do { \ + if ((a) != (b)) { \ + a = b; \ + updated = 1; \ + } \ +} while (0) \ + static const char *print_ratecontrol(mfxU16 rc_mode) { int i; @@ -1520,6 +1528,53 @@ static void print_interlace_msg(AVCodecContext *avctx, QSVEncContext *q) } } +static int update_qp(AVCodecContext *avctx, QSVEncContext *q, + const AVFrame *frame) +{ + int updated = 0, qp = 0, new_qp; + AVDictionaryEntry *entry = av_dict_get(frame->metadata, "qsv_config_qp", + NULL, 0); + if (entry && q->param.mfx.RateControlMethod == MFX_RATECONTROL_CQP) { + qp = atoi(entry->value); + av_log(avctx, AV_LOG_DEBUG, "Configure qp: %d\n",qp); + if (qp < 0 || qp > 51) + av_log(avctx, AV_LOG_WARNING, "Invalid qp, clip to 0 ~ 51\n"); + + qp = av_clip(qp, 0, 51); + UPDATE_PARAM(q->param.mfx.QPP, qp); + new_qp = av_clip(qp * fabs(avctx->i_quant_factor) + + avctx->i_quant_offset, 0, 51); + UPDATE_PARAM(q->param.mfx.QPI, new_qp); + new_qp = av_clip(qp * fabs(avctx->b_quant_factor) + + avctx->b_quant_offset, 0, 51); + UPDATE_PARAM(q->param.mfx.QPB, new_qp); + av_log(avctx, AV_LOG_DEBUG, + "using fixed qp = %d/%d/%d for idr/p/b frames\n", + q->param.mfx.QPI, q->param.mfx.QPP, q->param.mfx.QPB); + } + return updated; +} + +static int update_parameters(AVCodecContext *avctx, QSVEncContext *q, + const AVFrame *frame) +{ + int needReset = 0, ret = 0; + + if (!frame) + return 0; + + needReset = update_qp(avctx, q, frame); + if (needReset) { + q->param.ExtParam = q->extparam_internal; + q->param.NumExtParam = q->nb_extparam_internal; + av_log(avctx, AV_LOG_DEBUG, "Parameter change, call msdk reset.\n"); + ret = MFXVideoENCODE_Reset(q->session, &q->param); + if (ret < 0) + return ff_qsv_print_error(avctx, ret, "Error during resetting"); + } + return 0; +} + static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, const AVFrame *frame) { @@ -1630,6 +1685,10 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, { int ret; + ret = update_parameters(avctx, q, frame); + if (ret < 0) + return ret; + ret = encode_frame(avctx, q, frame); if (ret < 0) return ret;