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 "base/bind.h" | 5 #include "base/bind.h" |
6 #include "media/base/audio_decoder_config.h" | 6 #include "media/base/audio_decoder_config.h" |
7 #include "media/base/mock_callback.h" | 7 #include "media/base/mock_callback.h" |
8 #include "media/base/mock_demuxer_host.h" | 8 #include "media/base/mock_demuxer_host.h" |
9 #include "media/base/test_data_util.h" | 9 #include "media/base/test_data_util.h" |
10 #include "media/filters/chunk_demuxer.h" | 10 #include "media/filters/chunk_demuxer.h" |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 protected: | 83 protected: |
84 enum CodecsIndex { | 84 enum CodecsIndex { |
85 AUDIO, | 85 AUDIO, |
86 VIDEO, | 86 VIDEO, |
87 MAX_CODECS_INDEX | 87 MAX_CODECS_INDEX |
88 }; | 88 }; |
89 | 89 |
90 ChunkDemuxerTest() | 90 ChunkDemuxerTest() |
91 : client_(new MockChunkDemuxerClient()), | 91 : client_(new MockChunkDemuxerClient()), |
92 demuxer_(new ChunkDemuxer(client_.get())) { | 92 demuxer_(new ChunkDemuxer(client_.get())) { |
| 93 demuxer_->set_host(&mock_demuxer_host_); |
93 } | 94 } |
94 | 95 |
95 virtual ~ChunkDemuxerTest() { | 96 virtual ~ChunkDemuxerTest() { |
96 ShutdownDemuxer(); | 97 ShutdownDemuxer(); |
97 } | 98 } |
98 | 99 |
99 void CreateInfoTracks(bool has_audio, bool has_video, | 100 void CreateInfoTracks(bool has_audio, bool has_video, |
100 bool video_content_encoded, scoped_array<uint8>* buffer, | 101 bool video_content_encoded, scoped_array<uint8>* buffer, |
101 int* size) { | 102 int* size) { |
102 scoped_array<uint8> info; | 103 scoped_array<uint8> info; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 | 187 |
187 bool AppendInfoTracks(bool has_audio, bool has_video, | 188 bool AppendInfoTracks(bool has_audio, bool has_video, |
188 bool video_content_encoded) { | 189 bool video_content_encoded) { |
189 scoped_array<uint8> info_tracks; | 190 scoped_array<uint8> info_tracks; |
190 int info_tracks_size = 0; | 191 int info_tracks_size = 0; |
191 CreateInfoTracks(has_audio, has_video, video_content_encoded, | 192 CreateInfoTracks(has_audio, has_video, video_content_encoded, |
192 &info_tracks, &info_tracks_size); | 193 &info_tracks, &info_tracks_size); |
193 return AppendData(info_tracks.get(), info_tracks_size); | 194 return AppendData(info_tracks.get(), info_tracks_size); |
194 } | 195 } |
195 | 196 |
196 void InitDoneCalled(const base::TimeDelta& expected_duration, | 197 void InitDoneCalled(PipelineStatus expected_status, |
197 PipelineStatus expected_status, | |
198 bool call_set_host, | |
199 PipelineStatus status) { | 198 PipelineStatus status) { |
200 EXPECT_EQ(status, expected_status); | 199 EXPECT_EQ(status, expected_status); |
| 200 } |
201 | 201 |
202 if (status == PIPELINE_OK) { | 202 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration, |
| 203 PipelineStatus expected_status) { |
| 204 if (expected_status == PIPELINE_OK) { |
203 EXPECT_CALL(mock_demuxer_host_, SetDuration(expected_duration)); | 205 EXPECT_CALL(mock_demuxer_host_, SetDuration(expected_duration)); |
204 EXPECT_CALL(mock_demuxer_host_, SetCurrentReadPosition(_)); | 206 EXPECT_CALL(mock_demuxer_host_, SetCurrentReadPosition(_)); |
| 207 } |
205 | 208 |
206 if (call_set_host) | |
207 demuxer_->set_host(&mock_demuxer_host_); | |
208 } | |
209 } | |
210 | |
211 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& duration, | |
212 PipelineStatus expected_status, | |
213 bool call_set_host) { | |
214 return base::Bind(&ChunkDemuxerTest::InitDoneCalled, | 209 return base::Bind(&ChunkDemuxerTest::InitDoneCalled, |
215 base::Unretained(this), | 210 base::Unretained(this), |
216 duration, | 211 expected_status); |
217 expected_status, | |
218 call_set_host); | |
219 } | 212 } |
220 | 213 |
221 bool InitDemuxer(bool has_audio, bool has_video, | 214 bool InitDemuxer(bool has_audio, bool has_video, |
222 bool video_content_encoded) { | 215 bool video_content_encoded) { |
223 PipelineStatus expected_status = | 216 PipelineStatus expected_status = |
224 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; | 217 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; |
225 | 218 |
226 EXPECT_CALL(*client_, DemuxerOpened(_)); | 219 EXPECT_CALL(*client_, DemuxerOpened(_)); |
227 demuxer_->Init(CreateInitDoneCB(kDefaultDuration(), expected_status, true)); | 220 demuxer_->Initialize(CreateInitDoneCB( |
| 221 kDefaultDuration(), expected_status)); |
228 | 222 |
229 return AppendInfoTracks(has_audio, has_video, video_content_encoded); | 223 return AppendInfoTracks(has_audio, has_video, video_content_encoded); |
230 } | 224 } |
231 | 225 |
232 void ShutdownDemuxer() { | 226 void ShutdownDemuxer() { |
233 if (demuxer_) { | 227 if (demuxer_) { |
234 EXPECT_CALL(*client_, DemuxerClosed()); | 228 EXPECT_CALL(*client_, DemuxerClosed()); |
235 demuxer_->Shutdown(); | 229 demuxer_->Shutdown(); |
236 } | 230 } |
237 } | 231 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
269 // a timestamp of kSkip indicates that a Read() call for that stream | 263 // a timestamp of kSkip indicates that a Read() call for that stream |
270 // shouldn't be made on that iteration of the loop. If both streams have | 264 // shouldn't be made on that iteration of the loop. If both streams have |
271 // a kSkip then the loop will terminate. | 265 // a kSkip then the loop will terminate. |
272 bool ParseWebMFile(const std::string& filename, | 266 bool ParseWebMFile(const std::string& filename, |
273 const BufferTimestamps* timestamps, | 267 const BufferTimestamps* timestamps, |
274 const base::TimeDelta& duration) { | 268 const base::TimeDelta& duration) { |
275 scoped_array<uint8> buffer; | 269 scoped_array<uint8> buffer; |
276 int buffer_size = 0; | 270 int buffer_size = 0; |
277 | 271 |
278 EXPECT_CALL(*client_, DemuxerOpened(_)); | 272 EXPECT_CALL(*client_, DemuxerOpened(_)); |
279 demuxer_->Init(CreateInitDoneCB(duration, PIPELINE_OK, true)); | 273 demuxer_->Initialize(CreateInitDoneCB(duration, PIPELINE_OK)); |
280 | 274 |
281 // Read a WebM file into memory and send the data to the demuxer. | 275 // Read a WebM file into memory and send the data to the demuxer. |
282 ReadTestDataFile(filename, &buffer, &buffer_size); | 276 ReadTestDataFile(filename, &buffer, &buffer_size); |
283 if (!AppendDataInPieces(buffer.get(), buffer_size, 512)) | 277 if (!AppendDataInPieces(buffer.get(), buffer_size, 512)) |
284 return false; | 278 return false; |
285 | 279 |
286 scoped_refptr<DemuxerStream> audio = | 280 scoped_refptr<DemuxerStream> audio = |
287 demuxer_->GetStream(DemuxerStream::AUDIO); | 281 demuxer_->GetStream(DemuxerStream::AUDIO); |
288 scoped_refptr<DemuxerStream> video = | 282 scoped_refptr<DemuxerStream> video = |
289 demuxer_->GetStream(DemuxerStream::VIDEO); | 283 demuxer_->GetStream(DemuxerStream::VIDEO); |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 bool has_audio = (i & 0x1) != 0; | 330 bool has_audio = (i & 0x1) != 0; |
337 bool has_video = (i & 0x2) != 0; | 331 bool has_video = (i & 0x2) != 0; |
338 bool video_content_encoded = (i & 0x4) != 0; | 332 bool video_content_encoded = (i & 0x4) != 0; |
339 | 333 |
340 // No test on invalid combination. | 334 // No test on invalid combination. |
341 if (!has_video && video_content_encoded) | 335 if (!has_video && video_content_encoded) |
342 continue; | 336 continue; |
343 | 337 |
344 client_.reset(new MockChunkDemuxerClient()); | 338 client_.reset(new MockChunkDemuxerClient()); |
345 demuxer_ = new ChunkDemuxer(client_.get()); | 339 demuxer_ = new ChunkDemuxer(client_.get()); |
| 340 demuxer_->set_host(&mock_demuxer_host_); |
346 ASSERT_TRUE(InitDemuxer(has_audio, has_video, video_content_encoded)); | 341 ASSERT_TRUE(InitDemuxer(has_audio, has_video, video_content_encoded)); |
347 | 342 |
348 scoped_refptr<DemuxerStream> audio_stream = | 343 scoped_refptr<DemuxerStream> audio_stream = |
349 demuxer_->GetStream(DemuxerStream::AUDIO); | 344 demuxer_->GetStream(DemuxerStream::AUDIO); |
350 if (has_audio) { | 345 if (has_audio) { |
351 ASSERT_TRUE(audio_stream); | 346 ASSERT_TRUE(audio_stream); |
352 | 347 |
353 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); | 348 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); |
354 EXPECT_EQ(kCodecVorbis, config.codec()); | 349 EXPECT_EQ(kCodecVorbis, config.codec()); |
355 EXPECT_EQ(16, config.bits_per_channel()); | 350 EXPECT_EQ(16, config.bits_per_channel()); |
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
632 AddSimpleBlock(&cb, kAudioTrackNum, 10); | 627 AddSimpleBlock(&cb, kAudioTrackNum, 10); |
633 AddSimpleBlock(&cb, kVideoTrackNum, 10); | 628 AddSimpleBlock(&cb, kVideoTrackNum, 10); |
634 scoped_ptr<Cluster> cluster_c(cb.Finish()); | 629 scoped_ptr<Cluster> cluster_c(cb.Finish()); |
635 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); | 630 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); |
636 } | 631 } |
637 | 632 |
638 // Test the case where a cluster is passed to AppendData() before | 633 // Test the case where a cluster is passed to AppendData() before |
639 // INFO & TRACKS data. | 634 // INFO & TRACKS data. |
640 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { | 635 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { |
641 EXPECT_CALL(*client_, DemuxerOpened(_)); | 636 EXPECT_CALL(*client_, DemuxerOpened(_)); |
642 demuxer_->Init(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 637 demuxer_->Initialize(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
643 | 638 |
644 ClusterBuilder cb; | 639 ClusterBuilder cb; |
645 cb.SetClusterTimecode(0); | 640 cb.SetClusterTimecode(0); |
646 AddSimpleBlock(&cb, kVideoTrackNum, 0); | 641 AddSimpleBlock(&cb, kVideoTrackNum, 0); |
647 scoped_ptr<Cluster> cluster(cb.Finish()); | 642 scoped_ptr<Cluster> cluster(cb.Finish()); |
648 | 643 |
649 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); | 644 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); |
650 } | 645 } |
651 | 646 |
652 // Test cases where we get an EndOfStream() call during initialization. | 647 // Test cases where we get an EndOfStream() call during initialization. |
653 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { | 648 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { |
654 EXPECT_CALL(*client_, DemuxerOpened(_)); | 649 EXPECT_CALL(*client_, DemuxerOpened(_)); |
655 demuxer_->Init(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); | 650 demuxer_->Initialize(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); |
656 demuxer_->EndOfStream(PIPELINE_OK); | 651 demuxer_->EndOfStream(PIPELINE_OK); |
657 } | 652 } |
658 | 653 |
659 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { | 654 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { |
660 ASSERT_TRUE(InitDemuxer(true, true, false)); | 655 ASSERT_TRUE(InitDemuxer(true, true, false)); |
661 | 656 |
662 ClusterBuilder cb; | 657 ClusterBuilder cb; |
663 cb.SetClusterTimecode(0); | 658 cb.SetClusterTimecode(0); |
664 AddSimpleBlock(&cb, kAudioTrackNum, 0); | 659 AddSimpleBlock(&cb, kAudioTrackNum, 0); |
665 AddSimpleBlock(&cb, kVideoTrackNum, 0); | 660 AddSimpleBlock(&cb, kVideoTrackNum, 0); |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
829 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); | 824 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); |
830 | 825 |
831 end_of_stream_helper_3.RequestReads(); | 826 end_of_stream_helper_3.RequestReads(); |
832 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); | 827 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); |
833 } | 828 } |
834 | 829 |
835 // Make sure AppendData() will accept elements that span multiple calls. | 830 // Make sure AppendData() will accept elements that span multiple calls. |
836 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { | 831 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { |
837 | 832 |
838 EXPECT_CALL(*client_, DemuxerOpened(_)); | 833 EXPECT_CALL(*client_, DemuxerOpened(_)); |
839 demuxer_->Init(CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK, true)); | 834 demuxer_->Initialize(CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); |
840 | 835 |
841 scoped_array<uint8> info_tracks; | 836 scoped_array<uint8> info_tracks; |
842 int info_tracks_size = 0; | 837 int info_tracks_size = 0; |
843 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); | 838 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); |
844 | 839 |
845 ClusterBuilder cb; | 840 ClusterBuilder cb; |
846 cb.SetClusterTimecode(0); | 841 cb.SetClusterTimecode(0); |
847 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512); | 842 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512); |
848 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024); | 843 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024); |
849 scoped_ptr<Cluster> cluster_a(cb.Finish()); | 844 scoped_ptr<Cluster> cluster_a(cb.Finish()); |
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1024 | 1019 |
1025 // Append the remaining data. | 1020 // Append the remaining data. |
1026 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); | 1021 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); |
1027 | 1022 |
1028 EXPECT_TRUE(audio_read_done); | 1023 EXPECT_TRUE(audio_read_done); |
1029 EXPECT_TRUE(video_read_done); | 1024 EXPECT_TRUE(video_read_done); |
1030 } | 1025 } |
1031 | 1026 |
1032 | 1027 |
1033 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { | 1028 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { |
| 1029 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); |
| 1030 |
1034 EXPECT_CALL(*client_, DemuxerOpened(_)); | 1031 EXPECT_CALL(*client_, DemuxerOpened(_)); |
1035 demuxer_->Init(CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK, false)); | 1032 demuxer_->Initialize(CreateInitDoneCB( |
| 1033 kDefaultDuration(), PIPELINE_OK)); |
1036 ASSERT_TRUE(AppendInfoTracks(true, true, false)); | 1034 ASSERT_TRUE(AppendInfoTracks(true, true, false)); |
1037 | 1035 |
1038 uint8 tmp = 0; | 1036 uint8 tmp = 0; |
1039 ASSERT_TRUE(demuxer_->AppendData(&tmp, 1)); | 1037 ASSERT_TRUE(demuxer_->AppendData(&tmp, 1)); |
1040 | |
1041 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); | |
1042 demuxer_->set_host(&mock_demuxer_host_); | |
1043 } | 1038 } |
1044 | 1039 |
1045 } // namespace media | 1040 } // namespace media |
OLD | NEW |