| 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 | 
|---|