Index: webrtc/modules/video_coding/protection_bitrate_calculator.h |
diff --git a/webrtc/video/send_delay_stats.h b/webrtc/modules/video_coding/protection_bitrate_calculator.h |
similarity index 20% |
copy from webrtc/video/send_delay_stats.h |
copy to webrtc/modules/video_coding/protection_bitrate_calculator.h |
index 20a97814c72e808b3acfd5a920290e01a993cc8d..cdbab102d4937fa69e6826c139d1a9cb428387fe 100644 |
--- a/webrtc/video/send_delay_stats.h |
+++ b/webrtc/modules/video_coding/protection_bitrate_calculator.h |
@@ -8,86 +8,75 @@ |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
-#ifndef WEBRTC_VIDEO_SEND_DELAY_STATS_H_ |
-#define WEBRTC_VIDEO_SEND_DELAY_STATS_H_ |
+#ifndef WEBRTC_MODULES_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_ |
+#define WEBRTC_MODULES_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_ |
-#include <map> |
+#include <list> |
#include <memory> |
-#include <set> |
#include "webrtc/base/criticalsection.h" |
-#include "webrtc/base/thread_annotations.h" |
-#include "webrtc/common_types.h" |
#include "webrtc/modules/include/module_common_types.h" |
+#include "webrtc/modules/video_coding/include/video_coding.h" |
+#include "webrtc/modules/video_coding/media_opt_util.h" |
#include "webrtc/system_wrappers/include/clock.h" |
-#include "webrtc/video_send_stream.h" |
namespace webrtc { |
-class SendDelayStats : public SendPacketObserver { |
+// ProtectionBitrateCalculator calculates how much of the allocated network |
+// capacity that can be used by an encoder and how much that |
+// is needed for redundant packets such as FEC and NACK. It uses an |
+// implementation of |VCMProtectionCallback| to set new FEC parameters and get |
+// the bitrate currently used for FEC and NACK. |
+// Usage: |
+// Setup by calling SetProtectionMethod and SetEncodingData. |
+// For each encoded image, call UpdateWithEncodedData. |
+// Each time the bandwidth estimate change, call SetTargetRates. SetTargetRates |
+// will return the bitrate that can be used by an encoder. |
+// A lock is used to protect internal states, so methods can be called on an |
+// arbitrary thread. |
+class ProtectionBitrateCalculator { |
public: |
- explicit SendDelayStats(Clock* clock); |
- virtual ~SendDelayStats(); |
- |
- // Adds the configured ssrcs for the rtp streams. |
- // Stats will be calculated for these streams. |
- void AddSsrcs(const VideoSendStream::Config& config); |
- |
- // Called when a packet is sent (leaving socket). |
- bool OnSentPacket(int packet_id, int64_t time_ms); |
- |
- protected: |
- // From SendPacketObserver. |
- // Called when a packet is sent to the transport. |
- void OnSendPacket(uint16_t packet_id, |
- int64_t capture_time_ms, |
- uint32_t ssrc) override; |
+ ProtectionBitrateCalculator(Clock* clock, |
+ VCMProtectionCallback* protection_callback); |
+ ~ProtectionBitrateCalculator(); |
+ |
+ void SetProtectionMethod(bool enable_fec, bool enable_nack); |
+ |
+ // Informs media optimization of initial encoding state. |
+ void SetEncodingData(uint32_t estimated_bitrate_bps, |
+ uint16_t width, |
+ uint16_t height, |
+ uint32_t frame_rate, |
+ size_t num_temporal_layers, |
+ size_t max_payload_size); |
+ |
+ // Returns target rate for the encoder given the channel parameters. |
+ // Inputs: estimated_bitrate_bps - the estimated network bitrate in bits/s. |
+ // actual_framerate - encoder frame rate. |
+ // fraction_lost - packet loss rate in % in the network. |
+ // round_trip_time_ms - round trip time in milliseconds. |
+ uint32_t SetTargetRates(uint32_t estimated_bitrate_bps, |
+ int actual_framerate, |
+ uint8_t fraction_lost, |
+ int64_t round_trip_time_ms); |
+ |
+ // Informs of encoded output. |
+ void UpdateWithEncodedData(const EncodedImage& encoded_image); |
private: |
- // Map holding sent packets (mapped by sequence number). |
- struct SequenceNumberOlderThan { |
- bool operator()(uint16_t seq1, uint16_t seq2) const { |
- return IsNewerSequenceNumber(seq2, seq1); |
- } |
- }; |
- struct Packet { |
- Packet(uint32_t ssrc, int64_t capture_time_ms, int64_t send_time_ms) |
- : ssrc(ssrc), |
- capture_time_ms(capture_time_ms), |
- send_time_ms(send_time_ms) {} |
- uint32_t ssrc; |
- int64_t capture_time_ms; |
- int64_t send_time_ms; |
- }; |
- typedef std::map<uint16_t, Packet, SequenceNumberOlderThan> PacketMap; |
- |
- class SampleCounter { |
- public: |
- SampleCounter() : sum(0), num_samples(0) {} |
- ~SampleCounter() {} |
- void Add(int sample); |
- int Avg(int min_required_samples) const; |
- |
- private: |
- int sum; |
- int num_samples; |
- }; |
- |
- void UpdateHistograms(); |
- void RemoveOld(int64_t now, PacketMap* packets) |
- EXCLUSIVE_LOCKS_REQUIRED(crit_); |
+ struct EncodedFrameSample; |
+ enum { kBitrateAverageWinMs = 1000 }; |
Clock* const clock_; |
- rtc::CriticalSection crit_; |
+ VCMProtectionCallback* const protection_callback_; |
- PacketMap packets_ GUARDED_BY(crit_); |
- size_t num_old_packets_ GUARDED_BY(crit_); |
- size_t num_skipped_packets_ GUARDED_BY(crit_); |
+ rtc::CriticalSection crit_sect_; |
+ std::unique_ptr<media_optimization::VCMLossProtectionLogic> loss_prot_logic_ |
+ GUARDED_BY(crit_sect_); |
+ size_t max_payload_size_ GUARDED_BY(crit_sect_); |
- std::set<uint32_t> ssrcs_ GUARDED_BY(crit_); |
- std::map<uint32_t, SampleCounter> send_delay_counters_ |
- GUARDED_BY(crit_); // Mapped by SSRC. |
+ RTC_DISALLOW_COPY_AND_ASSIGN(ProtectionBitrateCalculator); |
}; |
} // namespace webrtc |
-#endif // WEBRTC_VIDEO_SEND_DELAY_STATS_H_ |
+#endif // WEBRTC_MODULES_VIDEO_CODING_PROTECTION_BITRATE_CALCULATOR_H_ |