| 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 |