| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 base::TimeDelta::FromSecondsD(base::ByteSwapToLE32(*skip_samples_ptr) / | 129 base::TimeDelta::FromSecondsD(base::ByteSwapToLE32(*skip_samples_ptr) / |
| 130 samples_per_second), | 130 samples_per_second), |
| 131 base::TimeDelta())); | 131 base::TimeDelta())); |
| 132 } | 132 } |
| 133 | 133 |
| 134 class AudioDecoderTest : public testing::TestWithParam<DecoderTestData> { | 134 class AudioDecoderTest : public testing::TestWithParam<DecoderTestData> { |
| 135 public: | 135 public: |
| 136 AudioDecoderTest() | 136 AudioDecoderTest() |
| 137 : pending_decode_(false), | 137 : pending_decode_(false), |
| 138 pending_reset_(false), | 138 pending_reset_(false), |
| 139 last_decode_status_(AudioDecoder::kDecodeError) { | 139 last_decode_status_(DecodeStatus::DECODE_ERROR) { |
| 140 switch (GetParam().decoder_type) { | 140 switch (GetParam().decoder_type) { |
| 141 case FFMPEG: | 141 case FFMPEG: |
| 142 decoder_.reset(new FFmpegAudioDecoder(message_loop_.task_runner(), | 142 decoder_.reset(new FFmpegAudioDecoder(message_loop_.task_runner(), |
| 143 new MediaLog())); | 143 new MediaLog())); |
| 144 break; | 144 break; |
| 145 case OPUS: | 145 case OPUS: |
| 146 decoder_.reset( | 146 decoder_.reset( |
| 147 new OpusAudioDecoder(message_loop_.task_runner())); | 147 new OpusAudioDecoder(message_loop_.task_runner())); |
| 148 break; | 148 break; |
| 149 #if defined(OS_ANDROID) | 149 #if defined(OS_ANDROID) |
| 150 case MEDIA_CODEC: | 150 case MEDIA_CODEC: |
| 151 decoder_.reset(new MediaCodecAudioDecoder(message_loop_.task_runner())); | 151 decoder_.reset(new MediaCodecAudioDecoder(message_loop_.task_runner())); |
| 152 break; | 152 break; |
| 153 #endif | 153 #endif |
| 154 } | 154 } |
| 155 } | 155 } |
| 156 | 156 |
| 157 virtual ~AudioDecoderTest() { | 157 virtual ~AudioDecoderTest() { |
| 158 EXPECT_FALSE(pending_decode_); | 158 EXPECT_FALSE(pending_decode_); |
| 159 EXPECT_FALSE(pending_reset_); | 159 EXPECT_FALSE(pending_reset_); |
| 160 } | 160 } |
| 161 | 161 |
| 162 protected: | 162 protected: |
| 163 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer) { | 163 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& buffer) { |
| 164 ASSERT_FALSE(pending_decode_); | 164 ASSERT_FALSE(pending_decode_); |
| 165 pending_decode_ = true; | 165 pending_decode_ = true; |
| 166 last_decode_status_ = AudioDecoder::kDecodeError; | 166 last_decode_status_ = DecodeStatus::DECODE_ERROR; |
| 167 | 167 |
| 168 base::RunLoop run_loop; | 168 base::RunLoop run_loop; |
| 169 decoder_->Decode( | 169 decoder_->Decode( |
| 170 buffer, base::Bind(&AudioDecoderTest::DecodeFinished, | 170 buffer, base::Bind(&AudioDecoderTest::DecodeFinished, |
| 171 base::Unretained(this), run_loop.QuitClosure())); | 171 base::Unretained(this), run_loop.QuitClosure())); |
| 172 run_loop.Run(); | 172 run_loop.Run(); |
| 173 ASSERT_FALSE(pending_decode_); | 173 ASSERT_FALSE(pending_decode_); |
| 174 } | 174 } |
| 175 | 175 |
| 176 void SendEndOfStream() { | 176 void SendEndOfStream() { |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 Reset(); | 269 Reset(); |
| 270 decoded_audio_.clear(); | 270 decoded_audio_.clear(); |
| 271 ASSERT_TRUE(reader_->SeekForTesting(seek_time)); | 271 ASSERT_TRUE(reader_->SeekForTesting(seek_time)); |
| 272 } | 272 } |
| 273 | 273 |
| 274 void OnDecoderOutput(const scoped_refptr<AudioBuffer>& buffer) { | 274 void OnDecoderOutput(const scoped_refptr<AudioBuffer>& buffer) { |
| 275 EXPECT_FALSE(buffer->end_of_stream()); | 275 EXPECT_FALSE(buffer->end_of_stream()); |
| 276 decoded_audio_.push_back(buffer); | 276 decoded_audio_.push_back(buffer); |
| 277 } | 277 } |
| 278 | 278 |
| 279 void DecodeFinished(const base::Closure& quit_closure, | 279 void DecodeFinished(const base::Closure& quit_closure, DecodeStatus status) { |
| 280 AudioDecoder::Status status) { | |
| 281 EXPECT_TRUE(pending_decode_); | 280 EXPECT_TRUE(pending_decode_); |
| 282 EXPECT_FALSE(pending_reset_); | 281 EXPECT_FALSE(pending_reset_); |
| 283 pending_decode_ = false; | 282 pending_decode_ = false; |
| 284 last_decode_status_ = status; | 283 last_decode_status_ = status; |
| 285 quit_closure.Run(); | 284 quit_closure.Run(); |
| 286 } | 285 } |
| 287 | 286 |
| 288 void ResetFinished() { | 287 void ResetFinished() { |
| 289 EXPECT_TRUE(pending_reset_); | 288 EXPECT_TRUE(pending_reset_); |
| 290 EXPECT_FALSE(pending_decode_); | 289 EXPECT_FALSE(pending_decode_); |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 if (i > 0) | 357 if (i > 0) |
| 359 EXPECT_NE(exact_hash, GetDecodedAudioMD5(i - 1)); | 358 EXPECT_NE(exact_hash, GetDecodedAudioMD5(i - 1)); |
| 360 } | 359 } |
| 361 } | 360 } |
| 362 | 361 |
| 363 size_t decoded_audio_size() const { return decoded_audio_.size(); } | 362 size_t decoded_audio_size() const { return decoded_audio_.size(); } |
| 364 base::TimeDelta start_timestamp() const { return start_timestamp_; } | 363 base::TimeDelta start_timestamp() const { return start_timestamp_; } |
| 365 const scoped_refptr<AudioBuffer>& decoded_audio(size_t i) { | 364 const scoped_refptr<AudioBuffer>& decoded_audio(size_t i) { |
| 366 return decoded_audio_[i]; | 365 return decoded_audio_[i]; |
| 367 } | 366 } |
| 368 AudioDecoder::Status last_decode_status() const { | 367 DecodeStatus last_decode_status() const { return last_decode_status_; } |
| 369 return last_decode_status_; | |
| 370 } | |
| 371 | 368 |
| 372 private: | 369 private: |
| 373 base::MessageLoop message_loop_; | 370 base::MessageLoop message_loop_; |
| 374 scoped_refptr<DecoderBuffer> data_; | 371 scoped_refptr<DecoderBuffer> data_; |
| 375 scoped_ptr<InMemoryUrlProtocol> protocol_; | 372 scoped_ptr<InMemoryUrlProtocol> protocol_; |
| 376 scoped_ptr<AudioFileReader> reader_; | 373 scoped_ptr<AudioFileReader> reader_; |
| 377 | 374 |
| 378 scoped_ptr<AudioDecoder> decoder_; | 375 scoped_ptr<AudioDecoder> decoder_; |
| 379 bool pending_decode_; | 376 bool pending_decode_; |
| 380 bool pending_reset_; | 377 bool pending_reset_; |
| 381 AudioDecoder::Status last_decode_status_; | 378 DecodeStatus last_decode_status_; |
| 382 | 379 |
| 383 std::deque<scoped_refptr<AudioBuffer> > decoded_audio_; | 380 std::deque<scoped_refptr<AudioBuffer> > decoded_audio_; |
| 384 base::TimeDelta start_timestamp_; | 381 base::TimeDelta start_timestamp_; |
| 385 | 382 |
| 386 DISALLOW_COPY_AND_ASSIGN(AudioDecoderTest); | 383 DISALLOW_COPY_AND_ASSIGN(AudioDecoderTest); |
| 387 }; | 384 }; |
| 388 | 385 |
| 389 class OpusAudioDecoderBehavioralTest : public AudioDecoderTest {}; | 386 class OpusAudioDecoderBehavioralTest : public AudioDecoderTest {}; |
| 390 class FFmpegAudioDecoderBehavioralTest : public AudioDecoderTest {}; | 387 class FFmpegAudioDecoderBehavioralTest : public AudioDecoderTest {}; |
| 391 | 388 |
| 392 TEST_P(AudioDecoderTest, Initialize) { | 389 TEST_P(AudioDecoderTest, Initialize) { |
| 393 SKIP_TEST_IF_NO_MEDIA_CODEC(); | 390 SKIP_TEST_IF_NO_MEDIA_CODEC(); |
| 394 ASSERT_NO_FATAL_FAILURE(Initialize()); | 391 ASSERT_NO_FATAL_FAILURE(Initialize()); |
| 395 } | 392 } |
| 396 | 393 |
| 397 // Verifies decode audio as well as the Decode() -> Reset() sequence. | 394 // Verifies decode audio as well as the Decode() -> Reset() sequence. |
| 398 TEST_P(AudioDecoderTest, ProduceAudioSamples) { | 395 TEST_P(AudioDecoderTest, ProduceAudioSamples) { |
| 399 SKIP_TEST_IF_NO_MEDIA_CODEC(); | 396 SKIP_TEST_IF_NO_MEDIA_CODEC(); |
| 400 ASSERT_NO_FATAL_FAILURE(Initialize()); | 397 ASSERT_NO_FATAL_FAILURE(Initialize()); |
| 401 | 398 |
| 402 // Run the test multiple times with a seek back to the beginning in between. | 399 // Run the test multiple times with a seek back to the beginning in between. |
| 403 std::vector<std::string> decoded_audio_md5_hashes; | 400 std::vector<std::string> decoded_audio_md5_hashes; |
| 404 for (int i = 0; i < 2; ++i) { | 401 for (int i = 0; i < 2; ++i) { |
| 405 // Run decoder until we get at least |kDecodeRuns| output buffers. | 402 // Run decoder until we get at least |kDecodeRuns| output buffers. |
| 406 // Keeping Decode() in a loop seems to be the simplest way to guarantee that | 403 // Keeping Decode() in a loop seems to be the simplest way to guarantee that |
| 407 // the predefined number of output buffers are produced without draining | 404 // the predefined number of output buffers are produced without draining |
| 408 // (i.e. decoding EOS). | 405 // (i.e. decoding EOS). |
| 409 do { | 406 do { |
| 410 Decode(); | 407 Decode(); |
| 411 ASSERT_EQ(last_decode_status(), AudioDecoder::kOk); | 408 ASSERT_EQ(last_decode_status(), DecodeStatus::OK); |
| 412 } while (decoded_audio_size() < kDecodeRuns); | 409 } while (decoded_audio_size() < kDecodeRuns); |
| 413 | 410 |
| 414 // With MediaCodecAudioDecoder the output buffers might appear after | 411 // With MediaCodecAudioDecoder the output buffers might appear after |
| 415 // some delay. Since we keep decoding in a loop, the number of output | 412 // some delay. Since we keep decoding in a loop, the number of output |
| 416 // buffers when they eventually appear might exceed |kDecodeRuns|. | 413 // buffers when they eventually appear might exceed |kDecodeRuns|. |
| 417 ASSERT_LE(kDecodeRuns, decoded_audio_size()); | 414 ASSERT_LE(kDecodeRuns, decoded_audio_size()); |
| 418 | 415 |
| 419 // On the first pass record the exact MD5 hash for each decoded buffer. | 416 // On the first pass record the exact MD5 hash for each decoded buffer. |
| 420 if (i == 0) { | 417 if (i == 0) { |
| 421 for (size_t j = 0; j < kDecodeRuns; ++j) | 418 for (size_t j = 0; j < kDecodeRuns; ++j) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 433 | 430 |
| 434 // Seek back to the beginning. Calls Reset() on the decoder. | 431 // Seek back to the beginning. Calls Reset() on the decoder. |
| 435 Seek(start_timestamp()); | 432 Seek(start_timestamp()); |
| 436 } | 433 } |
| 437 } | 434 } |
| 438 | 435 |
| 439 TEST_P(AudioDecoderTest, Decode) { | 436 TEST_P(AudioDecoderTest, Decode) { |
| 440 SKIP_TEST_IF_NO_MEDIA_CODEC(); | 437 SKIP_TEST_IF_NO_MEDIA_CODEC(); |
| 441 ASSERT_NO_FATAL_FAILURE(Initialize()); | 438 ASSERT_NO_FATAL_FAILURE(Initialize()); |
| 442 Decode(); | 439 Decode(); |
| 443 EXPECT_EQ(AudioDecoder::kOk, last_decode_status()); | 440 EXPECT_EQ(DecodeStatus::OK, last_decode_status()); |
| 444 } | 441 } |
| 445 | 442 |
| 446 TEST_P(AudioDecoderTest, Reset) { | 443 TEST_P(AudioDecoderTest, Reset) { |
| 447 SKIP_TEST_IF_NO_MEDIA_CODEC(); | 444 SKIP_TEST_IF_NO_MEDIA_CODEC(); |
| 448 ASSERT_NO_FATAL_FAILURE(Initialize()); | 445 ASSERT_NO_FATAL_FAILURE(Initialize()); |
| 449 Reset(); | 446 Reset(); |
| 450 } | 447 } |
| 451 | 448 |
| 452 TEST_P(AudioDecoderTest, NoTimestamp) { | 449 TEST_P(AudioDecoderTest, NoTimestamp) { |
| 453 SKIP_TEST_IF_NO_MEDIA_CODEC(); | 450 SKIP_TEST_IF_NO_MEDIA_CODEC(); |
| 454 ASSERT_NO_FATAL_FAILURE(Initialize()); | 451 ASSERT_NO_FATAL_FAILURE(Initialize()); |
| 455 scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0)); | 452 scoped_refptr<DecoderBuffer> buffer(new DecoderBuffer(0)); |
| 456 buffer->set_timestamp(kNoTimestamp()); | 453 buffer->set_timestamp(kNoTimestamp()); |
| 457 DecodeBuffer(buffer); | 454 DecodeBuffer(buffer); |
| 458 EXPECT_EQ(AudioDecoder::kDecodeError, last_decode_status()); | 455 EXPECT_EQ(DecodeStatus::DECODE_ERROR, last_decode_status()); |
| 459 } | 456 } |
| 460 | 457 |
| 461 TEST_P(OpusAudioDecoderBehavioralTest, InitializeWithNoCodecDelay) { | 458 TEST_P(OpusAudioDecoderBehavioralTest, InitializeWithNoCodecDelay) { |
| 462 ASSERT_EQ(GetParam().decoder_type, OPUS); | 459 ASSERT_EQ(GetParam().decoder_type, OPUS); |
| 463 std::vector<uint8_t> extra_data( | 460 std::vector<uint8_t> extra_data( |
| 464 kOpusExtraData, | 461 kOpusExtraData, |
| 465 kOpusExtraData + arraysize(kOpusExtraData)); | 462 kOpusExtraData + arraysize(kOpusExtraData)); |
| 466 AudioDecoderConfig decoder_config; | 463 AudioDecoderConfig decoder_config; |
| 467 decoder_config.Initialize(kCodecOpus, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, | 464 decoder_config.Initialize(kCodecOpus, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, |
| 468 48000, extra_data, Unencrypted(), | 465 48000, extra_data, Unencrypted(), |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 }; | 618 }; |
| 622 | 619 |
| 623 INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderTest, | 620 INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderTest, |
| 624 AudioDecoderTest, | 621 AudioDecoderTest, |
| 625 testing::ValuesIn(kFFmpegTests)); | 622 testing::ValuesIn(kFFmpegTests)); |
| 626 INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderBehavioralTest, | 623 INSTANTIATE_TEST_CASE_P(FFmpegAudioDecoderBehavioralTest, |
| 627 FFmpegAudioDecoderBehavioralTest, | 624 FFmpegAudioDecoderBehavioralTest, |
| 628 testing::ValuesIn(kFFmpegBehavioralTest)); | 625 testing::ValuesIn(kFFmpegBehavioralTest)); |
| 629 | 626 |
| 630 } // namespace media | 627 } // namespace media |
| OLD | NEW |