Chromium Code Reviews| Index: chrome/browser/media/chrome_webrtc_audio_quality_browsertest.cc |
| diff --git a/chrome/browser/media/chrome_webrtc_audio_quality_browsertest.cc b/chrome/browser/media/chrome_webrtc_audio_quality_browsertest.cc |
| index 263b61a2bb703531a1cbeb10cb71c1ac9e04dc34..fecdc20f6ead8291806376deb3f0831a9cefd2ab 100644 |
| --- a/chrome/browser/media/chrome_webrtc_audio_quality_browsertest.cc |
| +++ b/chrome/browser/media/chrome_webrtc_audio_quality_browsertest.cc |
| @@ -172,6 +172,10 @@ class MAYBE_WebRtcAudioQualityBrowserTest : public WebRtcTestBase { |
| void TestAutoGainControl(const base::FilePath::StringType& reference_filename, |
| const std::string& constraints, |
| const std::string& perf_modifier); |
| + void SetupAndRecordAudioCall(const base::FilePath& reference_file, |
| + const base::FilePath& recording, |
| + const std::string& constraints, |
| + const base::TimeDelta recording_time); |
| }; |
| namespace { |
| @@ -187,17 +191,19 @@ class AudioRecorder { |
| // unless |mono| is true. |
| // TODO(phoglund): make win and mac also support the record_cd parameter. Or, |
| // even better, make everybody use the CD format rather than DAT. |
| - bool StartRecording(int duration_sec, const base::FilePath& output_file, |
| - bool mono, bool record_cd) { |
| + bool StartRecording(base::TimeDelta recording_time, |
| + const base::FilePath& output_file, bool mono, |
| + bool record_cd) { |
| EXPECT_FALSE(recording_application_.IsValid()) |
| << "Tried to record, but is already recording."; |
| + int duration_sec = static_cast<int>(recording_time.InSeconds()); |
| base::CommandLine command_line(base::CommandLine::NO_PROGRAM); |
| + |
| #if defined(OS_WIN) |
| // This disable is required to run SoundRecorder.exe on 64-bit Windows |
| // from a 32-bit binary. We need to load the wow64 disable function from |
| // the DLL since it doesn't exist on Windows XP. |
| - // TODO(phoglund): find some cleaner solution than using SoundRecorder.exe. |
| base::ScopedNativeLibrary kernel32_lib(base::FilePath(L"kernel32")); |
| if (kernel32_lib.is_valid()) { |
| typedef BOOL (WINAPI* Wow64DisableWow64FSRedirection)(PVOID*); |
| @@ -561,17 +567,98 @@ void AnalyzeSegmentsAndPrintResult( |
| } |
| } |
| +void ComputeAndPrintPesqResults(const base::FilePath& reference_file, |
| + const base::FilePath& recording, |
| + const std::string& perf_modifier) { |
| + base::FilePath trimmed_reference = CreateTemporaryWaveFile(); |
| + base::FilePath trimmed_recording = CreateTemporaryWaveFile(); |
| + |
| + ASSERT_TRUE(RemoveSilence(recording, trimmed_reference)); |
| + ASSERT_TRUE(RemoveSilence(recording, trimmed_recording)); |
| + |
| + std::string raw_mos; |
| + std::string mos_lqo; |
| + ASSERT_TRUE(RunPesq(trimmed_reference, trimmed_recording, 16000, |
| + &raw_mos, &mos_lqo)); |
| + |
| + perf_test::PrintResult( |
| + "audio_pesq", perf_modifier, "raw_mos", raw_mos, "score", true); |
| + perf_test::PrintResult( |
| + "audio_pesq", perf_modifier, "mos_lqo", mos_lqo, "score", true); |
| + |
| + EXPECT_TRUE(base::DeleteFile(trimmed_reference, false)); |
| + EXPECT_TRUE(base::DeleteFile(trimmed_recording, false)); |
| +} |
| + |
| } // namespace |
| +// Sets up a one-way WebRTC call and records its output to |recording|, using |
| +// getUserMedia. |
| +// |
| +// |reference_file| should have at least two seconds of silence in the |
| +// beginning: otherwise all the reference audio will not be picked up by the |
| +// recording. Note that the reference file will start playing as soon as the |
| +// audio device is up following the getUserMedia call in the left tab. The time |
| +// it takes to negotiate a call isn't deterministic, but two seconds should be |
| +// plenty of time. Similarly, the recording time should be enough to catch the |
| +// whole reference file. If you then silence-trim the reference file and actual |
| +// file, you should end up with two time-synchronized files. |
| +void MAYBE_WebRtcAudioQualityBrowserTest::SetupAndRecordAudioCall( |
| + const base::FilePath& reference_file, |
| + const base::FilePath& recording, |
| + const std::string& constraints, |
| + const base::TimeDelta recording_time) { |
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| + ASSERT_TRUE(test::HasReferenceFilesInCheckout()); |
| + ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent()); |
| + |
| + ConfigureFakeDeviceToPlayFile(reference_file); |
| + |
| + // Create a one-way call. |
| + GURL test_page = embedded_test_server()->GetURL(kWebRtcAudioTestHtmlPage); |
| + content::WebContents* left_tab = |
| + OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints); |
| + SetupPeerconnectionWithLocalStream(left_tab); |
| + |
| + content::WebContents* right_tab = |
| + OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage); |
| + |
| + AudioRecorder recorder; |
| + ASSERT_TRUE(recorder.StartRecording(recording_time, recording, false, true)); |
| + |
| + NegotiateCall(left_tab, right_tab); |
| + |
| + ASSERT_TRUE(recorder.WaitForRecordingToEnd()); |
| + DVLOG(0) << "Done recording to " << recording.value() << std::endl; |
| + |
| + HangUp(left_tab); |
| +} |
| + |
| IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| - MANUAL_TestAudioQuality) { |
| - if (OnWinXp()) { |
| - LOG(ERROR) << "This test is not implemented for Windows XP."; |
| + MANUAL_TestCallQualityWithAudioFromFakeDevice) { |
| + if (OnWinXp() || OnWin8()) { |
| + // http://crbug.com/379798. |
| + LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; |
| return; |
| } |
| - if (OnWin8()) { |
| + |
| + base::FilePath reference_file = |
| + test::GetReferenceFilesDir().Append(kReferenceFile); |
| + base::FilePath recording = CreateTemporaryWaveFile(); |
| + |
| + ASSERT_NO_FATAL_FAILURE(SetupAndRecordAudioCall( |
| + reference_file, recording, kAudioOnlyCallConstraints, |
| + base::TimeDelta::FromSeconds(25))); |
| + ComputeAndPrintPesqResults(reference_file, recording, "_getusermedia"); |
| + |
| + EXPECT_TRUE(base::DeleteFile(recording, false)); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| + MANUAL_TestCallQualityWithAudioFromWebAudio) { |
| + if (OnWinXp() || OnWin8()) { |
| // http://crbug.com/379798. |
| - LOG(ERROR) << "Temporarily disabled for Win 8."; |
| + LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; |
| return; |
| } |
| ASSERT_TRUE(test::HasReferenceFilesInCheckout()); |
| @@ -588,19 +675,13 @@ IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| NegotiateCall(left_tab, right_tab); |
| - // Note: the media flow isn't necessarily established on the connection just |
| - // because the ready state is ok on both sides. We sleep a bit between call |
| - // establishment and playing to avoid cutting off the beginning of the stream. |
| - test::SleepInJavascript(left_tab, 2000); |
| - |
| base::FilePath recording = CreateTemporaryWaveFile(); |
| - // Note: the sound clip is about 10 seconds: record for 15 seconds to get some |
| + // Note: the sound clip is about 13 seconds: record for 20 seconds to get some |
|
phoglund_chromium
2015/01/07 15:16:26
This is because I added 3 seconds of silence to th
|
| // safety margins on each side. |
| AudioRecorder recorder; |
| - static int kRecordingTimeSeconds = 15; |
| - ASSERT_TRUE(recorder.StartRecording(kRecordingTimeSeconds, recording, |
| - true, false)); |
| + ASSERT_TRUE(recorder.StartRecording(base::TimeDelta::FromSeconds(20), |
| + recording, true, false)); |
| PlayAudioFileThroughWebAudio(left_tab); |
| @@ -609,23 +690,11 @@ IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| HangUp(left_tab); |
| - base::FilePath trimmed_recording = CreateTemporaryWaveFile(); |
| - |
| - ASSERT_TRUE(RemoveSilence(recording, trimmed_recording)); |
| - DVLOG(0) << "Trimmed silence: " << trimmed_recording.value() << std::endl; |
| - |
| - std::string raw_mos; |
| - std::string mos_lqo; |
| - base::FilePath reference_file_in_test_dir = |
| + // Compare with the reference file on disk (this is the same file we played |
| + // through WebAudio earlier). |
| + base::FilePath reference_file = |
| test::GetReferenceFilesDir().Append(kReferenceFile); |
| - ASSERT_TRUE(RunPesq(reference_file_in_test_dir, trimmed_recording, 16000, |
| - &raw_mos, &mos_lqo)); |
| - |
| - perf_test::PrintResult("audio_pesq", "", "raw_mos", raw_mos, "score", true); |
| - perf_test::PrintResult("audio_pesq", "", "mos_lqo", mos_lqo, "score", true); |
| - |
| - EXPECT_TRUE(base::DeleteFile(recording, false)); |
| - EXPECT_TRUE(base::DeleteFile(trimmed_recording, false)); |
| + ComputeAndPrintPesqResults(reference_file, recording, "_webaudio"); |
| } |
| /** |
| @@ -662,46 +731,18 @@ void MAYBE_WebRtcAudioQualityBrowserTest::TestAutoGainControl( |
| const base::FilePath::StringType& reference_filename, |
| const std::string& constraints, |
| const std::string& perf_modifier) { |
| - if (OnWinXp()) { |
| - LOG(ERROR) << "This test is not implemented for Windows XP."; |
| - return; |
| - } |
| - if (OnWin8()) { |
| + if (OnWinXp() || OnWin8()) { |
| // http://crbug.com/379798. |
| - LOG(ERROR) << "Temporarily disabled for Win 8."; |
| + LOG(ERROR) << "This test is not implemented for Windows XP/Win8."; |
| return; |
| } |
| - ASSERT_TRUE(test::HasReferenceFilesInCheckout()); |
| - ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| - |
| - ASSERT_TRUE(ForceMicrophoneVolumeTo100Percent()); |
| - |
| base::FilePath reference_file = |
| test::GetReferenceFilesDir().Append(reference_filename); |
| - ConfigureFakeDeviceToPlayFile(reference_file); |
| - |
| - // Create a one-way call. |
| - GURL test_page = embedded_test_server()->GetURL(kWebRtcAudioTestHtmlPage); |
| - content::WebContents* left_tab = |
| - OpenPageAndGetUserMediaInNewTabWithConstraints(test_page, constraints); |
| - SetupPeerconnectionWithLocalStream(left_tab); |
| - |
| - content::WebContents* right_tab = |
| - OpenPageWithoutGetUserMedia(kWebRtcAudioTestHtmlPage); |
| - |
| base::FilePath recording = CreateTemporaryWaveFile(); |
| - AudioRecorder recorder; |
| - static int kRecordingTimeSeconds = 25; |
| - ASSERT_TRUE(recorder.StartRecording(kRecordingTimeSeconds, recording, false, |
| - true)); |
| - |
| - NegotiateCall(left_tab, right_tab); |
| - |
| - ASSERT_TRUE(recorder.WaitForRecordingToEnd()); |
| - DVLOG(0) << "Done recording to " << recording.value() << std::endl; |
| - |
| - HangUp(left_tab); |
| + ASSERT_NO_FATAL_FAILURE(SetupAndRecordAudioCall( |
| + reference_file, recording, constraints, |
| + base::TimeDelta::FromSeconds(25))); |
| // Call Take() on the scoped temp dirs if you want to look at the files after |
| // the test exits (the default is to delete the files). |
| @@ -743,19 +784,18 @@ IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| // Only implemented for Linux for now. |
| #if defined(OS_LINUX) |
| -#define MAYBE_MANUAL_TestComputeGainWithAudioProcessingOff \ |
| - MANUAL_TestComputeGainWithAudioProcessingOff |
| +#define MAYBE_MANUAL_TestAutoGainIsOffWithAudioProcessingOff \ |
| + MANUAL_TestAutoGainIsOffWithAudioProcessingOff |
| #else |
| -#define MAYBE_MANUAL_TestComputeGainWithAudioProcessingOff \ |
| - DISABLED_MANUAL_TestComputeGainWithAudioProcessingOff |
| +#define MAYBE_MANUAL_TestAutoGainIsOffWithAudioProcessingOff \ |
| + DISABLED_MANUAL_TestAutoGainIsOffWithAudioProcessingOff |
| #endif |
| // Since the AGC is off here there should be no gain at all. |
| IN_PROC_BROWSER_TEST_F(MAYBE_WebRtcAudioQualityBrowserTest, |
| - MAYBE_MANUAL_TestComputeGainWithAudioProcessingOff) { |
| + MAYBE_MANUAL_TestAutoGainIsOffWithAudioProcessingOff) { |
| const char* kAudioCallWithoutAudioProcessing = |
| "{audio: { mandatory: { echoCancellation: false } } }"; |
| ASSERT_NO_FATAL_FAILURE(TestAutoGainControl( |
| kAgcTestReferenceFile, kAudioCallWithoutAudioProcessing, "_no_agc")); |
| } |
| - |