Index: webrtc/modules/audio_coding/acm2/rent_a_codec_unittest.cc |
diff --git a/webrtc/modules/audio_coding/acm2/rent_a_codec_unittest.cc b/webrtc/modules/audio_coding/acm2/rent_a_codec_unittest.cc |
index 8cc59d615183c69dab13e986785ff013b8751384..cbdd5e97288ca70b2191422604e6c61ad3f110b2 100644 |
--- a/webrtc/modules/audio_coding/acm2/rent_a_codec_unittest.cc |
+++ b/webrtc/modules/audio_coding/acm2/rent_a_codec_unittest.cc |
@@ -19,22 +19,29 @@ 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; |
+ |
+class Marker final { |
+ public: |
+ MOCK_METHOD1(Mark, void(std::string desc)); |
+}; |
+ |
} // namespace |
class RentACodecTestF : public ::testing::Test { |
protected: |
void CreateCodec() { |
- speech_encoder_ = rent_a_codec_.RentEncoder(kDefaultCodecInst); |
- ASSERT_TRUE(speech_encoder_); |
+ auto speech_encoder = rent_a_codec_.RentEncoder(kDefaultCodecInst); |
+ ASSERT_TRUE(speech_encoder); |
RentACodec::StackParameters param; |
param.use_cng = true; |
- param.speech_encoder = speech_encoder_; |
+ param.speech_encoder = std::move(speech_encoder); |
encoder_ = rent_a_codec_.RentEncoderStack(¶m); |
} |
@@ -58,8 +65,7 @@ class RentACodecTestF : public ::testing::Test { |
} |
RentACodec rent_a_codec_; |
- AudioEncoder* speech_encoder_ = nullptr; |
- AudioEncoder* encoder_ = nullptr; |
+ std::unique_ptr<AudioEncoder> encoder_; |
uint32_t timestamp_ = 0; |
}; |
@@ -103,87 +109,91 @@ TEST_F(RentACodecTestF, VerifyCngFrames) { |
TEST(RentACodecTest, ExternalEncoder) { |
const int kSampleRateHz = 8000; |
- MockAudioEncoder external_encoder; |
- EXPECT_CALL(external_encoder, SampleRateHz()) |
+ auto* external_encoder = new MockAudioEncoder; |
+ 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)); |
+ EXPECT_CALL(*external_encoder, NumChannels()).WillRepeatedly(Return(1)); |
+ EXPECT_CALL(*external_encoder, SetFec(false)).WillRepeatedly(Return(true)); |
RentACodec rac; |
RentACodec::StackParameters param; |
- param.speech_encoder = &external_encoder; |
- EXPECT_EQ(&external_encoder, rac.RentEncoderStack(¶m)); |
+ param.speech_encoder = std::unique_ptr<AudioEncoder>(external_encoder); |
+ std::unique_ptr<AudioEncoder> encoder_stack = rac.RentEncoderStack(¶m); |
+ EXPECT_EQ(external_encoder, encoder_stack.get()); |
const int kPacketSizeSamples = kSampleRateHz / 100; |
int16_t audio[kPacketSizeSamples] = {0}; |
rtc::Buffer encoded; |
AudioEncoder::EncodedInfo info; |
+ Marker marker; |
{ |
::testing::InSequence s; |
info.encoded_timestamp = 0; |
- EXPECT_CALL(external_encoder, |
- EncodeImpl(0, rtc::ArrayView<const int16_t>(audio), |
- &encoded)) |
- .WillOnce(Return(info)); |
- EXPECT_CALL(external_encoder, Mark("A")); |
- EXPECT_CALL(external_encoder, Mark("B")); |
- info.encoded_timestamp = 2; |
- EXPECT_CALL(external_encoder, |
- EncodeImpl(2, rtc::ArrayView<const int16_t>(audio), |
- &encoded)) |
+ EXPECT_CALL( |
+ *external_encoder, |
+ EncodeImpl(0, rtc::ArrayView<const int16_t>(audio), &encoded)) |
.WillOnce(Return(info)); |
- EXPECT_CALL(external_encoder, Die()); |
+ EXPECT_CALL(marker, Mark("A")); |
+ EXPECT_CALL(marker, Mark("B")); |
+ EXPECT_CALL(*external_encoder, Die()); |
+ EXPECT_CALL(marker, Mark("C")); |
} |
- info = external_encoder.Encode(0, audio, &encoded); |
+ info = encoder_stack->Encode(0, audio, &encoded); |
EXPECT_EQ(0u, info.encoded_timestamp); |
- external_encoder.Mark("A"); |
+ marker.Mark("A"); |
// Change to internal encoder. |
CodecInst codec_inst = kDefaultCodecInst; |
codec_inst.pacsize = kPacketSizeSamples; |
param.speech_encoder = rac.RentEncoder(codec_inst); |
ASSERT_TRUE(param.speech_encoder); |
- EXPECT_EQ(param.speech_encoder, rac.RentEncoderStack(¶m)); |
+ AudioEncoder* enc = param.speech_encoder.get(); |
+ std::unique_ptr<AudioEncoder> stack = rac.RentEncoderStack(¶m); |
+ EXPECT_EQ(enc, stack.get()); |
// Don't expect any more calls to the external encoder. |
- info = param.speech_encoder->Encode(1, audio, &encoded); |
- external_encoder.Mark("B"); |
- |
- // Change back to external encoder again. |
- param.speech_encoder = &external_encoder; |
- EXPECT_EQ(&external_encoder, rac.RentEncoderStack(¶m)); |
- info = external_encoder.Encode(2, audio, &encoded); |
- EXPECT_EQ(2u, info.encoded_timestamp); |
+ info = stack->Encode(1, audio, &encoded); |
+ marker.Mark("B"); |
+ encoder_stack.reset(); |
+ marker.Mark("C"); |
} |
// 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)); |
+ auto make_enc = [] { |
+ auto speech_encoder = |
+ std::unique_ptr<MockAudioEncoder>(new MockAudioEncoder); |
+ 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)); |
+ return speech_encoder; |
+ }; |
+ auto speech_encoder1 = make_enc(); |
+ auto speech_encoder2 = make_enc(); |
+ Marker marker; |
{ |
::testing::InSequence s; |
- EXPECT_CALL(speech_encoder, Mark("disabled")); |
- EXPECT_CALL(speech_encoder, Mark("enabled")); |
+ EXPECT_CALL(marker, Mark("disabled")); |
+ EXPECT_CALL(*speech_encoder1, Die()); |
+ EXPECT_CALL(marker, Mark("enabled")); |
if (use_cng || use_red) |
- EXPECT_CALL(speech_encoder, Reset()); |
- EXPECT_CALL(speech_encoder, Die()); |
+ EXPECT_CALL(*speech_encoder2, Reset()); |
+ EXPECT_CALL(*speech_encoder2, Die()); |
} |
RentACodec::StackParameters param1, param2; |
- param1.speech_encoder = &speech_encoder; |
- param2.speech_encoder = &speech_encoder; |
+ param1.speech_encoder = std::move(speech_encoder1); |
+ param2.speech_encoder = std::move(speech_encoder2); |
param2.use_cng = use_cng; |
param2.use_red = use_red; |
- speech_encoder.Mark("disabled"); |
+ marker.Mark("disabled"); |
RentACodec rac; |
rac.RentEncoderStack(¶m1); |
- speech_encoder.Mark("enabled"); |
+ marker.Mark("enabled"); |
rac.RentEncoderStack(¶m2); |
} |