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

Bug: webrtc:13982 Change-Id: Idd4905c1930d51efd0b9a5a1df1ad6001f9bc37c Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/288941 Commit-Queue: Jakob Ivarsson <jakobi@webrtc.org> Auto-Submit: Evan Shrubsole <eshr@webrtc.org> Reviewed-by: Jakob Ivarsson <jakobi@webrtc.org> Cr-Commit-Position: refs/heads/main@{#39037}
82 lines
2.8 KiB
C++
82 lines
2.8 KiB
C++
/*
|
|
* Copyright (c) 2022 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 MODULES_AUDIO_CODING_NETEQ_PACKET_ARRIVAL_HISTORY_H_
|
|
#define MODULES_AUDIO_CODING_NETEQ_PACKET_ARRIVAL_HISTORY_H_
|
|
|
|
#include <cstdint>
|
|
#include <deque>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/neteq/tick_timer.h"
|
|
#include "rtc_base/numerics/sequence_number_unwrapper.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// Stores timing information about previously received packets.
|
|
// The history has a fixed window size beyond which old data is automatically
|
|
// pruned.
|
|
class PacketArrivalHistory {
|
|
public:
|
|
explicit PacketArrivalHistory(int window_size_ms);
|
|
|
|
// Insert packet with `rtp_timestamp` and `arrival_time_ms` into the history.
|
|
void Insert(uint32_t rtp_timestamp, int64_t arrival_time_ms);
|
|
|
|
// 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.
|
|
int GetDelayMs(uint32_t rtp_timestamp, int64_t time_ms) const;
|
|
|
|
// Get the maximum packet arrival delay observed in the history.
|
|
int GetMaxDelayMs() const;
|
|
|
|
bool IsNewestRtpTimestamp(uint32_t rtp_timestamp) const;
|
|
|
|
void Reset();
|
|
|
|
void set_sample_rate(int sample_rate) {
|
|
sample_rate_khz_ = sample_rate / 1000;
|
|
}
|
|
|
|
size_t size() const { return history_.size(); }
|
|
|
|
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;
|
|
bool operator<=(const PacketArrival& other) const {
|
|
return arrival_time_ms - rtp_timestamp_ms <=
|
|
other.arrival_time_ms - other.rtp_timestamp_ms;
|
|
}
|
|
bool operator>=(const PacketArrival& other) const {
|
|
return arrival_time_ms - rtp_timestamp_ms >=
|
|
other.arrival_time_ms - other.rtp_timestamp_ms;
|
|
}
|
|
};
|
|
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;
|
|
const int window_size_ms_;
|
|
RtpTimestampUnwrapper timestamp_unwrapper_;
|
|
absl::optional<int64_t> newest_rtp_timestamp_;
|
|
int sample_rate_khz_ = 0;
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // MODULES_AUDIO_CODING_NETEQ_PACKET_ARRIVAL_HISTORY_H_
|