| Index: media/filters/opus_audio_decoder_unittest.cc
|
| diff --git a/media/filters/ffmpeg_audio_decoder_unittest.cc b/media/filters/opus_audio_decoder_unittest.cc
|
| similarity index 51%
|
| copy from media/filters/ffmpeg_audio_decoder_unittest.cc
|
| copy to media/filters/opus_audio_decoder_unittest.cc
|
| index 60d1f405baa2fbef084b582e18f21ea22ead553a..6aea7b5f1044d788e2e28cd21b2e02a50f360df1 100644
|
| --- a/media/filters/ffmpeg_audio_decoder_unittest.cc
|
| +++ b/media/filters/opus_audio_decoder_unittest.cc
|
| @@ -14,8 +14,9 @@
|
| #include "media/base/test_data_util.h"
|
| #include "media/base/test_helpers.h"
|
| #include "media/ffmpeg/ffmpeg_common.h"
|
| -#include "media/filters/ffmpeg_audio_decoder.h"
|
| -#include "media/filters/ffmpeg_glue.h"
|
| +#include "media/filters/audio_file_reader.h"
|
| +#include "media/filters/in_memory_url_protocol.h"
|
| +#include "media/filters/opus_audio_decoder.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using ::testing::_;
|
| @@ -23,73 +24,67 @@ using ::testing::StrictMock;
|
|
|
| namespace media {
|
|
|
| -class FFmpegAudioDecoderTest : public testing::Test {
|
| +class OpusAudioDecoderTest : public testing::Test {
|
| public:
|
| - FFmpegAudioDecoderTest()
|
| - : decoder_(new FFmpegAudioDecoder(message_loop_.message_loop_proxy())),
|
| + OpusAudioDecoderTest()
|
| + : decoder_(new OpusAudioDecoder(message_loop_.message_loop_proxy())),
|
| pending_decode_(false),
|
| pending_reset_(false) {
|
| - FFmpegGlue::InitializeFFmpeg();
|
| -
|
| - vorbis_extradata_ = ReadTestDataFile("vorbis-extradata");
|
| -
|
| - // Refer to media/test/data/README for details on vorbis test data.
|
| - for (int i = 0; i < 4; ++i) {
|
| - scoped_refptr<DecoderBuffer> buffer =
|
| - ReadTestDataFile(base::StringPrintf("vorbis-packet-%d", i));
|
| -
|
| - if (i < 3) {
|
| - buffer->set_timestamp(base::TimeDelta());
|
| - } else {
|
| - buffer->set_timestamp(base::TimeDelta::FromMicroseconds(2902));
|
| - }
|
| -
|
| - buffer->set_duration(base::TimeDelta());
|
| - encoded_audio_.push_back(buffer);
|
| - }
|
| -
|
| - // Push in an EOS buffer.
|
| - encoded_audio_.push_back(DecoderBuffer::CreateEOSBuffer());
|
| + // Load the test data file.
|
| + data_ = ReadTestDataFile("bear-opus.ogg");
|
| + protocol_.reset(
|
| + new InMemoryUrlProtocol(data_->data(), data_->data_size(), false));
|
| + reader_.reset(new AudioFileReader(protocol_.get()));
|
| + reader_->Open();
|
|
|
| Initialize();
|
| }
|
|
|
| - virtual ~FFmpegAudioDecoderTest() {
|
| + virtual ~OpusAudioDecoderTest() {
|
| EXPECT_FALSE(pending_decode_);
|
| EXPECT_FALSE(pending_reset_);
|
| }
|
|
|
| void Initialize() {
|
| - AudioDecoderConfig config(kCodecVorbis,
|
| - kSampleFormatPlanarF32,
|
| - CHANNEL_LAYOUT_STEREO,
|
| - 44100,
|
| - vorbis_extradata_->data(),
|
| - vorbis_extradata_->data_size(),
|
| - false); // Not encrypted.
|
| - decoder_->Initialize(config,
|
| - NewExpectedStatusCB(PIPELINE_OK));
|
| + AudioDecoderConfig config;
|
| + AVCodecContextToAudioDecoderConfig(
|
| + reader_->codec_context_for_testing(), false, &config, false);
|
| + decoder_->Initialize(config, NewExpectedStatusCB(PIPELINE_OK));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| - void SatisfyPendingDecode() {
|
| + void SatisfyPendingDecode() { base::RunLoop().RunUntilIdle(); }
|
| +
|
| + void SendEndOfStream() {
|
| + pending_decode_ = true;
|
| + decoder_->Decode(DecoderBuffer::CreateEOSBuffer(),
|
| + base::Bind(&OpusAudioDecoderTest::DecodeFinished,
|
| + base::Unretained(this)));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| void Decode() {
|
| pending_decode_ = true;
|
| - scoped_refptr<DecoderBuffer> buffer(encoded_audio_.front());
|
| - encoded_audio_.pop_front();
|
| +
|
| + AVPacket packet;
|
| + ASSERT_TRUE(reader_->ReadPacketForTesting(&packet));
|
| + scoped_refptr<DecoderBuffer> buffer =
|
| + DecoderBuffer::CopyFrom(packet.data, packet.size);
|
| + buffer->set_timestamp(ConvertFromTimeBase(
|
| + reader_->codec_context_for_testing()->time_base, packet.pts));
|
| + buffer->set_duration(ConvertFromTimeBase(
|
| + reader_->codec_context_for_testing()->time_base, packet.duration));
|
| decoder_->Decode(buffer,
|
| - base::Bind(&FFmpegAudioDecoderTest::DecodeFinished,
|
| + base::Bind(&OpusAudioDecoderTest::DecodeFinished,
|
| base::Unretained(this)));
|
| + av_free_packet(&packet);
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| void Reset() {
|
| pending_reset_ = true;
|
| - decoder_->Reset(base::Bind(
|
| - &FFmpegAudioDecoderTest::ResetFinished, base::Unretained(this)));
|
| + decoder_->Reset(base::Bind(&OpusAudioDecoderTest::ResetFinished,
|
| + base::Unretained(this)));
|
| base::RunLoop().RunUntilIdle();
|
| }
|
|
|
| @@ -142,72 +137,58 @@ class FFmpegAudioDecoderTest : public testing::Test {
|
| }
|
|
|
| base::MessageLoop message_loop_;
|
| - scoped_ptr<FFmpegAudioDecoder> decoder_;
|
| + scoped_refptr<DecoderBuffer> data_;
|
| + scoped_ptr<InMemoryUrlProtocol> protocol_;
|
| + scoped_ptr<AudioFileReader> reader_;
|
| +
|
| + scoped_ptr<OpusAudioDecoder> decoder_;
|
| bool pending_decode_;
|
| bool pending_reset_;
|
|
|
| - scoped_refptr<DecoderBuffer> vorbis_extradata_;
|
| -
|
| - std::deque<scoped_refptr<DecoderBuffer> > encoded_audio_;
|
| std::deque<scoped_refptr<AudioBuffer> > decoded_audio_;
|
| };
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, Initialize) {
|
| - AudioDecoderConfig config(kCodecVorbis,
|
| - kSampleFormatPlanarF32,
|
| - CHANNEL_LAYOUT_STEREO,
|
| - 44100,
|
| - vorbis_extradata_->data(),
|
| - vorbis_extradata_->data_size(),
|
| - false); // Not encrypted.
|
| +TEST_F(OpusAudioDecoderTest, Initialize) {
|
| + Initialize();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, ProduceAudioSamples) {
|
| - // Vorbis requires N+1 packets to produce audio data for N packets.
|
| - //
|
| - // This will should result in the demuxer receiving three reads for two
|
| - // requests to produce audio samples.
|
| +TEST_F(OpusAudioDecoderTest, ProduceAudioSamples) {
|
| Decode();
|
| Decode();
|
| Decode();
|
|
|
| ASSERT_EQ(3u, decoded_audio_.size());
|
| - ExpectDecodedAudio(0, 0, 2902);
|
| - ExpectDecodedAudio(1, 2902, 13061);
|
| - ExpectDecodedAudio(2, 15963, 23220);
|
| + ExpectDecodedAudio(0, 0, 3500);
|
| + ExpectDecodedAudio(1, 3500, 10000);
|
| + ExpectDecodedAudio(2, 13500, 10000);
|
|
|
| // Call one more time to trigger EOS.
|
| - Decode();
|
| + SendEndOfStream();
|
| ASSERT_EQ(4u, decoded_audio_.size());
|
| ExpectEndOfStream(3);
|
| Stop();
|
| }
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, DecodeAbort) {
|
| - encoded_audio_.clear();
|
| - encoded_audio_.push_back(NULL);
|
| +TEST_F(OpusAudioDecoderTest, DecodeAbort) {
|
| Decode();
|
| -
|
| - EXPECT_EQ(decoded_audio_.size(), 1u);
|
| - EXPECT_TRUE(decoded_audio_[0].get() == NULL);
|
| Stop();
|
| }
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, PendingDecode_Stop) {
|
| +TEST_F(OpusAudioDecoderTest, PendingDecode_Stop) {
|
| Decode();
|
| Stop();
|
| SatisfyPendingDecode();
|
| }
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, PendingDecode_Reset) {
|
| +TEST_F(OpusAudioDecoderTest, PendingDecode_Reset) {
|
| Decode();
|
| Reset();
|
| SatisfyPendingDecode();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FFmpegAudioDecoderTest, PendingDecode_ResetStop) {
|
| +TEST_F(OpusAudioDecoderTest, PendingDecode_ResetStop) {
|
| Decode();
|
| Reset();
|
| Stop();
|
|
|