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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 // Fixture members. | 160 // Fixture members. |
161 scoped_ptr<FileDataSource> data_source_; | 161 scoped_ptr<FileDataSource> data_source_; |
162 scoped_ptr<FFmpegDemuxer> demuxer_; | 162 scoped_ptr<FFmpegDemuxer> demuxer_; |
163 StrictMock<MockDemuxerHost> host_; | 163 StrictMock<MockDemuxerHost> host_; |
164 base::MessageLoop message_loop_; | 164 base::MessageLoop message_loop_; |
165 | 165 |
166 AVFormatContext* format_context() { | 166 AVFormatContext* format_context() { |
167 return demuxer_->glue_->format_context(); | 167 return demuxer_->glue_->format_context(); |
168 } | 168 } |
169 | 169 |
170 void ReadUntilEndOfStream() { | 170 void ReadUntilEndOfStream(DemuxerStream* stream) { |
171 // We should expect an end of stream buffer. | |
172 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | |
173 | |
174 bool got_eos_buffer = false; | 171 bool got_eos_buffer = false; |
175 const int kMaxBuffers = 170; | 172 const int kMaxBuffers = 170; |
176 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 173 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
177 audio->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 174 stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
178 message_loop_.Run(); | 175 message_loop_.Run(); |
179 } | 176 } |
180 | 177 |
181 EXPECT_TRUE(got_eos_buffer); | 178 EXPECT_TRUE(got_eos_buffer); |
182 } | 179 } |
183 | 180 |
184 private: | 181 private: |
185 void CreateDataSource(const std::string& name) { | 182 void CreateDataSource(const std::string& name) { |
186 CHECK(!data_source_); | 183 CHECK(!data_source_); |
187 | 184 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 message_loop_.Run(); | 404 message_loop_.Run(); |
408 | 405 |
409 // Verify that the start time is equal to the lowest timestamp (ie the audio). | 406 // Verify that the start time is equal to the lowest timestamp (ie the audio). |
410 EXPECT_EQ(demuxer_->GetStartTime().InMicroseconds(), 396000); | 407 EXPECT_EQ(demuxer_->GetStartTime().InMicroseconds(), 396000); |
411 } | 408 } |
412 | 409 |
413 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { | 410 TEST_F(FFmpegDemuxerTest, Read_EndOfStream) { |
414 // Verify that end of stream buffers are created. | 411 // Verify that end of stream buffers are created. |
415 CreateDemuxer("bear-320x240.webm"); | 412 CreateDemuxer("bear-320x240.webm"); |
416 InitializeDemuxer(); | 413 InitializeDemuxer(); |
417 ReadUntilEndOfStream(); | 414 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
418 } | 415 } |
419 | 416 |
420 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { | 417 TEST_F(FFmpegDemuxerTest, Read_EndOfStreamText) { |
421 // Verify that end of stream buffers are created. | 418 // Verify that end of stream buffers are created. |
422 CreateDemuxer("bear-vp8-webvtt.webm"); | 419 CreateDemuxer("bear-vp8-webvtt.webm"); |
423 DemuxerStream* text_stream = NULL; | 420 DemuxerStream* text_stream = NULL; |
424 EXPECT_CALL(host_, AddTextStream(_, _)) | 421 EXPECT_CALL(host_, AddTextStream(_, _)) |
425 .WillOnce(SaveArg<0>(&text_stream)); | 422 .WillOnce(SaveArg<0>(&text_stream)); |
426 InitializeDemuxerText(true); | 423 InitializeDemuxerText(true); |
427 ASSERT_TRUE(text_stream); | 424 ASSERT_TRUE(text_stream); |
428 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); | 425 EXPECT_EQ(DemuxerStream::TEXT, text_stream->type()); |
429 | 426 |
430 bool got_eos_buffer = false; | 427 bool got_eos_buffer = false; |
431 const int kMaxBuffers = 10; | 428 const int kMaxBuffers = 10; |
432 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { | 429 for (int i = 0; !got_eos_buffer && i < kMaxBuffers; i++) { |
433 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); | 430 text_stream->Read(base::Bind(&EosOnReadDone, &got_eos_buffer)); |
434 message_loop_.Run(); | 431 message_loop_.Run(); |
435 } | 432 } |
436 | 433 |
437 EXPECT_TRUE(got_eos_buffer); | 434 EXPECT_TRUE(got_eos_buffer); |
438 } | 435 } |
439 | 436 |
440 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { | 437 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration) { |
441 // Verify that end of stream buffers are created. | 438 // Verify that end of stream buffers are created. |
442 CreateDemuxer("bear-320x240.webm"); | 439 CreateDemuxer("bear-320x240.webm"); |
443 InitializeDemuxer(); | 440 InitializeDemuxer(); |
444 set_duration_known(false); | 441 set_duration_known(false); |
445 EXPECT_CALL(host_, SetDuration(_)); | 442 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2767))); |
446 ReadUntilEndOfStream(); | 443 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
| 444 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO)); |
| 445 } |
| 446 |
| 447 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_VideoOnly) { |
| 448 // Verify that end of stream buffers are created. |
| 449 CreateDemuxer("bear-320x240-video-only.webm"); |
| 450 InitializeDemuxer(); |
| 451 set_duration_known(false); |
| 452 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2703))); |
| 453 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::VIDEO)); |
| 454 } |
| 455 |
| 456 TEST_F(FFmpegDemuxerTest, Read_EndOfStream_NoDuration_AudioOnly) { |
| 457 // Verify that end of stream buffers are created. |
| 458 CreateDemuxer("bear-320x240-audio-only.webm"); |
| 459 InitializeDemuxer(); |
| 460 set_duration_known(false); |
| 461 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2767))); |
| 462 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
447 } | 463 } |
448 | 464 |
449 TEST_F(FFmpegDemuxerTest, Seek) { | 465 TEST_F(FFmpegDemuxerTest, Seek) { |
450 // We're testing that the demuxer frees all queued packets when it receives | 466 // We're testing that the demuxer frees all queued packets when it receives |
451 // a Seek(). | 467 // a Seek(). |
452 CreateDemuxer("bear-320x240.webm"); | 468 CreateDemuxer("bear-320x240.webm"); |
453 InitializeDemuxer(); | 469 InitializeDemuxer(); |
454 | 470 |
455 // Get our streams. | 471 // Get our streams. |
456 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 472 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 } | 712 } |
697 | 713 |
698 // FFmpeg returns null data pointers when samples have zero size, leading to | 714 // FFmpeg returns null data pointers when samples have zero size, leading to |
699 // mistakenly creating end of stream buffers http://crbug.com/169133 | 715 // mistakenly creating end of stream buffers http://crbug.com/169133 |
700 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { | 716 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { |
701 #if !defined(USE_PROPRIETARY_CODECS) | 717 #if !defined(USE_PROPRIETARY_CODECS) |
702 return; | 718 return; |
703 #endif | 719 #endif |
704 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); | 720 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); |
705 InitializeDemuxer(); | 721 InitializeDemuxer(); |
706 ReadUntilEndOfStream(); | 722 ReadUntilEndOfStream(demuxer_->GetStream(DemuxerStream::AUDIO)); |
707 } | 723 } |
708 | 724 |
709 } // namespace media | 725 } // namespace media |
OLD | NEW |