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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); | 108 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); |
109 report->AddInt64(StatsReport::kStatsValueNameBytesSent, info.bytes_sent); | 109 report->AddInt64(StatsReport::kStatsValueNameBytesSent, info.bytes_sent); |
110 report->AddInt64(StatsReport::kStatsValueNameRtt, info.rtt_ms); | 110 report->AddInt64(StatsReport::kStatsValueNameRtt, info.rtt_ms); |
111 } | 111 } |
112 | 112 |
113 void ExtractCommonReceiveProperties(const cricket::MediaReceiverInfo& info, | 113 void ExtractCommonReceiveProperties(const cricket::MediaReceiverInfo& info, |
114 StatsReport* report) { | 114 StatsReport* report) { |
115 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); | 115 report->AddString(StatsReport::kStatsValueNameCodecName, info.codec_name); |
116 } | 116 } |
117 | 117 |
118 void SetAudioProcessingStats(StatsReport* report, int signal_level, | 118 void SetAudioProcessingStats(StatsReport* report, |
119 bool typing_noise_detected, int echo_return_loss, | 119 bool typing_noise_detected, |
120 int echo_return_loss_enhancement, int echo_delay_median_ms, | 120 int echo_return_loss, |
121 float aec_quality_min, int echo_delay_std_ms) { | 121 int echo_return_loss_enhancement, |
| 122 int echo_delay_median_ms, |
| 123 float aec_quality_min, |
| 124 int echo_delay_std_ms) { |
122 report->AddBoolean(StatsReport::kStatsValueNameTypingNoiseState, | 125 report->AddBoolean(StatsReport::kStatsValueNameTypingNoiseState, |
123 typing_noise_detected); | 126 typing_noise_detected); |
124 report->AddFloat(StatsReport::kStatsValueNameEchoCancellationQualityMin, | 127 report->AddFloat(StatsReport::kStatsValueNameEchoCancellationQualityMin, |
125 aec_quality_min); | 128 aec_quality_min); |
126 // Don't overwrite the previous signal level if it's not available now. | |
127 if (signal_level >= 0) | |
128 report->AddInt(StatsReport::kStatsValueNameAudioInputLevel, signal_level); | |
129 const IntForAdd ints[] = { | 129 const IntForAdd ints[] = { |
130 { StatsReport::kStatsValueNameEchoReturnLoss, echo_return_loss }, | 130 { StatsReport::kStatsValueNameEchoReturnLoss, echo_return_loss }, |
131 { StatsReport::kStatsValueNameEchoReturnLossEnhancement, | 131 { StatsReport::kStatsValueNameEchoReturnLossEnhancement, |
132 echo_return_loss_enhancement }, | 132 echo_return_loss_enhancement }, |
133 { StatsReport::kStatsValueNameEchoDelayMedian, echo_delay_median_ms }, | 133 { StatsReport::kStatsValueNameEchoDelayMedian, echo_delay_median_ms }, |
134 { StatsReport::kStatsValueNameEchoDelayStdDev, echo_delay_std_ms }, | 134 { StatsReport::kStatsValueNameEchoDelayStdDev, echo_delay_std_ms }, |
135 }; | 135 }; |
136 for (const auto& i : ints) | 136 for (const auto& i : ints) |
137 report->AddInt(i.name, i.value); | 137 report->AddInt(i.name, i.value); |
138 } | 138 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
175 | 175 |
176 report->AddInt64(StatsReport::kStatsValueNameBytesReceived, | 176 report->AddInt64(StatsReport::kStatsValueNameBytesReceived, |
177 info.bytes_rcvd); | 177 info.bytes_rcvd); |
178 report->AddInt64(StatsReport::kStatsValueNameCaptureStartNtpTimeMs, | 178 report->AddInt64(StatsReport::kStatsValueNameCaptureStartNtpTimeMs, |
179 info.capture_start_ntp_time_ms); | 179 info.capture_start_ntp_time_ms); |
180 } | 180 } |
181 | 181 |
182 void ExtractStats(const cricket::VoiceSenderInfo& info, StatsReport* report) { | 182 void ExtractStats(const cricket::VoiceSenderInfo& info, StatsReport* report) { |
183 ExtractCommonSendProperties(info, report); | 183 ExtractCommonSendProperties(info, report); |
184 | 184 |
185 SetAudioProcessingStats(report, info.audio_level, info.typing_noise_detected, | 185 SetAudioProcessingStats( |
186 info.echo_return_loss, info.echo_return_loss_enhancement, | 186 report, info.typing_noise_detected, info.echo_return_loss, |
187 info.echo_delay_median_ms, info.aec_quality_min, info.echo_delay_std_ms); | 187 info.echo_return_loss_enhancement, info.echo_delay_median_ms, |
| 188 info.aec_quality_min, info.echo_delay_std_ms); |
188 | 189 |
| 190 RTC_DCHECK_GE(info.audio_level, 0); |
189 const IntForAdd ints[] = { | 191 const IntForAdd ints[] = { |
| 192 { StatsReport::kStatsValueNameAudioInputLevel, info.audio_level}, |
190 { StatsReport::kStatsValueNameJitterReceived, info.jitter_ms }, | 193 { StatsReport::kStatsValueNameJitterReceived, info.jitter_ms }, |
191 { StatsReport::kStatsValueNamePacketsLost, info.packets_lost }, | 194 { StatsReport::kStatsValueNamePacketsLost, info.packets_lost }, |
192 { StatsReport::kStatsValueNamePacketsSent, info.packets_sent }, | 195 { StatsReport::kStatsValueNamePacketsSent, info.packets_sent }, |
193 }; | 196 }; |
194 | 197 |
195 for (const auto& i : ints) | 198 for (const auto& i : ints) |
196 report->AddInt(i.name, i.value); | 199 report->AddInt(i.name, i.value); |
197 } | 200 } |
198 | 201 |
199 void ExtractStats(const cricket::VideoReceiverInfo& info, StatsReport* report) { | 202 void ExtractStats(const cricket::VideoReceiverInfo& info, StatsReport* report) { |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 report->set_timestamp(stats_gathering_started_); | 887 report->set_timestamp(stats_gathering_started_); |
885 UpdateReportFromAudioTrack(track, report); | 888 UpdateReportFromAudioTrack(track, report); |
886 } | 889 } |
887 } | 890 } |
888 | 891 |
889 void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track, | 892 void StatsCollector::UpdateReportFromAudioTrack(AudioTrackInterface* track, |
890 StatsReport* report) { | 893 StatsReport* report) { |
891 RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent()); | 894 RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent()); |
892 RTC_DCHECK(track != NULL); | 895 RTC_DCHECK(track != NULL); |
893 | 896 |
894 int signal_level = 0; | 897 // Don't overwrite report values if they're not available. |
895 if (!track->GetSignalLevel(&signal_level)) | 898 int signal_level; |
896 signal_level = -1; | 899 if (track->GetSignalLevel(&signal_level)) { |
| 900 RTC_DCHECK_GE(signal_level, 0); |
| 901 report->AddInt(StatsReport::kStatsValueNameAudioInputLevel, signal_level); |
| 902 } |
897 | 903 |
898 rtc::scoped_refptr<AudioProcessorInterface> audio_processor( | 904 auto audio_processor(track->GetAudioProcessor()); |
899 track->GetAudioProcessor()); | |
900 | 905 |
901 AudioProcessorInterface::AudioProcessorStats stats; | 906 if (audio_processor.get()) { |
902 if (audio_processor.get()) | 907 AudioProcessorInterface::AudioProcessorStats stats; |
903 audio_processor->GetStats(&stats); | 908 audio_processor->GetStats(&stats); |
904 | 909 |
905 SetAudioProcessingStats(report, signal_level, stats.typing_noise_detected, | 910 SetAudioProcessingStats( |
906 stats.echo_return_loss, stats.echo_return_loss_enhancement, | 911 report, stats.typing_noise_detected, stats.echo_return_loss, |
907 stats.echo_delay_median_ms, stats.aec_quality_min, | 912 stats.echo_return_loss_enhancement, stats.echo_delay_median_ms, |
908 stats.echo_delay_std_ms); | 913 stats.aec_quality_min, stats.echo_delay_std_ms); |
| 914 } |
909 } | 915 } |
910 | 916 |
911 bool StatsCollector::GetTrackIdBySsrc(uint32_t ssrc, | 917 bool StatsCollector::GetTrackIdBySsrc(uint32_t ssrc, |
912 std::string* track_id, | 918 std::string* track_id, |
913 StatsReport::Direction direction) { | 919 StatsReport::Direction direction) { |
914 RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent()); | 920 RTC_DCHECK(pc_->session()->signaling_thread()->IsCurrent()); |
915 if (direction == StatsReport::kSend) { | 921 if (direction == StatsReport::kSend) { |
916 if (!pc_->session()->GetLocalTrackIdBySsrc(ssrc, track_id)) { | 922 if (!pc_->session()->GetLocalTrackIdBySsrc(ssrc, track_id)) { |
917 LOG(LS_WARNING) << "The SSRC " << ssrc | 923 LOG(LS_WARNING) << "The SSRC " << ssrc |
918 << " is not associated with a sending track"; | 924 << " is not associated with a sending track"; |
(...skipping 20 matching lines...) Expand all Loading... |
939 StatsReport* report = entry.second; | 945 StatsReport* report = entry.second; |
940 report->set_timestamp(stats_gathering_started_); | 946 report->set_timestamp(stats_gathering_started_); |
941 } | 947 } |
942 } | 948 } |
943 | 949 |
944 void StatsCollector::ClearUpdateStatsCacheForTest() { | 950 void StatsCollector::ClearUpdateStatsCacheForTest() { |
945 stats_gathering_started_ = 0; | 951 stats_gathering_started_ = 0; |
946 } | 952 } |
947 | 953 |
948 } // namespace webrtc | 954 } // namespace webrtc |
OLD | NEW |