| 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/file_path.h" | 9 #include "base/file_path.h" |
| 10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 } | 58 } |
| 59 | 59 |
| 60 void CreateDemuxer(const std::string& name) { | 60 void CreateDemuxer(const std::string& name) { |
| 61 CreateDemuxer(name, false); | 61 CreateDemuxer(name, false); |
| 62 } | 62 } |
| 63 | 63 |
| 64 void CreateDemuxer(const std::string& name, bool disable_file_size) { | 64 void CreateDemuxer(const std::string& name, bool disable_file_size) { |
| 65 CHECK(!demuxer_); | 65 CHECK(!demuxer_); |
| 66 | 66 |
| 67 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); | 67 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); |
| 68 EXPECT_CALL(host_, SetBufferedBytes(_)).Times(AnyNumber()); | 68 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); |
| 69 EXPECT_CALL(host_, SetCurrentReadPosition(_)) | |
| 70 .WillRepeatedly(SaveArg<0>(¤t_read_position_)); | |
| 71 | 69 |
| 72 CreateDataSource(name, disable_file_size); | 70 CreateDataSource(name, disable_file_size); |
| 73 demuxer_ = new FFmpegDemuxer(&message_loop_, data_source_); | 71 demuxer_ = new FFmpegDemuxer(&message_loop_, data_source_); |
| 74 } | 72 } |
| 75 | 73 |
| 76 MOCK_METHOD1(CheckPoint, void(int v)); | 74 MOCK_METHOD1(CheckPoint, void(int v)); |
| 77 | 75 |
| 78 void InitializeDemuxer() { | 76 void InitializeDemuxer() { |
| 79 EXPECT_CALL(host_, SetDuration(_)); | 77 EXPECT_CALL(host_, SetDuration(_)); |
| 80 demuxer_->Initialize(&host_, NewExpectedStatusCB(PIPELINE_OK)); | 78 demuxer_->Initialize(&host_, NewExpectedStatusCB(PIPELINE_OK)); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 CHECK(stream); | 116 CHECK(stream); |
| 119 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_; | 117 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_; |
| 120 } | 118 } |
| 121 | 119 |
| 122 // Fixture members. | 120 // Fixture members. |
| 123 scoped_refptr<FileDataSource> data_source_; | 121 scoped_refptr<FileDataSource> data_source_; |
| 124 scoped_refptr<FFmpegDemuxer> demuxer_; | 122 scoped_refptr<FFmpegDemuxer> demuxer_; |
| 125 StrictMock<MockDemuxerHost> host_; | 123 StrictMock<MockDemuxerHost> host_; |
| 126 MessageLoop message_loop_; | 124 MessageLoop message_loop_; |
| 127 | 125 |
| 128 int64 current_read_position_; | |
| 129 | |
| 130 AVFormatContext* format_context() { | 126 AVFormatContext* format_context() { |
| 131 return demuxer_->format_context_; | 127 return demuxer_->format_context_; |
| 132 } | 128 } |
| 133 | 129 |
| 134 void ReadUntilEndOfStream() { | 130 void ReadUntilEndOfStream() { |
| 135 // We should expect an end of stream buffer. | 131 // We should expect an end of stream buffer. |
| 136 scoped_refptr<DemuxerStream> audio = | 132 scoped_refptr<DemuxerStream> audio = |
| 137 demuxer_->GetStream(DemuxerStream::AUDIO); | 133 demuxer_->GetStream(DemuxerStream::AUDIO); |
| 138 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader()); | 134 scoped_refptr<DemuxerStreamReader> reader(new DemuxerStreamReader()); |
| 139 | 135 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 175 data_source_ = new FileDataSource(disable_file_size); | 171 data_source_ = new FileDataSource(disable_file_size); |
| 176 EXPECT_EQ(PIPELINE_OK, data_source_->Initialize(file_path.MaybeAsASCII())); | 172 EXPECT_EQ(PIPELINE_OK, data_source_->Initialize(file_path.MaybeAsASCII())); |
| 177 } | 173 } |
| 178 | 174 |
| 179 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest); | 175 DISALLOW_COPY_AND_ASSIGN(FFmpegDemuxerTest); |
| 180 }; | 176 }; |
| 181 | 177 |
| 182 TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) { | 178 TEST_F(FFmpegDemuxerTest, Initialize_OpenFails) { |
| 183 // Simulate avformat_open_input() failing. | 179 // Simulate avformat_open_input() failing. |
| 184 CreateDemuxer("ten_byte_file"), | 180 CreateDemuxer("ten_byte_file"), |
| 185 EXPECT_CALL(host_, SetCurrentReadPosition(_)); | |
| 186 demuxer_->Initialize( | 181 demuxer_->Initialize( |
| 187 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 182 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
| 188 | 183 |
| 189 message_loop_.RunAllPending(); | 184 message_loop_.RunAllPending(); |
| 190 } | 185 } |
| 191 | 186 |
| 192 // TODO(acolwell): Uncomment this test when we discover a file that passes | 187 // TODO(acolwell): Uncomment this test when we discover a file that passes |
| 193 // avformat_open_input(), but has avformat_find_stream_info() fail. | 188 // avformat_open_input(), but has avformat_find_stream_info() fail. |
| 194 // | 189 // |
| 195 //TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) { | 190 //TEST_F(FFmpegDemuxerTest, Initialize_ParseFails) { |
| 196 // CreateDemuxer("find_stream_info_fail.webm"); | 191 // CreateDemuxer("find_stream_info_fail.webm"); |
| 197 // demuxer_->Initialize( | 192 // demuxer_->Initialize( |
| 198 // &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE)); | 193 // &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_PARSE)); |
| 199 // message_loop_.RunAllPending(); | 194 // message_loop_.RunAllPending(); |
| 200 //} | 195 //} |
| 201 | 196 |
| 202 TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) { | 197 TEST_F(FFmpegDemuxerTest, Initialize_NoStreams) { |
| 203 // Open a file with no streams whatsoever. | 198 // Open a file with no streams whatsoever. |
| 204 CreateDemuxer("no_streams.webm"); | 199 CreateDemuxer("no_streams.webm"); |
| 205 EXPECT_CALL(host_, SetCurrentReadPosition(_)); | |
| 206 demuxer_->Initialize( | 200 demuxer_->Initialize( |
| 207 &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); | 201 &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
| 208 message_loop_.RunAllPending(); | 202 message_loop_.RunAllPending(); |
| 209 } | 203 } |
| 210 | 204 |
| 211 TEST_F(FFmpegDemuxerTest, Initialize_NoAudioVideo) { | 205 TEST_F(FFmpegDemuxerTest, Initialize_NoAudioVideo) { |
| 212 // Open a file containing streams but none of which are audio/video streams. | 206 // Open a file containing streams but none of which are audio/video streams. |
| 213 CreateDemuxer("no_audio_video.webm"); | 207 CreateDemuxer("no_audio_video.webm"); |
| 214 demuxer_->Initialize( | 208 demuxer_->Initialize( |
| 215 &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); | 209 &host_, NewExpectedStatusCB(DEMUXER_ERROR_NO_SUPPORTED_STREAMS)); |
| (...skipping 369 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 | 579 |
| 586 // Set read head to zero as Initialize() will have parsed a bit of the file. | 580 // Set read head to zero as Initialize() will have parsed a bit of the file. |
| 587 int64 position = 0; | 581 int64 position = 0; |
| 588 EXPECT_TRUE(demuxer_->SetPosition(0)); | 582 EXPECT_TRUE(demuxer_->SetPosition(0)); |
| 589 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 583 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 590 EXPECT_EQ(0, position); | 584 EXPECT_EQ(0, position); |
| 591 | 585 |
| 592 // Read 32 bytes from offset zero and verify position. | 586 // Read 32 bytes from offset zero and verify position. |
| 593 uint8 buffer[32]; | 587 uint8 buffer[32]; |
| 594 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); | 588 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
| 595 EXPECT_EQ(32, current_read_position_); | |
| 596 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 589 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 597 EXPECT_EQ(32, position); | 590 EXPECT_EQ(32, position); |
| 598 | 591 |
| 599 // Read an additional 32 bytes and verify position. | 592 // Read an additional 32 bytes and verify position. |
| 600 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); | 593 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
| 601 EXPECT_EQ(64, current_read_position_); | |
| 602 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 594 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 603 EXPECT_EQ(64, position); | 595 EXPECT_EQ(64, position); |
| 604 | 596 |
| 605 // Seek to end and read until EOF. | 597 // Seek to end and read until EOF. |
| 606 int64 size = 0; | 598 int64 size = 0; |
| 607 EXPECT_TRUE(demuxer_->GetSize(&size)); | 599 EXPECT_TRUE(demuxer_->GetSize(&size)); |
| 608 EXPECT_TRUE(demuxer_->SetPosition(size - 48)); | 600 EXPECT_TRUE(demuxer_->SetPosition(size - 48)); |
| 609 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); | 601 EXPECT_EQ(32u, demuxer_->Read(32, buffer)); |
| 610 EXPECT_EQ(size - 16, current_read_position_); | |
| 611 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 602 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 612 EXPECT_EQ(size - 16, position); | 603 EXPECT_EQ(size - 16, position); |
| 613 | 604 |
| 614 EXPECT_EQ(16u, demuxer_->Read(32, buffer)); | 605 EXPECT_EQ(16u, demuxer_->Read(32, buffer)); |
| 615 EXPECT_EQ(size, current_read_position_); | |
| 616 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 606 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 617 EXPECT_EQ(size, position); | 607 EXPECT_EQ(size, position); |
| 618 | 608 |
| 619 EXPECT_EQ(0u, demuxer_->Read(32, buffer)); | 609 EXPECT_EQ(0u, demuxer_->Read(32, buffer)); |
| 620 EXPECT_EQ(size, current_read_position_); | |
| 621 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 610 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 622 EXPECT_EQ(size, position); | 611 EXPECT_EQ(size, position); |
| 623 | 612 |
| 624 demuxer_->Stop(NewExpectedClosure()); | 613 demuxer_->Stop(NewExpectedClosure()); |
| 625 message_loop_.RunAllPending(); | 614 message_loop_.RunAllPending(); |
| 626 } | 615 } |
| 627 | 616 |
| 628 TEST_F(FFmpegDemuxerTest, GetBitrate_SetInContainer) { | 617 TEST_F(FFmpegDemuxerTest, GetBitrate_SetInContainer) { |
| 629 EXPECT_TRUE(VideoHasValidBitrate("bear.ogv", false)); | 618 EXPECT_TRUE(VideoHasValidBitrate("bear.ogv", false)); |
| 630 } | 619 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 644 TEST_F(FFmpegDemuxerTest, ProtocolGetSetPosition) { | 633 TEST_F(FFmpegDemuxerTest, ProtocolGetSetPosition) { |
| 645 CreateDemuxer("bear-320x240.webm"); | 634 CreateDemuxer("bear-320x240.webm"); |
| 646 InitializeDemuxer(); | 635 InitializeDemuxer(); |
| 647 | 636 |
| 648 InSequence s; | 637 InSequence s; |
| 649 | 638 |
| 650 int64 size; | 639 int64 size; |
| 651 int64 position; | 640 int64 position; |
| 652 EXPECT_TRUE(demuxer_->GetSize(&size)); | 641 EXPECT_TRUE(demuxer_->GetSize(&size)); |
| 653 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 642 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 654 EXPECT_EQ(current_read_position_, position); | |
| 655 | 643 |
| 656 EXPECT_TRUE(demuxer_->SetPosition(512)); | 644 EXPECT_TRUE(demuxer_->SetPosition(512)); |
| 657 EXPECT_FALSE(demuxer_->SetPosition(size)); | 645 EXPECT_FALSE(demuxer_->SetPosition(size)); |
| 658 EXPECT_FALSE(demuxer_->SetPosition(size + 1)); | 646 EXPECT_FALSE(demuxer_->SetPosition(size + 1)); |
| 659 EXPECT_FALSE(demuxer_->SetPosition(-1)); | 647 EXPECT_FALSE(demuxer_->SetPosition(-1)); |
| 660 EXPECT_TRUE(demuxer_->GetPosition(&position)); | 648 EXPECT_TRUE(demuxer_->GetPosition(&position)); |
| 661 EXPECT_EQ(512, position); | 649 EXPECT_EQ(512, position); |
| 662 } | 650 } |
| 663 | 651 |
| 664 TEST_F(FFmpegDemuxerTest, ProtocolGetSize) { | 652 TEST_F(FFmpegDemuxerTest, ProtocolGetSize) { |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 785 TEST_F(FFmpegDemuxerTest, UnsupportedVideoSupportedAudioDemux) { | 773 TEST_F(FFmpegDemuxerTest, UnsupportedVideoSupportedAudioDemux) { |
| 786 CreateDemuxer("vorbis_audio_wmv_video.mkv"); | 774 CreateDemuxer("vorbis_audio_wmv_video.mkv"); |
| 787 InitializeDemuxer(); | 775 InitializeDemuxer(); |
| 788 | 776 |
| 789 // Ensure the expected streams are present. | 777 // Ensure the expected streams are present. |
| 790 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::VIDEO)); | 778 EXPECT_FALSE(demuxer_->GetStream(DemuxerStream::VIDEO)); |
| 791 EXPECT_TRUE(demuxer_->GetStream(DemuxerStream::AUDIO)); | 779 EXPECT_TRUE(demuxer_->GetStream(DemuxerStream::AUDIO)); |
| 792 } | 780 } |
| 793 | 781 |
| 794 } // namespace media | 782 } // namespace media |
| OLD | NEW |