Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(171)

Side by Side Diff: media/cast/logging/logging_raw.cc

Issue 136903003: cast: Wire upp logging to be sent over RTCP between receiver and sender. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge TOT Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/cast/logging/logging_raw.h ('k') | media/cast/logging/logging_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
OLDNEW
« no previous file with comments | « media/cast/logging/logging_raw.h ('k') | media/cast/logging/logging_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698