| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <deque> | 6 #include <deque> |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 message_loop_.Run(); | 482 message_loop_.Run(); |
| 483 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); | 483 EXPECT_EQ(base::TimeDelta(), demuxer_->start_time()); |
| 484 | 484 |
| 485 // Seek back to the beginning and repeat the test. | 485 // Seek back to the beginning and repeat the test. |
| 486 WaitableMessageLoopEvent event; | 486 WaitableMessageLoopEvent event; |
| 487 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 487 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 488 event.RunAndWaitForStatus(PIPELINE_OK); | 488 event.RunAndWaitForStatus(PIPELINE_OK); |
| 489 } | 489 } |
| 490 } | 490 } |
| 491 | 491 |
| 492 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard) { | 492 // TODO(dalecurtis): Test is disabled since FFmpeg does not currently guarantee |
| 493 // the order of demuxed packets in OGG containers. Re-enable once we decide to |
| 494 // either workaround it or attempt a fix upstream. See http://crbug.com/387996. |
| 495 TEST_F(FFmpegDemuxerTest, |
| 496 DISABLED_Read_AudioNegativeStartTimeAndOggDiscard_Bear) { |
| 493 // Many ogg files have negative starting timestamps, so ensure demuxing and | 497 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 494 // seeking work correctly with a negative start time. | 498 // seeking work correctly with a negative start time. |
| 495 CreateDemuxer("bear.ogv"); | 499 CreateDemuxer("bear.ogv"); |
| 496 InitializeDemuxer(); | 500 InitializeDemuxer(); |
| 497 | 501 |
| 502 // Attempt a read from the video stream and run the message loop until done. |
| 503 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 504 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 505 |
| 498 // Run the test twice with a seek in between. | 506 // Run the test twice with a seek in between. |
| 499 for (int i = 0; i < 2; ++i) { | 507 for (int i = 0; i < 2; ++i) { |
| 500 demuxer_->GetStream(DemuxerStream::AUDIO)->Read( | 508 audio->Read( |
| 501 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration())); | 509 NewReadCBWithCheckedDiscard(FROM_HERE, 40, 0, kInfiniteDuration())); |
| 502 message_loop_.Run(); | 510 message_loop_.Run(); |
| 503 demuxer_->GetStream(DemuxerStream::AUDIO)->Read( | 511 audio->Read( |
| 504 NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, kInfiniteDuration())); | 512 NewReadCBWithCheckedDiscard(FROM_HERE, 41, 2903, kInfiniteDuration())); |
| 505 message_loop_.Run(); | 513 message_loop_.Run(); |
| 506 demuxer_->GetStream(DemuxerStream::AUDIO)->Read(NewReadCBWithCheckedDiscard( | 514 audio->Read(NewReadCBWithCheckedDiscard( |
| 507 FROM_HERE, 173, 5805, base::TimeDelta::FromMicroseconds(10159))); | 515 FROM_HERE, 173, 5805, base::TimeDelta::FromMicroseconds(10159))); |
| 508 message_loop_.Run(); | 516 message_loop_.Run(); |
| 509 | 517 |
| 510 demuxer_->GetStream(DemuxerStream::AUDIO) | 518 audio->Read(NewReadCB(FROM_HERE, 148, 18866)); |
| 511 ->Read(NewReadCB(FROM_HERE, 148, 18866)); | |
| 512 message_loop_.Run(); | 519 message_loop_.Run(); |
| 513 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-15964), | 520 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-15964), |
| 514 demuxer_->start_time()); | 521 demuxer_->start_time()); |
| 515 | 522 |
| 523 video->Read(NewReadCB(FROM_HERE, 5751, 0)); |
| 524 message_loop_.Run(); |
| 525 |
| 526 video->Read(NewReadCB(FROM_HERE, 846, 33367)); |
| 527 message_loop_.Run(); |
| 528 |
| 529 video->Read(NewReadCB(FROM_HERE, 1255, 66733)); |
| 530 message_loop_.Run(); |
| 531 |
| 516 // Seek back to the beginning and repeat the test. | 532 // Seek back to the beginning and repeat the test. |
| 517 WaitableMessageLoopEvent event; | 533 WaitableMessageLoopEvent event; |
| 518 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); | 534 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 535 event.RunAndWaitForStatus(PIPELINE_OK); |
| 536 } |
| 537 } |
| 538 |
| 539 // Same test above, but using sync2.ogv which has video stream muxed before the |
| 540 // audio stream, so seeking based only on start time will fail since ffmpeg is |
| 541 // essentially just seeking based on file position. |
| 542 TEST_F(FFmpegDemuxerTest, Read_AudioNegativeStartTimeAndOggDiscard_Sync) { |
| 543 // Many ogg files have negative starting timestamps, so ensure demuxing and |
| 544 // seeking work correctly with a negative start time. |
| 545 CreateDemuxer("sync2.ogv"); |
| 546 InitializeDemuxer(); |
| 547 |
| 548 // Attempt a read from the video stream and run the message loop until done. |
| 549 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
| 550 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
| 551 |
| 552 // Run the test twice with a seek in between. |
| 553 for (int i = 0; i < 2; ++i) { |
| 554 audio->Read(NewReadCBWithCheckedDiscard( |
| 555 FROM_HERE, 1, 0, base::TimeDelta::FromMicroseconds(2902))); |
| 556 message_loop_.Run(); |
| 557 |
| 558 audio->Read(NewReadCB(FROM_HERE, 1, 2902)); |
| 559 message_loop_.Run(); |
| 560 EXPECT_EQ(base::TimeDelta::FromMicroseconds(-2902), |
| 561 demuxer_->start_time()); |
| 562 |
| 563 video->Read(NewReadCB(FROM_HERE, 9997, 0)); |
| 564 message_loop_.Run(); |
| 565 |
| 566 video->Read(NewReadCB(FROM_HERE, 16, 33241)); |
| 567 message_loop_.Run(); |
| 568 |
| 569 video->Read(NewReadCB(FROM_HERE, 631, 66482)); |
| 570 message_loop_.Run(); |
| 571 |
| 572 // Seek back to the beginning and repeat the test. |
| 573 WaitableMessageLoopEvent event; |
| 574 demuxer_->Seek(base::TimeDelta(), event.GetPipelineStatusCB()); |
| 519 event.RunAndWaitForStatus(PIPELINE_OK); | 575 event.RunAndWaitForStatus(PIPELINE_OK); |
| 520 } | 576 } |
| 521 } | 577 } |
| 522 | 578 |
| 523 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { | 579 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { |
| 524 // Verify that end of stream buffers are created. | 580 // Verify that end of stream buffers are created. |
| 525 CreateDemuxer("bear-320x240.webm"); | 581 CreateDemuxer("bear-320x240.webm"); |
| 526 InitializeDemuxer(); | 582 InitializeDemuxer(); |
| 527 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); | 583 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
| 528 } | 584 } |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 demuxer_->Stop(event.GetClosure()); | 912 demuxer_->Stop(event.GetClosure()); |
| 857 event.RunAndWait(); | 913 event.RunAndWait(); |
| 858 demuxer_.reset(); | 914 demuxer_.reset(); |
| 859 data_source_.reset(); | 915 data_source_.reset(); |
| 860 } | 916 } |
| 861 } | 917 } |
| 862 | 918 |
| 863 #endif | 919 #endif |
| 864 | 920 |
| 865 } // namespace media | 921 } // namespace media |
| OLD | NEW |