OLD | NEW |
1 /* | 1 /* |
2 * libjingle | 2 * libjingle |
3 * Copyright 2012 Google Inc. | 3 * Copyright 2012 Google Inc. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are met: | 6 * modification, are permitted provided that the following conditions are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright notice, | 8 * 1. Redistributions of source code must retain the above copyright notice, |
9 * this list of conditions and the following disclaimer. | 9 * this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | 10 * 2. Redistributions in binary form must reproduce the above copyright notice, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
73 const std::string& proxy) { | 73 const std::string& proxy) { |
74 DCHECK(!proxy.empty()); | 74 DCHECK(!proxy.empty()); |
75 cricket::ProxyTransportMap::const_iterator found = map.find(proxy); | 75 cricket::ProxyTransportMap::const_iterator found = map.find(proxy); |
76 if (found == map.end()) | 76 if (found == map.end()) |
77 return StatsReport::Id(); | 77 return StatsReport::Id(); |
78 | 78 |
79 return StatsReport::NewComponentId( | 79 return StatsReport::NewComponentId( |
80 found->second, cricket::ICE_CANDIDATE_COMPONENT_RTP); | 80 found->second, cricket::ICE_CANDIDATE_COMPONENT_RTP); |
81 } | 81 } |
82 | 82 |
83 void AddTrackReport(StatsCollection* reports, const std::string& track_id) { | 83 StatsReport* AddTrackReport(StatsCollection* reports, |
| 84 const std::string& track_id) { |
84 // Adds an empty track report. | 85 // Adds an empty track report. |
85 StatsReport::Id id( | 86 StatsReport::Id id( |
86 StatsReport::NewTypedId(StatsReport::kStatsReportTypeTrack, track_id)); | 87 StatsReport::NewTypedId(StatsReport::kStatsReportTypeTrack, track_id)); |
87 StatsReport* report = reports->ReplaceOrAddNew(id); | 88 StatsReport* report = reports->ReplaceOrAddNew(id); |
88 report->AddString(StatsReport::kStatsValueNameTrackId, track_id); | 89 report->AddString(StatsReport::kStatsValueNameTrackId, track_id); |
| 90 return report; |
89 } | 91 } |
90 | 92 |
91 template <class TrackVector> | 93 template <class TrackVector> |
92 void CreateTrackReports(const TrackVector& tracks, StatsCollection* reports) { | 94 void CreateTrackReports(const TrackVector& tracks, StatsCollection* reports, |
93 for (const auto& track : tracks) | 95 TrackIdMap& track_ids) { |
94 AddTrackReport(reports, track->id()); | 96 for (const auto& track : tracks) { |
| 97 const std::string& track_id = track->id(); |
| 98 StatsReport* report = AddTrackReport(reports, track_id); |
| 99 DCHECK(report != nullptr); |
| 100 track_ids[track_id] = report; |
| 101 } |
95 } | 102 } |
96 | 103 |
97 void ExtractCommonSendProperties(const cricket::MediaSenderInfo& info, | 104 void ExtractCommonSendProperties(const cricket::MediaSenderInfo& info, |
98 StatsReport* report) { | 105 StatsReport* report) { |
99 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); | 106 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); |
100 report->AddInt64(StatsReport::kStatsValueNameBytesSent, info.bytes_sent); | 107 report->AddInt64(StatsReport::kStatsValueNameBytesSent, info.bytes_sent); |
101 report->AddInt64(StatsReport::kStatsValueNameRtt, info.rtt_ms); | 108 report->AddInt64(StatsReport::kStatsValueNameRtt, info.rtt_ms); |
102 } | 109 } |
103 | 110 |
104 void SetAudioProcessingStats(StatsReport* report, int signal_level, | 111 void SetAudioProcessingStats(StatsReport* report, int signal_level, |
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 return rtc::Timing::WallTimeNow() * rtc::kNumMillisecsPerSec; | 365 return rtc::Timing::WallTimeNow() * rtc::kNumMillisecsPerSec; |
359 } | 366 } |
360 | 367 |
361 // Adds a MediaStream with tracks that can be used as a |selector| in a call | 368 // Adds a MediaStream with tracks that can be used as a |selector| in a call |
362 // to GetStats. | 369 // to GetStats. |
363 void StatsCollector::AddStream(MediaStreamInterface* stream) { | 370 void StatsCollector::AddStream(MediaStreamInterface* stream) { |
364 DCHECK(session_->signaling_thread()->IsCurrent()); | 371 DCHECK(session_->signaling_thread()->IsCurrent()); |
365 DCHECK(stream != NULL); | 372 DCHECK(stream != NULL); |
366 | 373 |
367 CreateTrackReports<AudioTrackVector>(stream->GetAudioTracks(), | 374 CreateTrackReports<AudioTrackVector>(stream->GetAudioTracks(), |
368 &reports_); | 375 &reports_, track_ids_); |
369 CreateTrackReports<VideoTrackVector>(stream->GetVideoTracks(), | 376 CreateTrackReports<VideoTrackVector>(stream->GetVideoTracks(), |
370 &reports_); | 377 &reports_, track_ids_); |
371 } | 378 } |
372 | 379 |
373 void StatsCollector::AddLocalAudioTrack(AudioTrackInterface* audio_track, | 380 void StatsCollector::AddLocalAudioTrack(AudioTrackInterface* audio_track, |
374 uint32 ssrc) { | 381 uint32 ssrc) { |
375 DCHECK(session_->signaling_thread()->IsCurrent()); | 382 DCHECK(session_->signaling_thread()->IsCurrent()); |
376 DCHECK(audio_track != NULL); | 383 DCHECK(audio_track != NULL); |
377 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) | 384 #if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) |
378 for (const auto& track : local_audio_tracks_) | 385 for (const auto& track : local_audio_tracks_) |
379 DCHECK(track.first != audio_track || track.second != ssrc); | 386 DCHECK(track.first != audio_track || track.second != ssrc); |
380 #endif | 387 #endif |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 // TODO(tommi): All of these hop over to the worker thread to fetch | 466 // TODO(tommi): All of these hop over to the worker thread to fetch |
460 // information. We could use an AsyncInvoker to run all of these and post | 467 // information. We could use an AsyncInvoker to run all of these and post |
461 // the information back to the signaling thread where we can create and | 468 // the information back to the signaling thread where we can create and |
462 // update stats reports. That would also clean up the threading story a bit | 469 // update stats reports. That would also clean up the threading story a bit |
463 // since we'd be creating/updating the stats report objects consistently on | 470 // since we'd be creating/updating the stats report objects consistently on |
464 // the same thread (this class has no locks right now). | 471 // the same thread (this class has no locks right now). |
465 ExtractSessionInfo(); | 472 ExtractSessionInfo(); |
466 ExtractVoiceInfo(); | 473 ExtractVoiceInfo(); |
467 ExtractVideoInfo(level); | 474 ExtractVideoInfo(level); |
468 ExtractDataInfo(); | 475 ExtractDataInfo(); |
| 476 UpdateTrackReports(); |
469 } | 477 } |
470 } | 478 } |
471 | 479 |
472 StatsReport* StatsCollector::PrepareReport( | 480 StatsReport* StatsCollector::PrepareReport( |
473 bool local, | 481 bool local, |
474 uint32 ssrc, | 482 uint32 ssrc, |
475 const StatsReport::Id& transport_id, | 483 const StatsReport::Id& transport_id, |
476 StatsReport::Direction direction) { | 484 StatsReport::Direction direction) { |
477 DCHECK(session_->signaling_thread()->IsCurrent()); | 485 DCHECK(session_->signaling_thread()->IsCurrent()); |
478 StatsReport::Id id(StatsReport::NewIdWithDirection( | 486 StatsReport::Id id(StatsReport::NewIdWithDirection( |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 LOG(LS_ERROR) << "Stats report does not exist for ssrc " << ssrc; | 870 LOG(LS_ERROR) << "Stats report does not exist for ssrc " << ssrc; |
863 continue; | 871 continue; |
864 } | 872 } |
865 | 873 |
866 // The same ssrc can be used by both local and remote audio tracks. | 874 // The same ssrc can be used by both local and remote audio tracks. |
867 const StatsReport::Value* v = | 875 const StatsReport::Value* v = |
868 report->FindValue(StatsReport::kStatsValueNameTrackId); | 876 report->FindValue(StatsReport::kStatsValueNameTrackId); |
869 if (!v || v->string_val() != track->id()) | 877 if (!v || v->string_val() != track->id()) |
870 continue; | 878 continue; |
871 | 879 |
| 880 report->set_timestamp(stats_gathering_started_); |
872 UpdateReportFromAudioTrack(track, report); | 881 UpdateReportFromAudioTrack(track, report); |
873 } | 882 } |
874 } | 883 } |
875 | 884 |
876 void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track, | 885 void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track, |
877 StatsReport* report) { | 886 StatsReport* report) { |
878 DCHECK(session_->signaling_thread()->IsCurrent()); | 887 DCHECK(session_->signaling_thread()->IsCurrent()); |
879 DCHECK(track != NULL); | 888 DCHECK(track != NULL); |
880 | 889 |
881 int signal_level = 0; | 890 int signal_level = 0; |
(...skipping 27 matching lines...) Expand all Loading... |
909 if (!session_->GetRemoteTrackIdBySsrc(ssrc, track_id)) { | 918 if (!session_->GetRemoteTrackIdBySsrc(ssrc, track_id)) { |
910 LOG(LS_WARNING) << "The SSRC " << ssrc | 919 LOG(LS_WARNING) << "The SSRC " << ssrc |
911 << " is not associated with a receiving track"; | 920 << " is not associated with a receiving track"; |
912 return false; | 921 return false; |
913 } | 922 } |
914 } | 923 } |
915 | 924 |
916 return true; | 925 return true; |
917 } | 926 } |
918 | 927 |
| 928 void StatsCollector::UpdateTrackReports() { |
| 929 DCHECK(session_->signaling_thread()->IsCurrent()); |
| 930 |
| 931 rtc::Thread::ScopedDisallowBlockingCalls no_blocking_calls; |
| 932 |
| 933 for (const auto& entry : track_ids_) { |
| 934 StatsReport* report = entry.second; |
| 935 report->set_timestamp(stats_gathering_started_); |
| 936 } |
| 937 |
| 938 } |
| 939 |
919 void StatsCollector::ClearUpdateStatsCacheForTest() { | 940 void StatsCollector::ClearUpdateStatsCacheForTest() { |
920 stats_gathering_started_ = 0; | 941 stats_gathering_started_ = 0; |
921 } | 942 } |
922 | 943 |
923 } // namespace webrtc | 944 } // namespace webrtc |
OLD | NEW |