mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-13 05:40:42 +01:00

Convert most field trials used in PCLF tests. Change-Id: I26c0c4b1164bb0870aae1a488942cde888cb459d Bug: webrtc:10335 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/322703 Commit-Queue: Jeremy Leconte <jleconte@google.com> Reviewed-by: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/main@{#40909}
91 lines
3.4 KiB
C++
91 lines
3.4 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/field_trials_view.h"
|
|
#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 simulcast/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;
|
|
|
|
EncoderBitrateAdjuster(const VideoCodec& codec_settings,
|
|
const FieldTrialsView& field_trials);
|
|
~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.
|
|
// `stream_index` is the spatial or simulcast index.
|
|
// TODO(https://crbug.com/webrtc/14891): If we want to support a mix of
|
|
// simulcast and SVC we'll also need to consider the case where we have both
|
|
// simulcast and spatial indices.
|
|
void OnEncodedFrame(DataSize size, int stream_index, int temporal_index);
|
|
|
|
void Reset();
|
|
|
|
private:
|
|
const bool utilize_bandwidth_headroom_;
|
|
|
|
VideoEncoder::RateControlParameters current_rate_control_parameters_;
|
|
// FPS allocation of temporal layers, per simulcast/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 simulcast, 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];
|
|
|
|
// Size in pixels of each spatial layer.
|
|
uint32_t frame_size_pixels_[kMaxSpatialLayers];
|
|
|
|
// Codec type used for encoding.
|
|
VideoCodecType codec_;
|
|
|
|
// Codec mode: { kRealtimeVideo, kScreensharing }.
|
|
VideoCodecMode codec_mode_;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // VIDEO_ENCODER_BITRATE_ADJUSTER_H_
|