123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * 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_OVERSHOOT_DETECTOR_H_
- #define VIDEO_ENCODER_OVERSHOOT_DETECTOR_H_
- #include <deque>
- #include "absl/types/optional.h"
- #include "api/units/data_rate.h"
- namespace webrtc {
- class EncoderOvershootDetector {
- public:
- explicit EncoderOvershootDetector(int64_t window_size_ms);
- ~EncoderOvershootDetector();
- void SetTargetRate(DataRate target_bitrate,
- double target_framerate_fps,
- int64_t time_ms);
- // A frame has been encoded or dropped. |bytes| == 0 indicates a drop.
- void OnEncodedFrame(size_t bytes, int64_t time_ms);
- // This utilization factor reaches 1.0 only if the encoder produces encoded
- // frame in such a way that they can be sent onto the network at
- // |target_bitrate| without building growing queues.
- absl::optional<double> GetNetworkRateUtilizationFactor(int64_t time_ms);
- // This utilization factor is based just on actual encoded frame sizes in
- // relation to ideal sizes. An undershoot may be compensated by an
- // overshoot so that the average over time is close to |target_bitrate|.
- absl::optional<double> GetMediaRateUtilizationFactor(int64_t time_ms);
- void Reset();
- private:
- int64_t IdealFrameSizeBits() const;
- void LeakBits(int64_t time_ms);
- void CullOldUpdates(int64_t time_ms);
- // Updates provided buffer and checks if overuse ensues, returns
- // the calculated utilization factor for this frame.
- double HandleEncodedFrame(size_t frame_size_bits,
- int64_t ideal_frame_size_bits,
- int64_t time_ms,
- int64_t* buffer_level_bits) const;
- const int64_t window_size_ms_;
- int64_t time_last_update_ms_;
- struct BitrateUpdate {
- BitrateUpdate(double network_utilization_factor,
- double media_utilization_factor,
- int64_t update_time_ms)
- : network_utilization_factor(network_utilization_factor),
- media_utilization_factor(media_utilization_factor),
- update_time_ms(update_time_ms) {}
- // The utilization factor based on strict network rate.
- double network_utilization_factor;
- // The utilization based on average media rate.
- double media_utilization_factor;
- int64_t update_time_ms;
- };
- std::deque<BitrateUpdate> utilization_factors_;
- double sum_network_utilization_factors_;
- double sum_media_utilization_factors_;
- DataRate target_bitrate_;
- double target_framerate_fps_;
- int64_t network_buffer_level_bits_;
- int64_t media_buffer_level_bits_;
- };
- } // namespace webrtc
- #endif // VIDEO_ENCODER_OVERSHOOT_DETECTOR_H_
|