| Index: webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
|
| diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc b/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
|
| index f734883635a043091c9226555a8ff11dd6370be0..cb4405d16d220c7b10c42f382d02cc6c67cdee31 100644
|
| --- a/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
|
| +++ b/webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc
|
| @@ -28,6 +28,7 @@
|
| #include "webrtc/modules/audio_coding/neteq/preemptive_expand.h"
|
| #include "webrtc/modules/audio_coding/neteq/sync_buffer.h"
|
| #include "webrtc/modules/audio_coding/neteq/timestamp_scaler.h"
|
| +#include "webrtc/modules/include/module_common_types.h"
|
|
|
| using ::testing::AtLeast;
|
| using ::testing::Return;
|
| @@ -464,16 +465,11 @@ TEST_F(NetEqImplTest, VerifyTimestampPropagation) {
|
|
|
| // Pull audio once.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(
|
| - NetEq::kOK,
|
| - neteq_->GetAudio(
|
| - kMaxOutputSize, output, &samples_per_channel, &num_channels, &type));
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| // Start with a simple check that the fake decoder is behaving as expected.
|
| @@ -485,7 +481,8 @@ TEST_F(NetEqImplTest, VerifyTimestampPropagation) {
|
| // timestamp should match the playout timestamp.
|
| uint32_t timestamp = 0;
|
| EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp));
|
| - EXPECT_EQ(rtp_header.header.timestamp + output[samples_per_channel - 1],
|
| + EXPECT_EQ(rtp_header.header.timestamp +
|
| + output.data_[output.samples_per_channel_ - 1],
|
| timestamp);
|
|
|
| // Check the timestamp for the last value in the sync buffer. This should
|
| @@ -497,8 +494,9 @@ TEST_F(NetEqImplTest, VerifyTimestampPropagation) {
|
|
|
| // Check that the number of samples still to play from the sync buffer add
|
| // up with what was already played out.
|
| - EXPECT_EQ(kPayloadLengthSamples - output[samples_per_channel - 1],
|
| - sync_buffer->FutureLength());
|
| + EXPECT_EQ(
|
| + kPayloadLengthSamples - output.data_[output.samples_per_channel_ - 1],
|
| + sync_buffer->FutureLength());
|
| }
|
|
|
| TEST_F(NetEqImplTest, ReorderedPacket) {
|
| @@ -543,16 +541,11 @@ TEST_F(NetEqImplTest, ReorderedPacket) {
|
|
|
| // Pull audio once.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(
|
| - NetEq::kOK,
|
| - neteq_->GetAudio(
|
| - kMaxOutputSize, output, &samples_per_channel, &num_channels, &type));
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| // Insert two more packets. The first one is out of order, and is already too
|
| @@ -578,12 +571,9 @@ TEST_F(NetEqImplTest, ReorderedPacket) {
|
| Return(kPayloadLengthSamples)));
|
|
|
| // Pull audio once.
|
| - EXPECT_EQ(
|
| - NetEq::kOK,
|
| - neteq_->GetAudio(
|
| - kMaxOutputSize, output, &samples_per_channel, &num_channels, &type));
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| // Now check the packet buffer, and make sure it is empty, since the
|
| @@ -620,16 +610,12 @@ TEST_F(NetEqImplTest, FirstPacketUnknown) {
|
|
|
| // Pull audio once.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - ASSERT_LE(samples_per_channel, kMaxOutputSize);
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_LE(output.samples_per_channel_, kMaxOutputSize);
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputPLC, type);
|
|
|
| // Register the payload type.
|
| @@ -647,12 +633,10 @@ TEST_F(NetEqImplTest, FirstPacketUnknown) {
|
|
|
| // Pull audio repeatedly and make sure we get normal output, that is not PLC.
|
| for (size_t i = 0; i < 3; ++i) {
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - ASSERT_LE(samples_per_channel, kMaxOutputSize);
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_LE(output.samples_per_channel_, kMaxOutputSize);
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type)
|
| << "NetEq did not decode the packets as expected.";
|
| }
|
| @@ -732,9 +716,7 @@ TEST_F(NetEqImplTest, CodecInternalCng) {
|
| neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
|
|
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateKhz);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| uint32_t timestamp;
|
| uint32_t last_timestamp;
|
| NetEqOutputType type;
|
| @@ -752,19 +734,15 @@ TEST_F(NetEqImplTest, CodecInternalCng) {
|
| 50 * kSampleRateKhz, 10 * kSampleRateKhz
|
| };
|
|
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| EXPECT_TRUE(neteq_->GetPlayoutTimestamp(&last_timestamp));
|
|
|
| for (size_t i = 1; i < 6; ++i) {
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(expected_type[i - 1], type);
|
| EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp));
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp));
|
| EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]);
|
| last_timestamp = timestamp;
|
| @@ -778,12 +756,10 @@ TEST_F(NetEqImplTest, CodecInternalCng) {
|
| neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
|
|
|
| for (size_t i = 6; i < 8; ++i) {
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(expected_type[i - 1], type);
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| EXPECT_TRUE(neteq_->GetPlayoutTimestamp(×tamp));
|
| EXPECT_EQ(timestamp, last_timestamp + expected_timestamp_increment[i]);
|
| last_timestamp = timestamp;
|
| @@ -871,24 +847,23 @@ TEST_F(NetEqImplTest, UnsupportedDecoder) {
|
| EXPECT_EQ(NetEq::kOK,
|
| neteq_->InsertPacket(rtp_header, payload, kReceiveTime));
|
|
|
| - const size_t kMaxOutputSize = 10 * kSampleRateHz / 1000 * kChannels;
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| -
|
| - EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(kMaxOutputSize, output,
|
| - &samples_per_channel, &num_channels,
|
| - &type));
|
| + // First call to GetAudio will try to decode the "faulty" packet.
|
| + // Expect kFail return value...
|
| + EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &type));
|
| + // ... and kOtherDecoderError error code.
|
| EXPECT_EQ(NetEq::kOtherDecoderError, neteq_->LastError());
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels);
|
| - EXPECT_EQ(kChannels, num_channels);
|
| -
|
| - EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(kMaxOutputSize, output,
|
| - &samples_per_channel, &num_channels,
|
| - &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel * kChannels);
|
| - EXPECT_EQ(kChannels, num_channels);
|
| + // Output size and number of channels should be correct.
|
| + const size_t kExpectedOutputSize = 10 * (kSampleRateHz / 1000) * kChannels;
|
| + EXPECT_EQ(kExpectedOutputSize, output.samples_per_channel_ * kChannels);
|
| + EXPECT_EQ(kChannels, output.num_channels_);
|
| +
|
| + // Second call to GetAudio will decode the packet that is ok. No errors are
|
| + // expected.
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kExpectedOutputSize, output.samples_per_channel_ * kChannels);
|
| + EXPECT_EQ(kChannels, output.num_channels_);
|
| }
|
|
|
| // This test inserts packets until the buffer is flushed. After that, it asks
|
| @@ -978,15 +953,11 @@ TEST_F(NetEqImplTest, DecodedPayloadTooShort) {
|
|
|
| // Pull audio once.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - ASSERT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + ASSERT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| EXPECT_CALL(mock_decoder, Die());
|
| @@ -1075,43 +1046,33 @@ TEST_F(NetEqImplTest, DecodingError) {
|
|
|
| // Pull audio.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| // Pull audio again. Decoder fails.
|
| - EXPECT_EQ(NetEq::kFail,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| + EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &type));
|
| EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError());
|
| EXPECT_EQ(kDecoderErrorCode, neteq_->LastDecoderError());
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| // TODO(minyue): should NetEq better give kOutputPLC, since it is actually an
|
| // expansion.
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| // Pull audio again, should continue an expansion.
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputPLC, type);
|
|
|
| // Pull audio again, should behave normal.
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputNormal, type);
|
|
|
| EXPECT_CALL(mock_decoder, Die());
|
| @@ -1196,35 +1157,27 @@ TEST_F(NetEqImplTest, DecodingErrorDuringInternalCng) {
|
|
|
| // Pull audio.
|
| const size_t kMaxOutputSize = static_cast<size_t>(10 * kSampleRateHz / 1000);
|
| - int16_t output[kMaxOutputSize];
|
| - size_t samples_per_channel;
|
| - size_t num_channels;
|
| + AudioFrame output;
|
| NetEqOutputType type;
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputCNG, type);
|
|
|
| // Pull audio again. Decoder fails.
|
| - EXPECT_EQ(NetEq::kFail,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| + EXPECT_EQ(NetEq::kFail, neteq_->GetAudio(&output, &type));
|
| EXPECT_EQ(NetEq::kDecoderErrorCode, neteq_->LastError());
|
| EXPECT_EQ(kDecoderErrorCode, neteq_->LastDecoderError());
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| // TODO(minyue): should NetEq better give kOutputPLC, since it is actually an
|
| // expansion.
|
| EXPECT_EQ(kOutputCNG, type);
|
|
|
| // Pull audio again, should resume codec CNG.
|
| - EXPECT_EQ(NetEq::kOK,
|
| - neteq_->GetAudio(kMaxOutputSize, output, &samples_per_channel,
|
| - &num_channels, &type));
|
| - EXPECT_EQ(kMaxOutputSize, samples_per_channel);
|
| - EXPECT_EQ(1u, num_channels);
|
| + EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output, &type));
|
| + EXPECT_EQ(kMaxOutputSize, output.samples_per_channel_);
|
| + EXPECT_EQ(1u, output.num_channels_);
|
| EXPECT_EQ(kOutputCNG, type);
|
|
|
| EXPECT_CALL(mock_decoder, Die());
|
|
|