From 9a394f0649d39737a791d17e73ad2603e3d162fb Mon Sep 17 00:00:00 2001 From: hbos Date: Wed, 14 Dec 2016 07:58:22 -0800 Subject: [PATCH] Skip RTCMediaStreamTrackStats.echoReturnLoss[Enhancement] default value. Due to the Chromium implementation[1] of GetAudioProcesssingStats, echoReturnLoss and echoReturnLossEnhancement could default to -100 when no value was available. This should be improved by using rtc::Optional or AudioProcessorInterface::GetStats being able to return false, but this requires a bunch of refactoring. In the meantime we "blacklist" the value -100 which is a nonsense value anyway. In that case echoReturnLoss[Enhancement] is correctly left undefined. [1] https://cs.chromium.org/chromium/src/content/renderer/media/media_stream_audio_processor_options.cc?sq=package:chromium&dr=C&rcl=1481530670&l=461 BUG=chromium:669877 Review-Url: https://codereview.webrtc.org/2573443002 Cr-Commit-Position: refs/heads/master@{#15611} --- webrtc/api/rtcstatscollector.cc | 12 ++++--- webrtc/api/rtcstatscollector_unittest.cc | 40 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/webrtc/api/rtcstatscollector.cc b/webrtc/api/rtcstatscollector.cc index 9998d9aafe..5289c4820b 100644 --- a/webrtc/api/rtcstatscollector.cc +++ b/webrtc/api/rtcstatscollector.cc @@ -317,10 +317,14 @@ void ProduceMediaStreamAndTrackStats( if (audio_track->GetAudioProcessor()) { AudioProcessorInterface::AudioProcessorStats audio_processor_stats; audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); - audio_track_stats->echo_return_loss = static_cast( - audio_processor_stats.echo_return_loss); - audio_track_stats->echo_return_loss_enhancement = static_cast( - audio_processor_stats.echo_return_loss_enhancement); + if (audio_processor_stats.echo_return_loss != -100) { + audio_track_stats->echo_return_loss = static_cast( + audio_processor_stats.echo_return_loss); + } + if (audio_processor_stats.echo_return_loss_enhancement != -100) { + audio_track_stats->echo_return_loss_enhancement = static_cast( + audio_processor_stats.echo_return_loss_enhancement); + } } report->AddStats(std::move(audio_track_stats)); } diff --git a/webrtc/api/rtcstatscollector_unittest.cc b/webrtc/api/rtcstatscollector_unittest.cc index 278d945378..6d0b56fc0f 100644 --- a/webrtc/api/rtcstatscollector_unittest.cc +++ b/webrtc/api/rtcstatscollector_unittest.cc @@ -1211,6 +1211,46 @@ TEST_F(RTCStatsCollectorTest, RTCMediaStreamTrackStats>()); } +TEST_F(RTCStatsCollectorTest, + CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Audio_Defaults) { + rtc::scoped_refptr local_streams = + StreamCollection::Create(); + EXPECT_CALL(test_->pc(), local_streams()) + .WillRepeatedly(Return(local_streams)); + + rtc::scoped_refptr local_stream = + MediaStream::Create("LocalStreamLabel"); + local_streams->AddStream(local_stream); + + // Local audio track + AudioProcessorInterface::AudioProcessorStats local_audio_processor_stats; + local_audio_processor_stats.echo_return_loss = -100; + local_audio_processor_stats.echo_return_loss_enhancement = -100; + rtc::scoped_refptr local_audio_track = + FakeAudioTrackForStats::Create( + "LocalAudioTrackID", + MediaStreamTrackInterface::TrackState::kEnded, + 32767, + new FakeAudioProcessorForStats(local_audio_processor_stats)); + local_stream->AddTrack(local_audio_track); + + rtc::scoped_refptr report = GetStatsReport(); + + RTCMediaStreamTrackStats expected_local_audio_track( + "RTCMediaStreamTrack_LocalAudioTrackID", report->timestamp_us()); + expected_local_audio_track.track_identifier = local_audio_track->id(); + expected_local_audio_track.remote_source = false; + expected_local_audio_track.ended = true; + expected_local_audio_track.detached = false; + expected_local_audio_track.audio_level = 1.0; + // Should be undefined: |expected_local_audio_track.echo_return_loss| and + // |expected_local_audio_track.echo_return_loss_enhancement|. + EXPECT_TRUE(report->Get(expected_local_audio_track.id())); + EXPECT_EQ(expected_local_audio_track, + report->Get(expected_local_audio_track.id())->cast_to< + RTCMediaStreamTrackStats>()); +} + TEST_F(RTCStatsCollectorTest, CollectRTCMediaStreamStatsAndRTCMediaStreamTrackStats_Video) { rtc::scoped_refptr local_streams =