Cleanup RtpToNtpEstimator
- Use NtpTime instead of pair of uint32_t to represent ntp time - Increase precision estimate with NtpTime precision instead of ms precision - Hide helper structs as private types - Modernize interface to prefer return values over output parameters - embed LinearRegression helper into the only user: UpdateParameters Bug: webrtc:13757 Change-Id: I0a62a03e2869b2ae1eacaa15253accc43ba0a598 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/254780 Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36232}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
340cb5e46a
commit
ae4fb618d7
@ -18,60 +18,51 @@
|
||||
#include "absl/types/optional.h"
|
||||
#include "modules/include/module_common_types_public.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/numerics/moving_median_filter.h"
|
||||
#include "system_wrappers/include/ntp_time.h"
|
||||
|
||||
namespace webrtc {
|
||||
// Class for converting an RTP timestamp to the NTP domain in milliseconds.
|
||||
|
||||
// Converts an RTP timestamp to the NTP domain.
|
||||
// The class needs to be trained with (at least 2) RTP/NTP timestamp pairs from
|
||||
// RTCP sender reports before the convertion can be done.
|
||||
class RtpToNtpEstimator {
|
||||
public:
|
||||
RtpToNtpEstimator();
|
||||
~RtpToNtpEstimator();
|
||||
static constexpr int kMaxInvalidSamples = 3;
|
||||
|
||||
RtpToNtpEstimator() = default;
|
||||
RtpToNtpEstimator(const RtpToNtpEstimator&) = delete;
|
||||
RtpToNtpEstimator& operator=(const RtpToNtpEstimator&) = delete;
|
||||
~RtpToNtpEstimator() = default;
|
||||
|
||||
enum UpdateResult { kInvalidMeasurement, kSameMeasurement, kNewMeasurement };
|
||||
// Updates measurements with RTP/NTP timestamp pair from a RTCP sender report.
|
||||
UpdateResult UpdateMeasurements(NtpTime ntp, uint32_t rtp_timestamp);
|
||||
|
||||
// Converts an RTP timestamp to the NTP domain.
|
||||
// Returns invalid NtpTime (i.e. NtpTime(0)) on failure.
|
||||
NtpTime Estimate(uint32_t rtp_timestamp) const;
|
||||
|
||||
// Returns estimated rtp_timestamp frequency, or 0 on failure.
|
||||
double EstimatedFrequencyKhz() const;
|
||||
|
||||
private:
|
||||
// Estimated parameters from RTP and NTP timestamp pairs in `measurements_`.
|
||||
// Defines linear estimation: NtpTime (in units of 1s/2^32) =
|
||||
// `Parameters::slope` * rtp_timestamp + `Parameters::offset`.
|
||||
struct Parameters {
|
||||
double slope;
|
||||
double offset;
|
||||
};
|
||||
|
||||
// RTP and NTP timestamp pair from a RTCP SR report.
|
||||
struct RtcpMeasurement {
|
||||
RtcpMeasurement(uint32_t ntp_secs,
|
||||
uint32_t ntp_frac,
|
||||
int64_t unwrapped_timestamp);
|
||||
bool IsEqual(const RtcpMeasurement& other) const;
|
||||
|
||||
NtpTime ntp_time;
|
||||
int64_t unwrapped_rtp_timestamp;
|
||||
};
|
||||
|
||||
// Estimated parameters from RTP and NTP timestamp pairs in `measurements_`.
|
||||
struct Parameters {
|
||||
Parameters() : frequency_khz(0.0), offset_ms(0.0) {}
|
||||
|
||||
Parameters(double frequency_khz, double offset_ms)
|
||||
: frequency_khz(frequency_khz), offset_ms(offset_ms) {}
|
||||
|
||||
double frequency_khz;
|
||||
double offset_ms;
|
||||
};
|
||||
|
||||
// Updates measurements with RTP/NTP timestamp pair from a RTCP sender report.
|
||||
// `new_rtcp_sr` is set to true if a new report is added.
|
||||
bool UpdateMeasurements(uint32_t ntp_secs,
|
||||
uint32_t ntp_frac,
|
||||
uint32_t rtp_timestamp,
|
||||
bool* new_rtcp_sr);
|
||||
|
||||
// Converts an RTP timestamp to the NTP domain in milliseconds.
|
||||
// Returns true on success, false otherwise.
|
||||
bool Estimate(int64_t rtp_timestamp, int64_t* ntp_timestamp_ms) const;
|
||||
|
||||
// Returns estimated rtp to ntp linear transform parameters.
|
||||
const absl::optional<Parameters> params() const;
|
||||
|
||||
static const int kMaxInvalidSamples = 3;
|
||||
|
||||
private:
|
||||
void UpdateParameters();
|
||||
|
||||
int consecutive_invalid_samples_;
|
||||
int consecutive_invalid_samples_ = 0;
|
||||
std::list<RtcpMeasurement> measurements_;
|
||||
absl::optional<Parameters> params_;
|
||||
mutable TimestampUnwrapper unwrapper_;
|
||||
|
||||
Reference in New Issue
Block a user