OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2016 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 #include "webrtc/api/rtcstatscollector.h" | 11 #include "webrtc/api/rtcstatscollector.h" |
12 | 12 |
| 13 #include <initializer_list> |
13 #include <memory> | 14 #include <memory> |
14 #include <ostream> | 15 #include <ostream> |
15 #include <string> | 16 #include <string> |
16 #include <vector> | 17 #include <vector> |
17 | 18 |
18 #include "webrtc/api/jsepsessiondescription.h" | 19 #include "webrtc/api/jsepsessiondescription.h" |
19 #include "webrtc/api/mediastream.h" | 20 #include "webrtc/api/mediastream.h" |
20 #include "webrtc/api/mediastreamtrack.h" | 21 #include "webrtc/api/mediastreamtrack.h" |
21 #include "webrtc/api/rtpparameters.h" | 22 #include "webrtc/api/rtpparameters.h" |
22 #include "webrtc/api/stats/rtcstats_objects.h" | 23 #include "webrtc/api/stats/rtcstats_objects.h" |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 const std::string& candidate_type, | 164 const std::string& candidate_type, |
164 uint32_t priority) { | 165 uint32_t priority) { |
165 std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate()); | 166 std::unique_ptr<cricket::Candidate> candidate(new cricket::Candidate()); |
166 candidate->set_address(rtc::SocketAddress(hostname, port)); | 167 candidate->set_address(rtc::SocketAddress(hostname, port)); |
167 candidate->set_protocol(protocol); | 168 candidate->set_protocol(protocol); |
168 candidate->set_type(candidate_type); | 169 candidate->set_type(candidate_type); |
169 candidate->set_priority(priority); | 170 candidate->set_priority(priority); |
170 return candidate; | 171 return candidate; |
171 } | 172 } |
172 | 173 |
173 class FakeAudioProcessorForStats | |
174 : public rtc::RefCountedObject<AudioProcessorInterface> { | |
175 public: | |
176 FakeAudioProcessorForStats( | |
177 AudioProcessorInterface::AudioProcessorStats stats) | |
178 : stats_(stats) { | |
179 } | |
180 | |
181 void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { | |
182 *stats = stats_; | |
183 } | |
184 | |
185 private: | |
186 AudioProcessorInterface::AudioProcessorStats stats_; | |
187 }; | |
188 | |
189 class FakeAudioTrackForStats | 174 class FakeAudioTrackForStats |
190 : public MediaStreamTrack<AudioTrackInterface> { | 175 : public MediaStreamTrack<AudioTrackInterface> { |
191 public: | 176 public: |
192 static rtc::scoped_refptr<FakeAudioTrackForStats> Create( | 177 static rtc::scoped_refptr<FakeAudioTrackForStats> Create( |
193 const std::string& id, | 178 const std::string& id, |
194 MediaStreamTrackInterface::TrackState state, | 179 MediaStreamTrackInterface::TrackState state) { |
195 int signal_level, | |
196 rtc::scoped_refptr<FakeAudioProcessorForStats> processor) { | |
197 rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats( | 180 rtc::scoped_refptr<FakeAudioTrackForStats> audio_track_stats( |
198 new rtc::RefCountedObject<FakeAudioTrackForStats>( | 181 new rtc::RefCountedObject<FakeAudioTrackForStats>(id)); |
199 id, signal_level, processor)); | |
200 audio_track_stats->set_state(state); | 182 audio_track_stats->set_state(state); |
201 return audio_track_stats; | 183 return audio_track_stats; |
202 } | 184 } |
203 | 185 |
204 FakeAudioTrackForStats( | 186 FakeAudioTrackForStats(const std::string& id) |
205 const std::string& id, | 187 : MediaStreamTrack<AudioTrackInterface>(id) { |
206 int signal_level, | |
207 rtc::scoped_refptr<FakeAudioProcessorForStats> processor) | |
208 : MediaStreamTrack<AudioTrackInterface>(id), | |
209 signal_level_(signal_level), | |
210 processor_(processor) { | |
211 } | 188 } |
212 | 189 |
213 std::string kind() const override { | 190 std::string kind() const override { |
214 return MediaStreamTrackInterface::kAudioKind; | 191 return MediaStreamTrackInterface::kAudioKind; |
215 } | 192 } |
216 webrtc::AudioSourceInterface* GetSource() const override { return nullptr; } | 193 webrtc::AudioSourceInterface* GetSource() const override { return nullptr; } |
217 void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} | 194 void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} |
218 void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} | 195 void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} |
219 bool GetSignalLevel(int* level) override { | 196 bool GetSignalLevel(int* level) override { return false; } |
220 *level = signal_level_; | 197 rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override { |
221 return true; | 198 return nullptr; |
222 } | 199 } |
223 rtc::scoped_refptr<AudioProcessorInterface> GetAudioProcessor() override { | |
224 return processor_; | |
225 } | |
226 | |
227 private: | |
228 int signal_level_; | |
229 rtc::scoped_refptr<FakeAudioProcessorForStats> processor_; | |
230 }; | |
231 | |
232 class FakeVideoTrackSourceForStats | |
233 : public rtc::RefCountedObject<VideoTrackSourceInterface> { | |
234 public: | |
235 FakeVideoTrackSourceForStats(VideoTrackSourceInterface::Stats stats) | |
236 : stats_(stats) { | |
237 } | |
238 | |
239 MediaSourceInterface::SourceState state() const override { | |
240 return MediaSourceInterface::kLive; | |
241 } | |
242 bool remote() const override { return false; } | |
243 void RegisterObserver(ObserverInterface* observer) override {} | |
244 void UnregisterObserver(ObserverInterface* observer) override {} | |
245 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink, | |
246 const rtc::VideoSinkWants& wants) override {} | |
247 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override { | |
248 } | |
249 bool is_screencast() const override { return false; } | |
250 rtc::Optional<bool> needs_denoising() const override { | |
251 return rtc::Optional<bool>(); | |
252 } | |
253 bool GetStats(VideoTrackSourceInterface::Stats* stats) override { | |
254 *stats = stats_; | |
255 return true; | |
256 } | |
257 | |
258 private: | |
259 VideoTrackSourceInterface::Stats stats_; | |
260 }; | 200 }; |
261 | 201 |
262 class FakeVideoTrackForStats | 202 class FakeVideoTrackForStats |
263 : public MediaStreamTrack<VideoTrackInterface> { | 203 : public MediaStreamTrack<VideoTrackInterface> { |
264 public: | 204 public: |
265 static rtc::scoped_refptr<FakeVideoTrackForStats> Create( | 205 static rtc::scoped_refptr<FakeVideoTrackForStats> Create( |
266 const std::string& id, | 206 const std::string& id, |
267 MediaStreamTrackInterface::TrackState state, | 207 MediaStreamTrackInterface::TrackState state) { |
268 rtc::scoped_refptr<VideoTrackSourceInterface> source) { | |
269 rtc::scoped_refptr<FakeVideoTrackForStats> video_track( | 208 rtc::scoped_refptr<FakeVideoTrackForStats> video_track( |
270 new rtc::RefCountedObject<FakeVideoTrackForStats>(id, source)); | 209 new rtc::RefCountedObject<FakeVideoTrackForStats>(id)); |
271 video_track->set_state(state); | 210 video_track->set_state(state); |
272 return video_track; | 211 return video_track; |
273 } | 212 } |
274 | 213 |
275 FakeVideoTrackForStats( | 214 FakeVideoTrackForStats(const std::string& id) |
276 const std::string& id, | 215 : MediaStreamTrack<VideoTrackInterface>(id) { |
277 rtc::scoped_refptr<VideoTrackSourceInterface> source) | |
278 : MediaStreamTrack<VideoTrackInterface>(id), | |
279 source_(source) { | |
280 } | 216 } |
281 | 217 |
282 std::string kind() const override { | 218 std::string kind() const override { |
283 return MediaStreamTrackInterface::kVideoKind; | 219 return MediaStreamTrackInterface::kVideoKind; |
284 } | 220 } |
285 VideoTrackSourceInterface* GetSource() const override { | 221 VideoTrackSourceInterface* GetSource() const override { return nullptr; } |
286 return source_; | |
287 } | |
288 | |
289 private: | |
290 rtc::scoped_refptr<VideoTrackSourceInterface> source_; | |
291 }; | 222 }; |
292 | 223 |
293 rtc::scoped_refptr<MediaStreamTrackInterface> CreateFakeTrack( | 224 rtc::scoped_refptr<MediaStreamTrackInterface> CreateFakeTrack( |
294 cricket::MediaType media_type, | 225 cricket::MediaType media_type, |
295 const std::string& track_id) { | 226 const std::string& track_id, |
| 227 MediaStreamTrackInterface::TrackState track_state) { |
296 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 228 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
297 return FakeAudioTrackForStats::Create( | 229 return FakeAudioTrackForStats::Create(track_id, track_state); |
298 track_id, | |
299 MediaStreamTrackInterface::TrackState::kLive, | |
300 32767, | |
301 new FakeAudioProcessorForStats( | |
302 AudioProcessorInterface::AudioProcessorStats())); | |
303 } else { | 230 } else { |
304 RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO); | 231 RTC_DCHECK_EQ(media_type, cricket::MEDIA_TYPE_VIDEO); |
305 return FakeVideoTrackForStats::Create( | 232 return FakeVideoTrackForStats::Create(track_id, track_state); |
306 track_id, | |
307 MediaStreamTrackInterface::TrackState::kLive, | |
308 new FakeVideoTrackSourceForStats( | |
309 VideoTrackSourceInterface::Stats())); | |
310 } | 233 } |
311 } | 234 } |
312 | 235 |
| 236 rtc::scoped_refptr<MockRtpSender> CreateMockSender( |
| 237 rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) { |
| 238 rtc::scoped_refptr<MockRtpSender> sender( |
| 239 new rtc::RefCountedObject<MockRtpSender>()); |
| 240 EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track)); |
| 241 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc)); |
| 242 EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return( |
| 243 track->kind() == MediaStreamTrackInterface::kAudioKind |
| 244 ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO)); |
| 245 EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke( |
| 246 [ssrc]() { |
| 247 RtpParameters params; |
| 248 params.encodings.push_back(RtpEncodingParameters()); |
| 249 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc); |
| 250 return params; |
| 251 })); |
| 252 return sender; |
| 253 } |
| 254 |
| 255 rtc::scoped_refptr<MockRtpReceiver> CreateMockReceiver( |
| 256 rtc::scoped_refptr<MediaStreamTrackInterface> track, uint32_t ssrc) { |
| 257 rtc::scoped_refptr<MockRtpReceiver> receiver( |
| 258 new rtc::RefCountedObject<MockRtpReceiver>()); |
| 259 EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track)); |
| 260 EXPECT_CALL(*receiver, media_type()).WillRepeatedly(Return( |
| 261 track->kind() == MediaStreamTrackInterface::kAudioKind |
| 262 ? cricket::MEDIA_TYPE_AUDIO : cricket::MEDIA_TYPE_VIDEO)); |
| 263 EXPECT_CALL(*receiver, GetParameters()).WillRepeatedly(Invoke( |
| 264 [ssrc]() { |
| 265 RtpParameters params; |
| 266 params.encodings.push_back(RtpEncodingParameters()); |
| 267 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc); |
| 268 return params; |
| 269 })); |
| 270 return receiver; |
| 271 } |
| 272 |
313 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { | 273 class RTCStatsCollectorTestHelper : public SetSessionDescriptionObserver { |
314 public: | 274 public: |
315 RTCStatsCollectorTestHelper() | 275 RTCStatsCollectorTestHelper() |
316 : worker_thread_(rtc::Thread::Current()), | 276 : worker_thread_(rtc::Thread::Current()), |
317 network_thread_(rtc::Thread::Current()), | 277 network_thread_(rtc::Thread::Current()), |
318 signaling_thread_(rtc::Thread::Current()), | 278 signaling_thread_(rtc::Thread::Current()), |
319 media_engine_(new cricket::FakeMediaEngine()), | 279 media_engine_(new cricket::FakeMediaEngine()), |
320 channel_manager_(new cricket::ChannelManager(media_engine_, | 280 channel_manager_(new cricket::ChannelManager(media_engine_, |
321 worker_thread_, | 281 worker_thread_, |
322 network_thread_)), | 282 network_thread_)), |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 StreamCollection::Create(); | 330 StreamCollection::Create(); |
371 EXPECT_CALL(pc_, local_streams()) | 331 EXPECT_CALL(pc_, local_streams()) |
372 .WillRepeatedly(Return(local_streams)); | 332 .WillRepeatedly(Return(local_streams)); |
373 | 333 |
374 rtc::scoped_refptr<MediaStream> local_stream = | 334 rtc::scoped_refptr<MediaStream> local_stream = |
375 MediaStream::Create("LocalStreamLabel"); | 335 MediaStream::Create("LocalStreamLabel"); |
376 local_streams->AddStream(local_stream); | 336 local_streams->AddStream(local_stream); |
377 | 337 |
378 rtc::scoped_refptr<MediaStreamTrackInterface> track; | 338 rtc::scoped_refptr<MediaStreamTrackInterface> track; |
379 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 339 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
380 track = CreateFakeTrack(media_type, track_id); | 340 track = CreateFakeTrack(media_type, track_id, |
| 341 MediaStreamTrackInterface::kLive); |
381 local_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); | 342 local_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); |
382 } else { | 343 } else { |
383 track = CreateFakeTrack(media_type, track_id); | 344 track = CreateFakeTrack(media_type, track_id, |
| 345 MediaStreamTrackInterface::kLive); |
384 local_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); | 346 local_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); |
385 } | 347 } |
386 | 348 |
387 rtc::scoped_refptr<MockRtpSender> sender( | 349 rtc::scoped_refptr<MockRtpSender> sender = CreateMockSender(track, ssrc); |
388 new rtc::RefCountedObject<MockRtpSender>()); | |
389 EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track)); | |
390 EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc)); | |
391 EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return(media_type)); | |
392 EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke( | |
393 [ssrc]() { | |
394 RtpParameters params; | |
395 params.encodings.push_back(RtpEncodingParameters()); | |
396 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc); | |
397 return params; | |
398 })); | |
399 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return( | 350 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return( |
400 std::vector<rtc::scoped_refptr<RtpSenderInterface>>({ | 351 std::vector<rtc::scoped_refptr<RtpSenderInterface>>({ |
401 rtc::scoped_refptr<RtpSenderInterface>(sender.get()) }))); | 352 rtc::scoped_refptr<RtpSenderInterface>(sender.get()) }))); |
402 } | 353 } |
403 | 354 |
404 void SetupRemoteTrackAndReceiver(cricket::MediaType media_type, | 355 void SetupRemoteTrackAndReceiver(cricket::MediaType media_type, |
405 const std::string& track_id, | 356 const std::string& track_id, |
406 uint32_t ssrc) { | 357 uint32_t ssrc) { |
407 rtc::scoped_refptr<StreamCollection> remote_streams = | 358 rtc::scoped_refptr<StreamCollection> remote_streams = |
408 StreamCollection::Create(); | 359 StreamCollection::Create(); |
409 EXPECT_CALL(pc_, remote_streams()) | 360 EXPECT_CALL(pc_, remote_streams()) |
410 .WillRepeatedly(Return(remote_streams)); | 361 .WillRepeatedly(Return(remote_streams)); |
411 | 362 |
412 rtc::scoped_refptr<MediaStream> remote_stream = | 363 rtc::scoped_refptr<MediaStream> remote_stream = |
413 MediaStream::Create("RemoteStreamLabel"); | 364 MediaStream::Create("RemoteStreamLabel"); |
414 remote_streams->AddStream(remote_stream); | 365 remote_streams->AddStream(remote_stream); |
415 | 366 |
416 rtc::scoped_refptr<MediaStreamTrackInterface> track; | 367 rtc::scoped_refptr<MediaStreamTrackInterface> track; |
417 if (media_type == cricket::MEDIA_TYPE_AUDIO) { | 368 if (media_type == cricket::MEDIA_TYPE_AUDIO) { |
418 track = CreateFakeTrack(media_type, track_id); | 369 track = CreateFakeTrack(media_type, track_id, |
| 370 MediaStreamTrackInterface::kLive); |
419 remote_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); | 371 remote_stream->AddTrack(static_cast<AudioTrackInterface*>(track.get())); |
420 } else { | 372 } else { |
421 track = CreateFakeTrack(media_type, track_id); | 373 track = CreateFakeTrack(media_type, track_id, |
| 374 MediaStreamTrackInterface::kLive); |
422 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); | 375 remote_stream->AddTrack(static_cast<VideoTrackInterface*>(track.get())); |
423 } | 376 } |
424 | 377 |
425 rtc::scoped_refptr<MockRtpReceiver> receiver( | 378 rtc::scoped_refptr<MockRtpReceiver> receiver = |
426 new rtc::RefCountedObject<MockRtpReceiver>()); | 379 CreateMockReceiver(track, ssrc); |
427 EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track)); | |
428 EXPECT_CALL(*receiver, media_type()).WillRepeatedly(Return(media_type)); | |
429 EXPECT_CALL(*receiver, GetParameters()).WillRepeatedly(Invoke( | |
430 [ssrc]() { | |
431 RtpParameters params; | |
432 params.encodings.push_back(RtpEncodingParameters()); | |
433 params.encodings[0].ssrc = rtc::Optional<uint32_t>(ssrc); | |
434 return params; | |
435 })); | |
436 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return( | 380 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return( |
437 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>({ | 381 std::vector<rtc::scoped_refptr<RtpReceiverInterface>>({ |
438 rtc::scoped_refptr<RtpReceiverInterface>(receiver.get()) }))); | 382 rtc::scoped_refptr<RtpReceiverInterface>(receiver.get()) }))); |
439 } | 383 } |
440 | 384 |
| 385 // Attaches tracks to peer connections by configuring RTP senders and RTP |
| 386 // receivers according to the tracks' pairings with |
| 387 // |[Voice/Video][Sender/Receiver]Info| and their SSRCs. Local tracks can be |
| 388 // associated with multiple |[Voice/Video]SenderInfo|s, remote tracks can only |
| 389 // be associated with one |[Voice/Video]ReceiverInfo|. |
| 390 void CreateMockRtpSendersReceiversAndChannels( |
| 391 std::initializer_list<std::pair<MediaStreamTrackInterface*, |
| 392 cricket::VoiceSenderInfo>> local_audio_track_info_pairs, |
| 393 std::initializer_list<std::pair<MediaStreamTrackInterface*, |
| 394 cricket::VoiceReceiverInfo>> remote_audio_track_info_pairs, |
| 395 std::initializer_list<std::pair<MediaStreamTrackInterface*, |
| 396 cricket::VideoSenderInfo>> local_video_track_info_pairs, |
| 397 std::initializer_list<std::pair<MediaStreamTrackInterface*, |
| 398 cricket::VideoReceiverInfo>> remote_video_track_info_pairs) { |
| 399 voice_media_info_.reset(new cricket::VoiceMediaInfo()); |
| 400 video_media_info_.reset(new cricket::VideoMediaInfo()); |
| 401 rtp_senders_.clear(); |
| 402 rtp_receivers_.clear(); |
| 403 // Local audio tracks and voice sender infos |
| 404 for (auto& pair : local_audio_track_info_pairs) { |
| 405 MediaStreamTrackInterface* local_audio_track = pair.first; |
| 406 const cricket::VoiceSenderInfo& voice_sender_info = pair.second; |
| 407 RTC_DCHECK_EQ(local_audio_track->kind(), |
| 408 MediaStreamTrackInterface::kAudioKind); |
| 409 |
| 410 voice_media_info_->senders.push_back(voice_sender_info); |
| 411 rtc::scoped_refptr<MockRtpSender> rtp_sender = |
| 412 CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>( |
| 413 local_audio_track), |
| 414 voice_sender_info.local_stats[0].ssrc); |
| 415 rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>( |
| 416 rtp_sender.get())); |
| 417 } |
| 418 // Remote audio tracks and voice receiver infos |
| 419 for (auto& pair : remote_audio_track_info_pairs) { |
| 420 MediaStreamTrackInterface* remote_audio_track = pair.first; |
| 421 const cricket::VoiceReceiverInfo& voice_receiver_info = pair.second; |
| 422 RTC_DCHECK_EQ(remote_audio_track->kind(), |
| 423 MediaStreamTrackInterface::kAudioKind); |
| 424 |
| 425 voice_media_info_->receivers.push_back(voice_receiver_info); |
| 426 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver = |
| 427 CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>( |
| 428 remote_audio_track), |
| 429 voice_receiver_info.local_stats[0].ssrc); |
| 430 rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>( |
| 431 rtp_receiver.get())); |
| 432 } |
| 433 // Local video tracks and video sender infos |
| 434 for (auto& pair : local_video_track_info_pairs) { |
| 435 MediaStreamTrackInterface* local_video_track = pair.first; |
| 436 const cricket::VideoSenderInfo& video_sender_info = pair.second; |
| 437 RTC_DCHECK_EQ(local_video_track->kind(), |
| 438 MediaStreamTrackInterface::kVideoKind); |
| 439 |
| 440 video_media_info_->senders.push_back(video_sender_info); |
| 441 rtc::scoped_refptr<MockRtpSender> rtp_sender = |
| 442 CreateMockSender(rtc::scoped_refptr<MediaStreamTrackInterface>( |
| 443 local_video_track), |
| 444 video_sender_info.local_stats[0].ssrc); |
| 445 rtp_senders_.push_back(rtc::scoped_refptr<RtpSenderInterface>( |
| 446 rtp_sender.get())); |
| 447 } |
| 448 // Remote video tracks and video receiver infos |
| 449 for (auto& pair : remote_video_track_info_pairs) { |
| 450 MediaStreamTrackInterface* remote_video_track = pair.first; |
| 451 const cricket::VideoReceiverInfo& video_receiver_info = pair.second; |
| 452 RTC_DCHECK_EQ(remote_video_track->kind(), |
| 453 MediaStreamTrackInterface::kVideoKind); |
| 454 |
| 455 video_media_info_->receivers.push_back(video_receiver_info); |
| 456 rtc::scoped_refptr<MockRtpReceiver> rtp_receiver = |
| 457 CreateMockReceiver(rtc::scoped_refptr<MediaStreamTrackInterface>( |
| 458 remote_video_track), |
| 459 video_receiver_info.local_stats[0].ssrc); |
| 460 rtp_receivers_.push_back(rtc::scoped_refptr<RtpReceiverInterface>( |
| 461 rtp_receiver.get())); |
| 462 } |
| 463 EXPECT_CALL(pc_, GetSenders()).WillRepeatedly(Return(rtp_senders_)); |
| 464 EXPECT_CALL(pc_, GetReceivers()).WillRepeatedly(Return(rtp_receivers_)); |
| 465 |
| 466 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
| 467 voice_channel_.reset(new cricket::VoiceChannel( |
| 468 worker_thread_, network_thread_, nullptr, media_engine_, |
| 469 voice_media_channel, "VoiceContentName", kDefaultRtcpMuxRequired, |
| 470 kDefaultSrtpRequired)); |
| 471 EXPECT_CALL(session_, voice_channel()) |
| 472 .WillRepeatedly(Return(voice_channel_.get())); |
| 473 EXPECT_CALL(*voice_media_channel, GetStats(_)) |
| 474 .WillOnce(DoAll(SetArgPointee<0>(*voice_media_info_), Return(true))); |
| 475 |
| 476 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); |
| 477 video_channel_.reset(new cricket::VideoChannel( |
| 478 worker_thread_, network_thread_, nullptr, video_media_channel, |
| 479 "VideoContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired)); |
| 480 EXPECT_CALL(session_, video_channel()) |
| 481 .WillRepeatedly(Return(video_channel_.get())); |
| 482 EXPECT_CALL(*video_media_channel, GetStats(_)) |
| 483 .WillOnce(DoAll(SetArgPointee<0>(*video_media_info_), Return(true))); |
| 484 } |
| 485 |
441 private: | 486 private: |
442 rtc::ScopedFakeClock fake_clock_; | 487 rtc::ScopedFakeClock fake_clock_; |
443 RtcEventLogNullImpl event_log_; | 488 RtcEventLogNullImpl event_log_; |
444 rtc::Thread* const worker_thread_; | 489 rtc::Thread* const worker_thread_; |
445 rtc::Thread* const network_thread_; | 490 rtc::Thread* const network_thread_; |
446 rtc::Thread* const signaling_thread_; | 491 rtc::Thread* const signaling_thread_; |
447 cricket::FakeMediaEngine* media_engine_; | 492 cricket::FakeMediaEngine* media_engine_; |
448 std::unique_ptr<cricket::ChannelManager> channel_manager_; | 493 std::unique_ptr<cricket::ChannelManager> channel_manager_; |
449 std::unique_ptr<MediaControllerInterface> media_controller_; | 494 std::unique_ptr<MediaControllerInterface> media_controller_; |
450 MockWebRtcSession session_; | 495 MockWebRtcSession session_; |
451 MockPeerConnection pc_; | 496 MockPeerConnection pc_; |
452 | 497 |
453 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; | 498 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; |
| 499 std::unique_ptr<cricket::VoiceChannel> voice_channel_; |
| 500 std::unique_ptr<cricket::VideoChannel> video_channel_; |
| 501 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info_; |
| 502 std::unique_ptr<cricket::VideoMediaInfo> video_media_info_; |
| 503 std::vector<rtc::scoped_refptr<RtpSenderInterface>> rtp_senders_; |
| 504 std::vector<rtc::scoped_refptr<RtpReceiverInterface>> rtp_receivers_; |
454 }; | 505 }; |
455 | 506 |
456 class RTCTestStats : public RTCStats { | 507 class RTCTestStats : public RTCStats { |
457 public: | 508 public: |
458 WEBRTC_RTCSTATS_DECL(); | 509 WEBRTC_RTCSTATS_DECL(); |
459 | 510 |
460 RTCTestStats(const std::string& id, int64_t timestamp_us) | 511 RTCTestStats(const std::string& id, int64_t timestamp_us) |
461 : RTCStats(id, timestamp_us), | 512 : RTCStats(id, timestamp_us), |
462 dummy_stat("dummyStat") {} | 513 dummy_stat("dummyStat") {} |
463 | 514 |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1326 .WillRepeatedly(Return(remote_streams)); | 1377 .WillRepeatedly(Return(remote_streams)); |
1327 | 1378 |
1328 rtc::scoped_refptr<MediaStream> local_stream = | 1379 rtc::scoped_refptr<MediaStream> local_stream = |
1329 MediaStream::Create("LocalStreamLabel"); | 1380 MediaStream::Create("LocalStreamLabel"); |
1330 local_streams->AddStream(local_stream); | 1381 local_streams->AddStream(local_stream); |
1331 rtc::scoped_refptr<MediaStream> remote_stream = | 1382 rtc::scoped_refptr<MediaStream> remote_stream = |
1332 MediaStream::Create("RemoteStreamLabel"); | 1383 MediaStream::Create("RemoteStreamLabel"); |
1333 remote_streams->AddStream(remote_stream); | 1384 remote_streams->AddStream(remote_stream); |
1334 | 1385 |
1335 // Local audio track | 1386 // Local audio track |
1336 AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats; | 1387 rtc::scoped_refptr<MediaStreamTrackInterface> local_audio_track = |
1337 local_audio_processor_stats.echo_return_loss = 42; | 1388 CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "LocalAudioTrackID", |
1338 local_audio_processor_stats.echo_return_loss_enhancement = 52; | 1389 MediaStreamTrackInterface::kEnded); |
1339 rtc::scoped_refptr<FakeAudioTrackForStats> local_audio_track = | 1390 local_stream->AddTrack(static_cast<AudioTrackInterface*>( |
1340 FakeAudioTrackForStats::Create( | 1391 local_audio_track.get())); |
1341 "LocalAudioTrackID", | 1392 |
1342 MediaStreamTrackInterface::TrackState::kEnded, | 1393 cricket::VoiceSenderInfo voice_sender_info_ssrc1; |
1343 32767, | 1394 voice_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo()); |
1344 new FakeAudioProcessorForStats(local_audio_processor_stats)); | 1395 voice_sender_info_ssrc1.local_stats[0].ssrc = 1; |
1345 local_stream->AddTrack(local_audio_track); | 1396 voice_sender_info_ssrc1.audio_level = 32767; |
| 1397 voice_sender_info_ssrc1.echo_return_loss = 42; |
| 1398 voice_sender_info_ssrc1.echo_return_loss_enhancement = 52; |
| 1399 |
| 1400 // Uses default values, the corresponding stats object should contain |
| 1401 // undefined members. |
| 1402 cricket::VoiceSenderInfo voice_sender_info_ssrc2; |
| 1403 voice_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo()); |
| 1404 voice_sender_info_ssrc2.local_stats[0].ssrc = 2; |
| 1405 voice_sender_info_ssrc2.audio_level = 0; |
| 1406 voice_sender_info_ssrc2.echo_return_loss = -100; |
| 1407 voice_sender_info_ssrc2.echo_return_loss_enhancement = -100; |
1346 | 1408 |
1347 // Remote audio track | 1409 // Remote audio track |
1348 AudioProcessorInterface::AudioProcessorStats remote_audio_processor_stats; | 1410 rtc::scoped_refptr<MediaStreamTrackInterface> remote_audio_track = |
1349 remote_audio_processor_stats.echo_return_loss = 13; | 1411 CreateFakeTrack(cricket::MEDIA_TYPE_AUDIO, "RemoteAudioTrackID", |
1350 remote_audio_processor_stats.echo_return_loss_enhancement = 37; | 1412 MediaStreamTrackInterface::kLive); |
1351 rtc::scoped_refptr<FakeAudioTrackForStats> remote_audio_track = | 1413 remote_stream->AddTrack(static_cast<AudioTrackInterface*>( |
1352 FakeAudioTrackForStats::Create( | 1414 remote_audio_track.get())); |
1353 "RemoteAudioTrackID", | 1415 |
1354 MediaStreamTrackInterface::TrackState::kLive, | 1416 cricket::VoiceReceiverInfo voice_receiver_info; |
1355 0, | 1417 voice_receiver_info.local_stats.push_back(cricket::SsrcReceiverInfo()); |
1356 new FakeAudioProcessorForStats(remote_audio_processor_stats)); | 1418 voice_receiver_info.local_stats[0].ssrc = 3; |
1357 remote_stream->AddTrack(remote_audio_track); | 1419 voice_receiver_info.audio_level = 16383; |
| 1420 |
| 1421 test_->CreateMockRtpSendersReceiversAndChannels( |
| 1422 { std::make_pair(local_audio_track.get(), voice_sender_info_ssrc1), |
| 1423 std::make_pair(local_audio_track.get(), voice_sender_info_ssrc2) }, |
| 1424 { std::make_pair(remote_audio_track.get(), voice_receiver_info) }, |
| 1425 {}, {}); |
1358 | 1426 |
1359 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1427 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1360 | 1428 |
1361 RTCMediaStreamStats expected_local_stream( | 1429 RTCMediaStreamStats expected_local_stream( |
1362 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); | 1430 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); |
1363 expected_local_stream.stream_identifier = local_stream->label(); | 1431 expected_local_stream.stream_identifier = local_stream->label(); |
1364 expected_local_stream.track_ids = std::vector<std::string>(); | 1432 expected_local_stream.track_ids = std::vector<std::string>( |
1365 expected_local_stream.track_ids->push_back( | 1433 { "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1", |
1366 "RTCMediaStreamTrack_local_LocalAudioTrackID"); | 1434 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2" }); |
1367 ASSERT_TRUE(report->Get(expected_local_stream.id())); | 1435 ASSERT_TRUE(report->Get(expected_local_stream.id())); |
1368 EXPECT_EQ(expected_local_stream, | 1436 EXPECT_EQ(expected_local_stream, |
1369 report->Get(expected_local_stream.id())->cast_to< | 1437 report->Get(expected_local_stream.id())->cast_to< |
1370 RTCMediaStreamStats>()); | 1438 RTCMediaStreamStats>()); |
1371 | 1439 |
1372 RTCMediaStreamStats expected_remote_stream( | 1440 RTCMediaStreamStats expected_remote_stream( |
1373 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); | 1441 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); |
1374 expected_remote_stream.stream_identifier = remote_stream->label(); | 1442 expected_remote_stream.stream_identifier = remote_stream->label(); |
1375 expected_remote_stream.track_ids = std::vector<std::string>(); | 1443 expected_remote_stream.track_ids = std::vector<std::string>({ |
1376 expected_remote_stream.track_ids->push_back( | 1444 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3" }); |
1377 "RTCMediaStreamTrack_remote_RemoteAudioTrackID"); | |
1378 ASSERT_TRUE(report->Get(expected_remote_stream.id())); | 1445 ASSERT_TRUE(report->Get(expected_remote_stream.id())); |
1379 EXPECT_EQ(expected_remote_stream, | 1446 EXPECT_EQ(expected_remote_stream, |
1380 report->Get(expected_remote_stream.id())->cast_to< | 1447 report->Get(expected_remote_stream.id())->cast_to< |
1381 RTCMediaStreamStats>()); | 1448 RTCMediaStreamStats>()); |
1382 | 1449 |
1383 RTCMediaStreamTrackStats expected_local_audio_track( | 1450 RTCMediaStreamTrackStats expected_local_audio_track_ssrc1( |
1384 "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(), | 1451 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1", |
1385 RTCMediaStreamTrackKind::kAudio); | 1452 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio); |
1386 expected_local_audio_track.track_identifier = local_audio_track->id(); | 1453 expected_local_audio_track_ssrc1.track_identifier = local_audio_track->id(); |
1387 expected_local_audio_track.remote_source = false; | 1454 expected_local_audio_track_ssrc1.remote_source = false; |
1388 expected_local_audio_track.ended = true; | 1455 expected_local_audio_track_ssrc1.ended = true; |
1389 expected_local_audio_track.detached = false; | 1456 expected_local_audio_track_ssrc1.detached = false; |
1390 expected_local_audio_track.audio_level = 1.0; | 1457 expected_local_audio_track_ssrc1.audio_level = 1.0; |
1391 expected_local_audio_track.echo_return_loss = 42.0; | 1458 expected_local_audio_track_ssrc1.echo_return_loss = 42.0; |
1392 expected_local_audio_track.echo_return_loss_enhancement = 52.0; | 1459 expected_local_audio_track_ssrc1.echo_return_loss_enhancement = 52.0; |
1393 ASSERT_TRUE(report->Get(expected_local_audio_track.id())); | 1460 ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc1.id())); |
1394 EXPECT_EQ(expected_local_audio_track, | 1461 EXPECT_EQ(expected_local_audio_track_ssrc1, |
1395 report->Get(expected_local_audio_track.id())->cast_to< | 1462 report->Get(expected_local_audio_track_ssrc1.id())->cast_to< |
| 1463 RTCMediaStreamTrackStats>()); |
| 1464 |
| 1465 RTCMediaStreamTrackStats expected_local_audio_track_ssrc2( |
| 1466 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_2", |
| 1467 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio); |
| 1468 expected_local_audio_track_ssrc2.track_identifier = local_audio_track->id(); |
| 1469 expected_local_audio_track_ssrc2.remote_source = false; |
| 1470 expected_local_audio_track_ssrc2.ended = true; |
| 1471 expected_local_audio_track_ssrc2.detached = false; |
| 1472 expected_local_audio_track_ssrc2.audio_level = 0.0; |
| 1473 // Should be undefined: |expected_local_audio_track_ssrc2.echo_return_loss| |
| 1474 // and |expected_local_audio_track_ssrc2.echo_return_loss_enhancement|. |
| 1475 ASSERT_TRUE(report->Get(expected_local_audio_track_ssrc2.id())); |
| 1476 EXPECT_EQ(expected_local_audio_track_ssrc2, |
| 1477 report->Get(expected_local_audio_track_ssrc2.id())->cast_to< |
1396 RTCMediaStreamTrackStats>()); | 1478 RTCMediaStreamTrackStats>()); |
1397 | 1479 |
1398 RTCMediaStreamTrackStats expected_remote_audio_track( | 1480 RTCMediaStreamTrackStats expected_remote_audio_track( |
1399 "RTCMediaStreamTrack_remote_RemoteAudioTrackID", report->timestamp_us(), | 1481 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_3", |
1400 RTCMediaStreamTrackKind::kAudio); | 1482 report->timestamp_us(), RTCMediaStreamTrackKind::kAudio); |
1401 expected_remote_audio_track.track_identifier = remote_audio_track->id(); | 1483 expected_remote_audio_track.track_identifier = remote_audio_track->id(); |
1402 expected_remote_audio_track.remote_source = true; | 1484 expected_remote_audio_track.remote_source = true; |
1403 expected_remote_audio_track.ended = false; | 1485 expected_remote_audio_track.ended = false; |
1404 expected_remote_audio_track.detached = false; | 1486 expected_remote_audio_track.detached = false; |
1405 expected_remote_audio_track.audio_level = 0.0; | 1487 expected_remote_audio_track.audio_level = 16383.0 / 32767.0; |
1406 expected_remote_audio_track.echo_return_loss = 13.0; | |
1407 expected_remote_audio_track.echo_return_loss_enhancement = 37.0; | |
1408 ASSERT_TRUE(report->Get(expected_remote_audio_track.id())); | 1488 ASSERT_TRUE(report->Get(expected_remote_audio_track.id())); |
1409 EXPECT_EQ(expected_remote_audio_track, | 1489 EXPECT_EQ(expected_remote_audio_track, |
1410 report->Get(expected_remote_audio_track.id())->cast_to< | 1490 report->Get(expected_remote_audio_track.id())->cast_to< |
1411 RTCMediaStreamTrackStats>()); | 1491 RTCMediaStreamTrackStats>()); |
1412 } | 1492 } |
1413 | 1493 |
1414 TEST_F(RTCStatsCollectorTest, | 1494 TEST_F(RTCStatsCollectorTest, |
1415 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Audio_Defaults) { | |
1416 rtc::scoped_refptr<StreamCollection> local_streams = | |
1417 StreamCollection::Create(); | |
1418 EXPECT_CALL(test_->pc(), local_streams()) | |
1419 .WillRepeatedly(Return(local_streams)); | |
1420 | |
1421 rtc::scoped_refptr<MediaStream> local_stream = | |
1422 MediaStream::Create("LocalStreamLabel"); | |
1423 local_streams->AddStream(local_stream); | |
1424 | |
1425 // Local audio track | |
1426 AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats; | |
1427 local_audio_processor_stats.echo_return_loss = -100; | |
1428 local_audio_processor_stats.echo_return_loss_enhancement = -100; | |
1429 rtc::scoped_refptr<FakeAudioTrackForStats> local_audio_track = | |
1430 FakeAudioTrackForStats::Create( | |
1431 "LocalAudioTrackID", | |
1432 MediaStreamTrackInterface::TrackState::kEnded, | |
1433 32767, | |
1434 new FakeAudioProcessorForStats(local_audio_processor_stats)); | |
1435 local_stream->AddTrack(local_audio_track); | |
1436 | |
1437 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | |
1438 | |
1439 RTCMediaStreamTrackStats expected_local_audio_track( | |
1440 "RTCMediaStreamTrack_local_LocalAudioTrackID", report->timestamp_us(), | |
1441 RTCMediaStreamTrackKind::kAudio); | |
1442 expected_local_audio_track.track_identifier = local_audio_track->id(); | |
1443 expected_local_audio_track.remote_source = false; | |
1444 expected_local_audio_track.ended = true; | |
1445 expected_local_audio_track.detached = false; | |
1446 expected_local_audio_track.audio_level = 1.0; | |
1447 // Should be undefined: |expected_local_audio_track.echo_return_loss| and | |
1448 // |expected_local_audio_track.echo_return_loss_enhancement|. | |
1449 ASSERT_TRUE(report->Get(expected_local_audio_track.id())); | |
1450 EXPECT_EQ(expected_local_audio_track, | |
1451 report->Get(expected_local_audio_track.id())->cast_to< | |
1452 RTCMediaStreamTrackStats>()); | |
1453 } | |
1454 | |
1455 TEST_F(RTCStatsCollectorTest, | |
1456 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) { | 1495 CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) { |
1457 rtc::scoped_refptr<StreamCollection> local_streams = | 1496 rtc::scoped_refptr<StreamCollection> local_streams = |
1458 StreamCollection::Create(); | 1497 StreamCollection::Create(); |
1459 rtc::scoped_refptr<StreamCollection> remote_streams = | 1498 rtc::scoped_refptr<StreamCollection> remote_streams = |
1460 StreamCollection::Create(); | 1499 StreamCollection::Create(); |
1461 EXPECT_CALL(test_->pc(), local_streams()) | 1500 EXPECT_CALL(test_->pc(), local_streams()) |
1462 .WillRepeatedly(Return(local_streams)); | 1501 .WillRepeatedly(Return(local_streams)); |
1463 EXPECT_CALL(test_->pc(), remote_streams()) | 1502 EXPECT_CALL(test_->pc(), remote_streams()) |
1464 .WillRepeatedly(Return(remote_streams)); | 1503 .WillRepeatedly(Return(remote_streams)); |
1465 | 1504 |
1466 rtc::scoped_refptr<MediaStream> local_stream = | 1505 rtc::scoped_refptr<MediaStream> local_stream = |
1467 MediaStream::Create("LocalStreamLabel"); | 1506 MediaStream::Create("LocalStreamLabel"); |
1468 local_streams->AddStream(local_stream); | 1507 local_streams->AddStream(local_stream); |
1469 rtc::scoped_refptr<MediaStream> remote_stream = | 1508 rtc::scoped_refptr<MediaStream> remote_stream = |
1470 MediaStream::Create("RemoteStreamLabel"); | 1509 MediaStream::Create("RemoteStreamLabel"); |
1471 remote_streams->AddStream(remote_stream); | 1510 remote_streams->AddStream(remote_stream); |
1472 | 1511 |
1473 // Local video track | 1512 // Local video track |
1474 VideoTrackSourceInterface::Stats local_video_track_source_stats; | 1513 rtc::scoped_refptr<MediaStreamTrackInterface> local_video_track = |
1475 local_video_track_source_stats.input_width = 1234; | 1514 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "LocalVideoTrackID", |
1476 local_video_track_source_stats.input_height = 4321; | 1515 MediaStreamTrackInterface::kLive); |
1477 rtc::scoped_refptr<FakeVideoTrackSourceForStats> local_video_track_source = | 1516 local_stream->AddTrack(static_cast<VideoTrackInterface*>( |
1478 new FakeVideoTrackSourceForStats(local_video_track_source_stats); | 1517 local_video_track.get())); |
1479 rtc::scoped_refptr<FakeVideoTrackForStats> local_video_track = | |
1480 FakeVideoTrackForStats::Create( | |
1481 "LocalVideoTrackID", | |
1482 MediaStreamTrackInterface::TrackState::kLive, | |
1483 local_video_track_source); | |
1484 local_stream->AddTrack(local_video_track); | |
1485 | 1518 |
1486 // Remote video track | 1519 cricket::VideoSenderInfo video_sender_info_ssrc1; |
1487 VideoTrackSourceInterface::Stats remote_video_track_source_stats; | 1520 video_sender_info_ssrc1.local_stats.push_back(cricket::SsrcSenderInfo()); |
1488 remote_video_track_source_stats.input_width = 1234; | 1521 video_sender_info_ssrc1.local_stats[0].ssrc = 1; |
1489 remote_video_track_source_stats.input_height = 4321; | 1522 video_sender_info_ssrc1.send_frame_width = 1234; |
1490 rtc::scoped_refptr<FakeVideoTrackSourceForStats> remote_video_track_source = | 1523 video_sender_info_ssrc1.send_frame_height = 4321; |
1491 new FakeVideoTrackSourceForStats(remote_video_track_source_stats); | 1524 |
1492 rtc::scoped_refptr<FakeVideoTrackForStats> remote_video_track = | 1525 cricket::VideoSenderInfo video_sender_info_ssrc2; |
1493 FakeVideoTrackForStats::Create( | 1526 video_sender_info_ssrc2.local_stats.push_back(cricket::SsrcSenderInfo()); |
1494 "RemoteVideoTrackID", | 1527 video_sender_info_ssrc2.local_stats[0].ssrc = 2; |
1495 MediaStreamTrackInterface::TrackState::kEnded, | 1528 video_sender_info_ssrc2.send_frame_width = 4321; |
1496 remote_video_track_source); | 1529 video_sender_info_ssrc2.send_frame_height = 1234; |
1497 remote_stream->AddTrack(remote_video_track); | 1530 |
| 1531 // Remote video track with values |
| 1532 rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc3 = |
| 1533 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID3", |
| 1534 MediaStreamTrackInterface::kEnded); |
| 1535 remote_stream->AddTrack(static_cast<VideoTrackInterface*>( |
| 1536 remote_video_track_ssrc3.get())); |
| 1537 |
| 1538 cricket::VideoReceiverInfo video_receiver_info_ssrc3; |
| 1539 video_receiver_info_ssrc3.local_stats.push_back(cricket::SsrcReceiverInfo()); |
| 1540 video_receiver_info_ssrc3.local_stats[0].ssrc = 3; |
| 1541 video_receiver_info_ssrc3.frame_width = 6789; |
| 1542 video_receiver_info_ssrc3.frame_height = 9876; |
| 1543 |
| 1544 // Remote video track with undefined (default) values |
| 1545 rtc::scoped_refptr<MediaStreamTrackInterface> remote_video_track_ssrc4 = |
| 1546 CreateFakeTrack(cricket::MEDIA_TYPE_VIDEO, "RemoteVideoTrackID4", |
| 1547 MediaStreamTrackInterface::kLive); |
| 1548 remote_stream->AddTrack(static_cast<VideoTrackInterface*>( |
| 1549 remote_video_track_ssrc4.get())); |
| 1550 |
| 1551 cricket::VideoReceiverInfo video_receiver_info_ssrc4; |
| 1552 video_receiver_info_ssrc4.local_stats.push_back(cricket::SsrcReceiverInfo()); |
| 1553 video_receiver_info_ssrc4.local_stats[0].ssrc = 4; |
| 1554 video_receiver_info_ssrc4.frame_width = 0; |
| 1555 video_receiver_info_ssrc4.frame_height = 0; |
| 1556 |
| 1557 test_->CreateMockRtpSendersReceiversAndChannels( |
| 1558 {}, {}, |
| 1559 { std::make_pair(local_video_track.get(), video_sender_info_ssrc1), |
| 1560 std::make_pair(local_video_track.get(), video_sender_info_ssrc2) }, |
| 1561 { std::make_pair(remote_video_track_ssrc3.get(), |
| 1562 video_receiver_info_ssrc3), |
| 1563 std::make_pair(remote_video_track_ssrc4.get(), |
| 1564 video_receiver_info_ssrc4) }); |
1498 | 1565 |
1499 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1566 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1500 | 1567 |
1501 RTCMediaStreamStats expected_local_stream( | 1568 RTCMediaStreamStats expected_local_stream( |
1502 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); | 1569 "RTCMediaStream_local_LocalStreamLabel", report->timestamp_us()); |
1503 expected_local_stream.stream_identifier = local_stream->label(); | 1570 expected_local_stream.stream_identifier = local_stream->label(); |
1504 expected_local_stream.track_ids = std::vector<std::string>(); | 1571 expected_local_stream.track_ids = std::vector<std::string>({ |
1505 expected_local_stream.track_ids->push_back( | 1572 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1", |
1506 "RTCMediaStreamTrack_local_LocalVideoTrackID"); | 1573 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2" }); |
1507 ASSERT_TRUE(report->Get(expected_local_stream.id())); | 1574 ASSERT_TRUE(report->Get(expected_local_stream.id())); |
1508 EXPECT_EQ(expected_local_stream, | 1575 EXPECT_EQ(expected_local_stream, |
1509 report->Get(expected_local_stream.id())->cast_to< | 1576 report->Get(expected_local_stream.id())->cast_to< |
1510 RTCMediaStreamStats>()); | 1577 RTCMediaStreamStats>()); |
1511 | 1578 |
1512 RTCMediaStreamStats expected_remote_stream( | 1579 RTCMediaStreamStats expected_remote_stream( |
1513 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); | 1580 "RTCMediaStream_remote_RemoteStreamLabel", report->timestamp_us()); |
1514 expected_remote_stream.stream_identifier = remote_stream->label(); | 1581 expected_remote_stream.stream_identifier = remote_stream->label(); |
1515 expected_remote_stream.track_ids = std::vector<std::string>(); | 1582 expected_remote_stream.track_ids = std::vector<std::string>({ |
1516 expected_remote_stream.track_ids->push_back( | 1583 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3", |
1517 "RTCMediaStreamTrack_remote_RemoteVideoTrackID"); | 1584 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4" }); |
1518 ASSERT_TRUE(report->Get(expected_remote_stream.id())); | 1585 ASSERT_TRUE(report->Get(expected_remote_stream.id())); |
1519 EXPECT_EQ(expected_remote_stream, | 1586 EXPECT_EQ(expected_remote_stream, |
1520 report->Get(expected_remote_stream.id())->cast_to< | 1587 report->Get(expected_remote_stream.id())->cast_to< |
1521 RTCMediaStreamStats>()); | 1588 RTCMediaStreamStats>()); |
1522 | 1589 |
1523 RTCMediaStreamTrackStats expected_local_video_track( | 1590 RTCMediaStreamTrackStats expected_local_video_track_ssrc1( |
1524 "RTCMediaStreamTrack_local_LocalVideoTrackID", report->timestamp_us(), | 1591 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1", |
1525 RTCMediaStreamTrackKind::kVideo); | 1592 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo); |
1526 expected_local_video_track.track_identifier = local_video_track->id(); | 1593 expected_local_video_track_ssrc1.track_identifier = local_video_track->id(); |
1527 expected_local_video_track.remote_source = false; | 1594 expected_local_video_track_ssrc1.remote_source = false; |
1528 expected_local_video_track.ended = false; | 1595 expected_local_video_track_ssrc1.ended = false; |
1529 expected_local_video_track.detached = false; | 1596 expected_local_video_track_ssrc1.detached = false; |
1530 expected_local_video_track.frame_width = 1234; | 1597 expected_local_video_track_ssrc1.frame_width = 1234; |
1531 expected_local_video_track.frame_height = 4321; | 1598 expected_local_video_track_ssrc1.frame_height = 4321; |
1532 ASSERT_TRUE(report->Get(expected_local_video_track.id())); | 1599 ASSERT_TRUE(report->Get(expected_local_video_track_ssrc1.id())); |
1533 EXPECT_EQ(expected_local_video_track, | 1600 EXPECT_EQ(expected_local_video_track_ssrc1, |
1534 report->Get(expected_local_video_track.id())->cast_to< | 1601 report->Get(expected_local_video_track_ssrc1.id())->cast_to< |
1535 RTCMediaStreamTrackStats>()); | 1602 RTCMediaStreamTrackStats>()); |
1536 | 1603 |
1537 RTCMediaStreamTrackStats expected_remote_video_track( | 1604 RTCMediaStreamTrackStats expected_local_video_track_ssrc2( |
1538 "RTCMediaStreamTrack_remote_RemoteVideoTrackID", report->timestamp_us(), | 1605 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_2", |
1539 RTCMediaStreamTrackKind::kVideo); | 1606 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo); |
1540 expected_remote_video_track.track_identifier = remote_video_track->id(); | 1607 expected_local_video_track_ssrc2.track_identifier = local_video_track->id(); |
1541 expected_remote_video_track.remote_source = true; | 1608 expected_local_video_track_ssrc2.remote_source = false; |
1542 expected_remote_video_track.ended = true; | 1609 expected_local_video_track_ssrc2.ended = false; |
1543 expected_remote_video_track.detached = false; | 1610 expected_local_video_track_ssrc2.detached = false; |
1544 expected_remote_video_track.frame_width = 1234; | 1611 expected_local_video_track_ssrc2.frame_width = 4321; |
1545 expected_remote_video_track.frame_height = 4321; | 1612 expected_local_video_track_ssrc2.frame_height = 1234; |
1546 ASSERT_TRUE(report->Get(expected_remote_video_track.id())); | 1613 ASSERT_TRUE(report->Get(expected_local_video_track_ssrc2.id())); |
1547 EXPECT_EQ(expected_remote_video_track, | 1614 EXPECT_EQ(expected_local_video_track_ssrc2, |
1548 report->Get(expected_remote_video_track.id())->cast_to< | 1615 report->Get(expected_local_video_track_ssrc2.id())->cast_to< |
| 1616 RTCMediaStreamTrackStats>()); |
| 1617 |
| 1618 RTCMediaStreamTrackStats expected_remote_video_track_ssrc3( |
| 1619 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID3_3", |
| 1620 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo); |
| 1621 expected_remote_video_track_ssrc3.track_identifier = |
| 1622 remote_video_track_ssrc3->id(); |
| 1623 expected_remote_video_track_ssrc3.remote_source = true; |
| 1624 expected_remote_video_track_ssrc3.ended = true; |
| 1625 expected_remote_video_track_ssrc3.detached = false; |
| 1626 expected_remote_video_track_ssrc3.frame_width = 6789; |
| 1627 expected_remote_video_track_ssrc3.frame_height = 9876; |
| 1628 ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc3.id())); |
| 1629 EXPECT_EQ(expected_remote_video_track_ssrc3, |
| 1630 report->Get(expected_remote_video_track_ssrc3.id())->cast_to< |
| 1631 RTCMediaStreamTrackStats>()); |
| 1632 |
| 1633 RTCMediaStreamTrackStats expected_remote_video_track_ssrc4( |
| 1634 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID4_4", |
| 1635 report->timestamp_us(), RTCMediaStreamTrackKind::kVideo); |
| 1636 expected_remote_video_track_ssrc4.track_identifier = |
| 1637 remote_video_track_ssrc4->id(); |
| 1638 expected_remote_video_track_ssrc4.remote_source = true; |
| 1639 expected_remote_video_track_ssrc4.ended = false; |
| 1640 expected_remote_video_track_ssrc4.detached = false; |
| 1641 // Should be undefined: |expected_remote_video_track_ssrc4.frame_width| and |
| 1642 // |expected_remote_video_track_ssrc4.frame_height|. |
| 1643 ASSERT_TRUE(report->Get(expected_remote_video_track_ssrc4.id())); |
| 1644 EXPECT_EQ(expected_remote_video_track_ssrc4, |
| 1645 report->Get(expected_remote_video_track_ssrc4.id())->cast_to< |
1549 RTCMediaStreamTrackStats>()); | 1646 RTCMediaStreamTrackStats>()); |
1550 } | 1647 } |
1551 | 1648 |
1552 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { | 1649 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { |
1553 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); | 1650 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
1554 cricket::VoiceChannel voice_channel( | 1651 cricket::VoiceChannel voice_channel( |
1555 test_->worker_thread(), test_->network_thread(), | 1652 test_->worker_thread(), test_->network_thread(), |
1556 test_->signaling_thread(), test_->media_engine(), voice_media_channel, | 1653 test_->signaling_thread(), test_->media_engine(), voice_media_channel, |
1557 "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired); | 1654 "VoiceContentName", kDefaultRtcpMuxRequired, kDefaultSrtpRequired); |
1558 | 1655 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1601 .WillRepeatedly(Return(&voice_channel)); | 1698 .WillRepeatedly(Return(&voice_channel)); |
1602 | 1699 |
1603 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1700 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1604 | 1701 |
1605 RTCInboundRTPStreamStats expected_audio( | 1702 RTCInboundRTPStreamStats expected_audio( |
1606 "RTCInboundRTPAudioStream_1", report->timestamp_us()); | 1703 "RTCInboundRTPAudioStream_1", report->timestamp_us()); |
1607 expected_audio.ssrc = "1"; | 1704 expected_audio.ssrc = "1"; |
1608 expected_audio.is_remote = false; | 1705 expected_audio.is_remote = false; |
1609 expected_audio.media_type = "audio"; | 1706 expected_audio.media_type = "audio"; |
1610 expected_audio.media_track_id = | 1707 expected_audio.media_track_id = |
1611 "RTCMediaStreamTrack_remote_RemoteAudioTrackID"; | 1708 "RTCMediaStreamTrack_remote_audio_RemoteAudioTrackID_1"; |
1612 expected_audio.transport_id = "RTCTransport_TransportName_" + | 1709 expected_audio.transport_id = "RTCTransport_TransportName_" + |
1613 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1710 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
1614 expected_audio.codec_id = "RTCCodec_InboundAudio_42"; | 1711 expected_audio.codec_id = "RTCCodec_InboundAudio_42"; |
1615 expected_audio.packets_received = 2; | 1712 expected_audio.packets_received = 2; |
1616 expected_audio.bytes_received = 3; | 1713 expected_audio.bytes_received = 3; |
1617 expected_audio.packets_lost = 42; | 1714 expected_audio.packets_lost = 42; |
1618 expected_audio.jitter = 4.5; | 1715 expected_audio.jitter = 4.5; |
1619 expected_audio.fraction_lost = 5.5; | 1716 expected_audio.fraction_lost = 5.5; |
1620 | 1717 |
1621 ASSERT(report->Get(expected_audio.id())); | 1718 ASSERT(report->Get(expected_audio.id())); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1683 .WillRepeatedly(Return(&video_channel)); | 1780 .WillRepeatedly(Return(&video_channel)); |
1684 | 1781 |
1685 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1782 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1686 | 1783 |
1687 RTCInboundRTPStreamStats expected_video( | 1784 RTCInboundRTPStreamStats expected_video( |
1688 "RTCInboundRTPVideoStream_1", report->timestamp_us()); | 1785 "RTCInboundRTPVideoStream_1", report->timestamp_us()); |
1689 expected_video.ssrc = "1"; | 1786 expected_video.ssrc = "1"; |
1690 expected_video.is_remote = false; | 1787 expected_video.is_remote = false; |
1691 expected_video.media_type = "video"; | 1788 expected_video.media_type = "video"; |
1692 expected_video.media_track_id = | 1789 expected_video.media_track_id = |
1693 "RTCMediaStreamTrack_remote_RemoteVideoTrackID"; | 1790 "RTCMediaStreamTrack_remote_video_RemoteVideoTrackID_1"; |
1694 expected_video.transport_id = "RTCTransport_TransportName_" + | 1791 expected_video.transport_id = "RTCTransport_TransportName_" + |
1695 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1792 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
1696 expected_video.codec_id = "RTCCodec_InboundVideo_42"; | 1793 expected_video.codec_id = "RTCCodec_InboundVideo_42"; |
1697 expected_video.fir_count = 5; | 1794 expected_video.fir_count = 5; |
1698 expected_video.pli_count = 6; | 1795 expected_video.pli_count = 6; |
1699 expected_video.nack_count = 7; | 1796 expected_video.nack_count = 7; |
1700 expected_video.packets_received = 2; | 1797 expected_video.packets_received = 2; |
1701 expected_video.bytes_received = 3; | 1798 expected_video.bytes_received = 3; |
1702 expected_video.packets_lost = 42; | 1799 expected_video.packets_lost = 42; |
1703 expected_video.fraction_lost = 4.5; | 1800 expected_video.fraction_lost = 4.5; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1761 EXPECT_CALL(test_->session(), voice_channel()) | 1858 EXPECT_CALL(test_->session(), voice_channel()) |
1762 .WillRepeatedly(Return(&voice_channel)); | 1859 .WillRepeatedly(Return(&voice_channel)); |
1763 | 1860 |
1764 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1861 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1765 | 1862 |
1766 RTCOutboundRTPStreamStats expected_audio( | 1863 RTCOutboundRTPStreamStats expected_audio( |
1767 "RTCOutboundRTPAudioStream_1", report->timestamp_us()); | 1864 "RTCOutboundRTPAudioStream_1", report->timestamp_us()); |
1768 expected_audio.ssrc = "1"; | 1865 expected_audio.ssrc = "1"; |
1769 expected_audio.is_remote = false; | 1866 expected_audio.is_remote = false; |
1770 expected_audio.media_type = "audio"; | 1867 expected_audio.media_type = "audio"; |
1771 expected_audio.media_track_id = "RTCMediaStreamTrack_local_LocalAudioTrackID"; | 1868 expected_audio.media_track_id = |
| 1869 "RTCMediaStreamTrack_local_audio_LocalAudioTrackID_1"; |
1772 expected_audio.transport_id = "RTCTransport_TransportName_" + | 1870 expected_audio.transport_id = "RTCTransport_TransportName_" + |
1773 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1871 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
1774 expected_audio.codec_id = "RTCCodec_OutboundAudio_42"; | 1872 expected_audio.codec_id = "RTCCodec_OutboundAudio_42"; |
1775 expected_audio.packets_sent = 2; | 1873 expected_audio.packets_sent = 2; |
1776 expected_audio.bytes_sent = 3; | 1874 expected_audio.bytes_sent = 3; |
1777 expected_audio.round_trip_time = 4.5; | 1875 expected_audio.round_trip_time = 4.5; |
1778 | 1876 |
1779 ASSERT(report->Get(expected_audio.id())); | 1877 ASSERT(report->Get(expected_audio.id())); |
1780 const RTCOutboundRTPStreamStats& audio = report->Get( | 1878 const RTCOutboundRTPStreamStats& audio = report->Get( |
1781 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(); | 1879 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(); |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1839 EXPECT_CALL(test_->session(), video_channel()) | 1937 EXPECT_CALL(test_->session(), video_channel()) |
1840 .WillRepeatedly(Return(&video_channel)); | 1938 .WillRepeatedly(Return(&video_channel)); |
1841 | 1939 |
1842 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1940 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
1843 | 1941 |
1844 RTCOutboundRTPStreamStats expected_video( | 1942 RTCOutboundRTPStreamStats expected_video( |
1845 "RTCOutboundRTPVideoStream_1", report->timestamp_us()); | 1943 "RTCOutboundRTPVideoStream_1", report->timestamp_us()); |
1846 expected_video.ssrc = "1"; | 1944 expected_video.ssrc = "1"; |
1847 expected_video.is_remote = false; | 1945 expected_video.is_remote = false; |
1848 expected_video.media_type = "video"; | 1946 expected_video.media_type = "video"; |
1849 expected_video.media_track_id = "RTCMediaStreamTrack_local_LocalVideoTrackID"; | 1947 expected_video.media_track_id = |
| 1948 "RTCMediaStreamTrack_local_video_LocalVideoTrackID_1"; |
1850 expected_video.transport_id = "RTCTransport_TransportName_" + | 1949 expected_video.transport_id = "RTCTransport_TransportName_" + |
1851 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1950 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
1852 expected_video.codec_id = "RTCCodec_OutboundVideo_42"; | 1951 expected_video.codec_id = "RTCCodec_OutboundVideo_42"; |
1853 expected_video.fir_count = 2; | 1952 expected_video.fir_count = 2; |
1854 expected_video.pli_count = 3; | 1953 expected_video.pli_count = 3; |
1855 expected_video.nack_count = 4; | 1954 expected_video.nack_count = 4; |
1856 expected_video.packets_sent = 5; | 1955 expected_video.packets_sent = 5; |
1857 expected_video.bytes_sent = 6; | 1956 expected_video.bytes_sent = 6; |
1858 expected_video.round_trip_time = 7.5; | 1957 expected_video.round_trip_time = 7.5; |
1859 expected_video.frames_encoded = 8; | 1958 expected_video.frames_encoded = 8; |
(...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2142 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; | 2241 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; |
2143 }; | 2242 }; |
2144 | 2243 |
2145 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { | 2244 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { |
2146 collector_->VerifyThreadUsageAndResultsMerging(); | 2245 collector_->VerifyThreadUsageAndResultsMerging(); |
2147 } | 2246 } |
2148 | 2247 |
2149 } // namespace | 2248 } // namespace |
2150 | 2249 |
2151 } // namespace webrtc | 2250 } // namespace webrtc |
OLD | NEW |