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