class FFmpegAudioDecoderTest : public testing::Test {
public:
FFmpegAudioDecoderTest()
- : decoder_(new FFmpegAudioDecoder(message_loop_.message_loop_proxy())),
+ : decoder_(new FFmpegAudioDecoder(message_loop_.message_loop_proxy(),
+ LogCB())),
pending_decode_(false),
pending_reset_(false),
- pending_stop_(false) {
+ last_decode_status_(AudioDecoder::kOk) {
FFmpegGlue::InitializeFFmpeg();
vorbis_extradata_ = ReadTestDataFile("vorbis-extradata");
virtual ~FFmpegAudioDecoderTest() {
EXPECT_FALSE(pending_decode_);
EXPECT_FALSE(pending_reset_);
- EXPECT_FALSE(pending_stop_);
}
void Initialize() {
vorbis_extradata_->data_size(),
false); // Not encrypted.
decoder_->Initialize(config,
- NewExpectedStatusCB(PIPELINE_OK));
+ NewExpectedStatusCB(PIPELINE_OK),
+ base::Bind(&FFmpegAudioDecoderTest::OnDecoderOutput,
+ base::Unretained(this)));
base::RunLoop().RunUntilIdle();
}
base::Bind(&FFmpegAudioDecoderTest::DecodeFinished,
base::Unretained(this)));
base::RunLoop().RunUntilIdle();
+ EXPECT_FALSE(pending_decode_);
+ EXPECT_EQ(AudioDecoder::kOk, last_decode_status_);
}
void Reset() {
}
void Stop() {
- pending_stop_ = true;
- decoder_->Stop(base::Bind(
- &FFmpegAudioDecoderTest::StopFinished, base::Unretained(this)));
+ decoder_->Stop();
base::RunLoop().RunUntilIdle();
}
- void DecodeFinished(AudioDecoder::Status status,
- const scoped_refptr<AudioBuffer>& buffer) {
- EXPECT_TRUE(pending_decode_);
- pending_decode_ = false;
-
- if (status == AudioDecoder::kNotEnoughData) {
- EXPECT_TRUE(buffer.get() == NULL);
- Decode();
- return;
- }
-
+ void OnDecoderOutput(const scoped_refptr<AudioBuffer>& buffer) {
+ EXPECT_FALSE(buffer->end_of_stream());
decoded_audio_.push_back(buffer);
-
- // If we hit a NULL buffer or have a pending reset, we expect an abort.
- if (buffer.get() == NULL || pending_stop_ || pending_reset_) {
- EXPECT_TRUE(buffer.get() == NULL);
- EXPECT_EQ(status, AudioDecoder::kAborted);
- return;
- }
-
- EXPECT_EQ(status, AudioDecoder::kOk);
}
- void StopFinished() {
- EXPECT_TRUE(pending_stop_);
- // Stop should always finish after Decode and Reset.
- EXPECT_FALSE(pending_decode_);
- EXPECT_FALSE(pending_reset_);
+ void DecodeFinished(AudioDecoder::Status status) {
+ EXPECT_TRUE(pending_decode_);
+ pending_decode_ = false;
- pending_stop_ = false;
+ last_decode_status_ = status;
}
void ResetFinished() {
EXPECT_LT(i, decoded_audio_.size());
EXPECT_EQ(timestamp, decoded_audio_[i]->timestamp().InMicroseconds());
EXPECT_EQ(duration, decoded_audio_[i]->duration().InMicroseconds());
- EXPECT_FALSE(decoded_audio_[i]->end_of_stream());
- }
-
- void ExpectEndOfStream(size_t i) {
- EXPECT_LT(i, decoded_audio_.size());
- EXPECT_TRUE(decoded_audio_[i]->end_of_stream());
}
base::MessageLoop message_loop_;
scoped_ptr<FFmpegAudioDecoder> decoder_;
bool pending_decode_;
bool pending_reset_;
- bool pending_stop_;
scoped_refptr<DecoderBuffer> vorbis_extradata_;
std::deque<scoped_refptr<DecoderBuffer> > encoded_audio_;
std::deque<scoped_refptr<AudioBuffer> > decoded_audio_;
+ AudioDecoder::Status last_decode_status_;
};
TEST_F(FFmpegAudioDecoderTest, Initialize) {
Decode();
Decode();
Decode();
+ Decode();
ASSERT_EQ(3u, decoded_audio_.size());
ExpectDecodedAudio(0, 0, 2902);
ExpectDecodedAudio(1, 2902, 13061);
- ExpectDecodedAudio(2, 15963, 23220);
-
- // Call one more time to trigger EOS.
- Decode();
- ASSERT_EQ(4u, decoded_audio_.size());
- ExpectEndOfStream(3);
- Stop();
-}
+ ExpectDecodedAudio(2, 15963, 23219);
-TEST_F(FFmpegAudioDecoderTest, DecodeAbort) {
- encoded_audio_.clear();
- encoded_audio_.push_back(NULL);
+ // Call one more time with EOS.
Decode();
-
- EXPECT_EQ(decoded_audio_.size(), 1u);
- EXPECT_TRUE(decoded_audio_[0].get() == NULL);
+ ASSERT_EQ(3u, decoded_audio_.size());
Stop();
}
Decode();
Stop();
SatisfyPendingDecode();
- Stop();
}
TEST_F(FFmpegAudioDecoderTest, PendingDecode_Reset) {