| Index: webrtc/voice_engine/transport_feedback_packet_loss_tracker.h
|
| diff --git a/webrtc/voice_engine/transport_feedback_packet_loss_tracker.h b/webrtc/voice_engine/transport_feedback_packet_loss_tracker.h
|
| index e5626eb9b22a44d7961809f7f9a32f2f74938602..77af2fa7da30c33b5b3a490a19977fb8863b3ca0 100644
|
| --- a/webrtc/voice_engine/transport_feedback_packet_loss_tracker.h
|
| +++ b/webrtc/voice_engine/transport_feedback_packet_loss_tracker.h
|
| @@ -24,21 +24,25 @@ class TransportFeedback;
|
|
|
| class TransportFeedbackPacketLossTracker final {
|
| public:
|
| - // Up to |max_window_size| latest packet statuses wil be used for calculating
|
| - // the packet loss metrics. When less than |min_window_size| samples are
|
| - // available for making a reliable estimation, GetPacketLossRates() will
|
| - // return false to indicate packet loss metrics are not ready.
|
| - TransportFeedbackPacketLossTracker(size_t min_window_size,
|
| - size_t max_window_size);
|
| + // * Up to |max_window_size| latest packet statuses will be used for
|
| + // calculating the packet loss metrics.
|
| + // * PLR (packet-loss-rate) is reliably computable once the statuses of
|
| + // |plr_min_num_packets| packets are known.
|
| + // * RPLR (recoverable-packet-loss-rate) is reliably computable once the
|
| + // statuses of |rplr_min_num_pairs| pairs are known.
|
| + TransportFeedbackPacketLossTracker(size_t max_window_size,
|
| + size_t plr_min_num_packets,
|
| + size_t rplr_min_num_pairs);
|
|
|
| void OnReceivedTransportFeedback(const rtcp::TransportFeedback& feedback);
|
|
|
| - // Returns true if packet loss rate and packet loss episode duration are ready
|
| - // and assigns respective values to |*packet_loss_rate| and
|
| - // |*consecutive_packet_loss_rate|. Continuous packet loss rate is defined as
|
| - // the probability of losing two adjacent packets.
|
| - bool GetPacketLossRates(float* packet_loss_rate,
|
| - float* consecutive_packet_loss_rate) const;
|
| + // Returns the packet loss rate, if the window has enough packet statuses to
|
| + // reliably compute it. Otherwise, returns empty.
|
| + rtc::Optional<float> GetPacketLossRate() const;
|
| +
|
| + // Returns the first-order-FEC recoverable packet loss rate, if the window has
|
| + // enough status pairs to reliably compute it. Otherwise, returns empty.
|
| + rtc::Optional<float> GetRecoverablePacketLossRate() const;
|
|
|
| // Verifies that the internal states are correct. Only used for tests.
|
| void Validate() const;
|
| @@ -51,6 +55,7 @@ class TransportFeedbackPacketLossTracker final {
|
| typedef PacketStatus::const_iterator PacketStatusIterator;
|
|
|
| void Reset();
|
| +
|
| // ReferenceSequenceNumber() provides a sequence number that defines the
|
| // order of packet reception info stored in |packet_status_window_|. In
|
| // particular, given any sequence number |x|,
|
| @@ -60,22 +65,58 @@ class TransportFeedbackPacketLossTracker final {
|
| bool IsOldSequenceNumber(uint16_t seq_num) const;
|
| void InsertPacketStatus(uint16_t seq_num, bool received);
|
| void RemoveOldestPacketStatus();
|
| - void ApplyPacketStatus(PacketStatusIterator it);
|
| - void UndoPacketStatus(PacketStatusIterator it);
|
| +
|
| + void UpdateMetrics(PacketStatusIterator it, bool apply /* false = undo */);
|
| + void UpdatePlr(PacketStatusIterator it, bool apply /* false = undo */);
|
| + void UpdateRplr(PacketStatusIterator it, bool apply /* false = undo */);
|
| +
|
| PacketStatusIterator PreviousPacketStatus(PacketStatusIterator it);
|
| PacketStatusIterator NextPacketStatus(PacketStatusIterator it);
|
|
|
| - const size_t min_window_size_;
|
| const size_t max_window_size_;
|
|
|
| PacketStatus packet_status_window_;
|
| // |ref_packet_status_| points to the oldest item in |packet_status_window_|.
|
| PacketStatusIterator ref_packet_status_;
|
|
|
| - size_t num_received_packets_;
|
| - size_t num_lost_packets_;
|
| - size_t num_consecutive_losses_;
|
| - size_t num_consecutive_old_reports_;
|
| + // Packet-loss-rate calculation (lost / all-known-packets).
|
| + struct PlrState {
|
| + explicit PlrState(size_t min_num_packets)
|
| + : min_num_packets_(min_num_packets) {
|
| + Reset();
|
| + }
|
| + void Reset() {
|
| + num_received_packets_ = 0;
|
| + num_lost_packets_ = 0;
|
| + }
|
| + rtc::Optional<float> GetMetric() const;
|
| + const size_t min_num_packets_;
|
| + size_t num_received_packets_;
|
| + size_t num_lost_packets_;
|
| + } plr_state_;
|
| +
|
| + // Recoverable packet loss calculation (first-order-FEC recoverable).
|
| + struct RplrState {
|
| + explicit RplrState(size_t min_num_pairs)
|
| + : min_num_pairs_(min_num_pairs) {
|
| + Reset();
|
| + }
|
| + void Reset() {
|
| + num_known_pairs_ = 0;
|
| + num_recoverable_losses_ = 0;
|
| + }
|
| + rtc::Optional<float> GetMetric() const;
|
| + // Recoverable packets are those which were lost, but immediately followed
|
| + // by a properly received packet. If that second packet carried FEC,
|
| + // the data from the former (lost) packet could be recovered.
|
| + // The RPLR is calculated as the fraction of such pairs (lost-received) out
|
| + // of all pairs of consecutive acked packets.
|
| + const size_t min_num_pairs_;
|
| + size_t num_known_pairs_;
|
| + size_t num_recoverable_losses_;
|
| + } rplr_state_;
|
| +
|
| + size_t num_consecutive_old_reports_; // TODO(elad.alon): Upcoming CL removes.
|
| };
|
|
|
| } // namespace webrtc
|
|
|