From patchwork Sun Aug 25 23:43:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: elliottk X-Patchwork-Id: 14714 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 7F88444945E for ; Mon, 26 Aug 2019 02:43:42 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5648668AC14; Mon, 26 Aug 2019 02:43:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yb1-f202.google.com (mail-yb1-f202.google.com [209.85.219.202]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C8B2168ABBE for ; Mon, 26 Aug 2019 02:43:35 +0300 (EEST) Received: by mail-yb1-f202.google.com with SMTP id m137so11743599ybf.18 for ; Sun, 25 Aug 2019 16:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:message-id:mime-version:subject:from:to; bh=aWyIYN0ZeiShTS7WbxRQfiuv6Fma7iaNX1Igwv0wmxM=; b=XN/xOcoxFglcxmSzBs56OF03Wy68uX5PT290xzFkk3gMMJUJNgyoAtSx9W3qNoMh2Q cVJJu/NMmH4kMba0Z3OqQIlI2bZjnYyrHYnp+3k6JGnT8JsguU3AErCluNPYcQ/8hn0/ 2pm5kkyTYj1en8lIYj5y+pYoBFSG7h6gBY9BLUUaPBcfjduFy5nCTBl+aBhE0NGfi7Ue j7wKovT7HuQUMvk46R94hsjqCnuVmBOPc/vr8FpxBg8yZbIAcbRC3bqD2jZQuTk+8VPP lMXzmiTdE9r+2E9TkCkl9eJkg3tHBmJSmba7rxE4vHLFV6X2WbJ2bkXUEHIwEOONeRq2 VKxA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:message-id:mime-version:subject:from:to; bh=aWyIYN0ZeiShTS7WbxRQfiuv6Fma7iaNX1Igwv0wmxM=; b=ceuDllo21muNAdybRNtrzwklS3A1r1+icfAAoayIZC2ajobTw5VWUaEZrSiZ01ttZ5 6d3nqhckWXsLu+dlcXX2sl7XriLeD/LbpW2Tyfy60KHclX/sQLQlda9bbTR5mHIDa9Tr qYFqQ7HV1zomLMVBo+Hy5WCH9K6XYx+Ziz95K8g1HzHHEgzSh2nIl99JszMr13G3Vy1o BCk0NjhdH7zrEpAGqw0zqRbzuRGrIpk50q092t7LCPhY1rCDR7vkS6e+oOJleGD2FXu4 qLnHK2A6JF9Wp8sdXqBiYgB+l2ZWcYGUZ6RZWIDcn7W30c5ifn0Z/LdZ7Cil5l+f0r+n 1zkg== X-Gm-Message-State: APjAAAXKHnrOboAxmv9ZL0nwkhg+G41hSDLgRqOJZqGhi2lZKqOJ6Xdb da6PQHFwN6WtL6TZF/+2J1DDKGVDv5NBQY22R+OdwS0sxjP5DnCBpnZtuSZFqG8SB8mqwFoveG7 EZA9hnBJZeyhFigep5rqSPU4d/vLbFzDp7+E0bJo0uXbubN/cCAqr3v3b2hlTJBzHtnI= X-Google-Smtp-Source: APXvYqwAq0DUbc+dORpYtx6voZfMdKZpB9grjt2I0enQySUHpZDQzYNwdBrJe/tEFPE5sQtG0n7VxNj1IZ4wQA== X-Received: by 2002:a81:8405:: with SMTP id u5mr11214849ywf.118.1566776613988; Sun, 25 Aug 2019 16:43:33 -0700 (PDT) Date: Sun, 25 Aug 2019 16:43:31 -0700 Message-Id: <20190825234331.216291-1-elliottk@google.com> Mime-Version: 1.0 X-Mailer: git-send-email 2.23.0.187.g17f5b7556c-goog From: Elliott Karpilovsky To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH] Change libvpx-vpx default to crf=32. 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" Current default is 200kbps, which produces inconsistent results (too high for low-res, too low for hi-res). Use CRF instead, which will adapt. Affects vp8/vp9. Also have VP8 use a default bitrate of 256kbps. --- libavcodec/libvpxenc.c | 71 +++++++++++++++++++++++++++++++++++------- 1 file changed, 60 insertions(+), 11 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index feb52ea0dd..18f5b742b7 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -510,6 +510,63 @@ static void set_color_range(AVCodecContext *avctx) #endif #endif +/** + * Set the target bitrate to VPX library default. Also set CRF to 32 if needed. + */ +static void set_vp8_defaults(AVCodecContext *avctx, + struct vpx_codec_enc_cfg *enccfg) { + VPxContext *ctx = avctx->priv_data; + av_assert0(!avctx->bit_rate); + avctx->bit_rate = enccfg->rc_target_bitrate * 1000; + if (enccfg->rc_end_usage == VPX_CQ) { + av_log(avctx, AV_LOG_WARNING, + "Bitrate not specified for constrained quality mode, using default of %dkbit/sec\n", + enccfg->rc_target_bitrate); + } else { + enccfg->rc_end_usage = VPX_CQ; + ctx->crf = 32; + av_log(avctx, AV_LOG_WARNING, + "Neither bitrate nor constrained quality specified, using default CRF of %d and bitrate of %dkbit/sec\n", + ctx->crf, enccfg->rc_target_bitrate); + } +} + + +#if CONFIG_LIBVPX_VP9_ENCODER +/** + * Keep the target bitrate at 0 to engage constant quality mode. If CRF is not + * set, use 32. + */ +static void set_vp9_defaults(AVCodecContext *avctx, + struct vpx_codec_enc_cfg *enccfg) { + VPxContext *ctx = avctx->priv_data; + av_assert0(!avctx->bit_rate); + if (enccfg->rc_end_usage != VPX_Q) { + enccfg->rc_end_usage = VPX_Q; + ctx->crf = 32; + av_log(avctx, AV_LOG_WARNING, + "Neither bitrate nor constrained quality specified, using default CRF of %d\n", + ctx->crf); + } +} +#endif + +/** + * Called when the bitrate is not set. It sets appropriate default values for + * bit-rate and CRF. + */ +static void set_vpx_defaults(AVCodecContext *avctx, + struct vpx_codec_enc_cfg *enccfg) { + av_assert0(!avctx->bit_rate); +#if CONFIG_LIBVPX_VP9_ENCODER + if (avctx->codec_id == AV_CODEC_ID_VP9) { + set_vp9_defaults(avctx, enccfg); + return; + } +#endif + set_vp8_defaults(avctx, enccfg); +} + static av_cold int vpx_init(AVCodecContext *avctx, const struct vpx_codec_iface *iface) { @@ -580,18 +637,9 @@ static av_cold int vpx_init(AVCodecContext *avctx, if (avctx->bit_rate) { enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000, AV_ROUND_NEAR_INF); -#if CONFIG_LIBVPX_VP9_ENCODER - } else if (enccfg.rc_end_usage == VPX_Q) { -#endif } else { - if (enccfg.rc_end_usage == VPX_CQ) { - enccfg.rc_target_bitrate = 1000000; - } else { - avctx->bit_rate = enccfg.rc_target_bitrate * 1000; - av_log(avctx, AV_LOG_WARNING, - "Neither bitrate nor constrained quality specified, using default bitrate of %dkbit/sec\n", - enccfg.rc_target_bitrate); - } + // Set bit-rate to default value. Also sets CRF to default if needed. + set_vpx_defaults(avctx, &enccfg); } if (avctx->codec_id == AV_CODEC_ID_VP9 && ctx->lossless == 1) { @@ -1266,6 +1314,7 @@ static const AVOption vp9_options[] = { #undef LEGACY_OPTIONS static const AVCodecDefault defaults[] = { + { "b", "0" }, { "qmin", "-1" }, { "qmax", "-1" }, { "g", "-1" },