acm_remixing_unittest.cc (4829B)
1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "modules/audio_coding/acm2/acm_remixing.h" 12 13 #include <cstddef> 14 #include <cstdint> 15 #include <vector> 16 17 #include "api/audio/audio_frame.h" 18 #include "api/audio/audio_view.h" 19 #include "test/gmock.h" 20 #include "test/gtest.h" 21 22 using ::testing::AllOf; 23 using ::testing::Each; 24 using ::testing::ElementsAreArray; 25 using ::testing::SizeIs; 26 27 namespace webrtc { 28 29 TEST(AcmRemixing, DownMixFrame) { 30 std::vector<int16_t> out(480, 0); 31 AudioFrame in; 32 InterleavedView<int16_t> const in_data = in.mutable_data(480, 2); 33 for (size_t k = 0; k < in_data.samples_per_channel(); ++k) { 34 in_data[2 * k] = 2; 35 in_data[2 * k + 1] = 0; 36 } 37 38 DownMixFrame(in, out); 39 40 EXPECT_THAT(out, AllOf(SizeIs(480), Each(1))); 41 } 42 43 TEST(AcmRemixing, DownMixMutedFrame) { 44 std::vector<int16_t> out(480, 0); 45 AudioFrame in; 46 in.num_channels_ = 2; 47 in.samples_per_channel_ = 480; 48 49 int16_t* const in_data = in.mutable_data(); 50 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 51 in_data[2 * k] = 2; 52 in_data[2 * k + 1] = 0; 53 } 54 55 in.Mute(); 56 57 DownMixFrame(in, out); 58 59 EXPECT_THAT(out, AllOf(SizeIs(480), Each(0))); 60 } 61 62 TEST(AcmRemixing, RemixMutedStereoFrameTo6Channels) { 63 std::vector<int16_t> out(480, 0); 64 AudioFrame in; 65 in.num_channels_ = 2; 66 in.samples_per_channel_ = 480; 67 68 int16_t* const in_data = in.mutable_data(); 69 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 70 in_data[2 * k] = 1; 71 in_data[2 * k + 1] = 2; 72 } 73 in.Mute(); 74 75 ReMixFrame(in, 6, &out); 76 EXPECT_EQ(6 * 480u, out.size()); 77 78 EXPECT_THAT(out, AllOf(SizeIs(in.samples_per_channel_ * 6), Each(0))); 79 } 80 81 TEST(AcmRemixing, RemixStereoFrameTo6Channels) { 82 std::vector<int16_t> out(480, 0); 83 AudioFrame in; 84 in.num_channels_ = 2; 85 in.samples_per_channel_ = 480; 86 87 int16_t* const in_data = in.mutable_data(); 88 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 89 in_data[2 * k] = 1; 90 in_data[2 * k + 1] = 2; 91 } 92 93 ReMixFrame(in, 6, &out); 94 EXPECT_EQ(6 * 480u, out.size()); 95 96 std::vector<int16_t> expected_output(in.samples_per_channel_ * 6); 97 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 98 expected_output[6 * k] = 1; 99 expected_output[6 * k + 1] = 2; 100 } 101 102 EXPECT_THAT(out, ElementsAreArray(expected_output)); 103 } 104 105 TEST(AcmRemixing, RemixMonoFrameTo6Channels) { 106 std::vector<int16_t> out(480, 0); 107 AudioFrame in; 108 in.num_channels_ = 1; 109 in.samples_per_channel_ = 480; 110 111 int16_t* const in_data = in.mutable_data(); 112 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 113 in_data[k] = 1; 114 } 115 116 ReMixFrame(in, 6, &out); 117 EXPECT_EQ(6 * 480u, out.size()); 118 119 std::vector<int16_t> expected_output(in.samples_per_channel_ * 6, 0); 120 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 121 expected_output[6 * k] = 1; 122 expected_output[6 * k + 1] = 1; 123 } 124 125 EXPECT_THAT(out, ElementsAreArray(expected_output)); 126 } 127 128 TEST(AcmRemixing, RemixStereoFrameToMono) { 129 std::vector<int16_t> out(480, 0); 130 AudioFrame in; 131 in.num_channels_ = 2; 132 in.samples_per_channel_ = 480; 133 134 int16_t* const in_data = in.mutable_data(); 135 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 136 in_data[2 * k] = 2; 137 in_data[2 * k + 1] = 0; 138 } 139 140 ReMixFrame(in, 1, &out); 141 EXPECT_EQ(480u, out.size()); 142 143 EXPECT_THAT(out, AllOf(SizeIs(in.samples_per_channel_), Each(1))); 144 } 145 146 TEST(AcmRemixing, RemixMonoFrameToStereo) { 147 std::vector<int16_t> out(480, 0); 148 AudioFrame in; 149 in.num_channels_ = 1; 150 in.samples_per_channel_ = 480; 151 152 int16_t* const in_data = in.mutable_data(); 153 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 154 in_data[k] = 1; 155 } 156 157 ReMixFrame(in, 2, &out); 158 EXPECT_EQ(960u, out.size()); 159 160 EXPECT_THAT(out, AllOf(SizeIs(2 * in.samples_per_channel_), Each(1))); 161 } 162 163 TEST(AcmRemixing, Remix3ChannelFrameToStereo) { 164 std::vector<int16_t> out(480, 0); 165 AudioFrame in; 166 in.num_channels_ = 3; 167 in.samples_per_channel_ = 480; 168 169 int16_t* const in_data = in.mutable_data(); 170 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 171 for (size_t j = 0; j < 3; ++j) { 172 in_data[3 * k + j] = j; 173 } 174 } 175 176 ReMixFrame(in, 2, &out); 177 EXPECT_EQ(2 * 480u, out.size()); 178 179 std::vector<int16_t> expected_output(in.samples_per_channel_ * 2); 180 for (size_t k = 0; k < in.samples_per_channel_; ++k) { 181 for (size_t j = 0; j < 2; ++j) { 182 expected_output[2 * k + j] = static_cast<int>(j); 183 } 184 } 185 186 EXPECT_THAT(out, ElementsAreArray(expected_output)); 187 } 188 189 } // namespace webrtc