| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 ASSERT_TRUE( | 39 ASSERT_TRUE( |
| 40 codec_owner_.SetEncoders(kDefaultCodecInst, kCngPt, VADNormal, -1)); | 40 codec_owner_.SetEncoders(kDefaultCodecInst, kCngPt, VADNormal, -1)); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void EncodeAndVerify(size_t expected_out_length, | 43 void EncodeAndVerify(size_t expected_out_length, |
| 44 uint32_t expected_timestamp, | 44 uint32_t expected_timestamp, |
| 45 int expected_payload_type, | 45 int expected_payload_type, |
| 46 int expected_send_even_if_empty) { | 46 int expected_send_even_if_empty) { |
| 47 uint8_t out[kPacketSizeSamples]; | 47 uint8_t out[kPacketSizeSamples]; |
| 48 AudioEncoder::EncodedInfo encoded_info; | 48 AudioEncoder::EncodedInfo encoded_info; |
| 49 encoded_info = codec_owner_.Encoder()->Encode( | 49 encoded_info = codec_owner_.Encoder()->Encode(timestamp_, kZeroData, |
| 50 timestamp_, kZeroData, kDataLengthSamples, kPacketSizeSamples, out); | 50 kPacketSizeSamples, out); |
| 51 timestamp_ += kDataLengthSamples; | 51 timestamp_ += kDataLengthSamples; |
| 52 EXPECT_TRUE(encoded_info.redundant.empty()); | 52 EXPECT_TRUE(encoded_info.redundant.empty()); |
| 53 EXPECT_EQ(expected_out_length, encoded_info.encoded_bytes); | 53 EXPECT_EQ(expected_out_length, encoded_info.encoded_bytes); |
| 54 EXPECT_EQ(expected_timestamp, encoded_info.encoded_timestamp); | 54 EXPECT_EQ(expected_timestamp, encoded_info.encoded_timestamp); |
| 55 if (expected_payload_type >= 0) | 55 if (expected_payload_type >= 0) |
| 56 EXPECT_EQ(expected_payload_type, encoded_info.payload_type); | 56 EXPECT_EQ(expected_payload_type, encoded_info.payload_type); |
| 57 if (expected_send_even_if_empty >= 0) | 57 if (expected_send_even_if_empty >= 0) |
| 58 EXPECT_EQ(static_cast<bool>(expected_send_even_if_empty), | 58 EXPECT_EQ(static_cast<bool>(expected_send_even_if_empty), |
| 59 encoded_info.send_even_if_empty); | 59 encoded_info.send_even_if_empty); |
| 60 } | 60 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 TEST_F(CodecOwnerTest, ExternalEncoder) { | 139 TEST_F(CodecOwnerTest, ExternalEncoder) { |
| 140 MockAudioEncoder external_encoder; | 140 MockAudioEncoder external_encoder; |
| 141 codec_owner_.SetEncoders(&external_encoder, -1, VADNormal, -1); | 141 codec_owner_.SetEncoders(&external_encoder, -1, VADNormal, -1); |
| 142 const int kSampleRateHz = 8000; | 142 const int kSampleRateHz = 8000; |
| 143 const int kPacketSizeSamples = kSampleRateHz / 100; | 143 const int kPacketSizeSamples = kSampleRateHz / 100; |
| 144 int16_t audio[kPacketSizeSamples] = {0}; | 144 int16_t audio[kPacketSizeSamples] = {0}; |
| 145 uint8_t encoded[kPacketSizeSamples]; | 145 uint8_t encoded[kPacketSizeSamples]; |
| 146 AudioEncoder::EncodedInfo info; | 146 AudioEncoder::EncodedInfo info; |
| 147 EXPECT_CALL(external_encoder, SampleRateHz()) | 147 EXPECT_CALL(external_encoder, SampleRateHz()) |
| 148 .WillRepeatedly(Return(kSampleRateHz)); | 148 .WillRepeatedly(Return(kSampleRateHz)); |
| 149 EXPECT_CALL(external_encoder, NumChannels()).WillRepeatedly(Return(1)); |
| 149 | 150 |
| 150 { | 151 { |
| 151 InSequence s; | 152 InSequence s; |
| 152 info.encoded_timestamp = 0; | 153 info.encoded_timestamp = 0; |
| 153 EXPECT_CALL(external_encoder, | 154 EXPECT_CALL(external_encoder, |
| 154 EncodeInternal(0, audio, arraysize(encoded), encoded)) | 155 EncodeInternal(0, rtc::ArrayView<const int16_t>(audio), |
| 156 arraysize(encoded), encoded)) |
| 155 .WillOnce(Return(info)); | 157 .WillOnce(Return(info)); |
| 156 EXPECT_CALL(external_encoder, Mark("A")); | 158 EXPECT_CALL(external_encoder, Mark("A")); |
| 157 EXPECT_CALL(external_encoder, Mark("B")); | 159 EXPECT_CALL(external_encoder, Mark("B")); |
| 158 info.encoded_timestamp = 2; | 160 info.encoded_timestamp = 2; |
| 159 EXPECT_CALL(external_encoder, | 161 EXPECT_CALL(external_encoder, |
| 160 EncodeInternal(2, audio, arraysize(encoded), encoded)) | 162 EncodeInternal(2, rtc::ArrayView<const int16_t>(audio), |
| 163 arraysize(encoded), encoded)) |
| 161 .WillOnce(Return(info)); | 164 .WillOnce(Return(info)); |
| 162 EXPECT_CALL(external_encoder, Die()); | 165 EXPECT_CALL(external_encoder, Die()); |
| 163 } | 166 } |
| 164 | 167 |
| 165 info = codec_owner_.Encoder()->Encode(0, audio, arraysize(audio), | 168 info = codec_owner_.Encoder()->Encode(0, audio, arraysize(encoded), encoded); |
| 166 arraysize(encoded), encoded); | |
| 167 EXPECT_EQ(0u, info.encoded_timestamp); | 169 EXPECT_EQ(0u, info.encoded_timestamp); |
| 168 external_encoder.Mark("A"); | 170 external_encoder.Mark("A"); |
| 169 | 171 |
| 170 // Change to internal encoder. | 172 // Change to internal encoder. |
| 171 CodecInst codec_inst = kDefaultCodecInst; | 173 CodecInst codec_inst = kDefaultCodecInst; |
| 172 codec_inst.pacsize = kPacketSizeSamples; | 174 codec_inst.pacsize = kPacketSizeSamples; |
| 173 ASSERT_TRUE(codec_owner_.SetEncoders(codec_inst, -1, VADNormal, -1)); | 175 ASSERT_TRUE(codec_owner_.SetEncoders(codec_inst, -1, VADNormal, -1)); |
| 174 // Don't expect any more calls to the external encoder. | 176 // Don't expect any more calls to the external encoder. |
| 175 info = codec_owner_.Encoder()->Encode(1, audio, arraysize(audio), | 177 info = codec_owner_.Encoder()->Encode(1, audio, arraysize(encoded), encoded); |
| 176 arraysize(encoded), encoded); | |
| 177 external_encoder.Mark("B"); | 178 external_encoder.Mark("B"); |
| 178 | 179 |
| 179 // Change back to external encoder again. | 180 // Change back to external encoder again. |
| 180 codec_owner_.SetEncoders(&external_encoder, -1, VADNormal, -1); | 181 codec_owner_.SetEncoders(&external_encoder, -1, VADNormal, -1); |
| 181 info = codec_owner_.Encoder()->Encode(2, audio, arraysize(audio), | 182 info = codec_owner_.Encoder()->Encode(2, audio, arraysize(encoded), encoded); |
| 182 arraysize(encoded), encoded); | |
| 183 EXPECT_EQ(2u, info.encoded_timestamp); | 183 EXPECT_EQ(2u, info.encoded_timestamp); |
| 184 } | 184 } |
| 185 | 185 |
| 186 TEST_F(CodecOwnerTest, CngResetsSpeechEncoder) { | 186 TEST_F(CodecOwnerTest, CngResetsSpeechEncoder) { |
| 187 TestCngAndRedResetSpeechEncoder(true, false); | 187 TestCngAndRedResetSpeechEncoder(true, false); |
| 188 } | 188 } |
| 189 | 189 |
| 190 TEST_F(CodecOwnerTest, RedResetsSpeechEncoder) { | 190 TEST_F(CodecOwnerTest, RedResetsSpeechEncoder) { |
| 191 TestCngAndRedResetSpeechEncoder(false, true); | 191 TestCngAndRedResetSpeechEncoder(false, true); |
| 192 } | 192 } |
| 193 | 193 |
| 194 TEST_F(CodecOwnerTest, CngAndRedResetsSpeechEncoder) { | 194 TEST_F(CodecOwnerTest, CngAndRedResetsSpeechEncoder) { |
| 195 TestCngAndRedResetSpeechEncoder(true, true); | 195 TestCngAndRedResetSpeechEncoder(true, true); |
| 196 } | 196 } |
| 197 | 197 |
| 198 TEST_F(CodecOwnerTest, NoCngAndRedNoSpeechEncoderReset) { | 198 TEST_F(CodecOwnerTest, NoCngAndRedNoSpeechEncoderReset) { |
| 199 TestCngAndRedResetSpeechEncoder(false, false); | 199 TestCngAndRedResetSpeechEncoder(false, false); |
| 200 } | 200 } |
| 201 | 201 |
| 202 TEST_F(CodecOwnerTest, SetEncodersError) { | 202 TEST_F(CodecOwnerTest, SetEncodersError) { |
| 203 CodecInst codec_inst = kDefaultCodecInst; | 203 CodecInst codec_inst = kDefaultCodecInst; |
| 204 static const char bad_name[] = "Robert'); DROP TABLE Students;"; | 204 static const char bad_name[] = "Robert'); DROP TABLE Students;"; |
| 205 std::memcpy(codec_inst.plname, bad_name, sizeof bad_name); | 205 std::memcpy(codec_inst.plname, bad_name, sizeof bad_name); |
| 206 EXPECT_FALSE(codec_owner_.SetEncoders(codec_inst, -1, VADNormal, -1)); | 206 EXPECT_FALSE(codec_owner_.SetEncoders(codec_inst, -1, VADNormal, -1)); |
| 207 } | 207 } |
| 208 | 208 |
| 209 } // namespace acm2 | 209 } // namespace acm2 |
| 210 } // namespace webrtc | 210 } // namespace webrtc |
| OLD | NEW |