/* * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ // Unit tests for FilePlayer. #include "webrtc/modules/utility/include/file_player.h" #include #include #include "gflags/gflags.h" #include "testing/gtest/include/gtest/gtest.h" #include "webrtc/base/md5digest.h" #include "webrtc/base/stringencode.h" #include "webrtc/test/testsupport/fileutils.h" DEFINE_bool(file_player_output, false, "Generate reference files."); namespace webrtc { class FilePlayerTest : public ::testing::Test { protected: static const uint32_t kId = 0; static const FileFormats kFileFormat = kFileFormatWavFile; static const int kSampleRateHz = 8000; FilePlayerTest() : player_(FilePlayer::CreateFilePlayer(kId, kFileFormat)), output_file_(NULL) {} void SetUp() override { if (FLAGS_file_player_output) { std::string output_file = webrtc::test::OutputPath() + "file_player_unittest_out.pcm"; output_file_ = fopen(output_file.c_str(), "wb"); ASSERT_TRUE(output_file_ != NULL); } } void TearDown() override { if (output_file_) fclose(output_file_); } ~FilePlayerTest() { FilePlayer::DestroyFilePlayer(player_); } void PlayFileAndCheck(const std::string& input_file, const std::string& ref_checksum, int output_length_ms) { const float kScaling = 1; ASSERT_EQ(0, player_->StartPlayingFile( input_file.c_str(), false, 0, kScaling, 0, 0, NULL)); rtc::Md5Digest checksum; for (int i = 0; i < output_length_ms / 10; ++i) { int16_t out[10 * kSampleRateHz / 1000] = {0}; size_t num_samples; EXPECT_EQ(0, player_->Get10msAudioFromFile(out, num_samples, kSampleRateHz)); checksum.Update(out, num_samples * sizeof(out[0])); if (FLAGS_file_player_output) { ASSERT_EQ(num_samples, fwrite(out, sizeof(out[0]), num_samples, output_file_)); } } char checksum_result[rtc::Md5Digest::kSize]; EXPECT_EQ(rtc::Md5Digest::kSize, checksum.Finish(checksum_result, rtc::Md5Digest::kSize)); EXPECT_EQ(ref_checksum, rtc::hex_encode(checksum_result, sizeof(checksum_result))); } FilePlayer* player_; FILE* output_file_; }; #if defined(WEBRTC_IOS) #define MAYBE_PlayWavPcmuFile DISABLED_PlayWavPcmuFile #else #define MAYBE_PlayWavPcmuFile PlayWavPcmuFile #endif TEST_F(FilePlayerTest, MAYBE_PlayWavPcmuFile) { const std::string kFileName = test::ResourcePath("utility/encapsulated_pcmu_8khz", "wav"); // The file is longer than this, but keeping the output shorter limits the // runtime for the test. const int kOutputLengthMs = 10000; const std::string kRefChecksum = "c74e7fd432d439b1311e1c16815b3e9a"; PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs); } #if defined(WEBRTC_IOS) #define MAYBE_PlayWavPcm16File DISABLED_PlayWavPcm16File #else #define MAYBE_PlayWavPcm16File PlayWavPcm16File #endif TEST_F(FilePlayerTest, MAYBE_PlayWavPcm16File) { const std::string kFileName = test::ResourcePath("utility/encapsulated_pcm16b_8khz", "wav"); // The file is longer than this, but keeping the output shorter limits the // runtime for the test. const int kOutputLengthMs = 10000; const std::string kRefChecksum = "e41d7e1dac8aeae9f21e8e03cd7ecd71"; PlayFileAndCheck(kFileName, kRefChecksum, kOutputLengthMs); } } // namespace webrtc