webrtc/video/encoder_bitrate_adjuster.h
Erik Språng 73cf80a932 Fixes incorrect feedback to EncoderBitrateAdjuster [perf note]
At the point where an EncodedImage is reported to the
EncoderBitrateAdjuster (in order to estimate utilization), the image
data has been cleared so the size is 0 - meaning the esimtated
utilization is 0 so pushback is in effect only applied at the
beginning before an estimate is available.

This CL fixes that by explicitly using spatial/temporal id and size in
bytes, rather than passing along the EncodedImage proxy.

It is unclear when this broke, but the regression seems rather old.

This CL will affect the encoded bitrate (and thus indirectly BWE
ramp-up rate), but should avoid exessive delay at low bitrates.
Perf bots will likely trigger alerts, this is expected.

In case there are undesired side-effects, we can entirely disable the
adjuster using existing field-trials.

Bug: webrtc:12606
Change-Id: I936c2045f554696d8b4bb518eee6871ffc12c47d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/212900
Commit-Queue: Erik Språng <sprang@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33550}
2021-03-24 12:08:23 +00:00

75 lines
2.8 KiB
C++

/*
* Copyright (c) 2019 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef VIDEO_ENCODER_BITRATE_ADJUSTER_H_
#define VIDEO_ENCODER_BITRATE_ADJUSTER_H_
#include <memory>
#include "api/video/encoded_image.h"
#include "api/video/video_bitrate_allocation.h"
#include "api/video_codecs/video_encoder.h"
#include "video/encoder_overshoot_detector.h"
namespace webrtc {
class EncoderBitrateAdjuster {
public:
// Size of sliding window used to track overshoot rate.
static constexpr int64_t kWindowSizeMs = 3000;
// Minimum number of frames since last layout change required to trust the
// overshoot statistics. Otherwise falls back to default utilization.
// By layout change, we mean any spatial/temporal layer being either enabled
// or disabled.
static constexpr size_t kMinFramesSinceLayoutChange = 30;
// Default utilization, before reliable metrics are available, is set to 20%
// overshoot. This is conservative so that badly misbehaving encoders don't
// build too much queue at the very start.
static constexpr double kDefaultUtilizationFactor = 1.2;
explicit EncoderBitrateAdjuster(const VideoCodec& codec_settings);
~EncoderBitrateAdjuster();
// Adjusts the given rate allocation to make it paceable within the target
// rates.
VideoBitrateAllocation AdjustRateAllocation(
const VideoEncoder::RateControlParameters& rates);
// Updated overuse detectors with data about the encoder, specifically about
// the temporal layer frame rate allocation.
void OnEncoderInfo(const VideoEncoder::EncoderInfo& encoder_info);
// Updates the overuse detectors according to the encoded image size.
void OnEncodedFrame(DataSize size, int spatial_index, int temporal_index);
void Reset();
private:
const bool utilize_bandwidth_headroom_;
VideoEncoder::RateControlParameters current_rate_control_parameters_;
// FPS allocation of temporal layers, per spatial layer. Represented as a Q8
// fraction; 0 = 0%, 255 = 100%. See VideoEncoder::EncoderInfo.fps_allocation.
absl::InlinedVector<uint8_t, kMaxTemporalStreams>
current_fps_allocation_[kMaxSpatialLayers];
// Frames since layout was changed, mean that any spatial or temporal layer
// was either disabled or enabled.
size_t frames_since_layout_change_;
std::unique_ptr<EncoderOvershootDetector>
overshoot_detectors_[kMaxSpatialLayers][kMaxTemporalStreams];
// Minimum bitrates allowed, per spatial layer.
uint32_t min_bitrates_bps_[kMaxSpatialLayers];
};
} // namespace webrtc
#endif // VIDEO_ENCODER_BITRATE_ADJUSTER_H_