From patchwork Sat Dec 28 23:55:13 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 17031 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 997CD448B82 for ; Sun, 29 Dec 2019 01:55:51 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 83A3F68AB1E; Sun, 29 Dec 2019 01:55:51 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7654568AB36 for ; Sun, 29 Dec 2019 01:55:43 +0200 (EET) Received: by mail-pg1-f175.google.com with SMTP id b9so16282452pgk.12 for ; Sat, 28 Dec 2019 15:55:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=4pvPaSjt0Sh4lFA9Aso1C0RSY8A+Xdgo7pxVMQM95Ls=; b=iq5QtuKPpwDPkajxPX2QNFbjl8+kKg7GuukwxC7sYvHvQVhBqB0iELbBfb17d2bywo GpAbKupqtkM/FSBOrbDikcZcsE2zkG9rctLYv58m/L2ZxCCtJBJCUAGfFle7U2yFZHKe depryv1CV72cL5vnnf/H8pMQ0xoUmR1EFRCX3cIgLwWLwjNdMAE2gHmJgXmnx863LTC8 apFWqfnKfMq9jQVTjFN2JDKTkSYK4UfnfI6sNHHzK+k6k1+mTOnV6EGt//iV2gJ6cRxr a1IXPqpHDuAq34y8D0kATdwXScncZH6IzEILLWCtYZCjAxkTo2RjM3Yq4dGpyspTat3l xp6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4pvPaSjt0Sh4lFA9Aso1C0RSY8A+Xdgo7pxVMQM95Ls=; b=n/2yM02V2NN0owkUDUwS+NwDwRt/YX7ZZac9IinPIxI+Qi1sLZf3QSiOP2KkCosqzM 5YgS4bel7T5K1ZvcNj65G240O8tgFxxRpJW2IMevw5JYxPHL7qcHB6NxhFvaiGG1fQsK z/MvCkbCDGO6iVLZ0328ftRNyQateFVmJ1zdwkhMy35L5PWEme3+2I9LchRinsyQL1yU TS23PgI+lJMpK00c+R1+4PbaVMxWoqQ96EZU/bJUkysuv0AP9Enl7ajl6qUMlHfookZw O32On9e8W9AnpV81dTRBJxx5kTWK++42gc6KI0JELHZukq3WkLhBm7ofJ7teqqubjHNw 8nlQ== X-Gm-Message-State: APjAAAXRB7DLhhQ6ExhM0PrqccCE0x2+pGafJB+AR9l8CRAv25Tk6DQz rEU9gd2StgtSo15R5fMek2qdJQ/b X-Google-Smtp-Source: APXvYqw9qxDj575HG8/npOiGhWpZCAN9g5Lwx19eODhcofFmYU+m2HUDHnb3UZz81ZziUU6BE5ExwQ== X-Received: by 2002:a65:5281:: with SMTP id y1mr61615577pgp.327.1577577341427; Sat, 28 Dec 2019 15:55:41 -0800 (PST) Received: from localhost.localdomain ([181.23.77.192]) by smtp.gmail.com with ESMTPSA id f43sm19834039pje.23.2019.12.28.15.55.38 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 28 Dec 2019 15:55:41 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 28 Dec 2019 20:55:13 -0300 Message-Id: <20191228235514.5335-2-jamrial@gmail.com> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20191228235514.5335-1-jamrial@gmail.com> References: <20191228235514.5335-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3] avcodec/libx265: add a qp option and apply the relevant global AVCodecContext settings to the encoder context X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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" Signed-off-by: James Almer --- doc/encoders.texi | 22 ++++++++++++++++++++++ libavcodec/libx265.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/doc/encoders.texi b/doc/encoders.texi index 673eaf6496..61e674cf96 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -2441,6 +2441,28 @@ Set profile restrictions. @item crf Set the quality for constant quality mode. +@item qp +Set constant quantization rate control method parameter. + +@item qmin +Minimum quantizer scale. + +@item qmax +Maximum quantizer scale. + +@item qdiff +Maximum difference between quantizer scales. + +@item qblur +Quantizer curve blur + +@item qcomp +Quantizer curve compression factor + +@item i_qfactor + +@item b_qfactor + @item forced-idr Normally, when forcing a I-frame type, the encoder can select any type of I-frame. This option forces it to choose an IDR-frame. diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c index 508fade98b..581732d169 100644 --- a/libavcodec/libx265.c +++ b/libavcodec/libx265.c @@ -42,6 +42,7 @@ typedef struct libx265Context { const x265_api *api; float crf; + int cqp; int forced_idr; char *preset; char *tune; @@ -223,11 +224,30 @@ static av_cold int libx265_encode_init(AVCodecContext *avctx) av_log(avctx, AV_LOG_ERROR, "Invalid crf: %2.2f.\n", ctx->crf); return AVERROR(EINVAL); } + ctx->params->rc.rateControlMode = X265_RC_CRF; } else if (avctx->bit_rate > 0) { ctx->params->rc.bitrate = avctx->bit_rate / 1000; ctx->params->rc.rateControlMode = X265_RC_ABR; + } else if (ctx->cqp >= 0) { + ctx->params->rc.qp = ctx->cqp; + ctx->params->rc.rateControlMode = X265_RC_CQP; } + if (avctx->qmin >= 0) + ctx->params->rc.qpMin = avctx->qmin; + if (avctx->qmax >= 0) + ctx->params->rc.qpMax = avctx->qmax; + if (avctx->max_qdiff >= 0) + ctx->params.rc.qpStep = avctx->max_qdiff; + if (avctx->qblur >= 0) + ctx->params->rc.qblur = avctx->qblur; + if (avctx->qcompress >= 0) + ctx->params->rc.qCompress = avctx->qcompress; + if (avctx->i_quant_factor > 0) + ctx->params->rc.ipFactor = 1 / fabs(avctx->i_quant_factor); + if (avctx->b_quant_factor > 0) + ctx->params->rc.pbFactor = avctx->b_quant_factor; + ctx->params->rc.vbvBufferSize = avctx->rc_buffer_size / 1000; ctx->params->rc.vbvMaxBitrate = avctx->rc_max_rate / 1000; @@ -548,6 +568,7 @@ static av_cold void libx265_encode_init_csp(AVCodec *codec) #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM static const AVOption options[] = { { "crf", "set the x265 crf", OFFSET(crf), AV_OPT_TYPE_FLOAT, { .dbl = -1 }, -1, FLT_MAX, VE }, + { "qp", "set the x265 qp", OFFSET(cqp), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE }, { "forced-idr", "if forcing keyframes, force them as IDR frames", OFFSET(forced_idr),AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE }, { "preset", "set the x265 preset", OFFSET(preset), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE }, { "tune", "set the x265 tune parameter", OFFSET(tune), AV_OPT_TYPE_STRING, { 0 }, 0, 0, VE }, @@ -569,6 +590,13 @@ static const AVCodecDefault x265_defaults[] = { { "g", "-1" }, { "keyint_min", "-1" }, { "refs", "-1" }, + { "qmin", "-1" }, + { "qmax", "-1" }, + { "qdiff", "-1" }, + { "qblur", "-1" }, + { "qcomp", "-1" }, + { "i_qfactor", "-1" }, + { "b_qfactor", "-1" }, { NULL }, };