1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <math.h> 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 13b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 14f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "webrtc/common_audio/resampler/include/push_resampler.h" 15f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "webrtc/modules/interface/module_common_types.h" 16f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "webrtc/voice_engine/utility.h" 17f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org#include "webrtc/voice_engine/voice_engine_defines.h" 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc { 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace voe { 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace { 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 23f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.orgenum FunctionToTest { 24f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org TestRemixAndResample, 25f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org TestDownConvertToCodecFormat 26f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org}; 27f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org 2801f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgclass UtilityTest : public ::testing::Test { 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected: 3001f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.org UtilityTest() { 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org src_frame_.sample_rate_hz_ = 16000; 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org src_frame_.samples_per_channel_ = src_frame_.sample_rate_hz_ / 100; 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org src_frame_.num_channels_ = 1; 34d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org dst_frame_.CopyFrom(src_frame_); 35d4682361fd4d284657e4e33ca5f022cc8ea8f468andrew@webrtc.org golden_frame_.CopyFrom(src_frame_); 36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org void RunResampleTest(int src_channels, int src_sample_rate_hz, 39f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org int dst_channels, int dst_sample_rate_hz, 40f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org FunctionToTest function); 41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 42708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org PushResampler<int16_t> resampler_; 43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioFrame src_frame_; 44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioFrame dst_frame_; 45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org AudioFrame golden_frame_; 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}; 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Sets the signal value to increase by |data| with every sample. Floats are 49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// used so non-integer values result in rounding error, but not an accumulating 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// error. 51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetMonoFrame(AudioFrame* frame, float data, int sample_rate_hz) { 52b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org memset(frame->data_, 0, sizeof(frame->data_)); 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->num_channels_ = 1; 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->sample_rate_hz_ = sample_rate_hz; 55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->samples_per_channel_ = sample_rate_hz / 100; 56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < frame->samples_per_channel_; i++) { 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->data_[i] = data * i; 58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Keep the existing sample rate. 62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetMonoFrame(AudioFrame* frame, float data) { 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(frame, data, frame->sample_rate_hz_); 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Sets the signal value to increase by |left| and |right| with every sample in 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// each channel respectively. 68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetStereoFrame(AudioFrame* frame, float left, float right, 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int sample_rate_hz) { 70b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org memset(frame->data_, 0, sizeof(frame->data_)); 71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->num_channels_ = 2; 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->sample_rate_hz_ = sample_rate_hz; 73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->samples_per_channel_ = sample_rate_hz / 100; 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < frame->samples_per_channel_; i++) { 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->data_[i * 2] = left * i; 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org frame->data_[i * 2 + 1] = right * i; 77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Keep the existing sample rate. 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid SetStereoFrame(AudioFrame* frame, float left, float right) { 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(frame, left, right, frame->sample_rate_hz_); 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VerifyParams(const AudioFrame& ref_frame, const AudioFrame& test_frame) { 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(ref_frame.num_channels_, test_frame.num_channels_); 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(ref_frame.samples_per_channel_, test_frame.samples_per_channel_); 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(ref_frame.sample_rate_hz_, test_frame.sample_rate_hz_); 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Computes the best SNR based on the error between |ref_frame| and 92b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org// |test_frame|. It allows for up to a |max_delay| in samples between the 93b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org// signals to compensate for the resampling delay. 94b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.orgfloat ComputeSNR(const AudioFrame& ref_frame, const AudioFrame& test_frame, 95b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org int max_delay) { 96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyParams(ref_frame, test_frame); 97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float best_snr = 0; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int best_delay = 0; 99b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org for (int delay = 0; delay <= max_delay; delay++) { 100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float mse = 0; 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float variance = 0; 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < ref_frame.samples_per_channel_ * 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ref_frame.num_channels_ - delay; i++) { 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int error = ref_frame.data_[i] - test_frame.data_[i + delay]; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org mse += error * error; 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org variance += ref_frame.data_[i] * ref_frame.data_[i]; 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org float snr = 100; // We assign 100 dB to the zero-error case. 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (mse > 0) 110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org snr = 10 * log10(variance / mse); 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (snr > best_snr) { 112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org best_snr = snr; 113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org best_delay = delay; 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("SNR=%.1f dB at delay=%d\n", best_snr, best_delay); 117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return best_snr; 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid VerifyFramesAreEqual(const AudioFrame& ref_frame, 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const AudioFrame& test_frame) { 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyParams(ref_frame, test_frame); 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int i = 0; i < ref_frame.samples_per_channel_ * ref_frame.num_channels_; 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org i++) { 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org EXPECT_EQ(ref_frame.data_[i], test_frame.data_[i]); 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 12901f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgvoid UtilityTest::RunResampleTest(int src_channels, 130708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org int src_sample_rate_hz, 131708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org int dst_channels, 132708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org int dst_sample_rate_hz, 133708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org FunctionToTest function) { 134708ff4d93770d863cdea26fd496ae71414eb8a53andrew@webrtc.org PushResampler<int16_t> resampler; // Create a new one with every test. 135b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const int16_t kSrcLeft = 30; // Shouldn't overflow for any used sample rate. 136b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const int16_t kSrcRight = 15; 137b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const float resampling_factor = (1.0 * src_sample_rate_hz) / 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org dst_sample_rate_hz; 139b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const float dst_left = resampling_factor * kSrcLeft; 140b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const float dst_right = resampling_factor * kSrcRight; 141b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const float dst_mono = (dst_left + dst_right) / 2; 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (src_channels == 1) 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&src_frame_, kSrcLeft, src_sample_rate_hz); 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&src_frame_, kSrcLeft, kSrcRight, src_sample_rate_hz); 146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (dst_channels == 1) { 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&dst_frame_, 0, dst_sample_rate_hz); 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (src_channels == 1) 150b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org SetMonoFrame(&golden_frame_, dst_left, dst_sample_rate_hz); 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 152b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org SetMonoFrame(&golden_frame_, dst_mono, dst_sample_rate_hz); 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } else { 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&dst_frame_, 0, 0, dst_sample_rate_hz); 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if (src_channels == 1) 156b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org SetStereoFrame(&golden_frame_, dst_left, dst_left, dst_sample_rate_hz); 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 158b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org SetStereoFrame(&golden_frame_, dst_left, dst_right, dst_sample_rate_hz); 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 161b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org // The sinc resampler has a known delay, which we compute here. Multiplying by 162b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org // two gives us a crude maximum for any resampling, as the old resampler 163b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org // typically (but not always) has lower delay. 164b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org static const int kInputKernelDelaySamples = 16; 165b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const int max_delay = static_cast<double>(dst_sample_rate_hz) 166b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org / src_sample_rate_hz * kInputKernelDelaySamples * dst_channels * 2; 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org printf("(%d, %d Hz) -> (%d, %d Hz) ", // SNR reported on the same line later. 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org src_channels, src_sample_rate_hz, dst_channels, dst_sample_rate_hz); 169f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org if (function == TestRemixAndResample) { 170f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RemixAndResample(src_frame_, &resampler, &dst_frame_); 171f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } else { 172f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org int16_t mono_buffer[kMaxMonoDataSizeSamples]; 173f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org DownConvertToCodecFormat(src_frame_.data_, 174f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org src_frame_.samples_per_channel_, 175f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org src_frame_.num_channels_, 176f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org src_frame_.sample_rate_hz_, 177f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org dst_frame_.num_channels_, 178f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org dst_frame_.sample_rate_hz_, 179f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org mono_buffer, 180f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org &resampler, 181f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org &dst_frame_); 182f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 183f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org 18492bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org if (src_sample_rate_hz == 96000 && dst_sample_rate_hz == 8000) { 18592bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org // The sinc resampler gives poor SNR at this extreme conversion, but we 18692bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org // expect to see this rarely in practice. 18792bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org EXPECT_GT(ComputeSNR(golden_frame_, dst_frame_, max_delay), 14.0f); 18892bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org } else { 18992bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org EXPECT_GT(ComputeSNR(golden_frame_, dst_frame_, max_delay), 46.0f); 19092bfbbd61bc6be8506644a52e13a3bef00e0d292andrew@webrtc.org } 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 19301f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgTEST_F(UtilityTest, RemixAndResampleCopyFrameSucceeds) { 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stereo -> stereo. 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&src_frame_, 10, 10); 196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&dst_frame_, 0, 0); 197f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RemixAndResample(src_frame_, &resampler_, &dst_frame_); 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyFramesAreEqual(src_frame_, dst_frame_); 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Mono -> mono. 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&src_frame_, 20); 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&dst_frame_, 0); 203f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RemixAndResample(src_frame_, &resampler_, &dst_frame_); 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyFramesAreEqual(src_frame_, dst_frame_); 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20701f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgTEST_F(UtilityTest, RemixAndResampleMixingOnlySucceeds) { 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Stereo -> mono. 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&dst_frame_, 0, 0); 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&src_frame_, 10); 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&golden_frame_, 10, 10); 212f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RemixAndResample(src_frame_, &resampler_, &dst_frame_); 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyFramesAreEqual(dst_frame_, golden_frame_); 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org // Mono -> stereo. 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&dst_frame_, 0); 217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetStereoFrame(&src_frame_, 10, 20); 218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org SetMonoFrame(&golden_frame_, 15); 219f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RemixAndResample(src_frame_, &resampler_, &dst_frame_); 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org VerifyFramesAreEqual(golden_frame_, dst_frame_); 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 22301f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgTEST_F(UtilityTest, RemixAndResampleSucceeds) { 224b6fadb16521d2d174c19a6fa881523fced10c6c9andrew@webrtc.org const int kSampleRates[] = {8000, 16000, 32000, 44100, 48000, 96000}; 225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int kSampleRatesSize = sizeof(kSampleRates) / sizeof(*kSampleRates); 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int kChannels[] = {1, 2}; 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org const int kChannelsSize = sizeof(kChannels) / sizeof(*kChannels); 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int src_rate = 0; src_rate < kSampleRatesSize; src_rate++) { 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int dst_rate = 0; dst_rate < kSampleRatesSize; dst_rate++) { 230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int src_channel = 0; src_channel < kChannelsSize; src_channel++) { 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (int dst_channel = 0; dst_channel < kChannelsSize; dst_channel++) { 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org RunResampleTest(kChannels[src_channel], kSampleRates[src_rate], 233f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org kChannels[dst_channel], kSampleRates[dst_rate], 234f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org TestRemixAndResample); 235f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 236f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 237f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 238f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 239f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org} 240f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org 24101f4592a275101a9d1e109ed53a0d713bcef67f4andrew@webrtc.orgTEST_F(UtilityTest, ConvertToCodecFormatSucceeds) { 242f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org const int kSampleRates[] = {8000, 16000, 32000, 44100, 48000, 96000}; 243f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org const int kSampleRatesSize = sizeof(kSampleRates) / sizeof(*kSampleRates); 244f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org const int kChannels[] = {1, 2}; 245f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org const int kChannelsSize = sizeof(kChannels) / sizeof(*kChannels); 246f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org for (int src_rate = 0; src_rate < kSampleRatesSize; src_rate++) { 247f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org for (int dst_rate = 0; dst_rate < kSampleRatesSize; dst_rate++) { 248f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org for (int src_channel = 0; src_channel < kChannelsSize; src_channel++) { 249f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org for (int dst_channel = 0; dst_channel < kChannelsSize; dst_channel++) { 250f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org if (dst_rate <= src_rate && dst_channel <= src_channel) { 251f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org RunResampleTest(kChannels[src_channel], kSampleRates[src_rate], 252f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org kChannels[src_channel], kSampleRates[dst_rate], 253f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org TestDownConvertToCodecFormat); 254f7c73b531c9f2aca2adb87044613a7b7fa94de84andrew@webrtc.org } 255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace 262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace voe 263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} // namespace webrtc 264