From a65c453f9e43a37ed56b20f335ca8b5f87fe5c33 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 10 Jan 2025 11:26:41 +0100 Subject: [PATCH] Reduce default max QP for AV1 from 56 to 52 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this CL VP8 and AV1 used the same max QP=56. Tests show that at this QP AV1 delivers a worse PSNR than VP8. We want AV1 min quality to be not worse than VP8. This CL reduces the default max QP for AV1 to 52. With this value libaom AV1 encoder delivers PSNR close to libvpx VP8 at QP 56. Bug: webrtc:351644568, b/369540380 Change-Id: I2e27ddab562f9c9710b11dc09076b03d7b308bb0 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/374041 Commit-Queue: Sergey Silkin Reviewed-by: Erik Språng Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/heads/main@{#43751} --- media/base/media_constants.cc | 1 + media/base/media_constants.h | 1 + rtc_tools/video_encoder/video_encoder.cc | 2 +- test/video_codec_tester.cc | 2 +- video/config/encoder_stream_factory.cc | 3 ++- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/media/base/media_constants.cc b/media/base/media_constants.cc index aaae12c139..76a77bb37e 100644 --- a/media/base/media_constants.cc +++ b/media/base/media_constants.cc @@ -137,6 +137,7 @@ const int kDefaultVideoMaxFramerate = 60; // Max encode quantizer for VP8/9 and AV1 encoders assuming libvpx/libaom API // range [0, 63] const int kDefaultVideoMaxQpVpx = 56; +const int kDefaultVideoMaxQpAv1 = 52; // Max encode quantizer for H264/5 assuming the bitstream range [0, 51]. const int kDefaultVideoMaxQpH26x = 51; diff --git a/media/base/media_constants.h b/media/base/media_constants.h index 7e245fc3e9..80e17b190e 100644 --- a/media/base/media_constants.h +++ b/media/base/media_constants.h @@ -158,6 +158,7 @@ extern const char kAv1FmtpTier[]; extern const int kDefaultVideoMaxFramerate; extern const int kDefaultVideoMaxQpVpx; +extern const int kDefaultVideoMaxQpAv1; extern const int kDefaultVideoMaxQpH26x; extern const size_t kConferenceMaxNumSpatialLayers; diff --git a/rtc_tools/video_encoder/video_encoder.cc b/rtc_tools/video_encoder/video_encoder.cc index a6317d384c..fc627f8bde 100644 --- a/rtc_tools/video_encoder/video_encoder.cc +++ b/rtc_tools/video_encoder/video_encoder.cc @@ -442,7 +442,7 @@ class TestVideoEncoderFactoryWrapper final { } else { RTC_LOG(LS_WARNING) << "Failed to configure svc bitrates for av1."; } - video_codec.qpMax = cricket::kDefaultVideoMaxQpVpx; + video_codec.qpMax = cricket::kDefaultVideoMaxQpAv1; break; case kVideoCodecH265: // TODO(bugs.webrtc.org/13485) diff --git a/test/video_codec_tester.cc b/test/video_codec_tester.cc index 192bb4ea6a..a74ea47150 100644 --- a/test/video_codec_tester.cc +++ b/test/video_codec_tester.cc @@ -1122,7 +1122,7 @@ class Encoder : public EncodedImageCallback { vc.qpMax = cricket::kDefaultVideoMaxQpVpx; break; case kVideoCodecAV1: - vc.qpMax = cricket::kDefaultVideoMaxQpVpx; + vc.qpMax = cricket::kDefaultVideoMaxQpAv1; break; case kVideoCodecH264: *(vc.H264()) = VideoEncoder::GetDefaultH264Settings(); diff --git a/video/config/encoder_stream_factory.cc b/video/config/encoder_stream_factory.cc index f77179f564..cb7f9f269c 100644 --- a/video/config/encoder_stream_factory.cc +++ b/video/config/encoder_stream_factory.cc @@ -106,9 +106,10 @@ int GetDefaultMaxQp(webrtc::VideoCodecType codec_type) { return kDefaultVideoMaxQpH26x; case webrtc::kVideoCodecVP8: case webrtc::kVideoCodecVP9: - case webrtc::kVideoCodecAV1: case webrtc::kVideoCodecGeneric: return kDefaultVideoMaxQpVpx; + case webrtc::kVideoCodecAV1: + return kDefaultVideoMaxQpAv1; } }