Index: webrtc/modules/audio_coding/main/acm2/rent_a_codec_unittest.cc |
diff --git a/webrtc/modules/audio_coding/main/acm2/rent_a_codec_unittest.cc b/webrtc/modules/audio_coding/main/acm2/rent_a_codec_unittest.cc |
deleted file mode 100644 |
index ae6c98b34c9248fb20f1390044acb95f30590278..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec_unittest.cc |
+++ /dev/null |
@@ -1,209 +0,0 @@ |
-/* |
- * Copyright (c) 2015 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. |
- */ |
- |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "webrtc/base/arraysize.h" |
-#include "webrtc/modules/audio_coding/codecs/mock/mock_audio_encoder.h" |
-#include "webrtc/modules/audio_coding/main/acm2/rent_a_codec.h" |
- |
-namespace webrtc { |
-namespace acm2 { |
- |
-using ::testing::Return; |
- |
-namespace { |
-const int kDataLengthSamples = 80; |
-const int kPacketSizeSamples = 2 * kDataLengthSamples; |
-const int16_t kZeroData[kDataLengthSamples] = {0}; |
-const CodecInst kDefaultCodecInst = {0, "pcmu", 8000, kPacketSizeSamples, |
- 1, 64000}; |
-const int kCngPt = 13; |
-} // namespace |
- |
-class RentACodecTestF : public ::testing::Test { |
- protected: |
- void CreateCodec() { |
- speech_encoder_ = rent_a_codec_.RentEncoder(kDefaultCodecInst); |
- ASSERT_TRUE(speech_encoder_); |
- RentACodec::StackParameters param; |
- param.use_cng = true; |
- encoder_ = rent_a_codec_.RentEncoderStack(speech_encoder_, ¶m); |
- } |
- |
- void EncodeAndVerify(size_t expected_out_length, |
- uint32_t expected_timestamp, |
- int expected_payload_type, |
- int expected_send_even_if_empty) { |
- uint8_t out[kPacketSizeSamples]; |
- AudioEncoder::EncodedInfo encoded_info; |
- encoded_info = |
- encoder_->Encode(timestamp_, kZeroData, kPacketSizeSamples, out); |
- timestamp_ += kDataLengthSamples; |
- EXPECT_TRUE(encoded_info.redundant.empty()); |
- EXPECT_EQ(expected_out_length, encoded_info.encoded_bytes); |
- EXPECT_EQ(expected_timestamp, encoded_info.encoded_timestamp); |
- if (expected_payload_type >= 0) |
- EXPECT_EQ(expected_payload_type, encoded_info.payload_type); |
- if (expected_send_even_if_empty >= 0) |
- EXPECT_EQ(static_cast<bool>(expected_send_even_if_empty), |
- encoded_info.send_even_if_empty); |
- } |
- |
- RentACodec rent_a_codec_; |
- AudioEncoder* speech_encoder_ = nullptr; |
- AudioEncoder* encoder_ = nullptr; |
- uint32_t timestamp_ = 0; |
-}; |
- |
-// This test verifies that CNG frames are delivered as expected. Since the frame |
-// size is set to 20 ms, we expect the first encode call to produce no output |
-// (which is signaled as 0 bytes output of type kNoEncoding). The next encode |
-// call should produce one SID frame of 9 bytes. The third call should not |
-// result in any output (just like the first one). The fourth and final encode |
-// call should produce an "empty frame", which is like no output, but with |
-// AudioEncoder::EncodedInfo::send_even_if_empty set to true. (The reason to |
-// produce an empty frame is to drive sending of DTMF packets in the RTP/RTCP |
-// module.) |
-TEST_F(RentACodecTestF, VerifyCngFrames) { |
- CreateCodec(); |
- uint32_t expected_timestamp = timestamp_; |
- // Verify no frame. |
- { |
- SCOPED_TRACE("First encoding"); |
- EncodeAndVerify(0, expected_timestamp, -1, -1); |
- } |
- |
- // Verify SID frame delivered. |
- { |
- SCOPED_TRACE("Second encoding"); |
- EncodeAndVerify(9, expected_timestamp, kCngPt, 1); |
- } |
- |
- // Verify no frame. |
- { |
- SCOPED_TRACE("Third encoding"); |
- EncodeAndVerify(0, expected_timestamp, -1, -1); |
- } |
- |
- // Verify NoEncoding. |
- expected_timestamp += 2 * kDataLengthSamples; |
- { |
- SCOPED_TRACE("Fourth encoding"); |
- EncodeAndVerify(0, expected_timestamp, kCngPt, 1); |
- } |
-} |
- |
-TEST(RentACodecTest, ExternalEncoder) { |
- const int kSampleRateHz = 8000; |
- MockAudioEncoder external_encoder; |
- EXPECT_CALL(external_encoder, SampleRateHz()) |
- .WillRepeatedly(Return(kSampleRateHz)); |
- EXPECT_CALL(external_encoder, NumChannels()).WillRepeatedly(Return(1)); |
- EXPECT_CALL(external_encoder, SetFec(false)).WillRepeatedly(Return(true)); |
- |
- RentACodec rac; |
- RentACodec::StackParameters param; |
- EXPECT_EQ(&external_encoder, rac.RentEncoderStack(&external_encoder, ¶m)); |
- const int kPacketSizeSamples = kSampleRateHz / 100; |
- int16_t audio[kPacketSizeSamples] = {0}; |
- uint8_t encoded[kPacketSizeSamples]; |
- AudioEncoder::EncodedInfo info; |
- |
- { |
- ::testing::InSequence s; |
- info.encoded_timestamp = 0; |
- EXPECT_CALL(external_encoder, |
- EncodeInternal(0, rtc::ArrayView<const int16_t>(audio), |
- arraysize(encoded), encoded)) |
- .WillOnce(Return(info)); |
- EXPECT_CALL(external_encoder, Mark("A")); |
- EXPECT_CALL(external_encoder, Mark("B")); |
- info.encoded_timestamp = 2; |
- EXPECT_CALL(external_encoder, |
- EncodeInternal(2, rtc::ArrayView<const int16_t>(audio), |
- arraysize(encoded), encoded)) |
- .WillOnce(Return(info)); |
- EXPECT_CALL(external_encoder, Die()); |
- } |
- |
- info = rac.GetEncoderStack()->Encode(0, audio, arraysize(encoded), encoded); |
- EXPECT_EQ(0u, info.encoded_timestamp); |
- external_encoder.Mark("A"); |
- |
- // Change to internal encoder. |
- CodecInst codec_inst = kDefaultCodecInst; |
- codec_inst.pacsize = kPacketSizeSamples; |
- AudioEncoder* enc = rac.RentEncoder(codec_inst); |
- ASSERT_TRUE(enc); |
- EXPECT_EQ(enc, rac.RentEncoderStack(enc, ¶m)); |
- |
- // Don't expect any more calls to the external encoder. |
- info = rac.GetEncoderStack()->Encode(1, audio, arraysize(encoded), encoded); |
- external_encoder.Mark("B"); |
- |
- // Change back to external encoder again. |
- EXPECT_EQ(&external_encoder, rac.RentEncoderStack(&external_encoder, ¶m)); |
- info = rac.GetEncoderStack()->Encode(2, audio, arraysize(encoded), encoded); |
- EXPECT_EQ(2u, info.encoded_timestamp); |
-} |
- |
-// Verify that the speech encoder's Reset method is called when CNG or RED |
-// (or both) are switched on, but not when they're switched off. |
-void TestCngAndRedResetSpeechEncoder(bool use_cng, bool use_red) { |
- MockAudioEncoder speech_encoder; |
- EXPECT_CALL(speech_encoder, NumChannels()).WillRepeatedly(Return(1)); |
- EXPECT_CALL(speech_encoder, Max10MsFramesInAPacket()) |
- .WillRepeatedly(Return(2)); |
- EXPECT_CALL(speech_encoder, SampleRateHz()).WillRepeatedly(Return(8000)); |
- EXPECT_CALL(speech_encoder, SetFec(false)).WillRepeatedly(Return(true)); |
- { |
- ::testing::InSequence s; |
- EXPECT_CALL(speech_encoder, Mark("disabled")); |
- EXPECT_CALL(speech_encoder, Mark("enabled")); |
- if (use_cng || use_red) |
- EXPECT_CALL(speech_encoder, Reset()); |
- EXPECT_CALL(speech_encoder, Die()); |
- } |
- |
- RentACodec::StackParameters param1, param2; |
- param2.use_cng = use_cng; |
- param2.use_red = use_red; |
- speech_encoder.Mark("disabled"); |
- RentACodec rac; |
- rac.RentEncoderStack(&speech_encoder, ¶m1); |
- speech_encoder.Mark("enabled"); |
- rac.RentEncoderStack(&speech_encoder, ¶m2); |
-} |
- |
-TEST(RentACodecTest, CngResetsSpeechEncoder) { |
- TestCngAndRedResetSpeechEncoder(true, false); |
-} |
- |
-TEST(RentACodecTest, RedResetsSpeechEncoder) { |
- TestCngAndRedResetSpeechEncoder(false, true); |
-} |
- |
-TEST(RentACodecTest, CngAndRedResetsSpeechEncoder) { |
- TestCngAndRedResetSpeechEncoder(true, true); |
-} |
- |
-TEST(RentACodecTest, NoCngAndRedNoSpeechEncoderReset) { |
- TestCngAndRedResetSpeechEncoder(false, false); |
-} |
- |
-TEST(RentACodecTest, RentEncoderError) { |
- const CodecInst codec_inst = { |
- 0, "Robert'); DROP TABLE Students;", 8000, 160, 1, 64000}; |
- RentACodec rent_a_codec; |
- EXPECT_FALSE(rent_a_codec.RentEncoder(codec_inst)); |
-} |
- |
-} // namespace acm2 |
-} // namespace webrtc |