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