From patchwork Wed Aug 28 21:18:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: elliottk X-Patchwork-Id: 14769 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 478CC447D40 for ; Thu, 29 Aug 2019 00:26:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2117E680722; Thu, 29 Aug 2019 00:26:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw1-f74.google.com (mail-yw1-f74.google.com [209.85.161.74]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1285C68048C for ; Thu, 29 Aug 2019 00:26:10 +0300 (EEST) Received: by mail-yw1-f74.google.com with SMTP id l63so858084ywg.21 for ; Wed, 28 Aug 2019 14:26:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:in-reply-to:message-id:mime-version:references:subject:from:to; bh=kEqayKgV2mH3DvVW3SLTKKMYhrKiVcWI4vQOYLMQS5c=; b=cUEdIO+z0kmq+O7B/pqljzBBFawmiEtPAXl73TLU/EdsxAK3JxKlUM4HABibYXkr8G VHxQZXQzOriD//yb2KK59S7Wi599WRoOnyAUofb0KsFOtsZ4B5iI63MTlCu5j2JF/+fJ Ll+Xp98GWOgraaCw2IJm6CZy/w3bhg2RMh2cRiJOvno9sZENrSWBQ4z3aHmuaiNS5pgb AXczzAE7JpzC8b7bOqlYzdE44ACq8TJ9aZQl7eg2xTH7Y9NhrBAWoxdycWNlal+UENAx nWv3wCQaOUPCCL++6IY+seb9sSg/rR6R/jYQr4knWOhi3m0tk6upxlSJ/PAAKNbORaKM 5VdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to; bh=kEqayKgV2mH3DvVW3SLTKKMYhrKiVcWI4vQOYLMQS5c=; b=m6vzV/QBoK01y4Dr4Ct5cB2m2YXQ7bO6UgVsrh0Z7sVnxf9KvYLHQzg75unShhCkwW SjBxleLhGtPsFQYUNC9rfKtlvWWivHOxAi20zqrnN5WSbKfHgB064AwgwmmNLqiCbERf vkhzuqzSZYQy8ECZ9Pfm6mpqre2F4uycX6dY8y2/uOhYIKF4xgp04Ne4gzA4k8kLk3KR BxUR2xI/zEDAjDMmhWXeWSobKQ3/XzCu7YNanPK/p4h0VB/s1yKqvtsh5aeqObHK0l4f dONL9TMGx1FBdAO5g+HW+JnpcGUL3tlUw+1c2/g3+2fzRX46Qlylpj/IyU8q8Yh49vt9 Zx4Q== X-Gm-Message-State: APjAAAWO4Mz7ZLRJW9nRL/Hd+TurK/Pf/dgsqspk4d2XF9MLN2R1i291 nRh0yr5yrK9KhzAWAt4w8M+0k3dWt7TmPoQwBYMV4HnFPnXkoD+6BzGsqJfGoqO8UVhWdQVimcL D/glhWMVE05s48wd4B2qfPnmuI7okWpBO+WdFw/qGLWOqoW8jOsMVyGqBhkijm9dHbWc= X-Google-Smtp-Source: APXvYqy6c1RzqoGHhiE7tV+JlaoMB2c50HUWvmMK01mY9NomSDeS27MfoT4fePz9/MLme3EOQA5e1hQ2I7tVVw== X-Received: by 2002:a81:a313:: with SMTP id a19mr4887629ywh.510.1567027125812; Wed, 28 Aug 2019 14:18:45 -0700 (PDT) Date: Wed, 28 Aug 2019 14:18:43 -0700 In-Reply-To: <20190827150545.GA3219@michaelspb> Message-Id: <20190828211843.50548-1-elliottk@google.com> Mime-Version: 1.0 References: <20190827150545.GA3219@michaelspb> 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 +++++++++++++++++++++++++++++++++++------- libavcodec/version.h | 2 +- 2 files changed, 61 insertions(+), 12 deletions(-) diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index feb52ea0dd..42504ab95e 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 && ctx->lossless < 0) { + 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" }, diff --git a/libavcodec/version.h b/libavcodec/version.h index e70ebc0c70..cda6dbae47 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #define LIBAVCODEC_VERSION_MAJOR 58 #define LIBAVCODEC_VERSION_MINOR 55 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MICRO 102 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \