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 |