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

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

Issue 2610843003: RTC[In/Out]boundRTPStreamStats.mediaTrackId collected. (Closed)
Patch Set: 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
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 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
57 const MediaStreamTrackInterface& track) { 57 const MediaStreamTrackInterface& track, bool is_local) {
58 return "RTCMediaStreamTrack_" + track.id(); 58 return (is_local ? "RTCMediaStreamTrack_local_" + track.id()
59 : "RTCMediaStreamTrack_remote_" + track.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 *audio_track.get());
332 if (report->Get(id)) {
333 // Skip track, stats already exist for it.
334 continue;
335 }
Taylor Brandstetter 2017/01/04 23:58:00 I think you should continue to check for duplicate
hbos 2017/01/09 18:37:13 Done.
336 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats( 331 std::unique_ptr<RTCMediaStreamTrackStats> audio_track_stats(
337 new RTCMediaStreamTrackStats(id, timestamp_us)); 332 new RTCMediaStreamTrackStats(
333 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
334 *audio_track.get(), is_local),
335 timestamp_us));
338 stream_stats->track_ids->push_back(audio_track_stats->id()); 336 stream_stats->track_ids->push_back(audio_track_stats->id());
339 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( 337 SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
340 *audio_track.get(), 338 *audio_track.get(),
341 audio_track_stats.get()); 339 audio_track_stats.get());
342 audio_track_stats->remote_source = !is_local; 340 audio_track_stats->remote_source = !is_local;
343 audio_track_stats->detached = false; 341 audio_track_stats->detached = false;
344 int signal_level; 342 int signal_level;
345 if (audio_track->GetSignalLevel(&signal_level)) { 343 if (audio_track->GetSignalLevel(&signal_level)) {
346 // Convert signal level from [0,32767] int to [0,1] double. 344 // Convert signal level from [0,32767] int to [0,1] double.
347 RTC_DCHECK_GE(signal_level, 0); 345 RTC_DCHECK_GE(signal_level, 0);
(...skipping 10 matching lines...) Expand all
358 if (audio_processor_stats.echo_return_loss_enhancement != -100) { 356 if (audio_processor_stats.echo_return_loss_enhancement != -100) {
359 audio_track_stats->echo_return_loss_enhancement = static_cast<double>( 357 audio_track_stats->echo_return_loss_enhancement = static_cast<double>(
360 audio_processor_stats.echo_return_loss_enhancement); 358 audio_processor_stats.echo_return_loss_enhancement);
361 } 359 }
362 } 360 }
363 report->AddStats(std::move(audio_track_stats)); 361 report->AddStats(std::move(audio_track_stats));
364 } 362 }
365 // Video Tracks 363 // Video Tracks
366 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track : 364 for (const rtc::scoped_refptr<VideoTrackInterface>& video_track :
367 stream->GetVideoTracks()) { 365 stream->GetVideoTracks()) {
368 std::string id = RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
369 *video_track.get());
370 if (report->Get(id)) {
371 // Skip track, stats already exist for it.
372 continue;
373 }
374 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats( 366 std::unique_ptr<RTCMediaStreamTrackStats> video_track_stats(
375 new RTCMediaStreamTrackStats(id, timestamp_us)); 367 new RTCMediaStreamTrackStats(
368 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
369 *video_track.get(), is_local),
370 timestamp_us));
376 stream_stats->track_ids->push_back(video_track_stats->id()); 371 stream_stats->track_ids->push_back(video_track_stats->id());
377 SetMediaStreamTrackStatsFromMediaStreamTrackInterface( 372 SetMediaStreamTrackStatsFromMediaStreamTrackInterface(
378 *video_track.get(), 373 *video_track.get(),
379 video_track_stats.get()); 374 video_track_stats.get());
380 video_track_stats->remote_source = !is_local; 375 video_track_stats->remote_source = !is_local;
381 video_track_stats->detached = false; 376 video_track_stats->detached = false;
382 if (video_track->GetSource()) { 377 if (video_track->GetSource()) {
383 VideoTrackSourceInterface::Stats video_track_source_stats; 378 VideoTrackSourceInterface::Stats video_track_source_stats;
384 if (video_track->GetSource()->GetStats(&video_track_source_stats)) { 379 if (video_track->GetSource()->GetStats(&video_track_source_stats)) {
385 video_track_stats->frame_width = static_cast<uint32_t>( 380 video_track_stats->frame_width = static_cast<uint32_t>(
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // are no more pending partial reports. 438 // are no more pending partial reports.
444 439
445 // "Now" using a system clock, relative to the UNIX epoch (Jan 1, 1970, 440 // "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 441 // UTC), in microseconds. The system clock could be modified and is not
447 // necessarily monotonically increasing. 442 // necessarily monotonically increasing.
448 int64_t timestamp_us = rtc::TimeUTCMicros(); 443 int64_t timestamp_us = rtc::TimeUTCMicros();
449 444
450 num_pending_partial_reports_ = 2; 445 num_pending_partial_reports_ = 2;
451 partial_report_timestamp_us_ = cache_now_us; 446 partial_report_timestamp_us_ = cache_now_us;
452 447
453 // Prepare |channel_names_| and |media_info_| for use in 448 // Prepare |channel_name_pairs_| for use in
454 // |ProducePartialResultsOnNetworkThread|. 449 // |ProducePartialResultsOnNetworkThread|.
455 channel_name_pairs_.reset(new ChannelNamePairs()); 450 channel_name_pairs_.reset(new ChannelNamePairs());
456 if (pc_->session()->voice_channel()) { 451 if (pc_->session()->voice_channel()) {
457 channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>( 452 channel_name_pairs_->voice = rtc::Optional<ChannelNamePair>(
458 ChannelNamePair(pc_->session()->voice_channel()->content_name(), 453 ChannelNamePair(pc_->session()->voice_channel()->content_name(),
459 pc_->session()->voice_channel()->transport_name())); 454 pc_->session()->voice_channel()->transport_name()));
460 } 455 }
461 if (pc_->session()->video_channel()) { 456 if (pc_->session()->video_channel()) {
462 channel_name_pairs_->video = rtc::Optional<ChannelNamePair>( 457 channel_name_pairs_->video = rtc::Optional<ChannelNamePair>(
463 ChannelNamePair(pc_->session()->video_channel()->content_name(), 458 ChannelNamePair(pc_->session()->video_channel()->content_name(),
464 pc_->session()->video_channel()->transport_name())); 459 pc_->session()->video_channel()->transport_name()));
465 } 460 }
466 if (pc_->session()->data_channel()) { 461 if (pc_->session()->data_channel()) {
467 channel_name_pairs_->data = rtc::Optional<ChannelNamePair>( 462 channel_name_pairs_->data = rtc::Optional<ChannelNamePair>(
468 ChannelNamePair(pc_->session()->data_channel()->content_name(), 463 ChannelNamePair(pc_->session()->data_channel()->content_name(),
469 pc_->session()->data_channel()->transport_name())); 464 pc_->session()->data_channel()->transport_name()));
470 } 465 }
471 media_info_.reset(PrepareMediaInfo_s().release()); 466 // Prepare |track_media_info_map_| for use in
467 // |ProducePartialResultsOnNetworkThread| and
468 // |ProducePartialResultsOnSignalingThread|.
469 track_media_info_map_.reset(PrepareTrackMediaInfoMap_s().release());
472 470
473 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_, 471 invoker_.AsyncInvoke<void>(RTC_FROM_HERE, network_thread_,
474 rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread, 472 rtc::Bind(&RTCStatsCollector::ProducePartialResultsOnNetworkThread,
475 rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us)); 473 rtc::scoped_refptr<RTCStatsCollector>(this), timestamp_us));
476 ProducePartialResultsOnSignalingThread(timestamp_us); 474 ProducePartialResultsOnSignalingThread(timestamp_us);
477 } 475 }
478 } 476 }
479 477
480 void RTCStatsCollector::ClearCachedStatsReport() { 478 void RTCStatsCollector::ClearCachedStatsReport() {
481 RTC_DCHECK(signaling_thread_->IsCurrent()); 479 RTC_DCHECK(signaling_thread_->IsCurrent());
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 512
515 std::unique_ptr<SessionStats> session_stats = 513 std::unique_ptr<SessionStats> session_stats =
516 pc_->session()->GetStats(*channel_name_pairs_); 514 pc_->session()->GetStats(*channel_name_pairs_);
517 if (session_stats) { 515 if (session_stats) {
518 std::map<std::string, CertificateStatsPair> transport_cert_stats = 516 std::map<std::string, CertificateStatsPair> transport_cert_stats =
519 PrepareTransportCertificateStats_n(*session_stats); 517 PrepareTransportCertificateStats_n(*session_stats);
520 518
521 ProduceCertificateStats_n( 519 ProduceCertificateStats_n(
522 timestamp_us, transport_cert_stats, report.get()); 520 timestamp_us, transport_cert_stats, report.get());
523 ProduceCodecStats_n( 521 ProduceCodecStats_n(
524 timestamp_us, *media_info_, report.get()); 522 timestamp_us, *track_media_info_map_, report.get());
525 ProduceIceCandidateAndPairStats_n( 523 ProduceIceCandidateAndPairStats_n(
526 timestamp_us, *session_stats, report.get()); 524 timestamp_us, *session_stats, report.get());
527 ProduceRTPStreamStats_n( 525 ProduceRTPStreamStats_n(
528 timestamp_us, *session_stats, *media_info_, report.get()); 526 timestamp_us, *session_stats, *track_media_info_map_, report.get());
529 ProduceTransportStats_n( 527 ProduceTransportStats_n(
530 timestamp_us, *session_stats, transport_cert_stats, report.get()); 528 timestamp_us, *session_stats, transport_cert_stats, report.get());
531 } 529 }
532 530
533 AddPartialResults(report); 531 AddPartialResults(report);
534 } 532 }
535 533
536 void RTCStatsCollector::AddPartialResults( 534 void RTCStatsCollector::AddPartialResults(
537 const rtc::scoped_refptr<RTCStatsReport>& partial_report) { 535 const rtc::scoped_refptr<RTCStatsReport>& partial_report) {
538 if (!signaling_thread_->IsCurrent()) { 536 if (!signaling_thread_->IsCurrent()) {
(...skipping 12 matching lines...) Expand all
551 RTC_DCHECK_GT(num_pending_partial_reports_, 0); 549 RTC_DCHECK_GT(num_pending_partial_reports_, 0);
552 if (!partial_report_) 550 if (!partial_report_)
553 partial_report_ = partial_report; 551 partial_report_ = partial_report;
554 else 552 else
555 partial_report_->TakeMembersFrom(partial_report); 553 partial_report_->TakeMembersFrom(partial_report);
556 --num_pending_partial_reports_; 554 --num_pending_partial_reports_;
557 if (!num_pending_partial_reports_) { 555 if (!num_pending_partial_reports_) {
558 cache_timestamp_us_ = partial_report_timestamp_us_; 556 cache_timestamp_us_ = partial_report_timestamp_us_;
559 cached_report_ = partial_report_; 557 cached_report_ = partial_report_;
560 partial_report_ = nullptr; 558 partial_report_ = nullptr;
559 channel_name_pairs_.reset();
560 track_media_info_map_.reset();
561 DeliverCachedReport(); 561 DeliverCachedReport();
562 } 562 }
563 } 563 }
564 564
565 void RTCStatsCollector::DeliverCachedReport() { 565 void RTCStatsCollector::DeliverCachedReport() {
566 RTC_DCHECK(signaling_thread_->IsCurrent()); 566 RTC_DCHECK(signaling_thread_->IsCurrent());
567 RTC_DCHECK(!callbacks_.empty()); 567 RTC_DCHECK(!callbacks_.empty());
568 RTC_DCHECK(cached_report_); 568 RTC_DCHECK(cached_report_);
569 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback : 569 for (const rtc::scoped_refptr<RTCStatsCollectorCallback>& callback :
570 callbacks_) { 570 callbacks_) {
(...skipping 13 matching lines...) Expand all
584 timestamp_us, *transport_cert_stats_pair.second.local.get(), report); 584 timestamp_us, *transport_cert_stats_pair.second.local.get(), report);
585 } 585 }
586 if (transport_cert_stats_pair.second.remote) { 586 if (transport_cert_stats_pair.second.remote) {
587 ProduceCertificateStatsFromSSLCertificateStats( 587 ProduceCertificateStatsFromSSLCertificateStats(
588 timestamp_us, *transport_cert_stats_pair.second.remote.get(), report); 588 timestamp_us, *transport_cert_stats_pair.second.remote.get(), report);
589 } 589 }
590 } 590 }
591 } 591 }
592 592
593 void RTCStatsCollector::ProduceCodecStats_n( 593 void RTCStatsCollector::ProduceCodecStats_n(
594 int64_t timestamp_us, const MediaInfo& media_info, 594 int64_t timestamp_us, const TrackMediaInfoMap& track_media_info_map,
595 RTCStatsReport* report) const { 595 RTCStatsReport* report) const {
596 RTC_DCHECK(network_thread_->IsCurrent()); 596 RTC_DCHECK(network_thread_->IsCurrent());
597 // Audio 597 // Audio
598 if (media_info.voice) { 598 if (track_media_info_map.voice_media_info()) {
599 // Inbound 599 // Inbound
600 for (const auto& pair : media_info.voice->receive_codecs) { 600 for (const auto& pair :
601 track_media_info_map.voice_media_info()->receive_codecs) {
601 report->AddStats(CodecStatsFromRtpCodecParameters( 602 report->AddStats(CodecStatsFromRtpCodecParameters(
602 timestamp_us, true, true, pair.second)); 603 timestamp_us, true, true, pair.second));
603 } 604 }
604 // Outbound 605 // Outbound
605 for (const auto& pair : media_info.voice->send_codecs) { 606 for (const auto& pair :
607 track_media_info_map.voice_media_info()->send_codecs) {
606 report->AddStats(CodecStatsFromRtpCodecParameters( 608 report->AddStats(CodecStatsFromRtpCodecParameters(
607 timestamp_us, false, true, pair.second)); 609 timestamp_us, false, true, pair.second));
608 } 610 }
609 } 611 }
610 // Video 612 // Video
611 if (media_info.video) { 613 if (track_media_info_map.video_media_info()) {
612 // Inbound 614 // Inbound
613 for (const auto& pair : media_info.video->receive_codecs) { 615 for (const auto& pair :
616 track_media_info_map.video_media_info()->receive_codecs) {
614 report->AddStats(CodecStatsFromRtpCodecParameters( 617 report->AddStats(CodecStatsFromRtpCodecParameters(
615 timestamp_us, true, false, pair.second)); 618 timestamp_us, true, false, pair.second));
616 } 619 }
617 // Outbound 620 // Outbound
618 for (const auto& pair : media_info.video->send_codecs) { 621 for (const auto& pair :
622 track_media_info_map.video_media_info()->send_codecs) {
619 report->AddStats(CodecStatsFromRtpCodecParameters( 623 report->AddStats(CodecStatsFromRtpCodecParameters(
620 timestamp_us, false, false, pair.second)); 624 timestamp_us, false, false, pair.second));
621 } 625 }
622 } 626 }
623 } 627 }
624 628
625 void RTCStatsCollector::ProduceDataChannelStats_s( 629 void RTCStatsCollector::ProduceDataChannelStats_s(
626 int64_t timestamp_us, RTCStatsReport* report) const { 630 int64_t timestamp_us, RTCStatsReport* report) const {
627 RTC_DCHECK(signaling_thread_->IsCurrent()); 631 RTC_DCHECK(signaling_thread_->IsCurrent());
628 for (const rtc::scoped_refptr<DataChannel>& data_channel : 632 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()); 722 RTC_DCHECK(signaling_thread_->IsCurrent());
719 std::unique_ptr<RTCPeerConnectionStats> stats( 723 std::unique_ptr<RTCPeerConnectionStats> stats(
720 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us)); 724 new RTCPeerConnectionStats("RTCPeerConnection", timestamp_us));
721 stats->data_channels_opened = internal_record_.data_channels_opened; 725 stats->data_channels_opened = internal_record_.data_channels_opened;
722 stats->data_channels_closed = internal_record_.data_channels_closed; 726 stats->data_channels_closed = internal_record_.data_channels_closed;
723 report->AddStats(std::move(stats)); 727 report->AddStats(std::move(stats));
724 } 728 }
725 729
726 void RTCStatsCollector::ProduceRTPStreamStats_n( 730 void RTCStatsCollector::ProduceRTPStreamStats_n(
727 int64_t timestamp_us, const SessionStats& session_stats, 731 int64_t timestamp_us, const SessionStats& session_stats,
728 const MediaInfo& media_info, RTCStatsReport* report) const { 732 const TrackMediaInfoMap& track_media_info_map,
733 RTCStatsReport* report) const {
729 RTC_DCHECK(network_thread_->IsCurrent()); 734 RTC_DCHECK(network_thread_->IsCurrent());
730 735
731 // Audio 736 // Audio
732 if (media_info.voice) { 737 if (track_media_info_map.voice_media_info()) {
733 std::string transport_id = RTCTransportStatsIDFromBaseChannel( 738 std::string transport_id = RTCTransportStatsIDFromBaseChannel(
734 session_stats.proxy_to_transport, *pc_->session()->voice_channel()); 739 session_stats.proxy_to_transport, *pc_->session()->voice_channel());
735 RTC_DCHECK(!transport_id.empty()); 740 RTC_DCHECK(!transport_id.empty());
736 // Inbound 741 // Inbound
737 for (const cricket::VoiceReceiverInfo& voice_receiver_info : 742 for (const cricket::VoiceReceiverInfo& voice_receiver_info :
738 media_info.voice->receivers) { 743 track_media_info_map.voice_media_info()->receivers) {
739 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 744 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
740 // is fixed. 745 // is fixed.
741 if (voice_receiver_info.ssrc() == 0) 746 if (voice_receiver_info.ssrc() == 0)
742 continue; 747 continue;
743 std::unique_ptr<RTCInboundRTPStreamStats> inbound_audio( 748 std::unique_ptr<RTCInboundRTPStreamStats> inbound_audio(
744 new RTCInboundRTPStreamStats( 749 new RTCInboundRTPStreamStats(
745 RTCInboundRTPStreamStatsIDFromSSRC( 750 RTCInboundRTPStreamStatsIDFromSSRC(
746 true, voice_receiver_info.ssrc()), 751 true, voice_receiver_info.ssrc()),
747 timestamp_us)); 752 timestamp_us));
748 SetInboundRTPStreamStatsFromVoiceReceiverInfo( 753 SetInboundRTPStreamStatsFromVoiceReceiverInfo(
749 voice_receiver_info, inbound_audio.get()); 754 voice_receiver_info, inbound_audio.get());
755 rtc::scoped_refptr<AudioTrackInterface> audio_track =
756 track_media_info_map_->GetAudioTrack(voice_receiver_info);
757 if (audio_track) {
Taylor Brandstetter 2017/01/04 23:58:00 There should always be a track for a receiver; you
hbos 2017/01/09 18:37:13 Done.
758 inbound_audio->media_track_id =
759 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
760 *audio_track, false);
761 }
750 inbound_audio->transport_id = transport_id; 762 inbound_audio->transport_id = transport_id;
751 if (voice_receiver_info.codec_payload_type) { 763 if (voice_receiver_info.codec_payload_type) {
752 inbound_audio->codec_id = 764 inbound_audio->codec_id =
753 RTCCodecStatsIDFromDirectionMediaAndPayload( 765 RTCCodecStatsIDFromDirectionMediaAndPayload(
754 true, true, *voice_receiver_info.codec_payload_type); 766 true, true, *voice_receiver_info.codec_payload_type);
755 } 767 }
756 report->AddStats(std::move(inbound_audio)); 768 report->AddStats(std::move(inbound_audio));
757 } 769 }
758 // Outbound 770 // Outbound
759 for (const cricket::VoiceSenderInfo& voice_sender_info : 771 for (const cricket::VoiceSenderInfo& voice_sender_info :
760 media_info.voice->senders) { 772 track_media_info_map.voice_media_info()->senders) {
761 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 773 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
762 // is fixed. 774 // is fixed.
763 if (voice_sender_info.ssrc() == 0) 775 if (voice_sender_info.ssrc() == 0)
764 continue; 776 continue;
765 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio( 777 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_audio(
766 new RTCOutboundRTPStreamStats( 778 new RTCOutboundRTPStreamStats(
767 RTCOutboundRTPStreamStatsIDFromSSRC( 779 RTCOutboundRTPStreamStatsIDFromSSRC(
768 true, voice_sender_info.ssrc()), 780 true, voice_sender_info.ssrc()),
769 timestamp_us)); 781 timestamp_us));
770 SetOutboundRTPStreamStatsFromVoiceSenderInfo( 782 SetOutboundRTPStreamStatsFromVoiceSenderInfo(
771 voice_sender_info, outbound_audio.get()); 783 voice_sender_info, outbound_audio.get());
784 rtc::scoped_refptr<AudioTrackInterface> audio_track =
785 track_media_info_map_->GetAudioTrack(voice_sender_info);
786 if (audio_track) {
787 outbound_audio->media_track_id =
788 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
789 *audio_track, true);
790 }
772 outbound_audio->transport_id = transport_id; 791 outbound_audio->transport_id = transport_id;
773 if (voice_sender_info.codec_payload_type) { 792 if (voice_sender_info.codec_payload_type) {
774 outbound_audio->codec_id = 793 outbound_audio->codec_id =
775 RTCCodecStatsIDFromDirectionMediaAndPayload( 794 RTCCodecStatsIDFromDirectionMediaAndPayload(
776 false, true, *voice_sender_info.codec_payload_type); 795 false, true, *voice_sender_info.codec_payload_type);
777 } 796 }
778 report->AddStats(std::move(outbound_audio)); 797 report->AddStats(std::move(outbound_audio));
779 } 798 }
780 } 799 }
781 // Video 800 // Video
782 if (media_info.video) { 801 if (track_media_info_map.video_media_info()) {
783 std::string transport_id = RTCTransportStatsIDFromBaseChannel( 802 std::string transport_id = RTCTransportStatsIDFromBaseChannel(
784 session_stats.proxy_to_transport, *pc_->session()->video_channel()); 803 session_stats.proxy_to_transport, *pc_->session()->video_channel());
785 RTC_DCHECK(!transport_id.empty()); 804 RTC_DCHECK(!transport_id.empty());
786 // Inbound 805 // Inbound
787 for (const cricket::VideoReceiverInfo& video_receiver_info : 806 for (const cricket::VideoReceiverInfo& video_receiver_info :
788 media_info.video->receivers) { 807 track_media_info_map.video_media_info()->receivers) {
789 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 808 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
790 // is fixed. 809 // is fixed.
791 if (video_receiver_info.ssrc() == 0) 810 if (video_receiver_info.ssrc() == 0)
792 continue; 811 continue;
793 std::unique_ptr<RTCInboundRTPStreamStats> inbound_video( 812 std::unique_ptr<RTCInboundRTPStreamStats> inbound_video(
794 new RTCInboundRTPStreamStats( 813 new RTCInboundRTPStreamStats(
795 RTCInboundRTPStreamStatsIDFromSSRC( 814 RTCInboundRTPStreamStatsIDFromSSRC(
796 false, video_receiver_info.ssrc()), 815 false, video_receiver_info.ssrc()),
797 timestamp_us)); 816 timestamp_us));
798 SetInboundRTPStreamStatsFromVideoReceiverInfo( 817 SetInboundRTPStreamStatsFromVideoReceiverInfo(
799 video_receiver_info, inbound_video.get()); 818 video_receiver_info, inbound_video.get());
819 rtc::scoped_refptr<VideoTrackInterface> video_track =
820 track_media_info_map_->GetVideoTrack(video_receiver_info);
821 if (video_track) {
822 inbound_video->media_track_id =
823 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
824 *video_track, false);
825 }
800 inbound_video->transport_id = transport_id; 826 inbound_video->transport_id = transport_id;
801 if (video_receiver_info.codec_payload_type) { 827 if (video_receiver_info.codec_payload_type) {
802 inbound_video->codec_id = 828 inbound_video->codec_id =
803 RTCCodecStatsIDFromDirectionMediaAndPayload( 829 RTCCodecStatsIDFromDirectionMediaAndPayload(
804 true, false, *video_receiver_info.codec_payload_type); 830 true, false, *video_receiver_info.codec_payload_type);
805 } 831 }
806 report->AddStats(std::move(inbound_video)); 832 report->AddStats(std::move(inbound_video));
807 } 833 }
808 // Outbound 834 // Outbound
809 for (const cricket::VideoSenderInfo& video_sender_info : 835 for (const cricket::VideoSenderInfo& video_sender_info :
810 media_info.video->senders) { 836 track_media_info_map.video_media_info()->senders) {
811 // TODO(nisse): SSRC == 0 currently means none. Delete check when that 837 // TODO(nisse): SSRC == 0 currently means none. Delete check when that
812 // is fixed. 838 // is fixed.
813 if (video_sender_info.ssrc() == 0) 839 if (video_sender_info.ssrc() == 0)
814 continue; 840 continue;
815 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video( 841 std::unique_ptr<RTCOutboundRTPStreamStats> outbound_video(
816 new RTCOutboundRTPStreamStats( 842 new RTCOutboundRTPStreamStats(
817 RTCOutboundRTPStreamStatsIDFromSSRC( 843 RTCOutboundRTPStreamStatsIDFromSSRC(
818 false, video_sender_info.ssrc()), 844 false, video_sender_info.ssrc()),
819 timestamp_us)); 845 timestamp_us));
820 SetOutboundRTPStreamStatsFromVideoSenderInfo( 846 SetOutboundRTPStreamStatsFromVideoSenderInfo(
821 video_sender_info, outbound_video.get()); 847 video_sender_info, outbound_video.get());
848 rtc::scoped_refptr<VideoTrackInterface> video_track =
849 track_media_info_map_->GetVideoTrack(video_sender_info);
850 if (video_track) {
851 outbound_video->media_track_id =
852 RTCMediaStreamTrackStatsIDFromMediaStreamTrackInterface(
853 *video_track, true);
854 }
822 outbound_video->transport_id = transport_id; 855 outbound_video->transport_id = transport_id;
823 if (video_sender_info.codec_payload_type) { 856 if (video_sender_info.codec_payload_type) {
824 outbound_video->codec_id = 857 outbound_video->codec_id =
825 RTCCodecStatsIDFromDirectionMediaAndPayload( 858 RTCCodecStatsIDFromDirectionMediaAndPayload(
826 false, false, *video_sender_info.codec_payload_type); 859 false, false, *video_sender_info.codec_payload_type);
827 } 860 }
828 report->AddStats(std::move(outbound_video)); 861 report->AddStats(std::move(outbound_video));
829 } 862 }
830 } 863 }
831 } 864 }
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 if (remote_certificate) { 948 if (remote_certificate) {
916 certificate_stats_pair.remote = remote_certificate->GetStats(); 949 certificate_stats_pair.remote = remote_certificate->GetStats();
917 } 950 }
918 transport_cert_stats.insert( 951 transport_cert_stats.insert(
919 std::make_pair(transport_stats.second.transport_name, 952 std::make_pair(transport_stats.second.transport_name,
920 std::move(certificate_stats_pair))); 953 std::move(certificate_stats_pair)));
921 } 954 }
922 return transport_cert_stats; 955 return transport_cert_stats;
923 } 956 }
924 957
925 std::unique_ptr<RTCStatsCollector::MediaInfo> 958 std::unique_ptr<TrackMediaInfoMap>
926 RTCStatsCollector::PrepareMediaInfo_s() const { 959 RTCStatsCollector::PrepareTrackMediaInfoMap_s() const {
927 RTC_DCHECK(signaling_thread_->IsCurrent()); 960 RTC_DCHECK(signaling_thread_->IsCurrent());
928 std::unique_ptr<MediaInfo> media_info(new MediaInfo()); 961 std::unique_ptr<cricket::VoiceMediaInfo> voice_media_info;
929 if (pc_->session()->voice_channel()) { 962 if (pc_->session()->voice_channel()) {
930 cricket::VoiceMediaInfo voice_media_info; 963 voice_media_info.reset(new cricket::VoiceMediaInfo());
931 if (pc_->session()->voice_channel()->GetStats(&voice_media_info)) { 964 if (!pc_->session()->voice_channel()->GetStats(voice_media_info.get())) {
932 media_info->voice = rtc::Optional<cricket::VoiceMediaInfo>( 965 voice_media_info.reset();
933 std::move(voice_media_info));
934 } 966 }
935 } 967 }
968 std::unique_ptr<cricket::VideoMediaInfo> video_media_info;
936 if (pc_->session()->video_channel()) { 969 if (pc_->session()->video_channel()) {
937 cricket::VideoMediaInfo video_media_info; 970 video_media_info.reset(new cricket::VideoMediaInfo());
938 if (pc_->session()->video_channel()->GetStats(&video_media_info)) { 971 if (!pc_->session()->video_channel()->GetStats(video_media_info.get())) {
939 media_info->video = rtc::Optional<cricket::VideoMediaInfo>( 972 video_media_info.reset();
940 std::move(video_media_info));
941 } 973 }
942 } 974 }
943 return media_info; 975 std::unique_ptr<TrackMediaInfoMap> track_media_info_map(
976 new TrackMediaInfoMap(std::move(voice_media_info),
977 std::move(video_media_info)));
978 track_media_info_map->Initialize(pc_->GetSenders(), pc_->GetReceivers());
979 return track_media_info_map;
944 } 980 }
945 981
946 void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) { 982 void RTCStatsCollector::OnDataChannelCreated(DataChannel* channel) {
947 channel->SignalOpened.connect(this, &RTCStatsCollector::OnDataChannelOpened); 983 channel->SignalOpened.connect(this, &RTCStatsCollector::OnDataChannelOpened);
948 channel->SignalClosed.connect(this, &RTCStatsCollector::OnDataChannelClosed); 984 channel->SignalClosed.connect(this, &RTCStatsCollector::OnDataChannelClosed);
949 } 985 }
950 986
951 void RTCStatsCollector::OnDataChannelOpened(DataChannel* channel) { 987 void RTCStatsCollector::OnDataChannelOpened(DataChannel* channel) {
952 RTC_DCHECK(signaling_thread_->IsCurrent()); 988 RTC_DCHECK(signaling_thread_->IsCurrent());
953 bool result = internal_record_.opened_data_channels.insert( 989 bool result = internal_record_.opened_data_channels.insert(
(...skipping 17 matching lines...) Expand all
971 const std::string& type) { 1007 const std::string& type) {
972 return CandidateTypeToRTCIceCandidateType(type); 1008 return CandidateTypeToRTCIceCandidateType(type);
973 } 1009 }
974 1010
975 const char* DataStateToRTCDataChannelStateForTesting( 1011 const char* DataStateToRTCDataChannelStateForTesting(
976 DataChannelInterface::DataState state) { 1012 DataChannelInterface::DataState state) {
977 return DataStateToRTCDataChannelState(state); 1013 return DataStateToRTCDataChannelState(state);
978 } 1014 }
979 1015
980 } // namespace webrtc 1016 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698