| Index: webrtc/base/timestampaligner.h
|
| diff --git a/webrtc/base/timestampaligner.h b/webrtc/base/timestampaligner.h
|
| index 00431f355b809f9b8bc2881e48ee95f9d7d641a4..590499dab385f816f87425877e1e4c714fbabf6d 100644
|
| --- a/webrtc/base/timestampaligner.h
|
| +++ b/webrtc/base/timestampaligner.h
|
| @@ -13,10 +13,18 @@
|
|
|
| #include "webrtc/base/basictypes.h"
|
| #include "webrtc/base/constructormagic.h"
|
| -#include "webrtc/base/optional.h"
|
|
|
| namespace rtc {
|
|
|
| +// The TimestampAligner class helps translating camera timestamps into
|
| +// the same timescale as is used by rtc::TimeMicros(). Some cameras
|
| +// have built in timestamping which is more accurate than reading the
|
| +// system clock, but using a different epoch and unknown clock drift.
|
| +// Frame timestamps in webrtc should use rtc::TimeMicros (system monotonic
|
| +// time), and this class provides a filter which lets us use the
|
| +// rtc::TimeMicros timescale, and at the same time take advantage of
|
| +// higher accuracy of the camera clock.
|
| +
|
| // This class is not thread safe, so all calls to it must be synchronized
|
| // externally.
|
| class TimestampAligner {
|
| @@ -25,9 +33,23 @@ class TimestampAligner {
|
| ~TimestampAligner();
|
|
|
| public:
|
| + // Translates camera timestamps to the same timescale as is used by
|
| + // rtc::TimeMicros(). |camera_time_us| is assumed to be accurate, but
|
| + // with an unknown epoch and clock drift. |system_time_us| is
|
| + // time according to rtc::TimeMicros(), preferably read as soon as
|
| + // possible when the frame is captured. It may have poor accuracy
|
| + // due to poor resolution or scheduling delays. Returns the
|
| + // translated timestamp.
|
| + int64_t TranslateTimestamp(int64_t camera_time_us, int64_t system_time_us);
|
| +
|
| + protected:
|
| // Update the estimated offset between camera time and system monotonic time.
|
| int64_t UpdateOffset(int64_t camera_time_us, int64_t system_time_us);
|
|
|
| + // Clip timestamp, return value is always
|
| + // <= |system_time_us|, and
|
| + // >= min(|prev_translated_time_us_| + |kMinFrameIntervalUs|,
|
| + // |system_time_us|).
|
| int64_t ClipTimestamp(int64_t filtered_time_us, int64_t system_time_us);
|
|
|
| private:
|
| @@ -36,11 +58,13 @@ class TimestampAligner {
|
| // Estimated offset between camera time and system monotonic time.
|
| int64_t offset_us_;
|
|
|
| - // State for timestamp clipping, applied after the filter, to ensure
|
| - // that translated timestamps are monotonic and not in the future.
|
| - // Subtracted from the translated timestamps.
|
| + // State for the ClipTimestamp method, applied after the filter.
|
| + // A large negative camera clock drift tends to push translated
|
| + // timestamps into the future. |clip_bias_us_| is subtracted from the
|
| + // translated timestamps, to get them back from the future.
|
| int64_t clip_bias_us_;
|
| - rtc::Optional<int64_t> prev_translated_time_us_;
|
| + // Used to ensure that translated timestamps are monotonous.
|
| + int64_t prev_translated_time_us_;
|
| RTC_DISALLOW_COPY_AND_ASSIGN(TimestampAligner);
|
| };
|
|
|
|
|