| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/logging_raw.h" | 5 #include "media/cast/logging/logging_raw.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
| 10 | 10 |
| 11 namespace media { | 11 namespace media { |
| 12 namespace cast { | 12 namespace cast { |
| 13 | 13 |
| 14 LoggingRaw::LoggingRaw() | 14 LoggingRaw::LoggingRaw(bool is_sender) |
| 15 : frame_map_(), | 15 : is_sender_(is_sender), |
| 16 frame_map_(), |
| 16 packet_map_(), | 17 packet_map_(), |
| 17 generic_map_(), | 18 generic_map_(), |
| 18 weak_factory_(this) {} | 19 weak_factory_(this) {} |
| 19 | 20 |
| 20 LoggingRaw::~LoggingRaw() {} | 21 LoggingRaw::~LoggingRaw() {} |
| 21 | 22 |
| 22 void LoggingRaw::InsertFrameEvent(const base::TimeTicks& time_of_event, | 23 void LoggingRaw::InsertFrameEvent(const base::TimeTicks& time_of_event, |
| 23 CastLoggingEvent event, | 24 CastLoggingEvent event, |
| 24 uint32 rtp_timestamp, | 25 uint32 rtp_timestamp, |
| 25 uint32 frame_id) { | 26 uint32 frame_id) { |
| 26 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 27 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
| 28 |
| 29 InsertRtcpFrameEvent(time_of_event, event, rtp_timestamp, base::TimeDelta()); |
| 27 } | 30 } |
| 28 | 31 |
| 29 void LoggingRaw::InsertFrameEventWithSize(const base::TimeTicks& time_of_event, | 32 void LoggingRaw::InsertFrameEventWithSize(const base::TimeTicks& time_of_event, |
| 30 CastLoggingEvent event, | 33 CastLoggingEvent event, |
| 31 uint32 rtp_timestamp, | 34 uint32 rtp_timestamp, |
| 32 uint32 frame_id, | 35 uint32 frame_id, |
| 33 int size) { | 36 int size) { |
| 34 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 37 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
| 35 // Now insert size. | 38 // Now insert size. |
| 36 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); | 39 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); |
| 37 DCHECK(it != frame_map_.end()); | 40 DCHECK(it != frame_map_.end()); |
| 38 it->second.size = size; | 41 it->second.size = size; |
| 39 } | 42 } |
| 40 | 43 |
| 41 void LoggingRaw::InsertFrameEventWithDelay(const base::TimeTicks& time_of_event, | 44 void LoggingRaw::InsertFrameEventWithDelay(const base::TimeTicks& time_of_event, |
| 42 CastLoggingEvent event, | 45 CastLoggingEvent event, |
| 43 uint32 rtp_timestamp, | 46 uint32 rtp_timestamp, |
| 44 uint32 frame_id, | 47 uint32 frame_id, |
| 45 base::TimeDelta delay) { | 48 base::TimeDelta delay) { |
| 46 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); | 49 InsertBaseFrameEvent(time_of_event, event, frame_id, rtp_timestamp); |
| 47 // Now insert delay. | 50 // Now insert delay. |
| 48 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); | 51 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); |
| 49 DCHECK(it != frame_map_.end()); | 52 DCHECK(it != frame_map_.end()); |
| 50 it->second.delay_delta = delay; | 53 it->second.delay_delta = delay; |
| 54 |
| 55 InsertRtcpFrameEvent(time_of_event, event, rtp_timestamp, delay); |
| 51 } | 56 } |
| 52 | 57 |
| 53 void LoggingRaw::InsertBaseFrameEvent(const base::TimeTicks& time_of_event, | 58 void LoggingRaw::InsertBaseFrameEvent(const base::TimeTicks& time_of_event, |
| 54 CastLoggingEvent event, | 59 CastLoggingEvent event, |
| 55 uint32 frame_id, | 60 uint32 frame_id, |
| 56 uint32 rtp_timestamp) { | 61 uint32 rtp_timestamp) { |
| 57 // Is this a new event? | 62 // Is this a new event? |
| 58 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); | 63 FrameRawMap::iterator it = frame_map_.find(rtp_timestamp); |
| 59 if (it == frame_map_.end()) { | 64 if (it == frame_map_.end()) { |
| 60 // Create a new map entry. | 65 // Create a new map entry. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 BasePacketInfo base_info; | 106 BasePacketInfo base_info; |
| 102 base_info.size = size; | 107 base_info.size = size; |
| 103 base_info.timestamp.push_back(time_of_event); | 108 base_info.timestamp.push_back(time_of_event); |
| 104 base_info.type.push_back(event); | 109 base_info.type.push_back(event); |
| 105 it->second.packet_map.insert(std::make_pair(packet_id, base_info)); | 110 it->second.packet_map.insert(std::make_pair(packet_id, base_info)); |
| 106 } else { | 111 } else { |
| 107 packet_it->second.timestamp.push_back(time_of_event); | 112 packet_it->second.timestamp.push_back(time_of_event); |
| 108 packet_it->second.type.push_back(event); | 113 packet_it->second.type.push_back(event); |
| 109 } | 114 } |
| 110 } | 115 } |
| 116 if (event == kAudioPacketReceived) { |
| 117 ReceiverRtcpEvent rtcp_event; |
| 118 rtcp_event.type = event; |
| 119 rtcp_event.timestamp = time_of_event; |
| 120 rtcp_event.packet_id = packet_id; |
| 121 audio_rtcp_map_.insert(std::make_pair(rtp_timestamp, rtcp_event)); |
| 122 } else if (event == kVideoPacketReceived) { |
| 123 ReceiverRtcpEvent rtcp_event; |
| 124 rtcp_event.type = event; |
| 125 rtcp_event.timestamp = time_of_event; |
| 126 rtcp_event.packet_id = packet_id; |
| 127 video_rtcp_map_.insert(std::make_pair(rtp_timestamp, rtcp_event)); |
| 128 } |
| 111 } | 129 } |
| 112 | 130 |
| 113 void LoggingRaw::InsertGenericEvent(const base::TimeTicks& time_of_event, | 131 void LoggingRaw::InsertGenericEvent(const base::TimeTicks& time_of_event, |
| 114 CastLoggingEvent event, int value) { | 132 CastLoggingEvent event, int value) { |
| 115 GenericEvent event_data; | 133 GenericEvent event_data; |
| 116 event_data.value.push_back(value); | 134 event_data.value.push_back(value); |
| 117 event_data.timestamp.push_back(time_of_event); | 135 event_data.timestamp.push_back(time_of_event); |
| 118 // Is this a new event? | 136 // Is this a new event? |
| 119 GenericRawMap::iterator it = generic_map_.find(event); | 137 GenericRawMap::iterator it = generic_map_.find(event); |
| 120 if (it == generic_map_.end()) { | 138 if (it == generic_map_.end()) { |
| 121 // Create new entry. | 139 // Create new entry. |
| 122 generic_map_.insert(std::make_pair(event, event_data)); | 140 generic_map_.insert(std::make_pair(event, event_data)); |
| 123 } else { | 141 } else { |
| 124 // Insert to existing entry. | 142 // Insert to existing entry. |
| 125 it->second.value.push_back(value); | 143 it->second.value.push_back(value); |
| 126 it->second.timestamp.push_back(time_of_event); | 144 it->second.timestamp.push_back(time_of_event); |
| 127 } | 145 } |
| 128 } | 146 } |
| 129 | 147 |
| 148 void LoggingRaw::InsertRtcpFrameEvent(const base::TimeTicks& time_of_event, |
| 149 CastLoggingEvent event, |
| 150 uint32 rtp_timestamp, |
| 151 base::TimeDelta delay) { |
| 152 ReceiverRtcpEvent rtcp_event; |
| 153 if (is_sender_) { |
| 154 if (event != kVideoFrameCaptured && |
| 155 event != kVideoFrameSentToEncoder && |
| 156 event != kVideoFrameEncoded) { |
| 157 // Not interested in other events. |
| 158 return; |
| 159 } |
| 160 VideoRtcpRawMap::iterator it = video_rtcp_map_.find(rtp_timestamp); |
| 161 if (it == video_rtcp_map_.end()) { |
| 162 // We have not stored this frame (RTP timestamp) in our map. |
| 163 rtcp_event.type = event; |
| 164 video_rtcp_map_.insert(std::make_pair(rtp_timestamp, rtcp_event)); |
| 165 } else { |
| 166 // We already have this frame (RTP timestamp) in our map. |
| 167 // Only update events that are later in the chain. |
| 168 // This is due to that events can be reordered on the wire. |
| 169 if (event == kVideoFrameCaptured) { |
| 170 return; // First event in chain can not be late by definition. |
| 171 } |
| 172 if (it->second.type == kVideoFrameEncoded) { |
| 173 return; // Last event in chain should not be updated. |
| 174 } |
| 175 // Update existing entry. |
| 176 it->second.type = event; |
| 177 } |
| 178 } else { |
| 179 // We are a cast receiver. |
| 180 switch (event) { |
| 181 case kAudioPlayoutDelay: |
| 182 rtcp_event.delay_delta = delay; |
| 183 case kAudioFrameDecoded: |
| 184 case kAudioAckSent: |
| 185 rtcp_event.type = event; |
| 186 rtcp_event.timestamp = time_of_event; |
| 187 audio_rtcp_map_.insert(std::make_pair(rtp_timestamp, rtcp_event)); |
| 188 break; |
| 189 case kVideoRenderDelay: |
| 190 rtcp_event.delay_delta = delay; |
| 191 case kVideoFrameDecoded: |
| 192 case kVideoAckSent: |
| 193 rtcp_event.type = event; |
| 194 rtcp_event.timestamp = time_of_event; |
| 195 video_rtcp_map_.insert(std::make_pair(rtp_timestamp, rtcp_event)); |
| 196 break; |
| 197 default: |
| 198 break; |
| 199 } |
| 200 } |
| 201 } |
| 202 |
| 130 FrameRawMap LoggingRaw::GetFrameData() const { | 203 FrameRawMap LoggingRaw::GetFrameData() const { |
| 131 return frame_map_; | 204 return frame_map_; |
| 132 } | 205 } |
| 133 | 206 |
| 134 PacketRawMap LoggingRaw::GetPacketData() const { | 207 PacketRawMap LoggingRaw::GetPacketData() const { |
| 135 return packet_map_; | 208 return packet_map_; |
| 136 } | 209 } |
| 137 | 210 |
| 138 GenericRawMap LoggingRaw::GetGenericData() const { | 211 GenericRawMap LoggingRaw::GetGenericData() const { |
| 139 return generic_map_; | 212 return generic_map_; |
| 140 } | 213 } |
| 141 | 214 |
| 215 AudioRtcpRawMap LoggingRaw::GetAndResetAudioRtcpData() { |
| 216 AudioRtcpRawMap return_map; |
| 217 audio_rtcp_map_.swap(return_map); |
| 218 return return_map; |
| 219 } |
| 220 |
| 221 VideoRtcpRawMap LoggingRaw::GetAndResetVideoRtcpData() { |
| 222 VideoRtcpRawMap return_map; |
| 223 video_rtcp_map_.swap(return_map); |
| 224 return return_map; |
| 225 } |
| 226 |
| 142 void LoggingRaw::Reset() { | 227 void LoggingRaw::Reset() { |
| 143 frame_map_.clear(); | 228 frame_map_.clear(); |
| 144 packet_map_.clear(); | 229 packet_map_.clear(); |
| 145 generic_map_.clear(); | 230 generic_map_.clear(); |
| 146 } | 231 } |
| 147 | 232 |
| 148 } // namespace cast | 233 } // namespace cast |
| 149 } // namespace media | 234 } // namespace media |
| OLD | NEW |