diff options
Diffstat (limited to 'chromium/media/cast/audio_receiver/audio_decoder_unittest.cc')
-rw-r--r-- | chromium/media/cast/audio_receiver/audio_decoder_unittest.cc | 99 |
1 files changed, 59 insertions, 40 deletions
diff --git a/chromium/media/cast/audio_receiver/audio_decoder_unittest.cc b/chromium/media/cast/audio_receiver/audio_decoder_unittest.cc index dbe3e324df0..04df4728bd9 100644 --- a/chromium/media/cast/audio_receiver/audio_decoder_unittest.cc +++ b/chromium/media/cast/audio_receiver/audio_decoder_unittest.cc @@ -2,38 +2,49 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/bind.h" -#include "base/memory/ref_counted.h" -#include "base/memory/scoped_ptr.h" +#include "base/test/simple_test_tick_clock.h" #include "media/cast/audio_receiver/audio_decoder.h" -#include "media/cast/cast_thread.h" +#include "media/cast/cast_environment.h" #include "media/cast/test/fake_task_runner.h" #include "testing/gmock/include/gmock/gmock.h" namespace media { namespace cast { -static const int64 kStartMillisecond = 123456789; +namespace { +class TestRtpPayloadFeedback : public RtpPayloadFeedback { + public: + TestRtpPayloadFeedback() {} + virtual ~TestRtpPayloadFeedback() {} + + virtual void CastFeedback(const RtcpCastMessage& cast_feedback) OVERRIDE { + EXPECT_EQ(1u, cast_feedback.ack_frame_id_); + EXPECT_EQ(0u, cast_feedback.missing_frames_and_packets_.size()); + } +}; +} // namespace. class AudioDecoderTest : public ::testing::Test { protected: - AudioDecoderTest() {} - - ~AudioDecoderTest() {} - - virtual void SetUp() { + AudioDecoderTest() { + testing_clock_.Advance(base::TimeDelta::FromMilliseconds(1234)); task_runner_ = new test::FakeTaskRunner(&testing_clock_); - cast_thread_ = new CastThread(task_runner_, task_runner_, task_runner_, - task_runner_, task_runner_); + cast_environment_ = new CastEnvironment(&testing_clock_, task_runner_, + task_runner_, task_runner_, task_runner_, task_runner_, + GetDefaultCastLoggingConfig()); } + virtual ~AudioDecoderTest() {} + void Configure(const AudioReceiverConfig& audio_config) { - audio_decoder_ = new AudioDecoder(cast_thread_, audio_config); + audio_decoder_.reset( + new AudioDecoder(cast_environment_, audio_config, &cast_feedback_)); } + TestRtpPayloadFeedback cast_feedback_; base::SimpleTestTickClock testing_clock_; scoped_refptr<test::FakeTaskRunner> task_runner_; - scoped_refptr<CastThread> cast_thread_; - scoped_refptr<AudioDecoder> audio_decoder_; + scoped_refptr<CastEnvironment> cast_environment_; + scoped_ptr<AudioDecoder> audio_decoder_; }; TEST_F(AudioDecoderTest, Pcm16MonoNoResampleOnePacket) { @@ -56,23 +67,26 @@ TEST_F(AudioDecoderTest, Pcm16MonoNoResampleOnePacket) { rtp_header.webrtc.type.Audio.isCNG = false; std::vector<int16> payload(640, 0x1234); - - uint8* payload_data = reinterpret_cast<uint8*>(&payload[0]); - int payload_size = payload.size() * sizeof(int16); - - audio_decoder_->IncomingParsedRtpPacket(payload_data, payload_size, - rtp_header); - int number_of_10ms_blocks = 4; int desired_frequency = 16000; PcmAudioFrame audio_frame; uint32 rtp_timestamp; + EXPECT_FALSE(audio_decoder_->GetRawAudioFrame(number_of_10ms_blocks, + desired_frequency, + &audio_frame, + &rtp_timestamp)); + + uint8* payload_data = reinterpret_cast<uint8*>(&payload[0]); + size_t payload_size = payload.size() * sizeof(int16); + + audio_decoder_->IncomingParsedRtpPacket(payload_data, + payload_size, rtp_header); + EXPECT_TRUE(audio_decoder_->GetRawAudioFrame(number_of_10ms_blocks, desired_frequency, &audio_frame, &rtp_timestamp)); - EXPECT_EQ(1, audio_frame.channels); EXPECT_EQ(16000, audio_frame.frequency); EXPECT_EQ(640ul, audio_frame.samples.size()); @@ -80,7 +94,6 @@ TEST_F(AudioDecoderTest, Pcm16MonoNoResampleOnePacket) { for (size_t i = 10; i < audio_frame.samples.size(); ++i) { EXPECT_EQ(0x3412, audio_frame.samples[i]); } - task_runner_->RunTasks(); } TEST_F(AudioDecoderTest, Pcm16StereoNoResampleTwoPackets) { @@ -93,6 +106,7 @@ TEST_F(AudioDecoderTest, Pcm16StereoNoResampleTwoPackets) { Configure(audio_config); RtpCastHeader rtp_header; + rtp_header.frame_id = 0; rtp_header.webrtc.header.payloadType = 127; rtp_header.webrtc.header.sequenceNumber = 1234; rtp_header.webrtc.header.timestamp = 0x87654321; @@ -106,11 +120,10 @@ TEST_F(AudioDecoderTest, Pcm16StereoNoResampleTwoPackets) { std::vector<int16> payload(640, 0x1234); uint8* payload_data = reinterpret_cast<uint8*>(&payload[0]); - int payload_size = payload.size() * sizeof(int16); - - audio_decoder_->IncomingParsedRtpPacket(payload_data, payload_size, - rtp_header); + size_t payload_size = payload.size() * sizeof(int16); + audio_decoder_->IncomingParsedRtpPacket(payload_data, + payload_size, rtp_header); int number_of_10ms_blocks = 2; int desired_frequency = 16000; @@ -121,29 +134,36 @@ TEST_F(AudioDecoderTest, Pcm16StereoNoResampleTwoPackets) { desired_frequency, &audio_frame, &rtp_timestamp)); - EXPECT_EQ(2, audio_frame.channels); EXPECT_EQ(16000, audio_frame.frequency); EXPECT_EQ(640ul, audio_frame.samples.size()); + // First 10 samples per channel are 0 from NetEq. for (size_t i = 10 * audio_config.channels; i < audio_frame.samples.size(); ++i) { EXPECT_EQ(0x3412, audio_frame.samples[i]); } + rtp_header.frame_id++; rtp_header.webrtc.header.sequenceNumber++; rtp_header.webrtc.header.timestamp += (audio_config.frequency / 100) * 2 * 2; - audio_decoder_->IncomingParsedRtpPacket(payload_data, payload_size, - rtp_header); + audio_decoder_->IncomingParsedRtpPacket(payload_data, + payload_size, rtp_header); + + EXPECT_TRUE(audio_decoder_->GetRawAudioFrame(number_of_10ms_blocks, + desired_frequency, + &audio_frame, + &rtp_timestamp)); EXPECT_EQ(2, audio_frame.channels); EXPECT_EQ(16000, audio_frame.frequency); EXPECT_EQ(640ul, audio_frame.samples.size()); - // First 10 samples per channel are 0 from NetEq. - for (size_t i = 10 * audio_config.channels; i < audio_frame.samples.size(); - ++i) { - EXPECT_EQ(0x3412, audio_frame.samples[i]); + for (size_t i = 0; i < audio_frame.samples.size(); ++i) { + EXPECT_NEAR(0x3412, audio_frame.samples[i], 1000); } - task_runner_->RunTasks(); + // Test cast callback. + audio_decoder_->SendCastMessage(); + testing_clock_.Advance(base::TimeDelta::FromMilliseconds(33)); + audio_decoder_->SendCastMessage(); } TEST_F(AudioDecoderTest, Pcm16Resample) { @@ -169,10 +189,10 @@ TEST_F(AudioDecoderTest, Pcm16Resample) { std::vector<int16> payload(640, 0x1234); uint8* payload_data = reinterpret_cast<uint8*>(&payload[0]); - int payload_size = payload.size() * sizeof(int16); + size_t payload_size = payload.size() * sizeof(int16); - audio_decoder_->IncomingParsedRtpPacket(payload_data, payload_size, - rtp_header); + audio_decoder_->IncomingParsedRtpPacket(payload_data, + payload_size, rtp_header); int number_of_10ms_blocks = 2; int desired_frequency = 48000; @@ -194,7 +214,6 @@ TEST_F(AudioDecoderTest, Pcm16Resample) { EXPECT_NEAR(0x3412, audio_frame.samples[i], 400); if (0x3412 == audio_frame.samples[i]) count++; } - task_runner_->RunTasks(); } } // namespace cast |