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 #include "media/cast/logging/encoding_event_subscriber.h" | 5 #include "media/cast/logging/encoding_event_subscriber.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstring> | 8 #include <cstring> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 } | 42 } |
43 | 43 |
44 } | 44 } |
45 | 45 |
46 namespace media { | 46 namespace media { |
47 namespace cast { | 47 namespace cast { |
48 | 48 |
49 EncodingEventSubscriber::EncodingEventSubscriber( | 49 EncodingEventSubscriber::EncodingEventSubscriber( |
50 EventMediaType event_media_type, | 50 EventMediaType event_media_type, |
51 size_t max_frames) | 51 size_t max_frames) |
52 : event_media_type_(event_media_type), | 52 : event_media_type_(event_media_type), max_frames_(max_frames) { |
53 max_frames_(max_frames), | 53 Reset(); |
54 frame_event_storage_index_(0), | 54 } |
55 packet_event_storage_index_(0), | |
56 seen_first_rtp_timestamp_(false), | |
57 first_rtp_timestamp_(0u) {} | |
58 | 55 |
59 EncodingEventSubscriber::~EncodingEventSubscriber() { | 56 EncodingEventSubscriber::~EncodingEventSubscriber() { |
60 DCHECK(thread_checker_.CalledOnValidThread()); | 57 DCHECK(thread_checker_.CalledOnValidThread()); |
61 } | 58 } |
62 | 59 |
63 void EncodingEventSubscriber::OnReceiveFrameEvent( | 60 void EncodingEventSubscriber::OnReceiveFrameEvent( |
64 const FrameEvent& frame_event) { | 61 const FrameEvent& frame_event) { |
65 DCHECK(thread_checker_.CalledOnValidThread()); | 62 DCHECK(thread_checker_.CalledOnValidThread()); |
66 | 63 |
67 if (event_media_type_ != frame_event.media_type) | 64 if (event_media_type_ != frame_event.media_type) |
68 return; | 65 return; |
69 | 66 |
70 RtpTimestamp relative_rtp_timestamp = | 67 const RtpTimeDelta relative_rtp_timestamp = |
71 GetRelativeRtpTimestamp(frame_event.rtp_timestamp); | 68 GetRelativeRtpTimestamp(frame_event.rtp_timestamp); |
72 FrameEventMap::iterator it = frame_event_map_.find(relative_rtp_timestamp); | 69 FrameEventMap::iterator it = frame_event_map_.find(relative_rtp_timestamp); |
73 linked_ptr<AggregatedFrameEvent> event_proto; | 70 linked_ptr<AggregatedFrameEvent> event_proto; |
74 | 71 |
75 // Look up existing entry. If not found, create a new entry and add to map. | 72 // Look up existing entry. If not found, create a new entry and add to map. |
76 if (it == frame_event_map_.end()) { | 73 if (it == frame_event_map_.end()) { |
77 event_proto.reset(new AggregatedFrameEvent); | 74 event_proto.reset(new AggregatedFrameEvent); |
78 event_proto->set_relative_rtp_timestamp(relative_rtp_timestamp); | 75 event_proto->set_relative_rtp_timestamp( |
| 76 relative_rtp_timestamp.lower_32_bits()); |
79 frame_event_map_.insert( | 77 frame_event_map_.insert( |
80 std::make_pair(relative_rtp_timestamp, event_proto)); | 78 std::make_pair(relative_rtp_timestamp, event_proto)); |
81 } else { | 79 } else { |
82 event_proto = it->second; | 80 event_proto = it->second; |
83 if (event_proto->event_type_size() >= kMaxEventsPerProto) { | 81 if (event_proto->event_type_size() >= kMaxEventsPerProto) { |
84 DVLOG(2) << "Too many events in frame " << frame_event.rtp_timestamp | 82 DVLOG(2) << "Too many events in frame " << frame_event.rtp_timestamp |
85 << ". Using new frame event proto."; | 83 << ". Using new frame event proto."; |
86 AddFrameEventToStorage(event_proto); | 84 AddFrameEventToStorage(event_proto); |
87 event_proto.reset(new AggregatedFrameEvent); | 85 event_proto.reset(new AggregatedFrameEvent); |
88 event_proto->set_relative_rtp_timestamp(relative_rtp_timestamp); | 86 event_proto->set_relative_rtp_timestamp( |
| 87 relative_rtp_timestamp.lower_32_bits()); |
89 it->second = event_proto; | 88 it->second = event_proto; |
90 } | 89 } |
91 } | 90 } |
92 | 91 |
93 event_proto->add_event_type(ToProtoEventType(frame_event.type)); | 92 event_proto->add_event_type(ToProtoEventType(frame_event.type)); |
94 event_proto->add_event_timestamp_ms( | 93 event_proto->add_event_timestamp_ms( |
95 (frame_event.timestamp - base::TimeTicks()).InMilliseconds()); | 94 (frame_event.timestamp - base::TimeTicks()).InMilliseconds()); |
96 | 95 |
97 if (frame_event.type == FRAME_CAPTURE_END) { | 96 if (frame_event.type == FRAME_CAPTURE_END) { |
98 if (frame_event.media_type == VIDEO_EVENT && | 97 if (frame_event.media_type == VIDEO_EVENT && |
(...skipping 27 matching lines...) Expand all Loading... |
126 DCHECK(frame_event_storage_.size() <= max_frames_); | 125 DCHECK(frame_event_storage_.size() <= max_frames_); |
127 } | 126 } |
128 | 127 |
129 void EncodingEventSubscriber::OnReceivePacketEvent( | 128 void EncodingEventSubscriber::OnReceivePacketEvent( |
130 const PacketEvent& packet_event) { | 129 const PacketEvent& packet_event) { |
131 DCHECK(thread_checker_.CalledOnValidThread()); | 130 DCHECK(thread_checker_.CalledOnValidThread()); |
132 | 131 |
133 if (event_media_type_ != packet_event.media_type) | 132 if (event_media_type_ != packet_event.media_type) |
134 return; | 133 return; |
135 | 134 |
136 RtpTimestamp relative_rtp_timestamp = | 135 const RtpTimeDelta relative_rtp_timestamp = |
137 GetRelativeRtpTimestamp(packet_event.rtp_timestamp); | 136 GetRelativeRtpTimestamp(packet_event.rtp_timestamp); |
138 PacketEventMap::iterator it = | 137 PacketEventMap::iterator it = |
139 packet_event_map_.find(relative_rtp_timestamp); | 138 packet_event_map_.find(relative_rtp_timestamp); |
140 linked_ptr<AggregatedPacketEvent> event_proto; | 139 linked_ptr<AggregatedPacketEvent> event_proto; |
141 BasePacketEvent* base_packet_event_proto = NULL; | 140 BasePacketEvent* base_packet_event_proto = NULL; |
142 | 141 |
143 // Look up existing entry. If not found, create a new entry and add to map. | 142 // Look up existing entry. If not found, create a new entry and add to map. |
144 if (it == packet_event_map_.end()) { | 143 if (it == packet_event_map_.end()) { |
145 event_proto.reset(new AggregatedPacketEvent); | 144 event_proto.reset(new AggregatedPacketEvent); |
146 event_proto->set_relative_rtp_timestamp(relative_rtp_timestamp); | 145 event_proto->set_relative_rtp_timestamp( |
| 146 relative_rtp_timestamp.lower_32_bits()); |
147 packet_event_map_.insert( | 147 packet_event_map_.insert( |
148 std::make_pair(relative_rtp_timestamp, event_proto)); | 148 std::make_pair(relative_rtp_timestamp, event_proto)); |
149 base_packet_event_proto = GetNewBasePacketEvent( | 149 base_packet_event_proto = GetNewBasePacketEvent( |
150 event_proto.get(), packet_event.packet_id, packet_event.size); | 150 event_proto.get(), packet_event.packet_id, packet_event.size); |
151 } else { | 151 } else { |
152 // Found existing entry, now look up existing BasePacketEvent using packet | 152 // Found existing entry, now look up existing BasePacketEvent using packet |
153 // ID. If not found, create a new entry and add to proto. | 153 // ID. If not found, create a new entry and add to proto. |
154 event_proto = it->second; | 154 event_proto = it->second; |
155 RepeatedPtrField<BasePacketEvent>* field = | 155 RepeatedPtrField<BasePacketEvent>* field = |
156 event_proto->mutable_base_packet_event(); | 156 event_proto->mutable_base_packet_event(); |
157 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator base_it = | 157 for (RepeatedPtrField<BasePacketEvent>::pointer_iterator base_it = |
158 field->pointer_begin(); | 158 field->pointer_begin(); |
159 base_it != field->pointer_end(); | 159 base_it != field->pointer_end(); |
160 ++base_it) { | 160 ++base_it) { |
161 if ((*base_it)->packet_id() == packet_event.packet_id) { | 161 if ((*base_it)->packet_id() == packet_event.packet_id) { |
162 base_packet_event_proto = *base_it; | 162 base_packet_event_proto = *base_it; |
163 break; | 163 break; |
164 } | 164 } |
165 } | 165 } |
166 if (!base_packet_event_proto) { | 166 if (!base_packet_event_proto) { |
167 if (event_proto->base_packet_event_size() >= kMaxPacketsPerFrame) { | 167 if (event_proto->base_packet_event_size() >= kMaxPacketsPerFrame) { |
168 DVLOG(3) << "Too many packets in AggregatedPacketEvent " | 168 DVLOG(3) << "Too many packets in AggregatedPacketEvent " |
169 << packet_event.rtp_timestamp << ". " | 169 << packet_event.rtp_timestamp << ". " |
170 << "Using new packet event proto."; | 170 << "Using new packet event proto."; |
171 AddPacketEventToStorage(event_proto); | 171 AddPacketEventToStorage(event_proto); |
172 event_proto.reset(new AggregatedPacketEvent); | 172 event_proto.reset(new AggregatedPacketEvent); |
173 event_proto->set_relative_rtp_timestamp(relative_rtp_timestamp); | 173 event_proto->set_relative_rtp_timestamp( |
| 174 relative_rtp_timestamp.lower_32_bits()); |
174 it->second = event_proto; | 175 it->second = event_proto; |
175 } | 176 } |
176 | 177 |
177 base_packet_event_proto = GetNewBasePacketEvent( | 178 base_packet_event_proto = GetNewBasePacketEvent( |
178 event_proto.get(), packet_event.packet_id, packet_event.size); | 179 event_proto.get(), packet_event.packet_id, packet_event.size); |
179 } else if (base_packet_event_proto->event_type_size() >= | 180 } else if (base_packet_event_proto->event_type_size() >= |
180 kMaxEventsPerProto) { | 181 kMaxEventsPerProto) { |
181 DVLOG(3) << "Too many events in packet " | 182 DVLOG(3) << "Too many events in packet " |
182 << packet_event.rtp_timestamp << ", " | 183 << packet_event.rtp_timestamp << ", " |
183 << packet_event.packet_id << ". Using new packet event proto."; | 184 << packet_event.packet_id << ". Using new packet event proto."; |
184 AddPacketEventToStorage(event_proto); | 185 AddPacketEventToStorage(event_proto); |
185 event_proto.reset(new AggregatedPacketEvent); | 186 event_proto.reset(new AggregatedPacketEvent); |
186 event_proto->set_relative_rtp_timestamp(relative_rtp_timestamp); | 187 event_proto->set_relative_rtp_timestamp( |
| 188 relative_rtp_timestamp.lower_32_bits()); |
187 it->second = event_proto; | 189 it->second = event_proto; |
188 base_packet_event_proto = GetNewBasePacketEvent( | 190 base_packet_event_proto = GetNewBasePacketEvent( |
189 event_proto.get(), packet_event.packet_id, packet_event.size); | 191 event_proto.get(), packet_event.packet_id, packet_event.size); |
190 } | 192 } |
191 } | 193 } |
192 | 194 |
193 base_packet_event_proto->add_event_type( | 195 base_packet_event_proto->add_event_type( |
194 ToProtoEventType(packet_event.type)); | 196 ToProtoEventType(packet_event.type)); |
195 base_packet_event_proto->add_event_timestamp_ms( | 197 base_packet_event_proto->add_event_timestamp_ms( |
196 (packet_event.timestamp - base::TimeTicks()).InMilliseconds()); | 198 (packet_event.timestamp - base::TimeTicks()).InMilliseconds()); |
(...skipping 18 matching lines...) Expand all Loading... |
215 | 217 |
216 // Flush all events. | 218 // Flush all events. |
217 TransferFrameEvents(frame_event_map_.size()); | 219 TransferFrameEvents(frame_event_map_.size()); |
218 TransferPacketEvents(packet_event_map_.size()); | 220 TransferPacketEvents(packet_event_map_.size()); |
219 std::sort(frame_event_storage_.begin(), frame_event_storage_.end(), | 221 std::sort(frame_event_storage_.begin(), frame_event_storage_.end(), |
220 &IsRtpTimestampLessThan<linked_ptr<AggregatedFrameEvent> >); | 222 &IsRtpTimestampLessThan<linked_ptr<AggregatedFrameEvent> >); |
221 std::sort(packet_event_storage_.begin(), packet_event_storage_.end(), | 223 std::sort(packet_event_storage_.begin(), packet_event_storage_.end(), |
222 &IsRtpTimestampLessThan<linked_ptr<AggregatedPacketEvent> >); | 224 &IsRtpTimestampLessThan<linked_ptr<AggregatedPacketEvent> >); |
223 | 225 |
224 metadata->set_is_audio(event_media_type_ == AUDIO_EVENT); | 226 metadata->set_is_audio(event_media_type_ == AUDIO_EVENT); |
225 metadata->set_first_rtp_timestamp(first_rtp_timestamp_); | 227 metadata->set_first_rtp_timestamp(first_rtp_timestamp_.lower_32_bits()); |
226 metadata->set_num_frame_events(frame_event_storage_.size()); | 228 metadata->set_num_frame_events(frame_event_storage_.size()); |
227 metadata->set_num_packet_events(packet_event_storage_.size()); | 229 metadata->set_num_packet_events(packet_event_storage_.size()); |
228 metadata->set_reference_timestamp_ms_at_unix_epoch( | 230 metadata->set_reference_timestamp_ms_at_unix_epoch( |
229 (base::TimeTicks::UnixEpoch() - base::TimeTicks()).InMilliseconds()); | 231 (base::TimeTicks::UnixEpoch() - base::TimeTicks()).InMilliseconds()); |
230 frame_events->swap(frame_event_storage_); | 232 frame_events->swap(frame_event_storage_); |
231 packet_events->swap(packet_event_storage_); | 233 packet_events->swap(packet_event_storage_); |
232 Reset(); | 234 Reset(); |
233 } | 235 } |
234 | 236 |
235 void EncodingEventSubscriber::TransferFrameEvents(size_t max_num_entries) { | 237 void EncodingEventSubscriber::TransferFrameEvents(size_t max_num_entries) { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 void EncodingEventSubscriber::AddPacketEventToStorage( | 272 void EncodingEventSubscriber::AddPacketEventToStorage( |
271 const linked_ptr<AggregatedPacketEvent>& packet_event_proto) { | 273 const linked_ptr<AggregatedPacketEvent>& packet_event_proto) { |
272 if (packet_event_storage_.size() >= max_frames_) | 274 if (packet_event_storage_.size() >= max_frames_) |
273 packet_event_storage_[packet_event_storage_index_] = packet_event_proto; | 275 packet_event_storage_[packet_event_storage_index_] = packet_event_proto; |
274 else | 276 else |
275 packet_event_storage_.push_back(packet_event_proto); | 277 packet_event_storage_.push_back(packet_event_proto); |
276 | 278 |
277 packet_event_storage_index_ = (packet_event_storage_index_ + 1) % max_frames_; | 279 packet_event_storage_index_ = (packet_event_storage_index_ + 1) % max_frames_; |
278 } | 280 } |
279 | 281 |
280 RtpTimestamp EncodingEventSubscriber::GetRelativeRtpTimestamp( | 282 RtpTimeDelta EncodingEventSubscriber::GetRelativeRtpTimestamp( |
281 RtpTimestamp rtp_timestamp) { | 283 RtpTimeTicks rtp_timestamp) { |
282 if (!seen_first_rtp_timestamp_) { | 284 if (!seen_first_rtp_timestamp_) { |
283 seen_first_rtp_timestamp_ = true; | 285 seen_first_rtp_timestamp_ = true; |
284 first_rtp_timestamp_ = rtp_timestamp; | 286 first_rtp_timestamp_ = rtp_timestamp; |
285 } | 287 } |
286 | 288 |
287 return rtp_timestamp - first_rtp_timestamp_; | 289 return rtp_timestamp - first_rtp_timestamp_; |
288 } | 290 } |
289 | 291 |
290 void EncodingEventSubscriber::Reset() { | 292 void EncodingEventSubscriber::Reset() { |
291 frame_event_map_.clear(); | 293 frame_event_map_.clear(); |
292 frame_event_storage_.clear(); | 294 frame_event_storage_.clear(); |
293 frame_event_storage_index_ = 0; | 295 frame_event_storage_index_ = 0; |
294 packet_event_map_.clear(); | 296 packet_event_map_.clear(); |
295 packet_event_storage_.clear(); | 297 packet_event_storage_.clear(); |
296 packet_event_storage_index_ = 0; | 298 packet_event_storage_index_ = 0; |
297 seen_first_rtp_timestamp_ = false; | 299 seen_first_rtp_timestamp_ = false; |
298 first_rtp_timestamp_ = 0u; | 300 first_rtp_timestamp_ = RtpTimeTicks(); |
299 } | 301 } |
300 | 302 |
301 } // namespace cast | 303 } // namespace cast |
302 } // namespace media | 304 } // namespace media |
OLD | NEW |