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 <memory> | 13 #include <memory> |
| 14 #include <sstream> |
14 #include <utility> | 15 #include <utility> |
15 #include <vector> | 16 #include <vector> |
16 | 17 |
17 #include "webrtc/api/peerconnection.h" | 18 #include "webrtc/api/peerconnection.h" |
18 #include "webrtc/api/peerconnectioninterface.h" | 19 #include "webrtc/api/peerconnectioninterface.h" |
19 #include "webrtc/api/mediastreaminterface.h" | 20 #include "webrtc/api/mediastreaminterface.h" |
20 #include "webrtc/api/webrtcsession.h" | 21 #include "webrtc/api/webrtcsession.h" |
21 #include "webrtc/base/checks.h" | 22 #include "webrtc/base/checks.h" |
22 #include "webrtc/base/timeutils.h" | 23 #include "webrtc/base/timeutils.h" |
23 #include "webrtc/media/base/mediachannel.h" | 24 #include "webrtc/media/base/mediachannel.h" |
(...skipping 22 matching lines...) Expand all Loading... |
46 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type) | 47 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type) |
47 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type); | 48 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type); |
48 } | 49 } |
49 | 50 |
50 std::string RTCIceCandidatePairStatsIDFromConnectionInfo( | 51 std::string RTCIceCandidatePairStatsIDFromConnectionInfo( |
51 const cricket::ConnectionInfo& info) { | 52 const cricket::ConnectionInfo& info) { |
52 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" + | 53 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" + |
53 info.remote_candidate.id(); | 54 info.remote_candidate.id(); |
54 } | 55 } |
55 | 56 |
56 std::string RTCMediaStreamTrackStatsIDFromTrackID( | 57 std::string RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
57 const std::string& id, bool is_local) { | 58 bool is_local, const char* kind, const std::string& id, uint32_t ssrc) { |
58 return (is_local ? "RTCMediaStreamTrack_local_" + id | 59 RTC_DCHECK(kind == MediaStreamTrackInterface::kAudioKind || |
59 : "RTCMediaStreamTrack_remote_" + id); | 60 kind == MediaStreamTrackInterface::kVideoKind); |
| 61 std::ostringstream oss; |
| 62 oss << (is_local ? "RTCMediaStreamTrack_local_" |
| 63 : "RTCMediaStreamTrack_remote_"); |
| 64 oss << kind << "_"; |
| 65 oss << id << "_"; |
| 66 oss << ssrc; |
| 67 return oss.str(); |
60 } | 68 } |
61 | 69 |
62 std::string RTCTransportStatsIDFromTransportChannel( | 70 std::string RTCTransportStatsIDFromTransportChannel( |
63 const std::string& transport_name, int channel_component) { | 71 const std::string& transport_name, int channel_component) { |
64 return "RTCTransport_" + transport_name + "_" + | 72 return "RTCTransport_" + transport_name + "_" + |
65 rtc::ToString<>(channel_component); | 73 rtc::ToString<>(channel_component); |
66 } | 74 } |
67 | 75 |
68 std::string RTCTransportStatsIDFromBaseChannel( | 76 std::string RTCTransportStatsIDFromBaseChannel( |
69 const ProxyTransportMap& proxy_to_transport, | 77 const ProxyTransportMap& proxy_to_transport, |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 case cricket::DTLS_TRANSPORT_CLOSED: | 152 case cricket::DTLS_TRANSPORT_CLOSED: |
145 return RTCDtlsTransportState::kClosed; | 153 return RTCDtlsTransportState::kClosed; |
146 case cricket::DTLS_TRANSPORT_FAILED: | 154 case cricket::DTLS_TRANSPORT_FAILED: |
147 return RTCDtlsTransportState::kFailed; | 155 return RTCDtlsTransportState::kFailed; |
148 default: | 156 default: |
149 RTC_NOTREACHED(); | 157 RTC_NOTREACHED(); |
150 return nullptr; | 158 return nullptr; |
151 } | 159 } |
152 } | 160 } |
153 | 161 |
| 162 double DoubleAudioLevelFromIntAudioLevel(int audio_level) { |
| 163 RTC_DCHECK_GE(audio_level, 0); |
| 164 RTC_DCHECK_LE(audio_level, 32767); |
| 165 return audio_level / 32767.0; |
| 166 } |
| 167 |
154 std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters( | 168 std::unique_ptr<RTCCodecStats> CodecStatsFromRtpCodecParameters( |
155 uint64_t timestamp_us, bool inbound, bool audio, | 169 uint64_t timestamp_us, bool inbound, bool audio, |
156 const RtpCodecParameters& codec_params) { | 170 const RtpCodecParameters& codec_params) { |
157 RTC_DCHECK_GE(codec_params.payload_type, 0); | 171 RTC_DCHECK_GE(codec_params.payload_type, 0); |
158 RTC_DCHECK_LE(codec_params.payload_type, 127); | 172 RTC_DCHECK_LE(codec_params.payload_type, 127); |
159 uint32_t payload_type = static_cast<uint32_t>(codec_params.payload_type); | 173 uint32_t payload_type = static_cast<uint32_t>(codec_params.payload_type); |
160 std::unique_ptr<RTCCodecStats> codec_stats(new RTCCodecStats( | 174 std::unique_ptr<RTCCodecStats> codec_stats(new RTCCodecStats( |
161 RTCCodecStatsIDFromDirectionMediaAndPayload(inbound, audio, payload_type), | 175 RTCCodecStatsIDFromDirectionMediaAndPayload(inbound, audio, payload_type), |
162 timestamp_us)); | 176 timestamp_us)); |
163 codec_stats->payload_type = payload_type; | 177 codec_stats->payload_type = payload_type; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
315 candidate_stats->priority = static_cast<int32_t>(candidate.priority()); | 329 candidate_stats->priority = static_cast<int32_t>(candidate.priority()); |
316 | 330 |
317 stats = candidate_stats.get(); | 331 stats = candidate_stats.get(); |
318 report->AddStats(std::move(candidate_stats)); | 332 report->AddStats(std::move(candidate_stats)); |
319 } | 333 } |
320 RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType | 334 RTC_DCHECK_EQ(stats->type(), is_local ? RTCLocalIceCandidateStats::kType |
321 : RTCRemoteIceCandidateStats::kType); | 335 : RTCRemoteIceCandidateStats::kType); |
322 return stats->id(); | 336 return stats->id(); |
323 } | 337 } |
324 | 338 |
| 339 std::unique_ptr<RTCMediaStreamTrackStats> |
| 340 ProduceMediaStreamTrackStatsFromVoiceSenderInfo( |
| 341 int64_t timestamp_us, |
| 342 const AudioTrackInterface& audio_track, |
| 343 const cricket::VoiceSenderInfo& voice_sender_info) { |
| 344 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( |
| 345 new RTCMediaStreamTrackStats( |
| 346 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
| 347 true, MediaStreamTrackInterface::kAudioKind, audio_track.id(), |
| 348 voice_sender_info.ssrc()), |
| 349 timestamp_us, |
| 350 RTCMediaStreamTrackKind::kAudio)); |
| 351 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( |
| 352 audio_track, audio_track_stats.get()); |
| 353 audio_track_stats->remote_source = false; |
| 354 audio_track_stats->detached = false; |
| 355 if (voice_sender_info.audio_level >= 0) { |
| 356 audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel( |
| 357 voice_sender_info.audio_level); |
| 358 } |
| 359 if (voice_sender_info.echo_return_loss != -100) { |
| 360 audio_track_stats->echo_return_loss = static_cast<double>( |
| 361 voice_sender_info.echo_return_loss); |
| 362 } |
| 363 if (voice_sender_info.echo_return_loss_enhancement != -100) { |
| 364 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( |
| 365 voice_sender_info.echo_return_loss_enhancement); |
| 366 } |
| 367 return audio_track_stats; |
| 368 } |
| 369 |
| 370 std::unique_ptr<RTCMediaStreamTrackStats> |
| 371 ProduceMediaStreamTrackStatsFromVoiceReceiverInfo( |
| 372 int64_t timestamp_us, |
| 373 const AudioTrackInterface& audio_track, |
| 374 const cricket::VoiceReceiverInfo& voice_receiver_info) { |
| 375 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( |
| 376 new RTCMediaStreamTrackStats( |
| 377 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
| 378 false, MediaStreamTrackInterface::kAudioKind, audio_track.id(), |
| 379 voice_receiver_info.ssrc()), |
| 380 timestamp_us, |
| 381 RTCMediaStreamTrackKind::kAudio)); |
| 382 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( |
| 383 audio_track, audio_track_stats.get()); |
| 384 audio_track_stats->remote_source = true; |
| 385 audio_track_stats->detached = false; |
| 386 if (voice_receiver_info.audio_level >= 0) { |
| 387 audio_track_stats->audio_level = DoubleAudioLevelFromIntAudioLevel( |
| 388 voice_receiver_info.audio_level); |
| 389 } |
| 390 return audio_track_stats; |
| 391 } |
| 392 |
| 393 std::unique_ptr<RTCMediaStreamTrackStats> |
| 394 ProduceMediaStreamTrackStatsFromVideoSenderInfo( |
| 395 int64_t timestamp_us, |
| 396 const VideoTrackInterface& video_track, |
| 397 const cricket::VideoSenderInfo& video_sender_info) { |
| 398 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( |
| 399 new RTCMediaStreamTrackStats( |
| 400 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
| 401 true, MediaStreamTrackInterface::kVideoKind, video_track.id(), |
| 402 video_sender_info.ssrc()), |
| 403 timestamp_us, |
| 404 RTCMediaStreamTrackKind::kVideo)); |
| 405 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( |
| 406 video_track, video_track_stats.get()); |
| 407 video_track_stats->remote_source = false; |
| 408 video_track_stats->detached = false; |
| 409 video_track_stats->frame_width = static_cast<uint32_t>( |
| 410 video_sender_info.send_frame_width); |
| 411 video_track_stats->frame_height = static_cast<uint32_t>( |
| 412 video_sender_info.send_frame_height); |
| 413 return video_track_stats; |
| 414 } |
| 415 |
| 416 std::unique_ptr<RTCMediaStreamTrackStats> |
| 417 ProduceMediaStreamTrackStatsFromVideoReceiverInfo( |
| 418 int64_t timestamp_us, |
| 419 const VideoTrackInterface& video_track, |
| 420 const cricket::VideoReceiverInfo& video_receiver_info) { |
| 421 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( |
| 422 new RTCMediaStreamTrackStats( |
| 423 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
| 424 false, MediaStreamTrackInterface::kVideoKind, video_track.id(), |
| 425 video_receiver_info.ssrc()), |
| 426 timestamp_us, |
| 427 RTCMediaStreamTrackKind::kVideo)); |
| 428 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( |
| 429 video_track, video_track_stats.get()); |
| 430 video_track_stats->remote_source = true; |
| 431 video_track_stats->detached = false; |
| 432 if (video_receiver_info.frame_width > 0 && |
| 433 video_receiver_info.frame_height > 0) { |
| 434 video_track_stats->frame_width = static_cast<uint32_t>( |
| 435 video_receiver_info.frame_width); |
| 436 video_track_stats->frame_height = static_cast<uint32_t>( |
| 437 video_receiver_info.frame_height); |
| 438 } |
| 439 return video_track_stats; |
| 440 } |
| 441 |
325 void ProduceMediaStreamAndTrackStats( | 442 void ProduceMediaStreamAndTrackStats( |
326 int64_t timestamp_us, | 443 int64_t timestamp_us, |
| 444 const TrackMediaInfoMap& track_media_info_map, |
327 rtc::scoped_refptr<StreamCollectionInterface> streams, | 445 rtc::scoped_refptr<StreamCollectionInterface> streams, |
328 bool is_local, | 446 bool is_local, |
329 RTCStatsReport* report) { | 447 RTCStatsReport* report) { |
330 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to | 448 // TODO(hbos): When "AddTrack" is implemented we should iterate tracks to |
331 // find which streams exist, not iterate streams to find tracks. | 449 // find which streams exist, not iterate streams to find tracks. |
332 // crbug.com/659137 | 450 // crbug.com/659137 |
333 // TODO(hbos): Return stats of detached tracks. We have to perform stats | 451 // TODO(hbos): Return stats of detached tracks. We have to perform stats |
334 // gathering at the time of detachment to get accurate stats and timestamps. | 452 // gathering at the time of detachment to get accurate stats and timestamps. |
335 // crbug.com/659137 | 453 // crbug.com/659137 |
336 if (!streams) | 454 if (!streams) |
337 return; | 455 return; |
338 for (size_t i = 0; i < streams->count(); ++i) { | 456 for (size_t i = 0; i < streams->count(); ++i) { |
339 MediaStreamInterface* stream = streams->at(i); | 457 MediaStreamInterface* stream = streams->at(i); |
340 | 458 |
341 std::unique_ptr<RTCMediaStreamStats> stream_stats( | 459 std::unique_ptr<RTCMediaStreamStats> stream_stats( |
342 new RTCMediaStreamStats( | 460 new RTCMediaStreamStats( |
343 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + | 461 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + |
344 stream->label(), timestamp_us)); | 462 stream->label(), timestamp_us)); |
345 stream_stats->stream_identifier = stream->label(); | 463 stream_stats->stream_identifier = stream->label(); |
346 stream_stats->track_ids = std::vector<std::string>(); | 464 stream_stats->track_ids = std::vector<std::string>(); |
347 // Audio Tracks | 465 // The track stats are per-attachment to the connection. There can be one |
348 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : | 466 // for receiving (remote) tracks and multiple attachments for sending |
349 stream->GetAudioTracks()) { | 467 // (local) tracks. |
350 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( | 468 if (is_local) { |
351 audio_track->id(), is_local); | 469 // Local Audio Tracks |
352 if (report->Get(id)) { | 470 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : |
353 // Skip track, stats already exist for it. | 471 stream->GetAudioTracks()) { |
354 continue; | 472 const std::vector<cricket::VoiceSenderInfo*>* voice_sender_infos = |
355 } | 473 track_media_info_map.GetVoiceSenderInfos(*audio_track); |
356 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( | 474 if (!voice_sender_infos) { |
357 new RTCMediaStreamTrackStats(id, timestamp_us, | 475 continue; |
358 RTCMediaStreamTrackKind::kAudio)); | |
359 stream_stats->track_ids->push_back(audio_track_stats->id()); | |
360 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
361 *audio_track.get(), | |
362 audio_track_stats.get()); | |
363 audio_track_stats->remote_source = !is_local; | |
364 audio_track_stats->detached = false; | |
365 int signal_level; | |
366 if (audio_track->GetSignalLevel(&signal_level)) { | |
367 // Convert signal level from [0,32767] int to [0,1] double. | |
368 RTC_DCHECK_GE(signal_level, 0); | |
369 RTC_DCHECK_LE(signal_level, 32767); | |
370 audio_track_stats->audio_level = signal_level / 32767.0; | |
371 } | |
372 if (audio_track->GetAudioProcessor()) { | |
373 AudioProcessorInterface::AudioProcessorStats audio_processor_stats; | |
374 audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); | |
375 if (audio_processor_stats.echo_return_loss != -100) { | |
376 audio_track_stats->echo_return_loss = static_cast<double>( | |
377 audio_processor_stats.echo_return_loss); | |
378 } | 476 } |
379 if (audio_processor_stats.echo_return_loss_enhancement != -100) { | 477 for (const auto& voice_sender_info : *voice_sender_infos) { |
380 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( | 478 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats = |
381 audio_processor_stats.echo_return_loss_enhancement); | 479 ProduceMediaStreamTrackStatsFromVoiceSenderInfo( |
| 480 timestamp_us, *audio_track, *voice_sender_info); |
| 481 stream_stats->track_ids->push_back(audio_track_stats->id()); |
| 482 report->AddStats(std::move(audio_track_stats)); |
382 } | 483 } |
383 } | 484 } |
384 report->AddStats(std::move(audio_track_stats)); | 485 // Local Video Tracks |
385 } | 486 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : |
386 // Video Tracks | 487 stream->GetVideoTracks()) { |
387 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : | 488 const std::vector<cricket::VideoSenderInfo*>* video_sender_infos = |
388 stream->GetVideoTracks()) { | 489 track_media_info_map.GetVideoSenderInfos(*video_track); |
389 std::string id = RTCMediaStreamTrackStatsIDFromTrackID( | 490 if (!video_sender_infos) { |
390 video_track->id(), is_local); | 491 continue; |
391 if (report->Get(id)) { | 492 } |
392 // Skip track, stats already exist for it. | 493 for (const auto& video_sender_info : *video_sender_infos) { |
393 continue; | 494 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats = |
394 } | 495 ProduceMediaStreamTrackStatsFromVideoSenderInfo( |
395 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( | 496 timestamp_us, *video_track, *video_sender_info); |
396 new RTCMediaStreamTrackStats(id, timestamp_us, | 497 stream_stats->track_ids->push_back(video_track_stats->id()); |
397 RTCMediaStreamTrackKind::kVideo)); | 498 report->AddStats(std::move(video_track_stats)); |
398 stream_stats->track_ids->push_back(video_track_stats->id()); | |
399 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( | |
400 *video_track.get(), | |
401 video_track_stats.get()); | |
402 video_track_stats->remote_source = !is_local; | |
403 video_track_stats->detached = false; | |
404 if (video_track->GetSource()) { | |
405 VideoTrackSourceInterface::Stats video_track_source_stats; | |
406 if (video_track->GetSource()->GetStats(&video_track_source_stats)) { | |
407 video_track_stats->frame_width = static_cast<uint32_t>( | |
408 video_track_source_stats.input_width); | |
409 video_track_stats->frame_height = static_cast<uint32_t>( | |
410 video_track_source_stats.input_height); | |
411 } | 499 } |
412 } | 500 } |
413 report->AddStats(std::move(video_track_stats)); | 501 } else { |
| 502 // Remote Audio Tracks |
| 503 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : |
| 504 stream->GetAudioTracks()) { |
| 505 const cricket::VoiceReceiverInfo* voice_receiver_info = |
| 506 track_media_info_map.GetVoiceReceiverInfo(*audio_track); |
| 507 if (!voice_receiver_info) { |
| 508 continue; |
| 509 } |
| 510 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats = |
| 511 ProduceMediaStreamTrackStatsFromVoiceReceiverInfo( |
| 512 timestamp_us, *audio_track, *voice_receiver_info); |
| 513 stream_stats->track_ids->push_back(audio_track_stats->id()); |
| 514 report->AddStats(std::move(audio_track_stats)); |
| 515 } |
| 516 // Remote Video Tracks |
| 517 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : |
| 518 stream->GetVideoTracks()) { |
| 519 const cricket::VideoReceiverInfo* video_receiver_info = |
| 520 track_media_info_map.GetVideoReceiverInfo(*video_track); |
| 521 if (!video_receiver_info) { |
| 522 continue; |
| 523 } |
| 524 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats = |
| 525 ProduceMediaStreamTrackStatsFromVideoReceiverInfo( |
| 526 timestamp_us, *video_track, *video_receiver_info); |
| 527 stream_stats->track_ids->push_back(video_track_stats->id()); |
| 528 report->AddStats(std::move(video_track_stats)); |
| 529 } |
414 } | 530 } |
415 report->AddStats(std::move(stream_stats)); | 531 report->AddStats(std::move(stream_stats)); |
416 } | 532 } |
417 } | 533 } |
418 | 534 |
419 } // namespace | 535 } // namespace |
420 | 536 |
421 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( | 537 rtc::scoped_refptr<RTCStatsCollector> RTCStatsCollector::Create( |
422 PeerConnection* pc, int64_t cache_lifetime_us) { | 538 PeerConnection* pc, int64_t cache_lifetime_us) { |
423 return rtc::scoped_refptr<RTCStatsCollector>( | 539 return rtc::scoped_refptr<RTCStatsCollector>( |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
742 | 858 |
743 report->AddStats(std::move(candidate_pair_stats)); | 859 report->AddStats(std::move(candidate_pair_stats)); |
744 } | 860 } |
745 } | 861 } |
746 } | 862 } |
747 } | 863 } |
748 | 864 |
749 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s( | 865 void RTCStatsCollector::ProduceMediaStreamAndTrackStats_s( |
750 int64_t timestamp_us, RTCStatsReport* report) const { | 866 int64_t timestamp_us, RTCStatsReport* report) const { |
751 RTC_DCHECK(signaling_thread_->IsCurrent()); | 867 RTC_DCHECK(signaling_thread_->IsCurrent()); |
752 ProduceMediaStreamAndTrackStats( | 868 RTC_DCHECK(track_media_info_map_); |
753 timestamp_us, pc_->local_streams(), true, report); | 869 ProduceMediaStreamAndTrackStats(timestamp_us, |
754 ProduceMediaStreamAndTrackStats( | 870 *track_media_info_map_, |
755 timestamp_us, pc_->remote_streams(), false, report); | 871 pc_->local_streams(), |
| 872 true, |
| 873 report); |
| 874 ProduceMediaStreamAndTrackStats(timestamp_us, |
| 875 *track_media_info_map_, |
| 876 pc_->remote_streams(), |
| 877 false, |
| 878 report); |
756 } | 879 } |
757 | 880 |
758 void RTCStatsCollector::ProducePeerConnectionStats_s( | 881 void RTCStatsCollector::ProducePeerConnectionStats_s( |
759 int64_t timestamp_us, RTCStatsReport* report) const { | 882 int64_t timestamp_us, RTCStatsReport* report) const { |
760 RTC_DCHECK(signaling_thread_->IsCurrent()); | 883 RTC_DCHECK(signaling_thread_->IsCurrent()); |
761 std::unique_ptr<RTCPeerConnectionStats> stats( | 884 std::unique_ptr<RTCPeerConnectionStats> stats( |
762 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); | 885 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); |
763 stats->data_channels_opened = internal_record_.data_channels_opened; | 886 stats->data_channels_opened = internal_record_.data_channels_opened; |
764 stats->data_channels_closed = internal_record_.data_channels_closed; | 887 stats->data_channels_closed = internal_record_.data_channels_closed; |
765 report->AddStats(std::move(stats)); | 888 report->AddStats(std::move(stats)); |
(...skipping 22 matching lines...) Expand all Loading... |
788 RTCInboundRTPStreamStatsIDFromSSRC( | 911 RTCInboundRTPStreamStatsIDFromSSRC( |
789 true, voice_receiver_info.ssrc()), | 912 true, voice_receiver_info.ssrc()), |
790 timestamp_us)); | 913 timestamp_us)); |
791 SetInboundRTPStreamStatsFromVoiceReceiverInfo( | 914 SetInboundRTPStreamStatsFromVoiceReceiverInfo( |
792 voice_receiver_info, inbound_audio.get()); | 915 voice_receiver_info, inbound_audio.get()); |
793 rtc::scoped_refptr<AudioTrackInterface> audio_track = | 916 rtc::scoped_refptr<AudioTrackInterface> audio_track = |
794 track_media_info_map_->GetAudioTrack(voice_receiver_info); | 917 track_media_info_map_->GetAudioTrack(voice_receiver_info); |
795 if (audio_track) { | 918 if (audio_track) { |
796 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); | 919 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); |
797 inbound_audio->media_track_id = | 920 inbound_audio->media_track_id = |
798 RTCMediaStreamTrackStatsIDFromTrackID( | 921 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
799 track_to_id_.find(audio_track.get())->second, false); | 922 false, |
| 923 MediaStreamTrackInterface::kAudioKind, |
| 924 track_to_id_.find(audio_track.get())->second, |
| 925 voice_receiver_info.ssrc()); |
800 } | 926 } |
801 inbound_audio->transport_id = transport_id; | 927 inbound_audio->transport_id = transport_id; |
802 if (voice_receiver_info.codec_payload_type) { | 928 if (voice_receiver_info.codec_payload_type) { |
803 inbound_audio->codec_id = | 929 inbound_audio->codec_id = |
804 RTCCodecStatsIDFromDirectionMediaAndPayload( | 930 RTCCodecStatsIDFromDirectionMediaAndPayload( |
805 true, true, *voice_receiver_info.codec_payload_type); | 931 true, true, *voice_receiver_info.codec_payload_type); |
806 } | 932 } |
807 report->AddStats(std::move(inbound_audio)); | 933 report->AddStats(std::move(inbound_audio)); |
808 } | 934 } |
809 // Outbound | 935 // Outbound |
810 for (const cricket::VoiceSenderInfo& voice_sender_info : | 936 for (const cricket::VoiceSenderInfo& voice_sender_info : |
811 track_media_info_map.voice_media_info()->senders) { | 937 track_media_info_map.voice_media_info()->senders) { |
812 // TODO(nisse): SSRC == 0 currently means none. Delete check when that | 938 // TODO(nisse): SSRC == 0 currently means none. Delete check when that |
813 // is fixed. | 939 // is fixed. |
814 if (voice_sender_info.ssrc() == 0) | 940 if (voice_sender_info.ssrc() == 0) |
815 continue; | 941 continue; |
816 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( | 942 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( |
817 new RTCOutboundRTPStreamStats( | 943 new RTCOutboundRTPStreamStats( |
818 RTCOutboundRTPStreamStatsIDFromSSRC( | 944 RTCOutboundRTPStreamStatsIDFromSSRC( |
819 true, voice_sender_info.ssrc()), | 945 true, voice_sender_info.ssrc()), |
820 timestamp_us)); | 946 timestamp_us)); |
821 SetOutboundRTPStreamStatsFromVoiceSenderInfo( | 947 SetOutboundRTPStreamStatsFromVoiceSenderInfo( |
822 voice_sender_info, outbound_audio.get()); | 948 voice_sender_info, outbound_audio.get()); |
823 rtc::scoped_refptr<AudioTrackInterface> audio_track = | 949 rtc::scoped_refptr<AudioTrackInterface> audio_track = |
824 track_media_info_map_->GetAudioTrack(voice_sender_info); | 950 track_media_info_map_->GetAudioTrack(voice_sender_info); |
825 if (audio_track) { | 951 if (audio_track) { |
826 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); | 952 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end()); |
827 outbound_audio->media_track_id = | 953 outbound_audio->media_track_id = |
828 RTCMediaStreamTrackStatsIDFromTrackID( | 954 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
829 track_to_id_.find(audio_track.get())->second, true); | 955 true, |
| 956 MediaStreamTrackInterface::kAudioKind, |
| 957 track_to_id_.find(audio_track.get())->second, |
| 958 voice_sender_info.ssrc()); |
830 } | 959 } |
831 outbound_audio->transport_id = transport_id; | 960 outbound_audio->transport_id = transport_id; |
832 if (voice_sender_info.codec_payload_type) { | 961 if (voice_sender_info.codec_payload_type) { |
833 outbound_audio->codec_id = | 962 outbound_audio->codec_id = |
834 RTCCodecStatsIDFromDirectionMediaAndPayload( | 963 RTCCodecStatsIDFromDirectionMediaAndPayload( |
835 false, true, *voice_sender_info.codec_payload_type); | 964 false, true, *voice_sender_info.codec_payload_type); |
836 } | 965 } |
837 report->AddStats(std::move(outbound_audio)); | 966 report->AddStats(std::move(outbound_audio)); |
838 } | 967 } |
839 } | 968 } |
(...skipping 14 matching lines...) Expand all Loading... |
854 RTCInboundRTPStreamStatsIDFromSSRC( | 983 RTCInboundRTPStreamStatsIDFromSSRC( |
855 false, video_receiver_info.ssrc()), | 984 false, video_receiver_info.ssrc()), |
856 timestamp_us)); | 985 timestamp_us)); |
857 SetInboundRTPStreamStatsFromVideoReceiverInfo( | 986 SetInboundRTPStreamStatsFromVideoReceiverInfo( |
858 video_receiver_info, inbound_video.get()); | 987 video_receiver_info, inbound_video.get()); |
859 rtc::scoped_refptr<VideoTrackInterface> video_track = | 988 rtc::scoped_refptr<VideoTrackInterface> video_track = |
860 track_media_info_map_->GetVideoTrack(video_receiver_info); | 989 track_media_info_map_->GetVideoTrack(video_receiver_info); |
861 if (video_track) { | 990 if (video_track) { |
862 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); | 991 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); |
863 inbound_video->media_track_id = | 992 inbound_video->media_track_id = |
864 RTCMediaStreamTrackStatsIDFromTrackID( | 993 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
865 track_to_id_.find(video_track.get())->second, false); | 994 false, |
| 995 MediaStreamTrackInterface::kVideoKind, |
| 996 track_to_id_.find(video_track.get())->second, |
| 997 video_receiver_info.ssrc()); |
866 } | 998 } |
867 inbound_video->transport_id = transport_id; | 999 inbound_video->transport_id = transport_id; |
868 if (video_receiver_info.codec_payload_type) { | 1000 if (video_receiver_info.codec_payload_type) { |
869 inbound_video->codec_id = | 1001 inbound_video->codec_id = |
870 RTCCodecStatsIDFromDirectionMediaAndPayload( | 1002 RTCCodecStatsIDFromDirectionMediaAndPayload( |
871 true, false, *video_receiver_info.codec_payload_type); | 1003 true, false, *video_receiver_info.codec_payload_type); |
872 } | 1004 } |
873 report->AddStats(std::move(inbound_video)); | 1005 report->AddStats(std::move(inbound_video)); |
874 } | 1006 } |
875 // Outbound | 1007 // Outbound |
876 for (const cricket::VideoSenderInfo& video_sender_info : | 1008 for (const cricket::VideoSenderInfo& video_sender_info : |
877 track_media_info_map.video_media_info()->senders) { | 1009 track_media_info_map.video_media_info()->senders) { |
878 // TODO(nisse): SSRC == 0 currently means none. Delete check when that | 1010 // TODO(nisse): SSRC == 0 currently means none. Delete check when that |
879 // is fixed. | 1011 // is fixed. |
880 if (video_sender_info.ssrc() == 0) | 1012 if (video_sender_info.ssrc() == 0) |
881 continue; | 1013 continue; |
882 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( | 1014 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( |
883 new RTCOutboundRTPStreamStats( | 1015 new RTCOutboundRTPStreamStats( |
884 RTCOutboundRTPStreamStatsIDFromSSRC( | 1016 RTCOutboundRTPStreamStatsIDFromSSRC( |
885 false, video_sender_info.ssrc()), | 1017 false, video_sender_info.ssrc()), |
886 timestamp_us)); | 1018 timestamp_us)); |
887 SetOutboundRTPStreamStatsFromVideoSenderInfo( | 1019 SetOutboundRTPStreamStatsFromVideoSenderInfo( |
888 video_sender_info, outbound_video.get()); | 1020 video_sender_info, outbound_video.get()); |
889 rtc::scoped_refptr<VideoTrackInterface> video_track = | 1021 rtc::scoped_refptr<VideoTrackInterface> video_track = |
890 track_media_info_map_->GetVideoTrack(video_sender_info); | 1022 track_media_info_map_->GetVideoTrack(video_sender_info); |
891 if (video_track) { | 1023 if (video_track) { |
892 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); | 1024 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end()); |
893 outbound_video->media_track_id = | 1025 outbound_video->media_track_id = |
894 RTCMediaStreamTrackStatsIDFromTrackID( | 1026 RTCMediaStreamTrackStatsIDFromTrackKindIDAndSsrc( |
895 track_to_id_.find(video_track.get())->second, true); | 1027 true, |
| 1028 MediaStreamTrackInterface::kVideoKind, |
| 1029 track_to_id_.find(video_track.get())->second, |
| 1030 video_sender_info.ssrc()); |
896 } | 1031 } |
897 outbound_video->transport_id = transport_id; | 1032 outbound_video->transport_id = transport_id; |
898 if (video_sender_info.codec_payload_type) { | 1033 if (video_sender_info.codec_payload_type) { |
899 outbound_video->codec_id = | 1034 outbound_video->codec_id = |
900 RTCCodecStatsIDFromDirectionMediaAndPayload( | 1035 RTCCodecStatsIDFromDirectionMediaAndPayload( |
901 false, false, *video_sender_info.codec_payload_type); | 1036 false, false, *video_sender_info.codec_payload_type); |
902 } | 1037 } |
903 report->AddStats(std::move(outbound_video)); | 1038 report->AddStats(std::move(outbound_video)); |
904 } | 1039 } |
905 } | 1040 } |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 const std::string& type) { | 1209 const std::string& type) { |
1075 return CandidateTypeToRTCIceCandidateType(type); | 1210 return CandidateTypeToRTCIceCandidateType(type); |
1076 } | 1211 } |
1077 | 1212 |
1078 const char* DataStateToRTCDataChannelStateForTesting( | 1213 const char* DataStateToRTCDataChannelStateForTesting( |
1079 DataChannelInterface::DataState state) { | 1214 DataChannelInterface::DataState state) { |
1080 return DataStateToRTCDataChannelState(state); | 1215 return DataStateToRTCDataChannelState(state); |
1081 } | 1216 } |
1082 | 1217 |
1083 } // namespace webrtc | 1218 } // namespace webrtc |
OLD | NEW |