OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #import "ARDStatsBuilder.h" | 11 #import "ARDStatsBuilder.h" |
12 | 12 |
13 #import "RTCPair.h" | 13 #import "webrtc/api/objc/RTCStatsReport.h" |
14 #import "RTCStatsReport.h" | |
15 | 14 |
16 #import "ARDBitrateTracker.h" | 15 #import "ARDBitrateTracker.h" |
17 #import "ARDUtilities.h" | 16 #import "ARDUtilities.h" |
18 | 17 |
19 @implementation ARDStatsBuilder { | 18 @implementation ARDStatsBuilder { |
20 // Connection stats. | 19 // Connection stats. |
21 NSString *_connRecvBitrate; | 20 NSString *_connRecvBitrate; |
22 NSString *_connRtt; | 21 NSString *_connRtt; |
23 NSString *_connSendBitrate; | 22 NSString *_connSendBitrate; |
24 NSString *_localCandType; | 23 NSString *_localCandType; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
126 [result appendString:[NSString stringWithFormat:audioReceiveFormat, | 125 [result appendString:[NSString stringWithFormat:audioReceiveFormat, |
127 _audioRecvBitrate, _audioRecvCodec, _audioCurrentDelay, | 126 _audioRecvBitrate, _audioRecvCodec, _audioCurrentDelay, |
128 _audioExpandRate]]; | 127 _audioExpandRate]]; |
129 | 128 |
130 return result; | 129 return result; |
131 } | 130 } |
132 | 131 |
133 - (void)parseStatsReport:(RTCStatsReport *)statsReport { | 132 - (void)parseStatsReport:(RTCStatsReport *)statsReport { |
134 NSString *reportType = statsReport.type; | 133 NSString *reportType = statsReport.type; |
135 if ([reportType isEqualToString:@"ssrc"] && | 134 if ([reportType isEqualToString:@"ssrc"] && |
136 [statsReport.reportId rangeOfString:@"ssrc"].location != NSNotFound) { | 135 [statsReport.statsId rangeOfString:@"ssrc"].location != NSNotFound) { |
137 if ([statsReport.reportId rangeOfString:@"send"].location != NSNotFound) { | 136 if ([statsReport.statsId rangeOfString:@"send"].location != NSNotFound) { |
138 [self parseSendSsrcStatsReport:statsReport]; | 137 [self parseSendSsrcStatsReport:statsReport]; |
139 } | 138 } |
140 if ([statsReport.reportId rangeOfString:@"recv"].location != NSNotFound) { | 139 if ([statsReport.statsId rangeOfString:@"recv"].location != NSNotFound) { |
141 [self parseRecvSsrcStatsReport:statsReport]; | 140 [self parseRecvSsrcStatsReport:statsReport]; |
142 } | 141 } |
143 } else if ([reportType isEqualToString:@"VideoBwe"]) { | 142 } else if ([reportType isEqualToString:@"VideoBwe"]) { |
144 [self parseBweStatsReport:statsReport]; | 143 [self parseBweStatsReport:statsReport]; |
145 } else if ([reportType isEqualToString:@"googCandidatePair"]) { | 144 } else if ([reportType isEqualToString:@"googCandidatePair"]) { |
146 [self parseConnectionStatsReport:statsReport]; | 145 [self parseConnectionStatsReport:statsReport]; |
147 } | 146 } |
148 } | 147 } |
149 | 148 |
150 #pragma mark - Private | 149 #pragma mark - Private |
151 | 150 |
152 - (void)parseBweStatsReport:(RTCStatsReport *)statsReport { | 151 - (void)parseBweStatsReport:(RTCStatsReport *)statsReport { |
153 for (RTCPair *pair in statsReport.values) { | 152 NSDictionary *values = statsReport.values; |
tkchin_webrtc
2016/03/08 19:51:21
use an enumerator to iterate over keys + values. H
hjon_webrtc
2016/03/10 03:32:43
Done.
| |
154 NSString *key = pair.key; | 153 for (NSString* key in values) { |
155 NSString *value = pair.value; | 154 NSString *value = values[key]; |
156 if ([key isEqualToString:@"googAvailableSendBandwidth"]) { | 155 if ([key isEqualToString:@"googAvailableSendBandwidth"]) { |
157 _availableSendBw = | 156 _availableSendBw = |
158 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; | 157 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; |
159 } else if ([key isEqualToString:@"googAvailableReceiveBandwidth"]) { | 158 } else if ([key isEqualToString:@"googAvailableReceiveBandwidth"]) { |
160 _availableRecvBw = | 159 _availableRecvBw = |
161 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; | 160 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; |
162 } else if ([key isEqualToString:@"googActualEncBitrate"]) { | 161 } else if ([key isEqualToString:@"googActualEncBitrate"]) { |
163 _actualEncBitrate = | 162 _actualEncBitrate = |
164 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; | 163 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; |
165 } else if ([key isEqualToString:@"googTargetEncBitrate"]) { | 164 } else if ([key isEqualToString:@"googTargetEncBitrate"]) { |
166 _targetEncBitrate = | 165 _targetEncBitrate = |
167 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; | 166 [ARDBitrateTracker bitrateStringForBitrate:value.doubleValue]; |
168 } | 167 } |
169 } | 168 } |
170 } | 169 } |
171 | 170 |
172 - (void)parseConnectionStatsReport:(RTCStatsReport *)statsReport { | 171 - (void)parseConnectionStatsReport:(RTCStatsReport *)statsReport { |
173 NSDictionary *values = [self dictionaryForReport:statsReport]; | 172 NSDictionary *values = statsReport.values; |
174 NSString *activeConnection = [values[@"googActiveConnection"] firstObject]; | 173 NSString *activeConnection = values[@"googActiveConnection"]; |
175 if (![activeConnection isEqualToString:@"true"]) { | 174 if (![activeConnection isEqualToString:@"true"]) { |
176 return; | 175 return; |
177 } | 176 } |
178 for (RTCPair *pair in statsReport.values) { | 177 for (NSString* key in values) { |
179 NSString *key = pair.key; | 178 NSString *value = values[key]; |
180 NSString *value = pair.value; | |
181 if ([key isEqualToString:@"googRtt"]) { | 179 if ([key isEqualToString:@"googRtt"]) { |
182 _connRtt = value; | 180 _connRtt = value; |
183 } else if ([key isEqualToString:@"googLocalCandidateType"]) { | 181 } else if ([key isEqualToString:@"googLocalCandidateType"]) { |
184 _localCandType = value; | 182 _localCandType = value; |
185 } else if ([key isEqualToString:@"googRemoteCandidateType"]) { | 183 } else if ([key isEqualToString:@"googRemoteCandidateType"]) { |
186 _remoteCandType = value; | 184 _remoteCandType = value; |
187 } else if ([key isEqualToString:@"googTransportType"]) { | 185 } else if ([key isEqualToString:@"googTransportType"]) { |
188 _transportType = value; | 186 _transportType = value; |
189 } else if ([key isEqualToString:@"bytesReceived"]) { | 187 } else if ([key isEqualToString:@"bytesReceived"]) { |
190 NSInteger byteCount = value.integerValue; | 188 NSInteger byteCount = value.integerValue; |
191 [_connRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 189 [_connRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
192 _connRecvBitrate = _connRecvBitrateTracker.bitrateString; | 190 _connRecvBitrate = _connRecvBitrateTracker.bitrateString; |
193 } else if ([key isEqualToString:@"bytesSent"]) { | 191 } else if ([key isEqualToString:@"bytesSent"]) { |
194 NSInteger byteCount = value.integerValue; | 192 NSInteger byteCount = value.integerValue; |
195 [_connSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 193 [_connSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
196 _connSendBitrate = _connSendBitrateTracker.bitrateString; | 194 _connSendBitrate = _connSendBitrateTracker.bitrateString; |
197 } | 195 } |
198 } | 196 } |
199 } | 197 } |
200 | 198 |
201 - (void)parseSendSsrcStatsReport:(RTCStatsReport *)statsReport { | 199 - (void)parseSendSsrcStatsReport:(RTCStatsReport *)statsReport { |
202 NSDictionary *values = [self dictionaryForReport:statsReport]; | 200 NSDictionary *values = statsReport.values; |
203 NSString *trackId = [values[@"googTrackId"] firstObject]; | 201 NSString *trackId = values[@"googTrackId"]; |
204 if (trackId.length && [trackId hasPrefix:@"ARDAMSv0"]) { | 202 if (trackId.length && [trackId hasPrefix:@"ARDAMSv0"]) { |
205 // Video track. | 203 // Video track. |
206 [self parseVideoSendStatsReport:statsReport]; | 204 [self parseVideoSendStatsReport:statsReport]; |
207 } else { | 205 } else { |
208 // Audio track. | 206 // Audio track. |
209 [self parseAudioSendStatsReport:statsReport]; | 207 [self parseAudioSendStatsReport:statsReport]; |
210 } | 208 } |
211 } | 209 } |
212 | 210 |
213 - (void)parseAudioSendStatsReport:(RTCStatsReport *)statsReport { | 211 - (void)parseAudioSendStatsReport:(RTCStatsReport *)statsReport { |
214 for (RTCPair *pair in statsReport.values) { | 212 NSDictionary *values = statsReport.values; |
215 NSString *key = pair.key; | 213 for (NSString* key in values) { |
216 NSString *value = pair.value; | 214 NSString *value = values[key]; |
217 if ([key isEqualToString:@"googCodecName"]) { | 215 if ([key isEqualToString:@"googCodecName"]) { |
218 _audioSendCodec = value; | 216 _audioSendCodec = value; |
219 } else if ([key isEqualToString:@"bytesSent"]) { | 217 } else if ([key isEqualToString:@"bytesSent"]) { |
220 NSInteger byteCount = value.integerValue; | 218 NSInteger byteCount = value.integerValue; |
221 [_audioSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 219 [_audioSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
222 _audioSendBitrate = _audioSendBitrateTracker.bitrateString; | 220 _audioSendBitrate = _audioSendBitrateTracker.bitrateString; |
223 } | 221 } |
224 } | 222 } |
225 } | 223 } |
226 | 224 |
227 - (void)parseVideoSendStatsReport:(RTCStatsReport *)statsReport { | 225 - (void)parseVideoSendStatsReport:(RTCStatsReport *)statsReport { |
228 for (RTCPair *pair in statsReport.values) { | 226 NSDictionary *values = statsReport.values; |
229 NSString *key = pair.key; | 227 for (NSString* key in values) { |
230 NSString *value = pair.value; | 228 NSString *value = values[key]; |
231 if ([key isEqualToString:@"googCodecName"]) { | 229 if ([key isEqualToString:@"googCodecName"]) { |
232 _videoSendCodec = value; | 230 _videoSendCodec = value; |
233 } else if ([key isEqualToString:@"googFrameHeightInput"]) { | 231 } else if ([key isEqualToString:@"googFrameHeightInput"]) { |
234 _videoInputHeight = value; | 232 _videoInputHeight = value; |
235 } else if ([key isEqualToString:@"googFrameWidthInput"]) { | 233 } else if ([key isEqualToString:@"googFrameWidthInput"]) { |
236 _videoInputWidth = value; | 234 _videoInputWidth = value; |
237 } else if ([key isEqualToString:@"googFrameRateInput"]) { | 235 } else if ([key isEqualToString:@"googFrameRateInput"]) { |
238 _videoInputFps = value; | 236 _videoInputFps = value; |
239 } else if ([key isEqualToString:@"googFrameHeightSent"]) { | 237 } else if ([key isEqualToString:@"googFrameHeightSent"]) { |
240 _videoSendHeight = value; | 238 _videoSendHeight = value; |
241 } else if ([key isEqualToString:@"googFrameWidthSent"]) { | 239 } else if ([key isEqualToString:@"googFrameWidthSent"]) { |
242 _videoSendWidth = value; | 240 _videoSendWidth = value; |
243 } else if ([key isEqualToString:@"googFrameRateSent"]) { | 241 } else if ([key isEqualToString:@"googFrameRateSent"]) { |
244 _videoSendFps = value; | 242 _videoSendFps = value; |
245 } else if ([key isEqualToString:@"googAvgEncodeMs"]) { | 243 } else if ([key isEqualToString:@"googAvgEncodeMs"]) { |
246 _videoEncodeMs = value; | 244 _videoEncodeMs = value; |
247 } else if ([key isEqualToString:@"bytesSent"]) { | 245 } else if ([key isEqualToString:@"bytesSent"]) { |
248 NSInteger byteCount = value.integerValue; | 246 NSInteger byteCount = value.integerValue; |
249 [_videoSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 247 [_videoSendBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
250 _videoSendBitrate = _videoSendBitrateTracker.bitrateString; | 248 _videoSendBitrate = _videoSendBitrateTracker.bitrateString; |
251 } | 249 } |
252 } | 250 } |
253 } | 251 } |
254 | 252 |
255 - (void)parseRecvSsrcStatsReport:(RTCStatsReport *)statsReport { | 253 - (void)parseRecvSsrcStatsReport:(RTCStatsReport *)statsReport { |
256 NSDictionary *values = [self dictionaryForReport:statsReport]; | 254 NSDictionary *values = statsReport.values; |
257 NSString *transportId = [values[@"transportId"] firstObject]; | 255 if (values[@"googFrameWidthReceived"]) { |
258 if ([values[@"googFrameWidthReceived"] firstObject]) { | |
259 [self parseVideoRecvStatsReport:statsReport]; | 256 [self parseVideoRecvStatsReport:statsReport]; |
260 } else { | 257 } else { |
261 [self parseAudioRecvStatsReport:statsReport]; | 258 [self parseAudioRecvStatsReport:statsReport]; |
262 } | 259 } |
263 } | 260 } |
264 | 261 |
265 - (void)parseAudioRecvStatsReport:(RTCStatsReport *)statsReport { | 262 - (void)parseAudioRecvStatsReport:(RTCStatsReport *)statsReport { |
266 for (RTCPair *pair in statsReport.values) { | 263 NSDictionary *values = statsReport.values; |
267 NSString *key = pair.key; | 264 for (NSString* key in values) { |
268 NSString *value = pair.value; | 265 NSString *value = values[key]; |
269 if ([key isEqualToString:@"googCodecName"]) { | 266 if ([key isEqualToString:@"googCodecName"]) { |
270 _audioRecvCodec = value; | 267 _audioRecvCodec = value; |
271 } else if ([key isEqualToString:@"bytesReceived"]) { | 268 } else if ([key isEqualToString:@"bytesReceived"]) { |
272 NSInteger byteCount = value.integerValue; | 269 NSInteger byteCount = value.integerValue; |
273 [_audioRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 270 [_audioRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
274 _audioRecvBitrate = _audioRecvBitrateTracker.bitrateString; | 271 _audioRecvBitrate = _audioRecvBitrateTracker.bitrateString; |
275 } else if ([key isEqualToString:@"googSpeechExpandRate"]) { | 272 } else if ([key isEqualToString:@"googSpeechExpandRate"]) { |
276 _audioExpandRate = value; | 273 _audioExpandRate = value; |
277 } else if ([key isEqualToString:@"googCurrentDelayMs"]) { | 274 } else if ([key isEqualToString:@"googCurrentDelayMs"]) { |
278 _audioCurrentDelay = value; | 275 _audioCurrentDelay = value; |
279 } | 276 } |
280 } | 277 } |
281 } | 278 } |
282 | 279 |
283 - (void)parseVideoRecvStatsReport:(RTCStatsReport *)statsReport { | 280 - (void)parseVideoRecvStatsReport:(RTCStatsReport *)statsReport { |
284 for (RTCPair *pair in statsReport.values) { | 281 NSDictionary *values = statsReport.values; |
285 NSString *key = pair.key; | 282 for (NSString* key in values) { |
286 NSString *value = pair.value; | 283 NSString *value = values[key]; |
287 if ([key isEqualToString:@"googFrameHeightReceived"]) { | 284 if ([key isEqualToString:@"googFrameHeightReceived"]) { |
288 _videoRecvHeight = value; | 285 _videoRecvHeight = value; |
289 } else if ([key isEqualToString:@"googFrameWidthReceived"]) { | 286 } else if ([key isEqualToString:@"googFrameWidthReceived"]) { |
290 _videoRecvWidth = value; | 287 _videoRecvWidth = value; |
291 } else if ([key isEqualToString:@"googFrameRateReceived"]) { | 288 } else if ([key isEqualToString:@"googFrameRateReceived"]) { |
292 _videoRecvFps = value; | 289 _videoRecvFps = value; |
293 } else if ([key isEqualToString:@"googFrameRateDecoded"]) { | 290 } else if ([key isEqualToString:@"googFrameRateDecoded"]) { |
294 _videoDecodedFps = value; | 291 _videoDecodedFps = value; |
295 } else if ([key isEqualToString:@"googFrameRateOutput"]) { | 292 } else if ([key isEqualToString:@"googFrameRateOutput"]) { |
296 _videoOutputFps = value; | 293 _videoOutputFps = value; |
297 } else if ([key isEqualToString:@"googDecodeMs"]) { | 294 } else if ([key isEqualToString:@"googDecodeMs"]) { |
298 _videoDecodeMs = value; | 295 _videoDecodeMs = value; |
299 } else if ([key isEqualToString:@"bytesReceived"]) { | 296 } else if ([key isEqualToString:@"bytesReceived"]) { |
300 NSInteger byteCount = value.integerValue; | 297 NSInteger byteCount = value.integerValue; |
301 [_videoRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; | 298 [_videoRecvBitrateTracker updateBitrateWithCurrentByteCount:byteCount]; |
302 _videoRecvBitrate = _videoRecvBitrateTracker.bitrateString; | 299 _videoRecvBitrate = _videoRecvBitrateTracker.bitrateString; |
303 } | 300 } |
304 } | 301 } |
305 } | 302 } |
306 | 303 |
307 - (NSDictionary *)dictionaryForReport:(RTCStatsReport *)statsReport { | |
308 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; | |
309 for (RTCPair *pair in statsReport.values) { | |
310 NSMutableArray *values = dict[pair.key]; | |
311 if (!values) { | |
312 values = [NSMutableArray arrayWithCapacity:1]; | |
313 dict[pair.key] = values; | |
314 } | |
315 [values addObject:pair.value]; | |
316 } | |
317 return dict; | |
318 } | |
319 | |
320 @end | 304 @end |
321 | 305 |
OLD | NEW |