summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h')
-rw-r--r--third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h79
1 files changed, 53 insertions, 26 deletions
diff --git a/third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h b/third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h
index 722caf5688..3fa1ea1fa9 100644
--- a/third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h
+++ b/third_party/libwebrtc/modules/audio_coding/neteq/packet_arrival_history.h
@@ -11,10 +11,11 @@
#ifndef MODULES_AUDIO_CODING_NETEQ_PACKET_ARRIVAL_HISTORY_H_
#define MODULES_AUDIO_CODING_NETEQ_PACKET_ARRIVAL_HISTORY_H_
+#include <cstddef>
#include <cstdint>
#include <deque>
+#include <map>
-#include "absl/types/optional.h"
#include "api/neteq/tick_timer.h"
#include "rtc_base/numerics/sequence_number_unwrapper.h"
@@ -25,19 +26,22 @@ namespace webrtc {
// pruned.
class PacketArrivalHistory {
public:
- explicit PacketArrivalHistory(int window_size_ms);
+ explicit PacketArrivalHistory(const TickTimer* tick_timer,
+ int window_size_ms);
virtual ~PacketArrivalHistory() = default;
- // Insert packet with `rtp_timestamp` and `arrival_time_ms` into the history.
- void Insert(uint32_t rtp_timestamp, int64_t arrival_time_ms);
+ // Insert packet with `rtp_timestamp` into the history. Returns true if the
+ // packet was inserted, false if the timestamp is too old or if the timestamp
+ // already exists.
+ bool Insert(uint32_t rtp_timestamp, int packet_length_samples);
- // The delay for `rtp_timestamp` at `time_ms` is calculated as
- // `(time_ms - p.arrival_time_ms) - (rtp_timestamp - p.rtp_timestamp)`
- // where `p` is chosen as the packet arrival in the history that maximizes the
- // delay.
- virtual int GetDelayMs(uint32_t rtp_timestamp, int64_t time_ms) const;
+ // The delay for `rtp_timestamp` at time `now` is calculated as
+ // `(now - p.arrival_timestamp) - (rtp_timestamp - p.rtp_timestamp)` where `p`
+ // is chosen as the packet arrival in the history that maximizes the delay.
+ virtual int GetDelayMs(uint32_t rtp_timestamp) const;
- // Get the maximum packet arrival delay observed in the history.
+ // Get the maximum packet arrival delay observed in the history, excluding
+ // reordered packets.
virtual int GetMaxDelayMs() const;
bool IsNewestRtpTimestamp(uint32_t rtp_timestamp) const;
@@ -52,30 +56,53 @@ class PacketArrivalHistory {
private:
struct PacketArrival {
- PacketArrival(int64_t rtp_timestamp_ms, int64_t arrival_time_ms)
- : rtp_timestamp_ms(rtp_timestamp_ms),
- arrival_time_ms(arrival_time_ms) {}
- int64_t rtp_timestamp_ms;
- int64_t arrival_time_ms;
+ PacketArrival(int64_t rtp_timestamp,
+ int64_t arrival_timestamp,
+ int length_samples)
+ : rtp_timestamp(rtp_timestamp),
+ arrival_timestamp(arrival_timestamp),
+ length_samples(length_samples) {}
+ PacketArrival() = default;
+ int64_t rtp_timestamp;
+ int64_t arrival_timestamp;
+ int length_samples;
+ bool operator==(const PacketArrival& other) const {
+ return rtp_timestamp == other.rtp_timestamp &&
+ arrival_timestamp == other.arrival_timestamp &&
+ length_samples == other.length_samples;
+ }
+ bool operator!=(const PacketArrival& other) const {
+ return !(*this == other);
+ }
bool operator<=(const PacketArrival& other) const {
- return arrival_time_ms - rtp_timestamp_ms <=
- other.arrival_time_ms - other.rtp_timestamp_ms;
+ return arrival_timestamp - rtp_timestamp <=
+ other.arrival_timestamp - other.rtp_timestamp;
}
bool operator>=(const PacketArrival& other) const {
- return arrival_time_ms - rtp_timestamp_ms >=
- other.arrival_time_ms - other.rtp_timestamp_ms;
+ return arrival_timestamp - rtp_timestamp >=
+ other.arrival_timestamp - other.rtp_timestamp;
+ }
+ bool contains(const PacketArrival& other) const {
+ return rtp_timestamp <= other.rtp_timestamp &&
+ rtp_timestamp + length_samples >=
+ other.rtp_timestamp + other.length_samples;
}
};
- std::deque<PacketArrival> history_;
int GetPacketArrivalDelayMs(const PacketArrival& packet_arrival) const;
- // Updates `min_packet_arrival_` and `max_packet_arrival_`.
- void MaybeUpdateCachedArrivals(const PacketArrival& packet);
- const PacketArrival* min_packet_arrival_ = nullptr;
- const PacketArrival* max_packet_arrival_ = nullptr;
+ // Checks if the packet is older than the window size.
+ bool IsObsolete(const PacketArrival& packet_arrival) const;
+ // Check if the packet exists or fully overlaps with a packet in the history.
+ bool Contains(const PacketArrival& packet_arrival) const;
+ const TickTimer* tick_timer_;
const int window_size_ms_;
- RtpTimestampUnwrapper timestamp_unwrapper_;
- absl::optional<int64_t> newest_rtp_timestamp_;
int sample_rate_khz_ = 0;
+ RtpTimestampUnwrapper timestamp_unwrapper_;
+ // Packet history ordered by rtp timestamp.
+ std::map<int64_t, PacketArrival> history_;
+ // Tracks min/max packet arrivals in `history_` in ascending/descending order.
+ // Reordered packets are excluded.
+ std::deque<PacketArrival> min_packet_arrivals_;
+ std::deque<PacketArrival> max_packet_arrivals_;
};
} // namespace webrtc