Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(754)

Unified Diff: media/cast/logging/receiver_time_offset_estimator_impl.h

Issue 556693002: Cast: Logging estimates clock difference based on packets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: merge Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/cast/logging/receiver_time_offset_estimator_impl.h
diff --git a/media/cast/logging/receiver_time_offset_estimator_impl.h b/media/cast/logging/receiver_time_offset_estimator_impl.h
index f0abd297f633571fa420e9ed5b26ce32751e5dd9..768ccbdb0f63b9ad9f6ccd2bc3a50aa02cc24e22 100644
--- a/media/cast/logging/receiver_time_offset_estimator_impl.h
+++ b/media/cast/logging/receiver_time_offset_estimator_impl.h
@@ -5,30 +5,36 @@
#ifndef MEDIA_CAST_LOGGING_RECEIVER_TIME_OFFSET_ESTIMATOR_IMPL_H_
#define MEDIA_CAST_LOGGING_RECEIVER_TIME_OFFSET_ESTIMATOR_IMPL_H_
+#include <map>
+
#include "base/time/time.h"
#include "base/threading/thread_checker.h"
+#include "media/cast/common/mod_util.h"
#include "media/cast/logging/logging_defines.h"
#include "media/cast/logging/receiver_time_offset_estimator.h"
-namespace base {
-class TickClock;
-}
-
namespace media {
namespace cast {
-// This implementation listens to three types of video events:
-// 1. FRAME_ENCODED (sender side)
-// 2. FRAME_ACK_SENT (receiver side)
-// 3. FRAME_ACK_RECEIVED (sender side)
+
+// This should be large enough so that we can collect all 3 events before
+// the entry gets removed from the map.
+const size_t kMaxEventTimesMapSize = 500;
+
+// The lower, this is, the faster we adjust to clock drift.
+// (But with more jitter.)
+const size_t kClockDriftSpeed = 500;
+
+
+// This implementation listens to two pair of events
+// 1. FRAME_ACK_SENT / FRAME_ACK_RECEIVED (receiver->sender)
+// 2. PACKET_SENT_TO_NETWORK / PACKET_RECEIVED (sender->receiver)
// There is a causal relationship between these events in that these events
// must happen in order. This class obtains the lower and upper bounds for
-// the offset by taking the difference of timestamps (2) - (1) and (2) - (3),
-// respectively.
-// The bound will become better as the latency between the events decreases.
+// the offset by taking the difference of timestamps.
class ReceiverTimeOffsetEstimatorImpl : public ReceiverTimeOffsetEstimator {
public:
- ReceiverTimeOffsetEstimatorImpl(base::TickClock* clock);
+ ReceiverTimeOffsetEstimatorImpl();
virtual ~ReceiverTimeOffsetEstimatorImpl();
@@ -41,28 +47,47 @@ class ReceiverTimeOffsetEstimatorImpl : public ReceiverTimeOffsetEstimator {
base::TimeDelta* upper_bound) OVERRIDE;
private:
- struct EventTimes {
- base::TimeTicks event_a_time;
- base::TimeTicks event_b_time;
- base::TimeTicks event_c_time;
+ // This helper uses the difference between sent and recived event
+ // to calculate an upper bound on the difference between the clocks
+ // on the sender and receiver. Note that this difference can take
+ // very large positive or negative values, but the smaller value is
+ // always the better estimate, since a receive event cannot possibly
+ // happen before a send event. Note that we use this to calculate
+ // both upper and lower bounds by reversing the sender/receiver
+ // relationship.
+ class BoundCalculator {
+ public:
+ typedef std::pair<base::TimeTicks, base::TimeTicks> TimeTickPair;
+ typedef std::map<uint64, TimeTickPair> EventMap;
+
+ BoundCalculator();
+ ~BoundCalculator();
+ bool has_bound() const { return has_bound_; }
+ base::TimeDelta bound() const { return bound_; }
+
+ void SetSent(uint32 rtp,
+ uint32 packet_id,
+ bool audio,
+ base::TimeTicks t);
+
+ void SetReceived(uint32 rtp,
+ uint16 packet_id,
+ bool audio,
+ base::TimeTicks t);
+
+ private:
+ void UpdateBound(base::TimeTicks a, base::TimeTicks b);
+ void CheckUpdate(uint64 key);
+
+ private:
+ EventMap events_;
+ bool has_bound_;
+ base::TimeDelta bound_;
};
- typedef std::map<RtpTimestamp, EventTimes> EventTimesMap;
-
- void UpdateOffsetBounds(const EventTimes& event);
-
// Fixed size storage to store event times for recent frames.
- EventTimesMap event_times_map_;
-
- bool bounded_;
- base::TickClock* clock_; // Not owned by this class.
-
- bool offset_bounds_valid_;
- base::TimeDelta offset_lower_bound_;
- base::TimeDelta offset_upper_bound_;
- base::TimeDelta prev_offset_lower_bound_;
- base::TimeDelta prev_offset_upper_bound_;
- base::TimeTicks last_reset_time_;
+ BoundCalculator upper_bound_;
+ BoundCalculator lower_bound_;
base::ThreadChecker thread_checker_;
DISALLOW_COPY_AND_ASSIGN(ReceiverTimeOffsetEstimatorImpl);
« no previous file with comments | « media/cast/logging/raw_event_subscriber_bundle.cc ('k') | media/cast/logging/receiver_time_offset_estimator_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698