| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "media/filters/pipeline_integration_test_base.h" | 5 #include "media/filters/pipeline_integration_test_base.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
| 11 #include "build/build_config.h" | 11 #include "build/build_config.h" |
| 12 #include "media/base/cdm_promise.h" | 12 #include "media/base/cdm_promise.h" |
| 13 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
| 14 #include "media/base/media_keys.h" | 14 #include "media/base/media_keys.h" |
| 15 #include "media/base/media_switches.h" | 15 #include "media/base/media_switches.h" |
| 16 #include "media/base/test_data_util.h" | 16 #include "media/base/test_data_util.h" |
| 17 #include "media/cdm/aes_decryptor.h" | 17 #include "media/cdm/aes_decryptor.h" |
| 18 #include "media/cdm/json_web_key.h" | 18 #include "media/cdm/json_web_key.h" |
| 19 #include "media/filters/chunk_demuxer.h" | 19 #include "media/filters/chunk_demuxer.h" |
| 20 #include "media/filters/renderer_impl.h" | 20 #include "media/filters/renderer_impl.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" |
| 21 | 22 |
| 22 using testing::_; | 23 using testing::_; |
| 23 using testing::AnyNumber; | 24 using testing::AnyNumber; |
| 25 using testing::AtLeast; |
| 24 using testing::AtMost; | 26 using testing::AtMost; |
| 25 using testing::SaveArg; | 27 using testing::SaveArg; |
| 26 | 28 |
| 27 namespace media { | 29 namespace media { |
| 28 | 30 |
| 29 const char kSourceId[] = "SourceId"; | 31 const char kSourceId[] = "SourceId"; |
| 30 const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; | 32 const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; |
| 31 | 33 |
| 32 const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; | 34 const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; |
| 33 const char kWebMVP9[] = "video/webm; codecs=\"vp9\""; | 35 const char kWebMVP9[] = "video/webm; codecs=\"vp9\""; |
| (...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 AppendData(seek_append_size); | 427 AppendData(seek_append_size); |
| 426 } | 428 } |
| 427 | 429 |
| 428 void AppendData(int size) { | 430 void AppendData(int size) { |
| 429 DCHECK(chunk_demuxer_); | 431 DCHECK(chunk_demuxer_); |
| 430 DCHECK_LT(current_position_, file_data_->data_size()); | 432 DCHECK_LT(current_position_, file_data_->data_size()); |
| 431 DCHECK_LE(current_position_ + size, file_data_->data_size()); | 433 DCHECK_LE(current_position_ + size, file_data_->data_size()); |
| 432 | 434 |
| 433 chunk_demuxer_->AppendData( | 435 chunk_demuxer_->AppendData( |
| 434 kSourceId, file_data_->data() + current_position_, size, | 436 kSourceId, file_data_->data() + current_position_, size, |
| 435 base::TimeDelta(), kInfiniteDuration(), &last_timestamp_offset_); | 437 base::TimeDelta(), kInfiniteDuration(), &last_timestamp_offset_, |
| 438 base::Bind(&MockMediaSource::InitSegmentReceived, |
| 439 base::Unretained(this))); |
| 436 current_position_ += size; | 440 current_position_ += size; |
| 437 } | 441 } |
| 438 | 442 |
| 439 void AppendAtTime(base::TimeDelta timestamp_offset, | 443 void AppendAtTime(base::TimeDelta timestamp_offset, |
| 440 const uint8* pData, | 444 const uint8* pData, |
| 441 int size) { | 445 int size) { |
| 442 CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); | 446 CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); |
| 443 chunk_demuxer_->AppendData(kSourceId, pData, size, | 447 chunk_demuxer_->AppendData(kSourceId, pData, size, |
| 444 base::TimeDelta(), kInfiniteDuration(), | 448 base::TimeDelta(), kInfiniteDuration(), |
| 445 ×tamp_offset); | 449 ×tamp_offset, |
| 450 base::Bind(&MockMediaSource::InitSegmentReceived, |
| 451 base::Unretained(this))); |
| 446 last_timestamp_offset_ = timestamp_offset; | 452 last_timestamp_offset_ = timestamp_offset; |
| 447 } | 453 } |
| 448 | 454 |
| 449 void AppendAtTimeWithWindow(base::TimeDelta timestamp_offset, | 455 void AppendAtTimeWithWindow(base::TimeDelta timestamp_offset, |
| 450 base::TimeDelta append_window_start, | 456 base::TimeDelta append_window_start, |
| 451 base::TimeDelta append_window_end, | 457 base::TimeDelta append_window_end, |
| 452 const uint8* pData, | 458 const uint8* pData, |
| 453 int size) { | 459 int size) { |
| 454 CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); | 460 CHECK(!chunk_demuxer_->IsParsingMediaSegment(kSourceId)); |
| 455 chunk_demuxer_->AppendData(kSourceId, | 461 chunk_demuxer_->AppendData(kSourceId, |
| 456 pData, | 462 pData, |
| 457 size, | 463 size, |
| 458 append_window_start, | 464 append_window_start, |
| 459 append_window_end, | 465 append_window_end, |
| 460 ×tamp_offset); | 466 ×tamp_offset, |
| 467 base::Bind(&MockMediaSource::InitSegmentReceived, |
| 468 base::Unretained(this))); |
| 461 last_timestamp_offset_ = timestamp_offset; | 469 last_timestamp_offset_ = timestamp_offset; |
| 462 } | 470 } |
| 463 | 471 |
| 464 void EndOfStream() { | 472 void EndOfStream() { |
| 465 chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); | 473 chunk_demuxer_->MarkEndOfStream(PIPELINE_OK); |
| 466 } | 474 } |
| 467 | 475 |
| 468 void Abort() { | 476 void Abort() { |
| 469 if (!chunk_demuxer_) | 477 if (!chunk_demuxer_) |
| 470 return; | 478 return; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 512 const std::vector<uint8>& init_data) { | 520 const std::vector<uint8>& init_data) { |
| 513 DCHECK(!init_data.empty()); | 521 DCHECK(!init_data.empty()); |
| 514 CHECK(!need_key_cb_.is_null()); | 522 CHECK(!need_key_cb_.is_null()); |
| 515 need_key_cb_.Run(type, init_data); | 523 need_key_cb_.Run(type, init_data); |
| 516 } | 524 } |
| 517 | 525 |
| 518 base::TimeDelta last_timestamp_offset() const { | 526 base::TimeDelta last_timestamp_offset() const { |
| 519 return last_timestamp_offset_; | 527 return last_timestamp_offset_; |
| 520 } | 528 } |
| 521 | 529 |
| 530 MOCK_METHOD0(InitSegmentReceived, void(void)); |
| 531 |
| 522 private: | 532 private: |
| 523 base::FilePath file_path_; | 533 base::FilePath file_path_; |
| 524 scoped_refptr<DecoderBuffer> file_data_; | 534 scoped_refptr<DecoderBuffer> file_data_; |
| 525 int current_position_; | 535 int current_position_; |
| 526 int initial_append_size_; | 536 int initial_append_size_; |
| 527 std::string mimetype_; | 537 std::string mimetype_; |
| 528 ChunkDemuxer* chunk_demuxer_; | 538 ChunkDemuxer* chunk_demuxer_; |
| 529 scoped_ptr<Demuxer> owned_chunk_demuxer_; | 539 scoped_ptr<Demuxer> owned_chunk_demuxer_; |
| 530 Demuxer::NeedKeyCB need_key_cb_; | 540 Demuxer::NeedKeyCB need_key_cb_; |
| 531 base::TimeDelta last_timestamp_offset_; | 541 base::TimeDelta last_timestamp_offset_; |
| 532 }; | 542 }; |
| 533 | 543 |
| 534 class PipelineIntegrationTest | 544 class PipelineIntegrationTest |
| 535 : public testing::Test, | 545 : public testing::Test, |
| 536 public PipelineIntegrationTestBase { | 546 public PipelineIntegrationTestBase { |
| 537 public: | 547 public: |
| 538 void StartPipelineWithMediaSource(MockMediaSource* source) { | 548 void StartPipelineWithMediaSource(MockMediaSource* source) { |
| 549 EXPECT_CALL(*source, InitSegmentReceived()).Times(AtLeast(1)); |
| 539 EXPECT_CALL(*this, OnMetadata(_)) | 550 EXPECT_CALL(*this, OnMetadata(_)) |
| 540 .Times(AtMost(1)) | 551 .Times(AtMost(1)) |
| 541 .WillRepeatedly(SaveArg<0>(&metadata_)); | 552 .WillRepeatedly(SaveArg<0>(&metadata_)); |
| 542 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) | 553 EXPECT_CALL(*this, OnBufferingStateChanged(BUFFERING_HAVE_ENOUGH)) |
| 543 .Times(AtMost(1)); | 554 .Times(AtMost(1)); |
| 544 demuxer_ = source->GetDemuxer().Pass(); | 555 demuxer_ = source->GetDemuxer().Pass(); |
| 545 pipeline_->Start( | 556 pipeline_->Start( |
| 546 demuxer_.get(), | 557 demuxer_.get(), |
| 547 CreateRenderer(NULL), | 558 CreateRenderer(NULL), |
| 548 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), | 559 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), |
| (...skipping 1029 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1578 ASSERT_TRUE(Start(GetTestDataFilePath("bear_audio_shorter_than_video.ogv"), | 1589 ASSERT_TRUE(Start(GetTestDataFilePath("bear_audio_shorter_than_video.ogv"), |
| 1579 PIPELINE_OK)); | 1590 PIPELINE_OK)); |
| 1580 // Audio track is 500ms. Video track is 1001ms. Duration should be higher of | 1591 // Audio track is 500ms. Video track is 1001ms. Duration should be higher of |
| 1581 // the two. | 1592 // the two. |
| 1582 EXPECT_EQ(1001, pipeline_->GetMediaDuration().InMilliseconds()); | 1593 EXPECT_EQ(1001, pipeline_->GetMediaDuration().InMilliseconds()); |
| 1583 Play(); | 1594 Play(); |
| 1584 ASSERT_TRUE(WaitUntilOnEnded()); | 1595 ASSERT_TRUE(WaitUntilOnEnded()); |
| 1585 } | 1596 } |
| 1586 | 1597 |
| 1587 } // namespace media | 1598 } // namespace media |
| OLD | NEW |