OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ | 5 #ifndef MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ |
6 #define MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ | 6 #define MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ |
7 | 7 |
8 #include "base/gtest_prod_util.h" | 8 #include "base/gtest_prod_util.h" |
| 9 #include "base/memory/linked_ptr.h" |
9 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
10 #include "base/threading/thread_checker.h" | 11 #include "base/threading/thread_checker.h" |
11 #include "base/time/tick_clock.h" | 12 #include "base/time/tick_clock.h" |
12 #include "media/cast/logging/logging_defines.h" | 13 #include "media/cast/logging/logging_defines.h" |
13 #include "media/cast/logging/raw_event_subscriber.h" | 14 #include "media/cast/logging/raw_event_subscriber.h" |
14 #include "media/cast/logging/receiver_time_offset_estimator.h" | 15 #include "media/cast/logging/receiver_time_offset_estimator.h" |
15 | 16 |
16 namespace base { | 17 namespace base { |
17 class DictionaryValue; | 18 class DictionaryValue; |
| 19 class ListValue; |
18 } | 20 } |
19 | 21 |
20 namespace media { | 22 namespace media { |
21 namespace cast { | 23 namespace cast { |
22 | 24 |
23 class StatsEventSubscriberTest; | 25 class StatsEventSubscriberTest; |
24 | 26 |
25 // A RawEventSubscriber implementation that subscribes to events, | 27 // A RawEventSubscriber implementation that subscribes to events, |
26 // and aggregates them into stats. | 28 // and aggregates them into stats. |
27 class StatsEventSubscriber : public RawEventSubscriber { | 29 class StatsEventSubscriber : public RawEventSubscriber { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 base::TimeDelta sum_delay; | 71 base::TimeDelta sum_delay; |
70 }; | 72 }; |
71 | 73 |
72 struct PacketLogStats { | 74 struct PacketLogStats { |
73 PacketLogStats(); | 75 PacketLogStats(); |
74 ~PacketLogStats(); | 76 ~PacketLogStats(); |
75 int event_counter; | 77 int event_counter; |
76 size_t sum_size; | 78 size_t sum_size; |
77 }; | 79 }; |
78 | 80 |
| 81 class SimpleHistogram { |
| 82 public: |
| 83 // This will create N+2 buckets where N = (max - min) / width: |
| 84 // Underflow bucket: < min |
| 85 // Bucket 0: [min, min + width - 1] |
| 86 // Bucket 1: [min + width, min + 2 * width - 1] |
| 87 // ... |
| 88 // Bucket N-1: [max - width, max - 1] |
| 89 // Overflow bucket: >= max |
| 90 // |min| must be less than |max|. |
| 91 // |width| must divide |max - min| evenly. |
| 92 SimpleHistogram(int64 min, int64 max, int64 width); |
| 93 |
| 94 ~SimpleHistogram(); |
| 95 |
| 96 void Add(int64 sample); |
| 97 |
| 98 void Reset(); |
| 99 |
| 100 scoped_ptr<base::ListValue> GetHistogram() const; |
| 101 |
| 102 private: |
| 103 int64 min_; |
| 104 int64 max_; |
| 105 int64 width_; |
| 106 std::vector<int> buckets_; |
| 107 }; |
| 108 |
79 enum CastStat { | 109 enum CastStat { |
80 // Capture frame rate. | 110 // Capture frame rate. |
81 CAPTURE_FPS, | 111 CAPTURE_FPS, |
82 // Encode frame rate. | 112 // Encode frame rate. |
83 ENCODE_FPS, | 113 ENCODE_FPS, |
84 // Decode frame rate. | 114 // Decode frame rate. |
85 DECODE_FPS, | 115 DECODE_FPS, |
86 // Average encode duration in milliseconds. | 116 // Average encode duration in milliseconds. |
87 // TODO(imcheng): This stat is not populated yet because we do not have | 117 // TODO(imcheng): This stat is not populated yet because we do not have |
88 // the time when encode started. Record it in FRAME_ENCODED event. | 118 // the time when encode started. Record it in FRAME_ENCODED event. |
(...skipping 20 matching lines...) Expand all Loading... |
109 // Number of frames dropped by encoder. | 139 // Number of frames dropped by encoder. |
110 NUM_FRAMES_DROPPED_BY_ENCODER, | 140 NUM_FRAMES_DROPPED_BY_ENCODER, |
111 // Number of late frames. | 141 // Number of late frames. |
112 NUM_FRAMES_LATE, | 142 NUM_FRAMES_LATE, |
113 // Number of packets that were sent (not retransmitted). | 143 // Number of packets that were sent (not retransmitted). |
114 NUM_PACKETS_SENT, | 144 NUM_PACKETS_SENT, |
115 // Number of packets that were retransmitted. | 145 // Number of packets that were retransmitted. |
116 NUM_PACKETS_RETRANSMITTED, | 146 NUM_PACKETS_RETRANSMITTED, |
117 // Number of packets that had their retransmission cancelled. | 147 // Number of packets that had their retransmission cancelled. |
118 NUM_PACKETS_RTX_REJECTED, | 148 NUM_PACKETS_RTX_REJECTED, |
| 149 // Duration since last reset. |
| 150 DURATION_MS, |
| 151 // Unix time in milliseconds of first event since reset. |
| 152 FIRST_EVENT_TIME_MS, |
| 153 // Unix time in milliseconds of last event since reset. |
| 154 LAST_EVENT_TIME_MS, |
| 155 |
| 156 // Histograms |
| 157 CAPTURE_LATENCY_MS_HISTO, |
| 158 ENCODE_LATENCY_MS_HISTO, |
| 159 PACKET_LATENCY_MS_HISTO, |
| 160 FRAME_LATENCY_MS_HISTO, |
| 161 PLAYOUT_DELAY_MS_HISTO |
119 }; | 162 }; |
120 | 163 |
121 struct FrameInfo { | 164 struct FrameInfo { |
122 explicit FrameInfo(base::TimeTicks capture_time); | 165 FrameInfo(); |
123 ~FrameInfo(); | 166 ~FrameInfo(); |
124 | 167 |
125 base::TimeTicks capture_time; | 168 base::TimeTicks capture_time; |
| 169 base::TimeTicks capture_end_time; |
| 170 base::TimeTicks encode_time; |
126 bool encoded; | 171 bool encoded; |
127 }; | 172 }; |
128 | 173 |
129 typedef std::map<CastStat, double> StatsMap; | 174 typedef std::map<CastStat, double> StatsMap; |
| 175 typedef std::map<CastStat, linked_ptr<SimpleHistogram> > HistogramMap; |
130 typedef std::map<RtpTimestamp, FrameInfo> FrameInfoMap; | 176 typedef std::map<RtpTimestamp, FrameInfo> FrameInfoMap; |
131 typedef std::map< | 177 typedef std::map< |
132 std::pair<RtpTimestamp, uint16>, | 178 std::pair<RtpTimestamp, uint16>, |
133 std::pair<base::TimeTicks, CastLoggingEvent> > | 179 std::pair<base::TimeTicks, CastLoggingEvent> > |
134 PacketEventTimeMap; | 180 PacketEventTimeMap; |
135 typedef std::map<CastLoggingEvent, FrameLogStats> FrameStatsMap; | 181 typedef std::map<CastLoggingEvent, FrameLogStats> FrameStatsMap; |
136 typedef std::map<CastLoggingEvent, PacketLogStats> PacketStatsMap; | 182 typedef std::map<CastLoggingEvent, PacketLogStats> PacketStatsMap; |
137 | 183 |
138 static const char* CastStatToString(CastStat stat); | 184 static const char* CastStatToString(CastStat stat); |
139 | 185 |
| 186 void InitHistograms(); |
| 187 |
140 // Assigns |stats_map| with stats data. Used for testing. | 188 // Assigns |stats_map| with stats data. Used for testing. |
141 void GetStatsInternal(StatsMap* stats_map) const; | 189 void GetStatsInternal(StatsMap* stats_map) const; |
142 | 190 |
| 191 void UpdateFirstLastEventTime(base::TimeTicks timestamp, |
| 192 bool is_receiver_event); |
143 bool GetReceiverOffset(base::TimeDelta* offset); | 193 bool GetReceiverOffset(base::TimeDelta* offset); |
| 194 void MaybeInsertFrameInfo(RtpTimestamp rtp_timestamp, |
| 195 const FrameInfo& frame_info); |
144 void RecordFrameCaptureTime(const FrameEvent& frame_event); | 196 void RecordFrameCaptureTime(const FrameEvent& frame_event); |
145 void MarkAsEncoded(RtpTimestamp rtp_timestamp); | 197 void RecordCaptureLatency(const FrameEvent& frame_event); |
| 198 void RecordEncodeLatency(const FrameEvent& frame_event); |
| 199 void RecordFrameTxLatency(const FrameEvent& frame_event); |
146 void RecordE2ELatency(const FrameEvent& frame_event); | 200 void RecordE2ELatency(const FrameEvent& frame_event); |
147 void RecordPacketSentTime(const PacketEvent& packet_event); | 201 void RecordPacketSentTime(const PacketEvent& packet_event); |
148 void ErasePacketSentTime(const PacketEvent& packet_event); | 202 void ErasePacketSentTime(const PacketEvent& packet_event); |
149 void RecordNetworkLatency(const PacketEvent& packet_event); | 203 void RecordNetworkLatency(const PacketEvent& packet_event); |
150 void UpdateLastResponseTime(base::TimeTicks receiver_time); | 204 void UpdateLastResponseTime(base::TimeTicks receiver_time); |
151 | 205 |
152 void PopulateFpsStat(base::TimeTicks now, | 206 void PopulateFpsStat(base::TimeTicks now, |
153 CastLoggingEvent event, | 207 CastLoggingEvent event, |
154 CastStat stat, | 208 CastStat stat, |
155 StatsMap* stats_map) const; | 209 StatsMap* stats_map) const; |
(...skipping 26 matching lines...) Expand all Loading... |
182 int network_latency_datapoints_; | 236 int network_latency_datapoints_; |
183 base::TimeDelta total_e2e_latency_; | 237 base::TimeDelta total_e2e_latency_; |
184 int e2e_latency_datapoints_; | 238 int e2e_latency_datapoints_; |
185 | 239 |
186 base::TimeTicks last_response_received_time_; | 240 base::TimeTicks last_response_received_time_; |
187 | 241 |
188 int num_frames_dropped_by_encoder_; | 242 int num_frames_dropped_by_encoder_; |
189 int num_frames_late_; | 243 int num_frames_late_; |
190 | 244 |
191 // Fixed size map to record when recent frames were captured and other info. | 245 // Fixed size map to record when recent frames were captured and other info. |
192 FrameInfoMap recent_captured_frames_; | 246 FrameInfoMap recent_frame_infos_; |
193 | 247 |
194 // Fixed size map to record when recent packets were sent. | 248 // Fixed size map to record when recent packets were sent. |
195 PacketEventTimeMap packet_sent_times_; | 249 PacketEventTimeMap packet_sent_times_; |
196 | 250 |
197 // Sender time assigned on creation and |Reset()|. | 251 // Sender time assigned on creation and |Reset()|. |
198 base::TimeTicks start_time_; | 252 base::TimeTicks start_time_; |
| 253 base::TimeTicks first_event_time_; |
| 254 base::TimeTicks last_event_time_; |
| 255 |
| 256 HistogramMap histograms_; |
199 | 257 |
200 base::ThreadChecker thread_checker_; | 258 base::ThreadChecker thread_checker_; |
201 DISALLOW_COPY_AND_ASSIGN(StatsEventSubscriber); | 259 DISALLOW_COPY_AND_ASSIGN(StatsEventSubscriber); |
202 }; | 260 }; |
203 | 261 |
204 } // namespace cast | 262 } // namespace cast |
205 } // namespace media | 263 } // namespace media |
206 | 264 |
207 #endif // MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ | 265 #endif // MEDIA_CAST_LOGGING_STATS_EVENT_SUBSCRIBER_H_ |
OLD | NEW |