1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
12 #define SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
13 
14 #include <stdint.h>
15 
16 #include <list>
17 
18 #include "absl/types/optional.h"
19 #include "modules/include/module_common_types_public.h"
20 #include "rtc_base/checks.h"
21 #include "rtc_base/numerics/moving_median_filter.h"
22 #include "system_wrappers/include/ntp_time.h"
23 
24 namespace webrtc {
25 // Class for converting an RTP timestamp to the NTP domain in milliseconds.
26 // The class needs to be trained with (at least 2) RTP/NTP timestamp pairs from
27 // RTCP sender reports before the convertion can be done.
28 class RtpToNtpEstimator {
29  public:
30   RtpToNtpEstimator();
31   ~RtpToNtpEstimator();
32 
33   // RTP and NTP timestamp pair from a RTCP SR report.
34   struct RtcpMeasurement {
35     RtcpMeasurement(uint32_t ntp_secs,
36                     uint32_t ntp_frac,
37                     int64_t unwrapped_timestamp);
38     bool IsEqual(const RtcpMeasurement& other) const;
39 
40     NtpTime ntp_time;
41     int64_t unwrapped_rtp_timestamp;
42   };
43 
44   // Estimated parameters from RTP and NTP timestamp pairs in |measurements_|.
45   struct Parameters {
ParametersParameters46     Parameters() : frequency_khz(0.0), offset_ms(0.0) {}
47 
ParametersParameters48     Parameters(double frequency_khz, double offset_ms)
49         : frequency_khz(frequency_khz), offset_ms(offset_ms) {}
50 
51     double frequency_khz;
52     double offset_ms;
53   };
54 
55   // Updates measurements with RTP/NTP timestamp pair from a RTCP sender report.
56   // |new_rtcp_sr| is set to true if a new report is added.
57   bool UpdateMeasurements(uint32_t ntp_secs,
58                           uint32_t ntp_frac,
59                           uint32_t rtp_timestamp,
60                           bool* new_rtcp_sr);
61 
62   // Converts an RTP timestamp to the NTP domain in milliseconds.
63   // Returns true on success, false otherwise.
64   bool Estimate(int64_t rtp_timestamp, int64_t* ntp_timestamp_ms) const;
65 
66   // Returns estimated rtp to ntp linear transform parameters.
67   const absl::optional<Parameters> params() const;
68 
69   static const int kMaxInvalidSamples = 3;
70 
71  private:
72   void UpdateParameters();
73 
74   int consecutive_invalid_samples_;
75   std::list<RtcpMeasurement> measurements_;
76   absl::optional<Parameters> params_;
77   mutable TimestampUnwrapper unwrapper_;
78 };
79 }  // namespace webrtc
80 
81 #endif  // SYSTEM_WRAPPERS_INCLUDE_RTP_TO_NTP_ESTIMATOR_H_
82