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

Side by Side Diff: webrtc/api/rtcstatscollector.cc

Issue 2610843003: RTC[In/Out]boundRTPStreamStats.mediaTrackId collected. (Closed)
Patch Set: track_to_id_ for thread-safety and 'if (track)' on inbound Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 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
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
46 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type) 46 return audio ? "RTCCodec_OutboundAudio_" + rtc::ToString<>(payload_type)
47 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type); 47 : "RTCCodec_OutboundVideo_" + rtc::ToString<>(payload_type);
48 } 48 }
49 49
50 std::string RTCIceCandidatePairStatsIDFromConnectionInfo( 50 std::string RTCIceCandidatePairStatsIDFromConnectionInfo(
51 const cricket::ConnectionInfo& info) { 51 const cricket::ConnectionInfo& info) {
52 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" + 52 return "RTCIceCandidatePair_" + info.local_candidate.id() + "_" +
53 info.remote_candidate.id(); 53 info.remote_candidate.id();
54 } 54 }
55 55
56 std::string RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface( 56 std::string RTCMediaStreamTrackStatsIDFromTrackID(
57 const MediaStreamTrackInterface& track) { 57 const std::string& id, bool is_local) {
58 return "RTCMediaStreamTrack_" + track.id(); 58 return (is_local ? "RTCMediaStreamTrack_local_" + id
59 : "RTCMediaStreamTrack_remote_" + id);
59 } 60 }
60 61
61 std::string RTCTransportStatsIDFromTransportChannel( 62 std::string RTCTransportStatsIDFromTransportChannel(
62 const std::string& transport_name, int channel_component) { 63 const std::string& transport_name, int channel_component) {
63 return "RTCTransport_" + transport_name + "_" + 64 return "RTCTransport_" + transport_name + "_" +
64 rtc::ToString<>(channel_component); 65 rtc::ToString<>(channel_component);
65 } 66 }
66 67
67 std::string RTCTransportStatsIDFromBaseChannel( 68 std::string RTCTransportStatsIDFromBaseChannel(
68 const ProxyTransportMap& proxy_to_transport, 69 const ProxyTransportMap& proxy_to_transport,
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 321
321 std::unique_ptr<RTCMediaStreamStats> stream_stats( 322 std::unique_ptr<RTCMediaStreamStats> stream_stats(
322 new RTCMediaStreamStats( 323 new RTCMediaStreamStats(
323 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") + 324 (is_local ? "RTCMediaStream_local_" : "RTCMediaStream_remote_") +
324 stream->label(), timestamp_us)); 325 stream->label(), timestamp_us));
325 stream_stats->stream_identifier = stream->label(); 326 stream_stats->stream_identifier = stream->label();
326 stream_stats->track_ids = std::vector<std::string>(); 327 stream_stats->track_ids = std::vector<std::string>();
327 // Audio Tracks 328 // Audio Tracks
328 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track : 329 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
329 stream->GetAudioTracks()) { 330 stream->GetAudioTracks()) {
330 std::string id = RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface( 331 std::string id = RTCMediaStreamTrackStatsIDFromTrackID(
331 *audio_track.get()); 332 audio_track->id(), is_local);
332 if (report->Get(id)) { 333 if (report->Get(id)) {
333 // Skip track, stats already exist for it. 334 // Skip track, stats already exist for it.
334 continue; 335 continue;
335 } 336 }
336 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( 337 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats(
337 new RTCMediaStreamTrackStats(id, timestamp_us)); 338 new RTCMediaStreamTrackStats(id, timestamp_us));
338 stream_stats->track_ids->push_back(audio_track_stats->id()); 339 stream_stats->track_ids->push_back(audio_track_stats->id());
339 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( 340 SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
340 *audio_track.get(), 341 *audio_track.get(),
341 audio_track_stats.get()); 342 audio_track_stats.get());
(...skipping 16 matching lines...) Expand all
358 if (audio_processor_stats.echo_return_loss_enhancement != -100) { 359 if (audio_processor_stats.echo_return_loss_enhancement != -100) {
359 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( 360 audio_track_stats->echo_return_loss_enhancement = static_cast<double>(
360 audio_processor_stats.echo_return_loss_enhancement); 361 audio_processor_stats.echo_return_loss_enhancement);
361 } 362 }
362 } 363 }
363 report->AddStats(std::move(audio_track_stats)); 364 report->AddStats(std::move(audio_track_stats));
364 } 365 }
365 // Video Tracks 366 // Video Tracks
366 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : 367 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
367 stream->GetVideoTracks()) { 368 stream->GetVideoTracks()) {
368 std::string id = RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface( 369 std::string id = RTCMediaStreamTrackStatsIDFromTrackID(
369 *video_track.get()); 370 video_track->id(), is_local);
370 if (report->Get(id)) { 371 if (report->Get(id)) {
371 // Skip track, stats already exist for it. 372 // Skip track, stats already exist for it.
372 continue; 373 continue;
373 } 374 }
374 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( 375 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats(
375 new RTCMediaStreamTrackStats(id, timestamp_us)); 376 new RTCMediaStreamTrackStats(id, timestamp_us));
376 stream_stats->track_ids->push_back(video_track_stats->id()); 377 stream_stats->track_ids->push_back(video_track_stats->id());
377 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( 378 SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
378 *video_track.get(), 379 *video_track.get(),
379 video_track_stats.get()); 380 video_track_stats.get());
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // are no more pending partial reports. 444 // are no more pending partial reports.
444 445
445 // "Now" using a system clock, relative to the UNIX epoch (Jan 1, 1970, 446 // "Now" using a system clock, relative to the UNIX epoch (Jan 1, 1970,
446 // UTC), in microseconds. The system clock could be modified and is not 447 // UTC), in microseconds. The system clock could be modified and is not
447 // necessarily monotonically increasing. 448 // necessarily monotonically increasing.
448 int64_t timestamp_us = rtc::TimeUTCMicros(); 449 int64_t timestamp_us = rtc::TimeUTCMicros();
449 450
450 num_pending_partial_reports_ = 2; 451 num_pending_partial_reports_ = 2;
451 partial_report_timestamp_us_ = cache_now_us; 452 partial_report_timestamp_us_ = cache_now_us;
452 453
453 // Prepare |channel_names_| and |media_info_| for use in 454 // Prepare |channel_name_pairs_| for use in
454 // |ProducePartialResultsOnNetworkThread|. 455 // |ProducePartialResultsOnNetworkThread|.
455 channel_name_pairs_.reset(new ChannelNamePairs()); 456 channel_name_pairs_.reset(new ChannelNamePairs());
456 if (pc_->session()->voice_channel()) { 457 if (pc_->session()->voice_channel()) {
457 channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>( 458 channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>(
458 ChannelNamePair(pc_->session()->voice_channel()->content_name(), 459 ChannelNamePair(pc_->session()->voice_channel()->content_name(),
459 pc_->session()->voice_channel()->transport_name())); 460 pc_->session()->voice_channel()->transport_name()));
460 } 461 }
461 if (pc_->session()->video_channel()) { 462 if (pc_->session()->video_channel()) {
462 channel_name_pairs_->video = rtc::Optional<ChannelNamePair>( 463 channel_name_pairs_->video = rtc::Optional<ChannelNamePair>(
463 ChannelNamePair(pc_->session()->video_channel()->content_name(), 464 ChannelNamePair(pc_->session()->video_channel()->content_name(),
464 pc_->session()->video_channel()->transport_name())); 465 pc_->session()->video_channel()->transport_name()));
465 } 466 }
466 if (pc_->session()->data_channel()) { 467 if (pc_->session()->data_channel()) {
467 channel_name_pairs_->data = rtc::Optional<ChannelNamePair>( 468 channel_name_pairs_->data = rtc::Optional<ChannelNamePair>(
468 ChannelNamePair(pc_->session()->data_channel()->content_name(), 469 ChannelNamePair(pc_->session()->data_channel()->content_name(),
469 pc_->session()->data_channel()->transport_name())); 470 pc_->session()->data_channel()->transport_name()));
470 } 471 }
471 media_info_.reset(PrepareMediaInfo_s().release()); 472 // Prepare |track_media_info_map_| for use in
473 // |ProducePartialResultsOnNetworkThread| and
474 // |ProducePartialResultsOnSignalingThread|.
475 track_media_info_map_.reset(PrepareTrackMediaInfoMap_s().release());
476 // Prepare |track_to_id_| for use in |ProducePartialResultsOnNetworkThread|.
477 // This avoids a possible deadlock if |MediaStreamTrackInterface::id| is
478 // implemented to invoke on the signaling thread.
479 track_to_id_ = PrepareTrackToID_s();
472 480
473 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_, 481 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_,
474 rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread, 482 rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread,
475 rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us)); 483 rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
476 ProducePartialResultsOnSignalingThread(timestamp_us); 484 ProducePartialResultsOnSignalingThread(timestamp_us);
477 } 485 }
478 } 486 }
479 487
480 void RTCStatsCollector::ClearCachedStatsReport() { 488 void RTCStatsCollector::ClearCachedStatsReport() {
481 RTC_DCHECK(signaling_thread_->IsCurrent()); 489 RTC_DCHECK(signaling_thread_->IsCurrent());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 522
515 std::unique_ptr<SessionStats> session_stats = 523 std::unique_ptr<SessionStats> session_stats =
516 pc_->session()->GetStats(*channel_name_pairs_); 524 pc_->session()->GetStats(*channel_name_pairs_);
517 if (session_stats) { 525 if (session_stats) {
518 std::map<std::string, CertificateStatsPair> transport_cert_stats = 526 std::map<std::string, CertificateStatsPair> transport_cert_stats =
519 PrepareTransportCertificateStats_n(*session_stats); 527 PrepareTransportCertificateStats_n(*session_stats);
520 528
521 ProduceCertificateStats_n( 529 ProduceCertificateStats_n(
522 timestamp_us, transport_cert_stats, report.get()); 530 timestamp_us, transport_cert_stats, report.get());
523 ProduceCodecStats_n( 531 ProduceCodecStats_n(
524 timestamp_us, *media_info_, report.get()); 532 timestamp_us, *track_media_info_map_, report.get());
525 ProduceIceCandidateAndPairStats_n( 533 ProduceIceCandidateAndPairStats_n(
526 timestamp_us, *session_stats, report.get()); 534 timestamp_us, *session_stats, report.get());
527 ProduceRTPStreamStats_n( 535 ProduceRTPStreamStats_n(
528 timestamp_us, *session_stats, *media_info_, report.get()); 536 timestamp_us, *session_stats, *track_media_info_map_, report.get());
529 ProduceTransportStats_n( 537 ProduceTransportStats_n(
530 timestamp_us, *session_stats, transport_cert_stats, report.get()); 538 timestamp_us, *session_stats, transport_cert_stats, report.get());
531 } 539 }
532 540
533 AddPartialResults(report); 541 AddPartialResults(report);
534 } 542 }
535 543
536 void RTCStatsCollector::AddPartialResults( 544 void RTCStatsCollector::AddPartialResults(
537 const rtc::scoped_refptr<RTCStatsReport>& partial_report) { 545 const rtc::scoped_refptr<RTCStatsReport>& partial_report) {
538 if (!signaling_thread_->IsCurrent()) { 546 if (!signaling_thread_->IsCurrent()) {
(...skipping 12 matching lines...) Expand all
551 RTC_DCHECK_GT(num_pending_partial_reports_, 0); 559 RTC_DCHECK_GT(num_pending_partial_reports_, 0);
552 if (!partial_report_) 560 if (!partial_report_)
553 partial_report_ = partial_report; 561 partial_report_ = partial_report;
554 else 562 else
555 partial_report_->TakeMembersFrom(partial_report); 563 partial_report_->TakeMembersFrom(partial_report);
556 --num_pending_partial_reports_; 564 --num_pending_partial_reports_;
557 if (!num_pending_partial_reports_) { 565 if (!num_pending_partial_reports_) {
558 cache_timestamp_us_ = partial_report_timestamp_us_; 566 cache_timestamp_us_ = partial_report_timestamp_us_;
559 cached_report_ = partial_report_; 567 cached_report_ = partial_report_;
560 partial_report_ = nullptr; 568 partial_report_ = nullptr;
569 channel_name_pairs_.reset();
570 track_media_info_map_.reset();
571 track_to_id_.clear();
561 DeliverCachedReport(); 572 DeliverCachedReport();
562 } 573 }
563 } 574 }
564 575
565 void RTCStatsCollector::DeliverCachedReport() { 576 void RTCStatsCollector::DeliverCachedReport() {
566 RTC_DCHECK(signaling_thread_->IsCurrent()); 577 RTC_DCHECK(signaling_thread_->IsCurrent());
567 RTC_DCHECK(!callbacks_.empty()); 578 RTC_DCHECK(!callbacks_.empty());
568 RTC_DCHECK(cached_report_); 579 RTC_DCHECK(cached_report_);
569 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback : 580 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback :
570 callbacks_) { 581 callbacks_) {
(...skipping 13 matching lines...) Expand all
584 timestamp_us, *transport_cert_stats_pair.second.local.get(), report); 595 timestamp_us, *transport_cert_stats_pair.second.local.get(), report);
585 } 596 }
586 if (transport_cert_stats_pair.second.remote) { 597 if (transport_cert_stats_pair.second.remote) {
587 ProduceCertificateStatsFromSSLCertificateStats( 598 ProduceCertificateStatsFromSSLCertificateStats(
588 timestamp_us, *transport_cert_stats_pair.second.remote.get(), report); 599 timestamp_us, *transport_cert_stats_pair.second.remote.get(), report);
589 } 600 }
590 } 601 }
591 } 602 }
592 603
593 void RTCStatsCollector::ProduceCodecStats_n( 604 void RTCStatsCollector::ProduceCodecStats_n(
594 int64_t timestamp_us, const MediaInfo& media_info, 605 int64_t timestamp_us, const TrackMediaInfoMap& track_media_info_map,
595 RTCStatsReport* report) const { 606 RTCStatsReport* report) const {
596 RTC_DCHECK(network_thread_->IsCurrent()); 607 RTC_DCHECK(network_thread_->IsCurrent());
597 // Audio 608 // Audio
598 if (media_info.voice) { 609 if (track_media_info_map.voice_media_info()) {
599 // Inbound 610 // Inbound
600 for (const auto& pair : media_info.voice->receive_codecs) { 611 for (const auto& pair :
612 track_media_info_map.voice_media_info()->receive_codecs) {
601 report->AddStats(CodecStatsFromRtpCodecParameters( 613 report->AddStats(CodecStatsFromRtpCodecParameters(
602 timestamp_us, true, true, pair.second)); 614 timestamp_us, true, true, pair.second));
603 } 615 }
604 // Outbound 616 // Outbound
605 for (const auto& pair : media_info.voice->send_codecs) { 617 for (const auto& pair :
618 track_media_info_map.voice_media_info()->send_codecs) {
606 report->AddStats(CodecStatsFromRtpCodecParameters( 619 report->AddStats(CodecStatsFromRtpCodecParameters(
607 timestamp_us, false, true, pair.second)); 620 timestamp_us, false, true, pair.second));
608 } 621 }
609 } 622 }
610 // Video 623 // Video
611 if (media_info.video) { 624 if (track_media_info_map.video_media_info()) {
612 // Inbound 625 // Inbound
613 for (const auto& pair : media_info.video->receive_codecs) { 626 for (const auto& pair :
627 track_media_info_map.video_media_info()->receive_codecs) {
614 report->AddStats(CodecStatsFromRtpCodecParameters( 628 report->AddStats(CodecStatsFromRtpCodecParameters(
615 timestamp_us, true, false, pair.second)); 629 timestamp_us, true, false, pair.second));
616 } 630 }
617 // Outbound 631 // Outbound
618 for (const auto& pair : media_info.video->send_codecs) { 632 for (const auto& pair :
633 track_media_info_map.video_media_info()->send_codecs) {
619 report->AddStats(CodecStatsFromRtpCodecParameters( 634 report->AddStats(CodecStatsFromRtpCodecParameters(
620 timestamp_us, false, false, pair.second)); 635 timestamp_us, false, false, pair.second));
621 } 636 }
622 } 637 }
623 } 638 }
624 639
625 void RTCStatsCollector::ProduceDataChannelStats_s( 640 void RTCStatsCollector::ProduceDataChannelStats_s(
626 int64_t timestamp_us, RTCStatsReport* report) const { 641 int64_t timestamp_us, RTCStatsReport* report) const {
627 RTC_DCHECK(signaling_thread_->IsCurrent()); 642 RTC_DCHECK(signaling_thread_->IsCurrent());
628 for (const rtc::scoped_refptr<DataChannel>& data_channel : 643 for (const rtc::scoped_refptr<DataChannel>& data_channel :
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 RTC_DCHECK(signaling_thread_->IsCurrent()); 733 RTC_DCHECK(signaling_thread_->IsCurrent());
719 std::unique_ptr<RTCPeerConnectionStats> stats( 734 std::unique_ptr<RTCPeerConnectionStats> stats(
720 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); 735 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us));
721 stats->data_channels_opened = internal_record_.data_channels_opened; 736 stats->data_channels_opened = internal_record_.data_channels_opened;
722 stats->data_channels_closed = internal_record_.data_channels_closed; 737 stats->data_channels_closed = internal_record_.data_channels_closed;
723 report->AddStats(std::move(stats)); 738 report->AddStats(std::move(stats));
724 } 739 }
725 740
726 void RTCStatsCollector::ProduceRTPStreamStats_n( 741 void RTCStatsCollector::ProduceRTPStreamStats_n(
727 int64_t timestamp_us, const SessionStats& session_stats, 742 int64_t timestamp_us, const SessionStats& session_stats,
728 const MediaInfo& media_info, RTCStatsReport* report) const { 743 const TrackMediaInfoMap& track_media_info_map,
744 RTCStatsReport* report) const {
729 RTC_DCHECK(network_thread_->IsCurrent()); 745 RTC_DCHECK(network_thread_->IsCurrent());
730 746
731 // Audio 747 // Audio
732 if (media_info.voice) { 748 if (track_media_info_map.voice_media_info()) {
733 std::string transport_id = RTCTransportStatsIDFromBaseChannel( 749 std::string transport_id = RTCTransportStatsIDFromBaseChannel(
734 session_stats.proxy_to_transport, *pc_->session()->voice_channel()); 750 session_stats.proxy_to_transport, *pc_->session()->voice_channel());
735 RTC_DCHECK(!transport_id.empty()); 751 RTC_DCHECK(!transport_id.empty());
736 // Inbound 752 // Inbound
737 for (const cricket::VoiceReceiverInfo& voice_receiver_info : 753 for (const cricket::VoiceReceiverInfo& voice_receiver_info :
738 media_info.voice->receivers) { 754 track_media_info_map.voice_media_info()->receivers) {
739 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 755 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
740 // is fixed. 756 // is fixed.
741 if (voice_receiver_info.ssrc() == 0) 757 if (voice_receiver_info.ssrc() == 0)
742 continue; 758 continue;
743 std::unique_ptr<RTCInboundRTPStreamStats> inbound_audio( 759 std::unique_ptr<RTCInboundRTPStreamStats> inbound_audio(
744 new RTCInboundRTPStreamStats( 760 new RTCInboundRTPStreamStats(
745 RTCInboundRTPStreamStatsIDFromSSRC( 761 RTCInboundRTPStreamStatsIDFromSSRC(
746 true, voice_receiver_info.ssrc()), 762 true, voice_receiver_info.ssrc()),
747 timestamp_us)); 763 timestamp_us));
748 SetInboundRTPStreamStatsFromVoiceReceiverInfo( 764 SetInboundRTPStreamStatsFromVoiceReceiverInfo(
749 voice_receiver_info, inbound_audio.get()); 765 voice_receiver_info, inbound_audio.get());
766 rtc::scoped_refptr<AudioTrackInterface> audio_track =
767 track_media_info_map_->GetAudioTrack(voice_receiver_info);
768 if (audio_track) {
hbos 2017/01/10 13:12:49 I started a Hangouts call on Chromium and found th
769 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
770 inbound_audio->media_track_id =
771 RTCMediaStreamTrackStatsIDFromTrackID(
772 track_to_id_.find(audio_track.get())->second, false);
773 }
750 inbound_audio->transport_id = transport_id; 774 inbound_audio->transport_id = transport_id;
751 if (voice_receiver_info.codec_payload_type) { 775 if (voice_receiver_info.codec_payload_type) {
752 inbound_audio->codec_id = 776 inbound_audio->codec_id =
753 RTCCodecStatsIDFromDirectionMediaAndPayload( 777 RTCCodecStatsIDFromDirectionMediaAndPayload(
754 true, true, *voice_receiver_info.codec_payload_type); 778 true, true, *voice_receiver_info.codec_payload_type);
755 } 779 }
756 report->AddStats(std::move(inbound_audio)); 780 report->AddStats(std::move(inbound_audio));
757 } 781 }
758 // Outbound 782 // Outbound
759 for (const cricket::VoiceSenderInfo& voice_sender_info : 783 for (const cricket::VoiceSenderInfo& voice_sender_info :
760 media_info.voice->senders) { 784 track_media_info_map.voice_media_info()->senders) {
761 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 785 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
762 // is fixed. 786 // is fixed.
763 if (voice_sender_info.ssrc() == 0) 787 if (voice_sender_info.ssrc() == 0)
764 continue; 788 continue;
765 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( 789 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio(
766 new RTCOutboundRTPStreamStats( 790 new RTCOutboundRTPStreamStats(
767 RTCOutboundRTPStreamStatsIDFromSSRC( 791 RTCOutboundRTPStreamStatsIDFromSSRC(
768 true, voice_sender_info.ssrc()), 792 true, voice_sender_info.ssrc()),
769 timestamp_us)); 793 timestamp_us));
770 SetOutboundRTPStreamStatsFromVoiceSenderInfo( 794 SetOutboundRTPStreamStatsFromVoiceSenderInfo(
771 voice_sender_info, outbound_audio.get()); 795 voice_sender_info, outbound_audio.get());
796 rtc::scoped_refptr<AudioTrackInterface> audio_track =
797 track_media_info_map_->GetAudioTrack(voice_sender_info);
798 if (audio_track) {
799 RTC_DCHECK(track_to_id_.find(audio_track.get()) != track_to_id_.end());
800 outbound_audio->media_track_id =
801 RTCMediaStreamTrackStatsIDFromTrackID(
802 track_to_id_.find(audio_track.get())->second, true);
803 }
772 outbound_audio->transport_id = transport_id; 804 outbound_audio->transport_id = transport_id;
773 if (voice_sender_info.codec_payload_type) { 805 if (voice_sender_info.codec_payload_type) {
774 outbound_audio->codec_id = 806 outbound_audio->codec_id =
775 RTCCodecStatsIDFromDirectionMediaAndPayload( 807 RTCCodecStatsIDFromDirectionMediaAndPayload(
776 false, true, *voice_sender_info.codec_payload_type); 808 false, true, *voice_sender_info.codec_payload_type);
777 } 809 }
778 report->AddStats(std::move(outbound_audio)); 810 report->AddStats(std::move(outbound_audio));
779 } 811 }
780 } 812 }
781 // Video 813 // Video
782 if (media_info.video) { 814 if (track_media_info_map.video_media_info()) {
783 std::string transport_id = RTCTransportStatsIDFromBaseChannel( 815 std::string transport_id = RTCTransportStatsIDFromBaseChannel(
784 session_stats.proxy_to_transport, *pc_->session()->video_channel()); 816 session_stats.proxy_to_transport, *pc_->session()->video_channel());
785 RTC_DCHECK(!transport_id.empty()); 817 RTC_DCHECK(!transport_id.empty());
786 // Inbound 818 // Inbound
787 for (const cricket::VideoReceiverInfo& video_receiver_info : 819 for (const cricket::VideoReceiverInfo& video_receiver_info :
788 media_info.video->receivers) { 820 track_media_info_map.video_media_info()->receivers) {
789 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 821 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
790 // is fixed. 822 // is fixed.
791 if (video_receiver_info.ssrc() == 0) 823 if (video_receiver_info.ssrc() == 0)
792 continue; 824 continue;
793 std::unique_ptr<RTCInboundRTPStreamStats> inbound_video( 825 std::unique_ptr<RTCInboundRTPStreamStats> inbound_video(
794 new RTCInboundRTPStreamStats( 826 new RTCInboundRTPStreamStats(
795 RTCInboundRTPStreamStatsIDFromSSRC( 827 RTCInboundRTPStreamStatsIDFromSSRC(
796 false, video_receiver_info.ssrc()), 828 false, video_receiver_info.ssrc()),
797 timestamp_us)); 829 timestamp_us));
798 SetInboundRTPStreamStatsFromVideoReceiverInfo( 830 SetInboundRTPStreamStatsFromVideoReceiverInfo(
799 video_receiver_info, inbound_video.get()); 831 video_receiver_info, inbound_video.get());
832 rtc::scoped_refptr<VideoTrackInterface> video_track =
833 track_media_info_map_->GetVideoTrack(video_receiver_info);
834 if (video_track) {
835 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
836 inbound_video->media_track_id =
837 RTCMediaStreamTrackStatsIDFromTrackID(
838 track_to_id_.find(video_track.get())->second, false);
839 }
800 inbound_video->transport_id = transport_id; 840 inbound_video->transport_id = transport_id;
801 if (video_receiver_info.codec_payload_type) { 841 if (video_receiver_info.codec_payload_type) {
802 inbound_video->codec_id = 842 inbound_video->codec_id =
803 RTCCodecStatsIDFromDirectionMediaAndPayload( 843 RTCCodecStatsIDFromDirectionMediaAndPayload(
804 true, false, *video_receiver_info.codec_payload_type); 844 true, false, *video_receiver_info.codec_payload_type);
805 } 845 }
806 report->AddStats(std::move(inbound_video)); 846 report->AddStats(std::move(inbound_video));
807 } 847 }
808 // Outbound 848 // Outbound
809 for (const cricket::VideoSenderInfo& video_sender_info : 849 for (const cricket::VideoSenderInfo& video_sender_info :
810 media_info.video->senders) { 850 track_media_info_map.video_media_info()->senders) {
811 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 851 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
812 // is fixed. 852 // is fixed.
813 if (video_sender_info.ssrc() == 0) 853 if (video_sender_info.ssrc() == 0)
814 continue; 854 continue;
815 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( 855 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video(
816 new RTCOutboundRTPStreamStats( 856 new RTCOutboundRTPStreamStats(
817 RTCOutboundRTPStreamStatsIDFromSSRC( 857 RTCOutboundRTPStreamStatsIDFromSSRC(
818 false, video_sender_info.ssrc()), 858 false, video_sender_info.ssrc()),
819 timestamp_us)); 859 timestamp_us));
820 SetOutboundRTPStreamStatsFromVideoSenderInfo( 860 SetOutboundRTPStreamStatsFromVideoSenderInfo(
821 video_sender_info, outbound_video.get()); 861 video_sender_info, outbound_video.get());
862 rtc::scoped_refptr<VideoTrackInterface> video_track =
863 track_media_info_map_->GetVideoTrack(video_sender_info);
864 if (video_track) {
865 RTC_DCHECK(track_to_id_.find(video_track.get()) != track_to_id_.end());
866 outbound_video->media_track_id =
867 RTCMediaStreamTrackStatsIDFromTrackID(
868 track_to_id_.find(video_track.get())->second, true);
869 }
822 outbound_video->transport_id = transport_id; 870 outbound_video->transport_id = transport_id;
823 if (video_sender_info.codec_payload_type) { 871 if (video_sender_info.codec_payload_type) {
824 outbound_video->codec_id = 872 outbound_video->codec_id =
825 RTCCodecStatsIDFromDirectionMediaAndPayload( 873 RTCCodecStatsIDFromDirectionMediaAndPayload(
826 false, false, *video_sender_info.codec_payload_type); 874 false, false, *video_sender_info.codec_payload_type);
827 } 875 }
828 report->AddStats(std::move(outbound_video)); 876 report->AddStats(std::move(outbound_video));
829 } 877 }
830 } 878 }
831 } 879 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 if (remote_certificate) { 963 if (remote_certificate) {
916 certificate_stats_pair.remote = remote_certificate->GetStats(); 964 certificate_stats_pair.remote = remote_certificate->GetStats();
917 } 965 }
918 transport_cert_stats.insert( 966 transport_cert_stats.insert(
919 std::make_pair(transport_stats.second.transport_name, 967 std::make_pair(transport_stats.second.transport_name,
920 std::move(certificate_stats_pair))); 968 std::move(certificate_stats_pair)));
921 } 969 }
922 return transport_cert_stats; 970 return transport_cert_stats;
923 } 971 }
924 972
925 std::unique_ptr<RTCStatsCollector::MediaInfo> 973 std::unique_ptr<TrackMediaInfoMap>
926 RTCStatsCollector::PrepareMediaInfo_s() const { 974 RTCStatsCollector::PrepareTrackMediaInfoMap_s() const {
927 RTC_DCHECK(signaling_thread_->IsCurrent()); 975 RTC_DCHECK(signaling_thread_->IsCurrent());
928 std::unique_ptr<MediaInfo> media_info(new MediaInfo()); 976 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info;
929 if (pc_->session()->voice_channel()) { 977 if (pc_->session()->voice_channel()) {
930 cricket::VoiceMediaInfo voice_media_info; 978 voice_media_info.reset(new cricket::VoiceMediaInfo());
931 if (pc_->session()->voice_channel()->GetStats(&voice_media_info)) { 979 if (!pc_->session()->voice_channel()->GetStats(voice_media_info.get())) {
932 media_info->voice = rtc::Optional<cricket::VoiceMediaInfo>( 980 voice_media_info.reset();
933 std::move(voice_media_info));
934 } 981 }
935 } 982 }
983 std::unique_ptr<cricket::VideoMediaInfo> video_media_info;
936 if (pc_->session()->video_channel()) { 984 if (pc_->session()->video_channel()) {
937 cricket::VideoMediaInfo video_media_info; 985 video_media_info.reset(new cricket::VideoMediaInfo());
938 if (pc_->session()->video_channel()->GetStats(&video_media_info)) { 986 if (!pc_->session()->video_channel()->GetStats(video_media_info.get())) {
939 media_info->video = rtc::Optional<cricket::VideoMediaInfo>( 987 video_media_info.reset();
940 std::move(video_media_info));
941 } 988 }
942 } 989 }
943 return media_info; 990 std::unique_ptr<TrackMediaInfoMap> track_media_info_map(
991 new TrackMediaInfoMap(std::move(voice_media_info),
992 std::move(video_media_info),
993 pc_->GetSenders(),
994 pc_->GetReceivers()));
995 return track_media_info_map;
996 }
997
998 std::map<MediaStreamTrackInterface*, std::string>
999 RTCStatsCollector::PrepareTrackToID_s() const {
1000 RTC_DCHECK(signaling_thread_->IsCurrent());
1001 std::map<MediaStreamTrackInterface*, std::string> track_to_id;
1002 StreamCollectionInterface* local_and_remote_streams[] =
1003 { pc_->local_streams().get(), pc_->remote_streams().get() };
1004 for (auto& streams : local_and_remote_streams) {
1005 if (streams) {
1006 for (size_t i = 0; i < streams->count(); ++i) {
1007 MediaStreamInterface* stream = streams->at(i);
1008 for (const rtc::scoped_refptr<AudioTrackInterface>& audio_track :
1009 stream->GetAudioTracks()) {
1010 track_to_id[audio_track.get()] = audio_track->id();
1011 }
1012 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
1013 stream->GetVideoTracks()) {
1014 track_to_id[video_track.get()] = video_track->id();
1015 }
1016 }
1017 }
1018 }
1019 return track_to_id;
944 } 1020 }
945 1021
946 void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) { 1022 void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) {
947 channel->SignalOpened.connect(this, &RTCStatsCollector::OnDataChannelOpened); 1023 channel->SignalOpened.connect(this, &RTCStatsCollector::OnDataChannelOpened);
948 channel->SignalClosed.connect(this, &RTCStatsCollector::OnDataChannelClosed); 1024 channel->SignalClosed.connect(this, &RTCStatsCollector::OnDataChannelClosed);
949 } 1025 }
950 1026
951 void RTCStatsCollector::OnDataChannelOpened(DataChannel* channel) { 1027 void RTCStatsCollector::OnDataChannelOpened(DataChannel* channel) {
952 RTC_DCHECK(signaling_thread_->IsCurrent()); 1028 RTC_DCHECK(signaling_thread_->IsCurrent());
953 bool result = internal_record_.opened_data_channels.insert( 1029 bool result = internal_record_.opened_data_channels.insert(
(...skipping 17 matching lines...) Expand all
971 const std::string& type) { 1047 const std::string& type) {
972 return CandidateTypeToRTCIceCandidateType(type); 1048 return CandidateTypeToRTCIceCandidateType(type);
973 } 1049 }
974 1050
975 const char* DataStateToRTCDataChannelStateForTesting( 1051 const char* DataStateToRTCDataChannelStateForTesting(
976 DataChannelInterface::DataState state) { 1052 DataChannelInterface::DataState state) {
977 return DataStateToRTCDataChannelState(state); 1053 return DataStateToRTCDataChannelState(state);
978 } 1054 }
979 1055
980 } // namespace webrtc 1056 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/api/rtcstatscollector.h ('k') | webrtc/api/rtcstatscollector_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698