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/file_util.h" | 10 #include "base/file_util.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 // FFmpeg, pipeline and filter host mocks. | 62 // FFmpeg, pipeline and filter host mocks. |
63 class FFmpegDemuxerTest : public testing::Test { | 63 class FFmpegDemuxerTest : public testing::Test { |
64 protected: | 64 protected: |
65 FFmpegDemuxerTest() {} | 65 FFmpegDemuxerTest() {} |
66 | 66 |
67 virtual ~FFmpegDemuxerTest() { | 67 virtual ~FFmpegDemuxerTest() { |
68 if (demuxer_) { | 68 if (demuxer_) { |
69 demuxer_->Stop(MessageLoop::QuitWhenIdleClosure()); | 69 demuxer_->Stop(MessageLoop::QuitWhenIdleClosure()); |
70 message_loop_.Run(); | 70 message_loop_.Run(); |
71 } | 71 } |
72 | |
73 demuxer_ = NULL; | |
74 } | 72 } |
75 | 73 |
76 void CreateDemuxer(const std::string& name) { | 74 void CreateDemuxer(const std::string& name) { |
77 CHECK(!demuxer_); | 75 CHECK(!demuxer_); |
78 | 76 |
79 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); | 77 EXPECT_CALL(host_, SetTotalBytes(_)).Times(AnyNumber()); |
80 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); | 78 EXPECT_CALL(host_, AddBufferedByteRange(_, _)).Times(AnyNumber()); |
81 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); | 79 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); |
82 | 80 |
83 CreateDataSource(name); | 81 CreateDataSource(name); |
84 | 82 |
85 media::FFmpegNeedKeyCB need_key_cb = | 83 media::FFmpegNeedKeyCB need_key_cb = |
86 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this)); | 84 base::Bind(&FFmpegDemuxerTest::NeedKeyCB, base::Unretained(this)); |
87 demuxer_ = new FFmpegDemuxer(message_loop_.message_loop_proxy(), | 85 demuxer_.reset(new FFmpegDemuxer( |
88 data_source_, | 86 message_loop_.message_loop_proxy(), data_source_, need_key_cb)); |
89 need_key_cb); | |
90 } | 87 } |
91 | 88 |
92 MOCK_METHOD1(CheckPoint, void(int v)); | 89 MOCK_METHOD1(CheckPoint, void(int v)); |
93 | 90 |
94 void InitializeDemuxer() { | 91 void InitializeDemuxer() { |
95 EXPECT_CALL(host_, SetDuration(_)); | 92 EXPECT_CALL(host_, SetDuration(_)); |
96 WaitableMessageLoopEvent event; | 93 WaitableMessageLoopEvent event; |
97 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); | 94 demuxer_->Initialize(&host_, event.GetPipelineStatusCB()); |
98 event.RunAndWaitForStatus(PIPELINE_OK); | 95 event.RunAndWaitForStatus(PIPELINE_OK); |
99 } | 96 } |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 } | 138 } |
142 | 139 |
143 // Accessor to demuxer internals. | 140 // Accessor to demuxer internals. |
144 void set_duration_known(bool duration_known) { | 141 void set_duration_known(bool duration_known) { |
145 demuxer_->duration_known_ = duration_known; | 142 demuxer_->duration_known_ = duration_known; |
146 } | 143 } |
147 | 144 |
148 bool IsStreamStopped(DemuxerStream::Type type) { | 145 bool IsStreamStopped(DemuxerStream::Type type) { |
149 DemuxerStream* stream = demuxer_->GetStream(type); | 146 DemuxerStream* stream = demuxer_->GetStream(type); |
150 CHECK(stream); | 147 CHECK(stream); |
151 return static_cast<FFmpegDemuxerStream*>(stream)->stopped_; | 148 return !static_cast<FFmpegDemuxerStream*>(stream)->demuxer_; |
152 } | 149 } |
153 | 150 |
154 // Fixture members. | 151 // Fixture members. |
155 scoped_refptr<FileDataSource> data_source_; | 152 scoped_refptr<FileDataSource> data_source_; |
156 scoped_refptr<FFmpegDemuxer> demuxer_; | 153 scoped_ptr<FFmpegDemuxer> demuxer_; |
157 StrictMock<MockDemuxerHost> host_; | 154 StrictMock<MockDemuxerHost> host_; |
158 MessageLoop message_loop_; | 155 MessageLoop message_loop_; |
159 | 156 |
160 AVFormatContext* format_context() { | 157 AVFormatContext* format_context() { |
161 return demuxer_->glue_->format_context(); | 158 return demuxer_->glue_->format_context(); |
162 } | 159 } |
163 | 160 |
164 void ReadUntilEndOfStream() { | 161 void ReadUntilEndOfStream() { |
165 // We should expect an end of stream buffer. | 162 // We should expect an end of stream buffer. |
166 scoped_refptr<DemuxerStream> audio = | 163 scoped_refptr<DemuxerStream> audio = |
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
501 // Create our mocked callback. The Callback created by base::Bind() will take | 498 // Create our mocked callback. The Callback created by base::Bind() will take |
502 // ownership of this pointer. | 499 // ownership of this pointer. |
503 StrictMock<MockReadCB>* callback = new StrictMock<MockReadCB>(); | 500 StrictMock<MockReadCB>* callback = new StrictMock<MockReadCB>(); |
504 | 501 |
505 // The callback should be immediately deleted. We'll use a checkpoint to | 502 // The callback should be immediately deleted. We'll use a checkpoint to |
506 // verify that it has indeed been deleted. | 503 // verify that it has indeed been deleted. |
507 EXPECT_CALL(*callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); | 504 EXPECT_CALL(*callback, Run(DemuxerStream::kOk, IsEndOfStreamBuffer())); |
508 EXPECT_CALL(*callback, OnDelete()); | 505 EXPECT_CALL(*callback, OnDelete()); |
509 EXPECT_CALL(*this, CheckPoint(1)); | 506 EXPECT_CALL(*this, CheckPoint(1)); |
510 | 507 |
511 // Release the reference to the demuxer. This should also destroy it. | 508 // Destroy the demuxer. |audio| now has a demuxer_ pointer to invalid memory. |
512 demuxer_ = NULL; | 509 demuxer_.reset(); |
513 // |audio| now has a demuxer_ pointer to invalid memory. | |
514 | 510 |
515 // Attempt the read... | 511 // Attempt the read... |
516 audio->Read(base::Bind(&MockReadCB::Run, callback)); | 512 audio->Read(base::Bind(&MockReadCB::Run, callback)); |
517 | 513 |
518 message_loop_.RunUntilIdle(); | 514 message_loop_.RunUntilIdle(); |
519 | 515 |
520 // ...and verify that |callback| was deleted. | 516 // ...and verify that |callback| was deleted. |
521 CheckPoint(1); | 517 CheckPoint(1); |
522 } | 518 } |
523 | 519 |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { | 647 TEST_F(FFmpegDemuxerTest, MP4_ZeroStszEntry) { |
652 #if !defined(USE_PROPRIETARY_CODECS) | 648 #if !defined(USE_PROPRIETARY_CODECS) |
653 return; | 649 return; |
654 #endif | 650 #endif |
655 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); | 651 CreateDemuxer("bear-1280x720-zero-stsz-entry.mp4"); |
656 InitializeDemuxer(); | 652 InitializeDemuxer(); |
657 ReadUntilEndOfStream(); | 653 ReadUntilEndOfStream(); |
658 } | 654 } |
659 | 655 |
660 } // namespace media | 656 } // namespace media |
OLD | NEW |