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/decoder_buffer.h" | 12 #include "media/base/decoder_buffer.h" |
13 #include "media/base/media_keys.h" | 13 #include "media/base/media_keys.h" |
14 #include "media/base/media_switches.h" | 14 #include "media/base/media_switches.h" |
15 #include "media/base/test_data_util.h" | 15 #include "media/base/test_data_util.h" |
16 #include "media/cdm/aes_decryptor.h" | 16 #include "media/cdm/aes_decryptor.h" |
17 #include "media/cdm/json_web_key.h" | 17 #include "media/cdm/json_web_key.h" |
18 #include "media/filters/chunk_demuxer.h" | 18 #include "media/filters/chunk_demuxer.h" |
19 | 19 |
20 using testing::_; | 20 using testing::_; |
21 using testing::AnyNumber; | 21 using testing::AnyNumber; |
22 using testing::AtMost; | 22 using testing::AtMost; |
| 23 using testing::Values; |
23 | 24 |
24 namespace media { | 25 namespace media { |
25 | 26 |
26 const char kSourceId[] = "SourceId"; | 27 const char kSourceId[] = "SourceId"; |
27 const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; | 28 const uint8 kInitData[] = { 0x69, 0x6e, 0x69, 0x74 }; |
28 | 29 |
29 const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; | 30 const char kWebM[] = "video/webm; codecs=\"vp8,vorbis\""; |
30 const char kWebMVP9[] = "video/webm; codecs=\"vp9\""; | 31 const char kWebMVP9[] = "video/webm; codecs=\"vp9\""; |
31 const char kAudioOnlyWebM[] = "video/webm; codecs=\"vorbis\""; | 32 const char kAudioOnlyWebM[] = "video/webm; codecs=\"vorbis\""; |
32 const char kOpusAudioOnlyWebM[] = "video/webm; codecs=\"opus\""; | 33 const char kOpusAudioOnlyWebM[] = "video/webm; codecs=\"opus\""; |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 AesDecryptor* decryptor) OVERRIDE { | 248 AesDecryptor* decryptor) OVERRIDE { |
248 } | 249 } |
249 }; | 250 }; |
250 | 251 |
251 // Helper class that emulates calls made on the ChunkDemuxer by the | 252 // Helper class that emulates calls made on the ChunkDemuxer by the |
252 // Media Source API. | 253 // Media Source API. |
253 class MockMediaSource { | 254 class MockMediaSource { |
254 public: | 255 public: |
255 MockMediaSource(const std::string& filename, | 256 MockMediaSource(const std::string& filename, |
256 const std::string& mimetype, | 257 const std::string& mimetype, |
257 int initial_append_size) | 258 int initial_append_size, |
| 259 const bool use_legacy_frame_processor) |
258 : file_path_(GetTestDataFilePath(filename)), | 260 : file_path_(GetTestDataFilePath(filename)), |
259 current_position_(0), | 261 current_position_(0), |
260 initial_append_size_(initial_append_size), | 262 initial_append_size_(initial_append_size), |
261 mimetype_(mimetype), | 263 mimetype_(mimetype), |
262 chunk_demuxer_(new ChunkDemuxer( | 264 chunk_demuxer_(new ChunkDemuxer( |
263 base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)), | 265 base::Bind(&MockMediaSource::DemuxerOpened, base::Unretained(this)), |
264 base::Bind(&MockMediaSource::DemuxerNeedKey, | 266 base::Bind(&MockMediaSource::DemuxerNeedKey, |
265 base::Unretained(this)), | 267 base::Unretained(this)), |
266 LogCB(), | 268 LogCB(), |
267 false)), | 269 false)), |
268 owned_chunk_demuxer_(chunk_demuxer_) { | 270 owned_chunk_demuxer_(chunk_demuxer_), |
| 271 use_legacy_frame_processor_(use_legacy_frame_processor) { |
269 | 272 |
270 file_data_ = ReadTestDataFile(filename); | 273 file_data_ = ReadTestDataFile(filename); |
271 | 274 |
272 if (initial_append_size_ == kAppendWholeFile) | 275 if (initial_append_size_ == kAppendWholeFile) |
273 initial_append_size_ = file_data_->data_size(); | 276 initial_append_size_ = file_data_->data_size(); |
274 | 277 |
275 DCHECK_GT(initial_append_size_, 0); | 278 DCHECK_GT(initial_append_size_, 0); |
276 DCHECK_LE(initial_append_size_, file_data_->data_size()); | 279 DCHECK_LE(initial_append_size_, file_data_->data_size()); |
277 } | 280 } |
278 | 281 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 size_t codecs_param_end = mimetype_.find("\"", codecs_param_start); | 359 size_t codecs_param_end = mimetype_.find("\"", codecs_param_start); |
357 | 360 |
358 CHECK_NE(codecs_param_end, std::string::npos); | 361 CHECK_NE(codecs_param_end, std::string::npos); |
359 | 362 |
360 std::string codecs_param = | 363 std::string codecs_param = |
361 mimetype_.substr(codecs_param_start, | 364 mimetype_.substr(codecs_param_start, |
362 codecs_param_end - codecs_param_start); | 365 codecs_param_end - codecs_param_start); |
363 Tokenize(codecs_param, ",", &codecs); | 366 Tokenize(codecs_param, ",", &codecs); |
364 } | 367 } |
365 | 368 |
366 CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs), ChunkDemuxer::kOk); | 369 CHECK_EQ(chunk_demuxer_->AddId(kSourceId, type, codecs, |
| 370 use_legacy_frame_processor_), |
| 371 ChunkDemuxer::kOk); |
| 372 |
367 AppendData(initial_append_size_); | 373 AppendData(initial_append_size_); |
368 } | 374 } |
369 | 375 |
370 void DemuxerNeedKey(const std::string& type, | 376 void DemuxerNeedKey(const std::string& type, |
371 const std::vector<uint8>& init_data) { | 377 const std::vector<uint8>& init_data) { |
372 DCHECK(!init_data.empty()); | 378 DCHECK(!init_data.empty()); |
373 CHECK(!need_key_cb_.is_null()); | 379 CHECK(!need_key_cb_.is_null()); |
374 need_key_cb_.Run(type, init_data); | 380 need_key_cb_.Run(type, init_data); |
375 } | 381 } |
376 | 382 |
377 base::TimeDelta last_timestamp_offset() const { | 383 base::TimeDelta last_timestamp_offset() const { |
378 return last_timestamp_offset_; | 384 return last_timestamp_offset_; |
379 } | 385 } |
380 | 386 |
381 private: | 387 private: |
382 base::FilePath file_path_; | 388 base::FilePath file_path_; |
383 scoped_refptr<DecoderBuffer> file_data_; | 389 scoped_refptr<DecoderBuffer> file_data_; |
384 int current_position_; | 390 int current_position_; |
385 int initial_append_size_; | 391 int initial_append_size_; |
386 std::string mimetype_; | 392 std::string mimetype_; |
387 ChunkDemuxer* chunk_demuxer_; | 393 ChunkDemuxer* chunk_demuxer_; |
388 scoped_ptr<Demuxer> owned_chunk_demuxer_; | 394 scoped_ptr<Demuxer> owned_chunk_demuxer_; |
389 Demuxer::NeedKeyCB need_key_cb_; | 395 Demuxer::NeedKeyCB need_key_cb_; |
390 base::TimeDelta last_timestamp_offset_; | 396 base::TimeDelta last_timestamp_offset_; |
| 397 bool use_legacy_frame_processor_; |
391 }; | 398 }; |
392 | 399 |
| 400 // Test parameter determines which coded frame processor is used to process |
| 401 // appended data, and is only applicable in tests where the pipeline is using a |
| 402 // (Mock)MediaSource (which are TEST_P, not TEST_F). If true, |
| 403 // LegacyFrameProcessor is used. Otherwise, (not yet supported), a more |
| 404 // compliant frame processor is used. |
| 405 // TODO(wolenetz): Enable usage of new frame processor based on this flag. |
| 406 // See http://crbug.com/249422. |
393 class PipelineIntegrationTest | 407 class PipelineIntegrationTest |
394 : public testing::Test, | 408 : public testing::TestWithParam<bool>, |
395 public PipelineIntegrationTestBase { | 409 public PipelineIntegrationTestBase { |
396 public: | 410 public: |
397 void StartPipelineWithMediaSource(MockMediaSource* source) { | 411 void StartPipelineWithMediaSource(MockMediaSource* source) { |
398 EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)); | 412 EXPECT_CALL(*this, OnMetadata(_)).Times(AtMost(1)); |
399 EXPECT_CALL(*this, OnPrerollCompleted()).Times(AtMost(1)); | 413 EXPECT_CALL(*this, OnPrerollCompleted()).Times(AtMost(1)); |
400 pipeline_->Start( | 414 pipeline_->Start( |
401 CreateFilterCollection(source->GetDemuxer(), NULL), | 415 CreateFilterCollection(source->GetDemuxer(), NULL), |
402 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), | 416 base::Bind(&PipelineIntegrationTest::OnEnded, base::Unretained(this)), |
403 base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), | 417 base::Bind(&PipelineIntegrationTest::OnError, base::Unretained(this)), |
404 QuitOnStatusCB(PIPELINE_OK), | 418 QuitOnStatusCB(PIPELINE_OK), |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 // Verifies that seeking works properly for ChunkDemuxer when the | 456 // Verifies that seeking works properly for ChunkDemuxer when the |
443 // seek happens while there is a pending read on the ChunkDemuxer | 457 // seek happens while there is a pending read on the ChunkDemuxer |
444 // and no data is available. | 458 // and no data is available. |
445 bool TestSeekDuringRead(const std::string& filename, | 459 bool TestSeekDuringRead(const std::string& filename, |
446 const std::string& mimetype, | 460 const std::string& mimetype, |
447 int initial_append_size, | 461 int initial_append_size, |
448 base::TimeDelta start_seek_time, | 462 base::TimeDelta start_seek_time, |
449 base::TimeDelta seek_time, | 463 base::TimeDelta seek_time, |
450 int seek_file_position, | 464 int seek_file_position, |
451 int seek_append_size) { | 465 int seek_append_size) { |
452 MockMediaSource source(filename, mimetype, initial_append_size); | 466 MockMediaSource source(filename, mimetype, initial_append_size, |
| 467 GetParam()); |
453 StartPipelineWithMediaSource(&source); | 468 StartPipelineWithMediaSource(&source); |
454 | 469 |
455 if (pipeline_status_ != PIPELINE_OK) | 470 if (pipeline_status_ != PIPELINE_OK) |
456 return false; | 471 return false; |
457 | 472 |
458 Play(); | 473 Play(); |
459 if (!WaitUntilCurrentTimeIsAfter(start_seek_time)) | 474 if (!WaitUntilCurrentTimeIsAfter(start_seek_time)) |
460 return false; | 475 return false; |
461 | 476 |
462 source.Seek(seek_time, seek_file_position, seek_append_size); | 477 source.Seek(seek_time, seek_file_position, seek_append_size); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
507 | 522 |
508 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-av_enc-av.webm"), | 523 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-av_enc-av.webm"), |
509 encrypted_media.decryptor())); | 524 encrypted_media.decryptor())); |
510 | 525 |
511 Play(); | 526 Play(); |
512 | 527 |
513 ASSERT_TRUE(WaitUntilOnEnded()); | 528 ASSERT_TRUE(WaitUntilOnEnded()); |
514 Stop(); | 529 Stop(); |
515 } | 530 } |
516 | 531 |
517 TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource) { | 532 TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource) { |
518 MockMediaSource source("bear-320x240.webm", kWebM, 219229); | 533 MockMediaSource source("bear-320x240.webm", kWebM, 219229, GetParam()); |
519 StartPipelineWithMediaSource(&source); | 534 StartPipelineWithMediaSource(&source); |
520 source.EndOfStream(); | 535 source.EndOfStream(); |
521 | 536 |
522 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 537 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
523 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 538 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
524 EXPECT_EQ(k320WebMFileDurationMs, | 539 EXPECT_EQ(k320WebMFileDurationMs, |
525 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 540 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
526 | 541 |
527 Play(); | 542 Play(); |
528 | 543 |
529 ASSERT_TRUE(WaitUntilOnEnded()); | 544 ASSERT_TRUE(WaitUntilOnEnded()); |
530 source.Abort(); | 545 source.Abort(); |
531 Stop(); | 546 Stop(); |
532 } | 547 } |
533 | 548 |
534 TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { | 549 TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VP9_WebM) { |
535 MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504); | 550 MockMediaSource source("bear-vp9.webm", kWebMVP9, 67504, GetParam()); |
536 StartPipelineWithMediaSource(&source); | 551 StartPipelineWithMediaSource(&source); |
537 source.EndOfStream(); | 552 source.EndOfStream(); |
538 | 553 |
539 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 554 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
540 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 555 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
541 EXPECT_EQ(kVP9WebMFileDurationMs, | 556 EXPECT_EQ(kVP9WebMFileDurationMs, |
542 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 557 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
543 | 558 |
544 Play(); | 559 Play(); |
545 | 560 |
546 ASSERT_TRUE(WaitUntilOnEnded()); | 561 ASSERT_TRUE(WaitUntilOnEnded()); |
547 source.Abort(); | 562 source.Abort(); |
548 Stop(); | 563 Stop(); |
549 } | 564 } |
550 | 565 |
551 TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { | 566 TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VP8A_WebM) { |
552 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); | 567 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); |
553 MockMediaSource source("bear-vp8a.webm", kVideoOnlyWebM, kAppendWholeFile); | 568 MockMediaSource source("bear-vp8a.webm", kVideoOnlyWebM, kAppendWholeFile, |
| 569 GetParam()); |
554 StartPipelineWithMediaSource(&source); | 570 StartPipelineWithMediaSource(&source); |
555 source.EndOfStream(); | 571 source.EndOfStream(); |
556 | 572 |
557 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 573 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
558 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 574 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
559 EXPECT_EQ(kVP8AWebMFileDurationMs, | 575 EXPECT_EQ(kVP8AWebMFileDurationMs, |
560 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 576 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
561 | 577 |
562 Play(); | 578 Play(); |
563 | 579 |
564 ASSERT_TRUE(WaitUntilOnEnded()); | 580 ASSERT_TRUE(WaitUntilOnEnded()); |
565 source.Abort(); | 581 source.Abort(); |
566 Stop(); | 582 Stop(); |
567 } | 583 } |
568 | 584 |
569 TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { | 585 TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_Opus_WebM) { |
570 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); | 586 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); |
571 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, | 587 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, |
572 kAppendWholeFile); | 588 kAppendWholeFile, GetParam()); |
573 StartPipelineWithMediaSource(&source); | 589 StartPipelineWithMediaSource(&source); |
574 source.EndOfStream(); | 590 source.EndOfStream(); |
575 | 591 |
576 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 592 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
577 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 593 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
578 // TODO(acolwell/wolenetz): Drop the "+ 1" once WebM stream parser always | 594 // TODO(acolwell/wolenetz): Drop the "+ 1" once WebM stream parser always |
579 // emits frames with valid durations (see http://crbug.com/351166) and | 595 // emits frames with valid durations (see http://crbug.com/351166) and |
580 // compliant coded frame processor's "highest presentation end timestamp" is | 596 // compliant coded frame processor's "highest presentation end timestamp" is |
581 // used to update duration (see http://crbug.com/249422). | 597 // used to update duration (see http://crbug.com/249422). |
582 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs + 1, | 598 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs + 1, |
583 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 599 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
584 Play(); | 600 Play(); |
585 | 601 |
586 ASSERT_TRUE(WaitUntilOnEnded()); | 602 ASSERT_TRUE(WaitUntilOnEnded()); |
587 source.Abort(); | 603 source.Abort(); |
588 Stop(); | 604 Stop(); |
589 } | 605 } |
590 | 606 |
591 // Flaky. http://crbug.com/304776 | 607 // Flaky. http://crbug.com/304776 |
592 TEST_F(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { | 608 TEST_P(PipelineIntegrationTest, DISABLED_MediaSource_Opus_Seeking_WebM) { |
593 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); | 609 EXPECT_CALL(*this, OnSetOpaque(false)).Times(AnyNumber()); |
594 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, | 610 MockMediaSource source("bear-opus-end-trimming.webm", kOpusAudioOnlyWebM, |
595 kAppendWholeFile); | 611 kAppendWholeFile, GetParam()); |
596 StartHashedPipelineWithMediaSource(&source); | 612 StartHashedPipelineWithMediaSource(&source); |
597 | 613 |
598 | |
599 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 614 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
600 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 615 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
601 // TODO(acolwell/wolenetz): Drop the "+ 1" once WebM stream parser always | 616 // TODO(acolwell/wolenetz): Drop the "+ 1" once WebM stream parser always |
602 // emits frames with valid durations (see http://crbug.com/351166) and | 617 // emits frames with valid durations (see http://crbug.com/351166) and |
603 // compliant coded frame processor's "highest presentation end timestamp" is | 618 // compliant coded frame processor's "highest presentation end timestamp" is |
604 // used to update duration (see http://crbug.com/249422). | 619 // used to update duration (see http://crbug.com/249422). |
605 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs + 1, | 620 EXPECT_EQ(kOpusEndTrimmingWebMFileDurationMs + 1, |
606 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 621 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
607 | 622 |
608 base::TimeDelta start_seek_time = base::TimeDelta::FromMilliseconds(1000); | 623 base::TimeDelta start_seek_time = base::TimeDelta::FromMilliseconds(1000); |
609 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000); | 624 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(2000); |
610 | 625 |
611 Play(); | 626 Play(); |
612 ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); | 627 ASSERT_TRUE(WaitUntilCurrentTimeIsAfter(start_seek_time)); |
613 source.Seek(seek_time, 0x1D5, 34017); | 628 source.Seek(seek_time, 0x1D5, 34017); |
614 source.EndOfStream(); | 629 source.EndOfStream(); |
615 ASSERT_TRUE(Seek(seek_time)); | 630 ASSERT_TRUE(Seek(seek_time)); |
616 | 631 |
617 ASSERT_TRUE(WaitUntilOnEnded()); | 632 ASSERT_TRUE(WaitUntilOnEnded()); |
618 | 633 |
619 EXPECT_EQ("0.76,0.20,-0.82,-0.58,-1.29,-0.29,", GetAudioHash()); | 634 EXPECT_EQ("0.76,0.20,-0.82,-0.58,-1.29,-0.29,", GetAudioHash()); |
620 | 635 |
621 source.Abort(); | 636 source.Abort(); |
622 Stop(); | 637 Stop(); |
623 } | 638 } |
624 | 639 |
625 TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { | 640 TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_WebM) { |
626 MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, | 641 MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, |
627 kAppendWholeFile); | 642 kAppendWholeFile, GetParam()); |
628 StartPipelineWithMediaSource(&source); | 643 StartPipelineWithMediaSource(&source); |
629 | 644 |
630 scoped_refptr<DecoderBuffer> second_file = | 645 scoped_refptr<DecoderBuffer> second_file = |
631 ReadTestDataFile("bear-640x360.webm"); | 646 ReadTestDataFile("bear-640x360.webm"); |
632 | 647 |
633 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 648 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
634 second_file->data(), second_file->data_size()); | 649 second_file->data(), second_file->data_size()); |
635 | 650 |
636 source.EndOfStream(); | 651 source.EndOfStream(); |
637 | 652 |
638 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 653 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
639 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 654 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
640 EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs, | 655 EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs, |
641 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 656 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
642 | 657 |
643 Play(); | 658 Play(); |
644 | 659 |
645 EXPECT_TRUE(WaitUntilOnEnded()); | 660 EXPECT_TRUE(WaitUntilOnEnded()); |
646 source.Abort(); | 661 source.Abort(); |
647 Stop(); | 662 Stop(); |
648 } | 663 } |
649 | 664 |
650 TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { | 665 TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_Encrypted_WebM) { |
651 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, | 666 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, |
652 kAppendWholeFile); | 667 kAppendWholeFile, GetParam()); |
653 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 668 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
654 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 669 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
655 | 670 |
656 scoped_refptr<DecoderBuffer> second_file = | 671 scoped_refptr<DecoderBuffer> second_file = |
657 ReadTestDataFile("bear-640x360-av_enc-av.webm"); | 672 ReadTestDataFile("bear-640x360-av_enc-av.webm"); |
658 | 673 |
659 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 674 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
660 second_file->data(), second_file->data_size()); | 675 second_file->data(), second_file->data_size()); |
661 | 676 |
662 source.EndOfStream(); | 677 source.EndOfStream(); |
663 | 678 |
664 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 679 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
665 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 680 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
666 // The "+ 1" is due to estimated audio and video frame durations on the last | 681 // The "+ 1" is due to estimated audio and video frame durations on the last |
667 // frames appended. The unencrypted file has a TrackEntry DefaultDuration | 682 // frames appended. The unencrypted file has a TrackEntry DefaultDuration |
668 // field for the video track, but the encrypted file does not. | 683 // field for the video track, but the encrypted file does not. |
669 EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs + 1, | 684 EXPECT_EQ(kAppendTimeMs + k640WebMFileDurationMs + 1, |
670 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 685 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
671 | 686 |
672 Play(); | 687 Play(); |
673 | 688 |
674 EXPECT_TRUE(WaitUntilOnEnded()); | 689 EXPECT_TRUE(WaitUntilOnEnded()); |
675 source.Abort(); | 690 source.Abort(); |
676 Stop(); | 691 Stop(); |
677 } | 692 } |
678 | 693 |
679 // Config changes from encrypted to clear are not currently supported. | 694 // Config changes from encrypted to clear are not currently supported. |
680 TEST_F(PipelineIntegrationTest, | 695 TEST_P(PipelineIntegrationTest, |
681 MediaSource_ConfigChange_ClearThenEncrypted_WebM) { | 696 MediaSource_ConfigChange_ClearThenEncrypted_WebM) { |
682 MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, | 697 MockMediaSource source("bear-320x240-16x9-aspect.webm", kWebM, |
683 kAppendWholeFile); | 698 kAppendWholeFile, GetParam()); |
684 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 699 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
685 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 700 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
686 | 701 |
687 scoped_refptr<DecoderBuffer> second_file = | 702 scoped_refptr<DecoderBuffer> second_file = |
688 ReadTestDataFile("bear-640x360-av_enc-av.webm"); | 703 ReadTestDataFile("bear-640x360-av_enc-av.webm"); |
689 | 704 |
690 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 705 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
691 second_file->data(), second_file->data_size()); | 706 second_file->data(), second_file->data_size()); |
692 | 707 |
693 source.EndOfStream(); | 708 source.EndOfStream(); |
694 | 709 |
695 message_loop_.Run(); | 710 message_loop_.Run(); |
696 EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); | 711 EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); |
697 | 712 |
698 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 713 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
699 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 714 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
700 // The second video was not added, so its time has not been added. | 715 // The second video was not added, so its time has not been added. |
701 EXPECT_EQ(k320WebMFileDurationMs, | 716 EXPECT_EQ(k320WebMFileDurationMs, |
702 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 717 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
703 | 718 |
704 Play(); | 719 Play(); |
705 | 720 |
706 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); | 721 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); |
707 source.Abort(); | 722 source.Abort(); |
708 } | 723 } |
709 | 724 |
710 // Config changes from clear to encrypted are not currently supported. | 725 // Config changes from clear to encrypted are not currently supported. |
711 TEST_F(PipelineIntegrationTest, | 726 TEST_P(PipelineIntegrationTest, |
712 MediaSource_ConfigChange_EncryptedThenClear_WebM) { | 727 MediaSource_ConfigChange_EncryptedThenClear_WebM) { |
713 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, | 728 MockMediaSource source("bear-320x240-16x9-aspect-av_enc-av.webm", kWebM, |
714 kAppendWholeFile); | 729 kAppendWholeFile, GetParam()); |
715 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 730 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
716 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 731 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
717 | 732 |
718 scoped_refptr<DecoderBuffer> second_file = | 733 scoped_refptr<DecoderBuffer> second_file = |
719 ReadTestDataFile("bear-640x360.webm"); | 734 ReadTestDataFile("bear-640x360.webm"); |
720 | 735 |
721 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 736 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
722 second_file->data(), second_file->data_size()); | 737 second_file->data(), second_file->data_size()); |
723 | 738 |
724 source.EndOfStream(); | 739 source.EndOfStream(); |
725 | 740 |
726 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 741 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
727 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 742 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
728 // The second video was not added, so its time has not been added. | 743 // The second video was not added, so its time has not been added. |
729 // The "+ 1" is due to estimated audio and video frame durations on the last | 744 // The "+ 1" is due to estimated audio and video frame durations on the last |
730 // frames appended. The unencrypted file has a TrackEntry DefaultDuration | 745 // frames appended. The unencrypted file has a TrackEntry DefaultDuration |
731 // field for the video track, but the encrypted file does not. | 746 // field for the video track, but the encrypted file does not. |
732 EXPECT_EQ(k320WebMFileDurationMs + 1, | 747 EXPECT_EQ(k320WebMFileDurationMs + 1, |
733 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 748 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
734 | 749 |
735 Play(); | 750 Play(); |
736 | 751 |
737 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); | 752 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); |
738 source.Abort(); | 753 source.Abort(); |
739 } | 754 } |
740 | 755 |
741 #if defined(USE_PROPRIETARY_CODECS) | 756 #if defined(USE_PROPRIETARY_CODECS) |
742 TEST_F(PipelineIntegrationTest, MediaSource_ADTS) { | 757 TEST_P(PipelineIntegrationTest, MediaSource_ADTS) { |
743 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); | 758 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile, GetParam()); |
744 StartPipelineWithMediaSource(&source); | 759 StartPipelineWithMediaSource(&source); |
745 source.EndOfStream(); | 760 source.EndOfStream(); |
746 | 761 |
747 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 762 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
748 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 763 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
749 EXPECT_EQ(325, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 764 EXPECT_EQ(325, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
750 | 765 |
751 Play(); | 766 Play(); |
752 | 767 |
753 EXPECT_TRUE(WaitUntilOnEnded()); | 768 EXPECT_TRUE(WaitUntilOnEnded()); |
754 } | 769 } |
755 | 770 |
756 TEST_F(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { | 771 TEST_P(PipelineIntegrationTest, MediaSource_ADTS_TimestampOffset) { |
757 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile); | 772 MockMediaSource source("sfx.adts", kADTS, kAppendWholeFile, GetParam()); |
758 StartPipelineWithMediaSource(&source); | 773 StartPipelineWithMediaSource(&source); |
759 EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); | 774 EXPECT_EQ(325, source.last_timestamp_offset().InMilliseconds()); |
760 | 775 |
761 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.adts"); | 776 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.adts"); |
762 source.AppendAtTime( | 777 source.AppendAtTime( |
763 source.last_timestamp_offset() - base::TimeDelta::FromMilliseconds(10), | 778 source.last_timestamp_offset() - base::TimeDelta::FromMilliseconds(10), |
764 second_file->data(), | 779 second_file->data(), |
765 second_file->data_size()); | 780 second_file->data_size()); |
766 source.EndOfStream(); | 781 source.EndOfStream(); |
767 | 782 |
768 EXPECT_EQ(640, source.last_timestamp_offset().InMilliseconds()); | 783 EXPECT_EQ(640, source.last_timestamp_offset().InMilliseconds()); |
769 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 784 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
770 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 785 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
771 EXPECT_EQ(640, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 786 EXPECT_EQ(640, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
772 | 787 |
773 Play(); | 788 Play(); |
774 | 789 |
775 EXPECT_TRUE(WaitUntilOnEnded()); | 790 EXPECT_TRUE(WaitUntilOnEnded()); |
776 } | 791 } |
777 | 792 |
778 TEST_F(PipelineIntegrationTest, MediaSource_MP3) { | 793 TEST_P(PipelineIntegrationTest, MediaSource_MP3) { |
779 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); | 794 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile, GetParam()); |
780 StartPipelineWithMediaSource(&source); | 795 StartPipelineWithMediaSource(&source); |
781 source.EndOfStream(); | 796 source.EndOfStream(); |
782 | 797 |
783 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 798 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
784 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 799 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
785 EXPECT_EQ(339, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 800 EXPECT_EQ(339, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
786 | 801 |
787 Play(); | 802 Play(); |
788 | 803 |
789 EXPECT_TRUE(WaitUntilOnEnded()); | 804 EXPECT_TRUE(WaitUntilOnEnded()); |
790 } | 805 } |
791 | 806 |
792 TEST_F(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { | 807 TEST_P(PipelineIntegrationTest, MediaSource_MP3_TimestampOffset) { |
793 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile); | 808 MockMediaSource source("sfx.mp3", kMP3, kAppendWholeFile, GetParam()); |
794 StartPipelineWithMediaSource(&source); | 809 StartPipelineWithMediaSource(&source); |
795 EXPECT_EQ(339, source.last_timestamp_offset().InMilliseconds()); | 810 EXPECT_EQ(339, source.last_timestamp_offset().InMilliseconds()); |
796 | 811 |
797 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.mp3"); | 812 scoped_refptr<DecoderBuffer> second_file = ReadTestDataFile("sfx.mp3"); |
798 source.AppendAtTime( | 813 source.AppendAtTime( |
799 source.last_timestamp_offset() - base::TimeDelta::FromMilliseconds(10), | 814 source.last_timestamp_offset() - base::TimeDelta::FromMilliseconds(10), |
800 second_file->data(), | 815 second_file->data(), |
801 second_file->data_size()); | 816 second_file->data_size()); |
802 source.EndOfStream(); | 817 source.EndOfStream(); |
803 | 818 |
804 EXPECT_EQ(669, source.last_timestamp_offset().InMilliseconds()); | 819 EXPECT_EQ(669, source.last_timestamp_offset().InMilliseconds()); |
805 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 820 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
806 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 821 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
807 EXPECT_EQ(669, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 822 EXPECT_EQ(669, pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
808 | 823 |
809 Play(); | 824 Play(); |
810 | 825 |
811 EXPECT_TRUE(WaitUntilOnEnded()); | 826 EXPECT_TRUE(WaitUntilOnEnded()); |
812 } | 827 } |
813 | 828 |
814 TEST_F(PipelineIntegrationTest, MediaSource_MP3_Icecast) { | 829 TEST_P(PipelineIntegrationTest, MediaSource_MP3_Icecast) { |
815 MockMediaSource source("icy_sfx.mp3", kMP3, kAppendWholeFile); | 830 MockMediaSource source("icy_sfx.mp3", kMP3, kAppendWholeFile, GetParam()); |
816 StartPipelineWithMediaSource(&source); | 831 StartPipelineWithMediaSource(&source); |
817 source.EndOfStream(); | 832 source.EndOfStream(); |
818 | 833 |
819 Play(); | 834 Play(); |
820 | 835 |
821 EXPECT_TRUE(WaitUntilOnEnded()); | 836 EXPECT_TRUE(WaitUntilOnEnded()); |
822 } | 837 } |
823 | 838 |
824 TEST_F(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { | 839 TEST_P(PipelineIntegrationTest, MediaSource_ConfigChange_MP4) { |
825 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4, kAppendWholeFile); | 840 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4, kAppendWholeFile, |
| 841 GetParam()); |
826 StartPipelineWithMediaSource(&source); | 842 StartPipelineWithMediaSource(&source); |
827 | 843 |
828 scoped_refptr<DecoderBuffer> second_file = | 844 scoped_refptr<DecoderBuffer> second_file = |
829 ReadTestDataFile("bear-1280x720-av_frag.mp4"); | 845 ReadTestDataFile("bear-1280x720-av_frag.mp4"); |
830 | 846 |
831 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 847 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
832 second_file->data(), second_file->data_size()); | 848 second_file->data(), second_file->data_size()); |
833 | 849 |
834 source.EndOfStream(); | 850 source.EndOfStream(); |
835 | 851 |
836 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 852 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
837 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 853 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
838 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, | 854 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, |
839 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 855 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
840 | 856 |
841 Play(); | 857 Play(); |
842 | 858 |
843 EXPECT_TRUE(WaitUntilOnEnded()); | 859 EXPECT_TRUE(WaitUntilOnEnded()); |
844 source.Abort(); | 860 source.Abort(); |
845 Stop(); | 861 Stop(); |
846 } | 862 } |
847 | 863 |
848 TEST_F(PipelineIntegrationTest, | 864 TEST_P(PipelineIntegrationTest, |
849 MediaSource_ConfigChange_Encrypted_MP4_CENC_VideoOnly) { | 865 MediaSource_ConfigChange_Encrypted_MP4_CENC_VideoOnly) { |
850 MockMediaSource source("bear-640x360-v_frag-cenc.mp4", | 866 MockMediaSource source("bear-640x360-v_frag-cenc.mp4", |
851 kMP4Video, kAppendWholeFile); | 867 kMP4Video, kAppendWholeFile, GetParam()); |
852 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 868 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
853 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 869 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
854 | 870 |
855 scoped_refptr<DecoderBuffer> second_file = | 871 scoped_refptr<DecoderBuffer> second_file = |
856 ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); | 872 ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); |
857 | 873 |
858 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 874 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
859 second_file->data(), second_file->data_size()); | 875 second_file->data(), second_file->data_size()); |
860 | 876 |
861 source.EndOfStream(); | 877 source.EndOfStream(); |
862 | 878 |
863 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 879 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
864 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 880 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
865 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, | 881 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, |
866 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 882 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
867 | 883 |
868 Play(); | 884 Play(); |
869 | 885 |
870 EXPECT_TRUE(WaitUntilOnEnded()); | 886 EXPECT_TRUE(WaitUntilOnEnded()); |
871 source.Abort(); | 887 source.Abort(); |
872 Stop(); | 888 Stop(); |
873 } | 889 } |
874 | 890 |
875 // Config changes from clear to encrypted are not currently supported. | 891 // Config changes from clear to encrypted are not currently supported. |
876 // TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). | 892 // TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). |
877 TEST_F(PipelineIntegrationTest, | 893 TEST_P(PipelineIntegrationTest, |
878 DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { | 894 DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { |
879 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, | 895 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, |
880 kAppendWholeFile); | 896 kAppendWholeFile, GetParam()); |
881 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 897 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
882 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 898 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
883 | 899 |
884 scoped_refptr<DecoderBuffer> second_file = | 900 scoped_refptr<DecoderBuffer> second_file = |
885 ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); | 901 ReadTestDataFile("bear-1280x720-v_frag-cenc.mp4"); |
886 | 902 |
887 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 903 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
888 second_file->data(), second_file->data_size()); | 904 second_file->data(), second_file->data_size()); |
889 | 905 |
890 source.EndOfStream(); | 906 source.EndOfStream(); |
891 | 907 |
892 message_loop_.Run(); | 908 message_loop_.Run(); |
893 EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); | 909 EXPECT_EQ(PIPELINE_ERROR_DECODE, pipeline_status_); |
894 | 910 |
895 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 911 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
896 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 912 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
897 // The second video was not added, so its time has not been added. | 913 // The second video was not added, so its time has not been added. |
898 EXPECT_EQ(k640IsoFileDurationMs, | 914 EXPECT_EQ(k640IsoFileDurationMs, |
899 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 915 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
900 | 916 |
901 Play(); | 917 Play(); |
902 | 918 |
903 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); | 919 EXPECT_EQ(PIPELINE_ERROR_DECODE, WaitUntilEndedOrError()); |
904 source.Abort(); | 920 source.Abort(); |
905 } | 921 } |
906 | 922 |
907 // Config changes from encrypted to clear are not currently supported. | 923 // Config changes from encrypted to clear are not currently supported. |
908 TEST_F(PipelineIntegrationTest, | 924 TEST_P(PipelineIntegrationTest, |
909 MediaSource_ConfigChange_EncryptedThenClear_MP4_CENC) { | 925 MediaSource_ConfigChange_EncryptedThenClear_MP4_CENC) { |
910 MockMediaSource source("bear-640x360-v_frag-cenc.mp4", | 926 MockMediaSource source("bear-640x360-v_frag-cenc.mp4", |
911 kMP4Video, kAppendWholeFile); | 927 kMP4Video, kAppendWholeFile, GetParam()); |
912 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 928 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
913 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 929 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
914 | 930 |
915 scoped_refptr<DecoderBuffer> second_file = | 931 scoped_refptr<DecoderBuffer> second_file = |
916 ReadTestDataFile("bear-1280x720-av_frag.mp4"); | 932 ReadTestDataFile("bear-1280x720-av_frag.mp4"); |
917 | 933 |
918 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | 934 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), |
919 second_file->data(), second_file->data_size()); | 935 second_file->data(), second_file->data_size()); |
920 | 936 |
921 source.EndOfStream(); | 937 source.EndOfStream(); |
(...skipping 20 matching lines...) Expand all Loading... |
942 | 958 |
943 #endif | 959 #endif |
944 | 960 |
945 TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { | 961 TEST_F(PipelineIntegrationTest, BasicPlayback_16x9AspectRatio) { |
946 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-16x9-aspect.webm"), | 962 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240-16x9-aspect.webm"), |
947 PIPELINE_OK)); | 963 PIPELINE_OK)); |
948 Play(); | 964 Play(); |
949 ASSERT_TRUE(WaitUntilOnEnded()); | 965 ASSERT_TRUE(WaitUntilOnEnded()); |
950 } | 966 } |
951 | 967 |
952 TEST_F(PipelineIntegrationTest, EncryptedPlayback_WebM) { | 968 TEST_P(PipelineIntegrationTest, EncryptedPlayback_WebM) { |
953 MockMediaSource source("bear-320x240-av_enc-av.webm", kWebM, 219816); | 969 MockMediaSource source("bear-320x240-av_enc-av.webm", kWebM, 219816, |
| 970 GetParam()); |
954 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 971 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
955 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 972 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
956 | 973 |
957 source.EndOfStream(); | 974 source.EndOfStream(); |
958 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 975 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
959 | 976 |
960 Play(); | 977 Play(); |
961 | 978 |
962 ASSERT_TRUE(WaitUntilOnEnded()); | 979 ASSERT_TRUE(WaitUntilOnEnded()); |
963 source.Abort(); | 980 source.Abort(); |
964 Stop(); | 981 Stop(); |
965 } | 982 } |
966 | 983 |
967 TEST_F(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { | 984 TEST_P(PipelineIntegrationTest, EncryptedPlayback_ClearStart_WebM) { |
968 MockMediaSource source("bear-320x240-av_enc-av_clear-1s.webm", | 985 MockMediaSource source("bear-320x240-av_enc-av_clear-1s.webm", |
969 kWebM, kAppendWholeFile); | 986 kWebM, kAppendWholeFile, GetParam()); |
970 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 987 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
971 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 988 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
972 | 989 |
973 source.EndOfStream(); | 990 source.EndOfStream(); |
974 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 991 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
975 | 992 |
976 Play(); | 993 Play(); |
977 | 994 |
978 ASSERT_TRUE(WaitUntilOnEnded()); | 995 ASSERT_TRUE(WaitUntilOnEnded()); |
979 source.Abort(); | 996 source.Abort(); |
980 Stop(); | 997 Stop(); |
981 } | 998 } |
982 | 999 |
983 TEST_F(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { | 1000 TEST_P(PipelineIntegrationTest, EncryptedPlayback_NoEncryptedFrames_WebM) { |
984 MockMediaSource source("bear-320x240-av_enc-av_clear-all.webm", | 1001 MockMediaSource source("bear-320x240-av_enc-av_clear-all.webm", |
985 kWebM, kAppendWholeFile); | 1002 kWebM, kAppendWholeFile, GetParam()); |
986 FakeEncryptedMedia encrypted_media(new NoResponseApp()); | 1003 FakeEncryptedMedia encrypted_media(new NoResponseApp()); |
987 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1004 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
988 | 1005 |
989 source.EndOfStream(); | 1006 source.EndOfStream(); |
990 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 1007 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
991 | 1008 |
992 Play(); | 1009 Play(); |
993 | 1010 |
994 ASSERT_TRUE(WaitUntilOnEnded()); | 1011 ASSERT_TRUE(WaitUntilOnEnded()); |
995 source.Abort(); | 1012 source.Abort(); |
996 Stop(); | 1013 Stop(); |
997 } | 1014 } |
998 | 1015 |
999 #if defined(USE_PROPRIETARY_CODECS) | 1016 #if defined(USE_PROPRIETARY_CODECS) |
1000 TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { | 1017 TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_VideoOnly) { |
1001 MockMediaSource source("bear-1280x720-v_frag-cenc.mp4", | 1018 MockMediaSource source("bear-1280x720-v_frag-cenc.mp4", |
1002 kMP4Video, kAppendWholeFile); | 1019 kMP4Video, kAppendWholeFile, GetParam()); |
1003 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 1020 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
1004 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1021 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
1005 | 1022 |
1006 source.EndOfStream(); | 1023 source.EndOfStream(); |
1007 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 1024 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
1008 | 1025 |
1009 Play(); | 1026 Play(); |
1010 | 1027 |
1011 ASSERT_TRUE(WaitUntilOnEnded()); | 1028 ASSERT_TRUE(WaitUntilOnEnded()); |
1012 source.Abort(); | 1029 source.Abort(); |
1013 Stop(); | 1030 Stop(); |
1014 } | 1031 } |
1015 | 1032 |
1016 TEST_F(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { | 1033 TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_AudioOnly) { |
1017 MockMediaSource source("bear-1280x720-a_frag-cenc.mp4", | 1034 MockMediaSource source("bear-1280x720-a_frag-cenc.mp4", |
1018 kMP4Audio, kAppendWholeFile); | 1035 kMP4Audio, kAppendWholeFile, GetParam()); |
1019 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 1036 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
1020 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1037 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
1021 | 1038 |
1022 source.EndOfStream(); | 1039 source.EndOfStream(); |
1023 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 1040 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
1024 | 1041 |
1025 Play(); | 1042 Play(); |
1026 | 1043 |
1027 ASSERT_TRUE(WaitUntilOnEnded()); | 1044 ASSERT_TRUE(WaitUntilOnEnded()); |
1028 source.Abort(); | 1045 source.Abort(); |
1029 Stop(); | 1046 Stop(); |
1030 } | 1047 } |
1031 | 1048 |
1032 TEST_F(PipelineIntegrationTest, | 1049 TEST_P(PipelineIntegrationTest, |
1033 EncryptedPlayback_NoEncryptedFrames_MP4_CENC_VideoOnly) { | 1050 EncryptedPlayback_NoEncryptedFrames_MP4_CENC_VideoOnly) { |
1034 MockMediaSource source("bear-1280x720-v_frag-cenc_clear-all.mp4", | 1051 MockMediaSource source("bear-1280x720-v_frag-cenc_clear-all.mp4", |
1035 kMP4Video, kAppendWholeFile); | 1052 kMP4Video, kAppendWholeFile, GetParam()); |
1036 FakeEncryptedMedia encrypted_media(new NoResponseApp()); | 1053 FakeEncryptedMedia encrypted_media(new NoResponseApp()); |
1037 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1054 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
1038 | 1055 |
1039 source.EndOfStream(); | 1056 source.EndOfStream(); |
1040 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 1057 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
1041 | 1058 |
1042 Play(); | 1059 Play(); |
1043 | 1060 |
1044 ASSERT_TRUE(WaitUntilOnEnded()); | 1061 ASSERT_TRUE(WaitUntilOnEnded()); |
1045 source.Abort(); | 1062 source.Abort(); |
1046 Stop(); | 1063 Stop(); |
1047 } | 1064 } |
1048 | 1065 |
1049 TEST_F(PipelineIntegrationTest, | 1066 TEST_P(PipelineIntegrationTest, |
1050 EncryptedPlayback_NoEncryptedFrames_MP4_CENC_AudioOnly) { | 1067 EncryptedPlayback_NoEncryptedFrames_MP4_CENC_AudioOnly) { |
1051 MockMediaSource source("bear-1280x720-a_frag-cenc_clear-all.mp4", | 1068 MockMediaSource source("bear-1280x720-a_frag-cenc_clear-all.mp4", |
1052 kMP4Audio, kAppendWholeFile); | 1069 kMP4Audio, kAppendWholeFile, GetParam()); |
1053 FakeEncryptedMedia encrypted_media(new NoResponseApp()); | 1070 FakeEncryptedMedia encrypted_media(new NoResponseApp()); |
1054 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1071 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
1055 | 1072 |
1056 source.EndOfStream(); | 1073 source.EndOfStream(); |
1057 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | 1074 ASSERT_EQ(PIPELINE_OK, pipeline_status_); |
1058 | 1075 |
1059 Play(); | 1076 Play(); |
1060 | 1077 |
1061 ASSERT_TRUE(WaitUntilOnEnded()); | 1078 ASSERT_TRUE(WaitUntilOnEnded()); |
1062 source.Abort(); | 1079 source.Abort(); |
1063 Stop(); | 1080 Stop(); |
1064 } | 1081 } |
1065 | 1082 |
1066 TEST_F(PipelineIntegrationTest, BasicPlayback_MediaSource_VideoOnly_MP4_AVC3) { | 1083 TEST_P(PipelineIntegrationTest, BasicPlayback_MediaSource_VideoOnly_MP4_AVC3) { |
1067 MockMediaSource source("bear-1280x720-v_frag-avc3.mp4", kMP4VideoAVC3, | 1084 MockMediaSource source("bear-1280x720-v_frag-avc3.mp4", kMP4VideoAVC3, |
1068 kAppendWholeFile); | 1085 kAppendWholeFile, GetParam()); |
1069 StartPipelineWithMediaSource(&source); | 1086 StartPipelineWithMediaSource(&source); |
1070 source.EndOfStream(); | 1087 source.EndOfStream(); |
1071 | 1088 |
1072 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | 1089 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); |
1073 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | 1090 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); |
1074 EXPECT_EQ(k1280IsoAVC3FileDurationMs, | 1091 EXPECT_EQ(k1280IsoAVC3FileDurationMs, |
1075 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1092 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
1076 | 1093 |
1077 Play(); | 1094 Play(); |
1078 | 1095 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1121 EXPECT_GE(pipeline_->GetMediaTime(), seek_time); | 1138 EXPECT_GE(pipeline_->GetMediaTime(), seek_time); |
1122 ASSERT_TRUE(WaitUntilOnEnded()); | 1139 ASSERT_TRUE(WaitUntilOnEnded()); |
1123 | 1140 |
1124 // Make sure seeking after reaching the end works as expected. | 1141 // Make sure seeking after reaching the end works as expected. |
1125 ASSERT_TRUE(Seek(seek_time)); | 1142 ASSERT_TRUE(Seek(seek_time)); |
1126 EXPECT_GE(pipeline_->GetMediaTime(), seek_time); | 1143 EXPECT_GE(pipeline_->GetMediaTime(), seek_time); |
1127 ASSERT_TRUE(WaitUntilOnEnded()); | 1144 ASSERT_TRUE(WaitUntilOnEnded()); |
1128 } | 1145 } |
1129 | 1146 |
1130 // Verify audio decoder & renderer can handle aborted demuxer reads. | 1147 // Verify audio decoder & renderer can handle aborted demuxer reads. |
1131 TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { | 1148 TEST_P(PipelineIntegrationTest, ChunkDemuxerAbortRead_AudioOnly) { |
1132 ASSERT_TRUE(TestSeekDuringRead("bear-320x240-audio-only.webm", kAudioOnlyWebM, | 1149 ASSERT_TRUE(TestSeekDuringRead("bear-320x240-audio-only.webm", kAudioOnlyWebM, |
1133 8192, | 1150 8192, |
1134 base::TimeDelta::FromMilliseconds(464), | 1151 base::TimeDelta::FromMilliseconds(464), |
1135 base::TimeDelta::FromMilliseconds(617), | 1152 base::TimeDelta::FromMilliseconds(617), |
1136 0x10CA, 19730)); | 1153 0x10CA, 19730)); |
1137 } | 1154 } |
1138 | 1155 |
1139 // Verify video decoder & renderer can handle aborted demuxer reads. | 1156 // Verify video decoder & renderer can handle aborted demuxer reads. |
1140 TEST_F(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { | 1157 TEST_P(PipelineIntegrationTest, ChunkDemuxerAbortRead_VideoOnly) { |
1141 ASSERT_TRUE(TestSeekDuringRead("bear-320x240-video-only.webm", kVideoOnlyWebM, | 1158 ASSERT_TRUE(TestSeekDuringRead("bear-320x240-video-only.webm", kVideoOnlyWebM, |
1142 32768, | 1159 32768, |
1143 base::TimeDelta::FromMilliseconds(167), | 1160 base::TimeDelta::FromMilliseconds(167), |
1144 base::TimeDelta::FromMilliseconds(1668), | 1161 base::TimeDelta::FromMilliseconds(1668), |
1145 0x1C896, 65536)); | 1162 0x1C896, 65536)); |
1146 } | 1163 } |
1147 | 1164 |
1148 // Verify that Opus audio in WebM containers can be played back. | 1165 // Verify that Opus audio in WebM containers can be played back. |
1149 TEST_F(PipelineIntegrationTest, BasicPlayback_AudioOnly_Opus_WebM) { | 1166 TEST_F(PipelineIntegrationTest, BasicPlayback_AudioOnly_Opus_WebM) { |
1150 ASSERT_TRUE(Start(GetTestDataFilePath("bear-opus-end-trimming.webm"), | 1167 ASSERT_TRUE(Start(GetTestDataFilePath("bear-opus-end-trimming.webm"), |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 | 1213 |
1197 // Verify that VP8 video with inband text track can be played back. | 1214 // Verify that VP8 video with inband text track can be played back. |
1198 TEST_F(PipelineIntegrationTest, | 1215 TEST_F(PipelineIntegrationTest, |
1199 BasicPlayback_VP8_WebVTT_WebM) { | 1216 BasicPlayback_VP8_WebVTT_WebM) { |
1200 ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp8-webvtt.webm"), | 1217 ASSERT_TRUE(Start(GetTestDataFilePath("bear-vp8-webvtt.webm"), |
1201 PIPELINE_OK)); | 1218 PIPELINE_OK)); |
1202 Play(); | 1219 Play(); |
1203 ASSERT_TRUE(WaitUntilOnEnded()); | 1220 ASSERT_TRUE(WaitUntilOnEnded()); |
1204 } | 1221 } |
1205 | 1222 |
| 1223 // TODO(wolenetz): Enable MSE testing of new frame processor based on this flag, |
| 1224 // once the new processor has landed. See http://crbug.com/249422. |
| 1225 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, PipelineIntegrationTest, |
| 1226 Values(true)); |
| 1227 |
1206 } // namespace media | 1228 } // namespace media |
OLD | NEW |