Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 9968117: Move Demuxer::set_host() to Initialize(). (Closed) Base URL: svn://chrome-svn/chrome/trunk/src
Patch Set: fixes Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/dummy_demuxer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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_);
94 } 93 }
95 94
96 virtual ~ChunkDemuxerTest() { 95 virtual ~ChunkDemuxerTest() {
97 ShutdownDemuxer(); 96 ShutdownDemuxer();
98 } 97 }
99 98
100 void CreateInfoTracks(bool has_audio, bool has_video, 99 void CreateInfoTracks(bool has_audio, bool has_video,
101 bool video_content_encoded, scoped_array<uint8>* buffer, 100 bool video_content_encoded, scoped_array<uint8>* buffer,
102 int* size) { 101 int* size) {
103 scoped_array<uint8> info; 102 scoped_array<uint8> info;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 video_content_encodings_size); 153 video_content_encodings_size);
155 video_track_entry_size += video_content_encodings_size; 154 video_track_entry_size += video_content_encodings_size;
156 WriteInt64(buf + kVideoTrackSizeOffset, 155 WriteInt64(buf + kVideoTrackSizeOffset,
157 video_track_entry_size - kVideoTrackEntryHeaderSize); 156 video_track_entry_size - kVideoTrackEntryHeaderSize);
158 } 157 }
159 buf += video_track_entry_size; 158 buf += video_track_entry_size;
160 } 159 }
161 } 160 }
162 161
163 bool AppendData(const uint8* data, size_t length) { 162 bool AppendData(const uint8* data, size_t length) {
164 EXPECT_CALL(mock_demuxer_host_, SetBufferedBytes(_)).Times(AnyNumber()); 163 EXPECT_CALL(host_, SetBufferedBytes(_)).Times(AnyNumber());
165 EXPECT_CALL(mock_demuxer_host_, SetBufferedTime(_)).Times(AnyNumber()); 164 EXPECT_CALL(host_, SetBufferedTime(_)).Times(AnyNumber());
166 EXPECT_CALL(mock_demuxer_host_, SetNetworkActivity(true)) 165 EXPECT_CALL(host_, SetNetworkActivity(true))
167 .Times(AnyNumber()); 166 .Times(AnyNumber());
168 return demuxer_->AppendData(data, length); 167 return demuxer_->AppendData(data, length);
169 } 168 }
170 169
171 bool AppendDataInPieces(const uint8* data, size_t length) { 170 bool AppendDataInPieces(const uint8* data, size_t length) {
172 return AppendDataInPieces(data, length, 7); 171 return AppendDataInPieces(data, length, 7);
173 } 172 }
174 173
175 bool AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) { 174 bool AppendDataInPieces(const uint8* data, size_t length, size_t piece_size) {
176 const uint8* start = data; 175 const uint8* start = data;
(...skipping 18 matching lines...) Expand all
195 } 194 }
196 195
197 void InitDoneCalled(PipelineStatus expected_status, 196 void InitDoneCalled(PipelineStatus expected_status,
198 PipelineStatus status) { 197 PipelineStatus status) {
199 EXPECT_EQ(status, expected_status); 198 EXPECT_EQ(status, expected_status);
200 } 199 }
201 200
202 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration, 201 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration,
203 PipelineStatus expected_status) { 202 PipelineStatus expected_status) {
204 if (expected_status == PIPELINE_OK) { 203 if (expected_status == PIPELINE_OK) {
205 EXPECT_CALL(mock_demuxer_host_, SetDuration(expected_duration)); 204 EXPECT_CALL(host_, SetDuration(expected_duration));
206 EXPECT_CALL(mock_demuxer_host_, SetCurrentReadPosition(_)); 205 EXPECT_CALL(host_, SetCurrentReadPosition(_));
207 } 206 }
208 207
209 return base::Bind(&ChunkDemuxerTest::InitDoneCalled, 208 return base::Bind(&ChunkDemuxerTest::InitDoneCalled,
210 base::Unretained(this), 209 base::Unretained(this),
211 expected_status); 210 expected_status);
212 } 211 }
213 212
214 bool InitDemuxer(bool has_audio, bool has_video, 213 bool InitDemuxer(bool has_audio, bool has_video,
215 bool video_content_encoded) { 214 bool video_content_encoded) {
216 PipelineStatus expected_status = 215 PipelineStatus expected_status =
217 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN; 216 (has_audio || has_video) ? PIPELINE_OK : DEMUXER_ERROR_COULD_NOT_OPEN;
218 217
219 EXPECT_CALL(*client_, DemuxerOpened(_)); 218 EXPECT_CALL(*client_, DemuxerOpened(_));
220 demuxer_->Initialize(CreateInitDoneCB( 219 demuxer_->Initialize(
221 kDefaultDuration(), expected_status)); 220 &host_, CreateInitDoneCB(kDefaultDuration(), expected_status));
222 221
223 return AppendInfoTracks(has_audio, has_video, video_content_encoded); 222 return AppendInfoTracks(has_audio, has_video, video_content_encoded);
224 } 223 }
225 224
226 void ShutdownDemuxer() { 225 void ShutdownDemuxer() {
227 if (demuxer_) { 226 if (demuxer_) {
228 EXPECT_CALL(*client_, DemuxerClosed()); 227 EXPECT_CALL(*client_, DemuxerClosed());
229 demuxer_->Shutdown(); 228 demuxer_->Shutdown();
230 } 229 }
231 } 230 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 // a timestamp of kSkip indicates that a Read() call for that stream 262 // a timestamp of kSkip indicates that a Read() call for that stream
264 // shouldn't be made on that iteration of the loop. If both streams have 263 // shouldn't be made on that iteration of the loop. If both streams have
265 // a kSkip then the loop will terminate. 264 // a kSkip then the loop will terminate.
266 bool ParseWebMFile(const std::string& filename, 265 bool ParseWebMFile(const std::string& filename,
267 const BufferTimestamps* timestamps, 266 const BufferTimestamps* timestamps,
268 const base::TimeDelta& duration) { 267 const base::TimeDelta& duration) {
269 scoped_array<uint8> buffer; 268 scoped_array<uint8> buffer;
270 int buffer_size = 0; 269 int buffer_size = 0;
271 270
272 EXPECT_CALL(*client_, DemuxerOpened(_)); 271 EXPECT_CALL(*client_, DemuxerOpened(_));
273 demuxer_->Initialize(CreateInitDoneCB(duration, PIPELINE_OK)); 272 demuxer_->Initialize(
273 &host_, CreateInitDoneCB(duration, PIPELINE_OK));
274 274
275 // 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.
276 ReadTestDataFile(filename, &buffer, &buffer_size); 276 ReadTestDataFile(filename, &buffer, &buffer_size);
277 if (!AppendDataInPieces(buffer.get(), buffer_size, 512)) 277 if (!AppendDataInPieces(buffer.get(), buffer_size, 512))
278 return false; 278 return false;
279 279
280 scoped_refptr<DemuxerStream> audio = 280 scoped_refptr<DemuxerStream> audio =
281 demuxer_->GetStream(DemuxerStream::AUDIO); 281 demuxer_->GetStream(DemuxerStream::AUDIO);
282 scoped_refptr<DemuxerStream> video = 282 scoped_refptr<DemuxerStream> video =
283 demuxer_->GetStream(DemuxerStream::VIDEO); 283 demuxer_->GetStream(DemuxerStream::VIDEO);
(...skipping 23 matching lines...) Expand all
307 timestamps[i].video_time_ms), 307 timestamps[i].video_time_ms),
308 &video_read_done)); 308 &video_read_done));
309 309
310 EXPECT_TRUE(video_read_done); 310 EXPECT_TRUE(video_read_done);
311 } 311 }
312 } 312 }
313 313
314 return true; 314 return true;
315 } 315 }
316 316
317 MockDemuxerHost mock_demuxer_host_; 317 MockDemuxerHost host_;
318 318
319 scoped_ptr<MockChunkDemuxerClient> client_; 319 scoped_ptr<MockChunkDemuxerClient> client_;
320 scoped_refptr<ChunkDemuxer> demuxer_; 320 scoped_refptr<ChunkDemuxer> demuxer_;
321 321
322 private: 322 private:
323 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest); 323 DISALLOW_COPY_AND_ASSIGN(ChunkDemuxerTest);
324 }; 324 };
325 325
326 TEST_F(ChunkDemuxerTest, TestInit) { 326 TEST_F(ChunkDemuxerTest, TestInit) {
327 // Test no streams, audio-only, video-only, and audio & video scenarios, 327 // Test no streams, audio-only, video-only, and audio & video scenarios,
328 // with video content encoded or not. 328 // with video content encoded or not.
329 for (int i = 0; i < 8; i++) { 329 for (int i = 0; i < 8; i++) {
330 bool has_audio = (i & 0x1) != 0; 330 bool has_audio = (i & 0x1) != 0;
331 bool has_video = (i & 0x2) != 0; 331 bool has_video = (i & 0x2) != 0;
332 bool video_content_encoded = (i & 0x4) != 0; 332 bool video_content_encoded = (i & 0x4) != 0;
333 333
334 // No test on invalid combination. 334 // No test on invalid combination.
335 if (!has_video && video_content_encoded) 335 if (!has_video && video_content_encoded)
336 continue; 336 continue;
337 337
338 client_.reset(new MockChunkDemuxerClient()); 338 client_.reset(new MockChunkDemuxerClient());
339 demuxer_ = new ChunkDemuxer(client_.get()); 339 demuxer_ = new ChunkDemuxer(client_.get());
340 demuxer_->set_host(&mock_demuxer_host_);
341 ASSERT_TRUE(InitDemuxer(has_audio, has_video, video_content_encoded)); 340 ASSERT_TRUE(InitDemuxer(has_audio, has_video, video_content_encoded));
342 341
343 scoped_refptr<DemuxerStream> audio_stream = 342 scoped_refptr<DemuxerStream> audio_stream =
344 demuxer_->GetStream(DemuxerStream::AUDIO); 343 demuxer_->GetStream(DemuxerStream::AUDIO);
345 if (has_audio) { 344 if (has_audio) {
346 ASSERT_TRUE(audio_stream); 345 ASSERT_TRUE(audio_stream);
347 346
348 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 347 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
349 EXPECT_EQ(kCodecVorbis, config.codec()); 348 EXPECT_EQ(kCodecVorbis, config.codec());
350 EXPECT_EQ(16, config.bits_per_channel()); 349 EXPECT_EQ(16, config.bits_per_channel());
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
513 // that overlaps. 512 // that overlaps.
514 cb.SetClusterTimecode(5); 513 cb.SetClusterTimecode(5);
515 AddSimpleBlock(&cb, kAudioTrackNum, 5); 514 AddSimpleBlock(&cb, kAudioTrackNum, 5);
516 AddSimpleBlock(&cb, kVideoTrackNum, 7); 515 AddSimpleBlock(&cb, kVideoTrackNum, 7);
517 AddSimpleBlock(&cb, kAudioTrackNum, 28); 516 AddSimpleBlock(&cb, kAudioTrackNum, 28);
518 AddSimpleBlock(&cb, kVideoTrackNum, 40); 517 AddSimpleBlock(&cb, kVideoTrackNum, 40);
519 scoped_ptr<Cluster> cluster_b(cb.Finish()); 518 scoped_ptr<Cluster> cluster_b(cb.Finish());
520 519
521 // Make sure that AppendData() fails because this cluster data 520 // Make sure that AppendData() fails because this cluster data
522 // is before previous data. 521 // is before previous data.
523 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 522 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
524 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 523 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
525 524
526 // Verify that AppendData() doesn't accept more data now. 525 // Verify that AppendData() doesn't accept more data now.
527 cb.SetClusterTimecode(45); 526 cb.SetClusterTimecode(45);
528 AddSimpleBlock(&cb, kAudioTrackNum, 45); 527 AddSimpleBlock(&cb, kAudioTrackNum, 45);
529 AddSimpleBlock(&cb, kVideoTrackNum, 45); 528 AddSimpleBlock(&cb, kVideoTrackNum, 45);
530 scoped_ptr<Cluster> cluster_c(cb.Finish()); 529 scoped_ptr<Cluster> cluster_c(cb.Finish());
531 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); 530 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size()));
532 } 531 }
533 532
534 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { 533 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) {
535 ASSERT_TRUE(InitDemuxer(true, true, false)); 534 ASSERT_TRUE(InitDemuxer(true, true, false));
536 535
537 ClusterBuilder cb; 536 ClusterBuilder cb;
538 537
539 // Test the case where block timecodes are not monotonically 538 // Test the case where block timecodes are not monotonically
540 // increasing but stay above the cluster timecode. 539 // increasing but stay above the cluster timecode.
541 cb.SetClusterTimecode(5); 540 cb.SetClusterTimecode(5);
542 AddSimpleBlock(&cb, kAudioTrackNum, 5); 541 AddSimpleBlock(&cb, kAudioTrackNum, 5);
543 AddSimpleBlock(&cb, kVideoTrackNum, 10); 542 AddSimpleBlock(&cb, kVideoTrackNum, 10);
544 AddSimpleBlock(&cb, kAudioTrackNum, 7); 543 AddSimpleBlock(&cb, kAudioTrackNum, 7);
545 AddSimpleBlock(&cb, kVideoTrackNum, 15); 544 AddSimpleBlock(&cb, kVideoTrackNum, 15);
546 scoped_ptr<Cluster> cluster_a(cb.Finish()); 545 scoped_ptr<Cluster> cluster_a(cb.Finish());
547 546
548 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 547 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
549 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 548 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
550 549
551 // Verify that AppendData() doesn't accept more data now. 550 // Verify that AppendData() doesn't accept more data now.
552 cb.SetClusterTimecode(20); 551 cb.SetClusterTimecode(20);
553 AddSimpleBlock(&cb, kAudioTrackNum, 20); 552 AddSimpleBlock(&cb, kAudioTrackNum, 20);
554 AddSimpleBlock(&cb, kVideoTrackNum, 20); 553 AddSimpleBlock(&cb, kVideoTrackNum, 20);
555 scoped_ptr<Cluster> cluster_b(cb.Finish()); 554 scoped_ptr<Cluster> cluster_b(cb.Finish());
556 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); 555 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size()));
557 } 556 }
558 557
559 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { 558 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) {
560 ASSERT_TRUE(InitDemuxer(true, true, false)); 559 ASSERT_TRUE(InitDemuxer(true, true, false));
561 560
562 ClusterBuilder cb; 561 ClusterBuilder cb;
563 562
564 // Test timecodes going backwards and including values less than the cluster 563 // Test timecodes going backwards and including values less than the cluster
565 // timecode. 564 // timecode.
566 cb.SetClusterTimecode(5); 565 cb.SetClusterTimecode(5);
567 AddSimpleBlock(&cb, kAudioTrackNum, 5); 566 AddSimpleBlock(&cb, kAudioTrackNum, 5);
568 AddSimpleBlock(&cb, kVideoTrackNum, 5); 567 AddSimpleBlock(&cb, kVideoTrackNum, 5);
569 AddSimpleBlock(&cb, kAudioTrackNum, 3); 568 AddSimpleBlock(&cb, kAudioTrackNum, 3);
570 AddSimpleBlock(&cb, kVideoTrackNum, 3); 569 AddSimpleBlock(&cb, kVideoTrackNum, 3);
571 scoped_ptr<Cluster> cluster_a(cb.Finish()); 570 scoped_ptr<Cluster> cluster_a(cb.Finish());
572 571
573 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 572 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
574 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 573 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
575 574
576 // Verify that AppendData() doesn't accept more data now. 575 // Verify that AppendData() doesn't accept more data now.
577 cb.SetClusterTimecode(6); 576 cb.SetClusterTimecode(6);
578 AddSimpleBlock(&cb, kAudioTrackNum, 6); 577 AddSimpleBlock(&cb, kAudioTrackNum, 6);
579 AddSimpleBlock(&cb, kVideoTrackNum, 6); 578 AddSimpleBlock(&cb, kVideoTrackNum, 6);
580 scoped_ptr<Cluster> cluster_b(cb.Finish()); 579 scoped_ptr<Cluster> cluster_b(cb.Finish());
581 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size())); 580 EXPECT_FALSE(demuxer_->AppendData(cluster_b->data(), cluster_b->size()));
582 } 581 }
583 582
584 583
585 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) { 584 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) {
586 ASSERT_TRUE(InitDemuxer(true, true, false)); 585 ASSERT_TRUE(InitDemuxer(true, true, false));
587 586
588 ClusterBuilder cb; 587 ClusterBuilder cb;
589 588
590 // Test strict monotonic increasing timestamps on a per stream 589 // Test strict monotonic increasing timestamps on a per stream
591 // basis. 590 // basis.
592 cb.SetClusterTimecode(5); 591 cb.SetClusterTimecode(5);
593 AddSimpleBlock(&cb, kAudioTrackNum, 5); 592 AddSimpleBlock(&cb, kAudioTrackNum, 5);
594 AddSimpleBlock(&cb, kVideoTrackNum, 5); 593 AddSimpleBlock(&cb, kVideoTrackNum, 5);
595 AddSimpleBlock(&cb, kAudioTrackNum, 5); 594 AddSimpleBlock(&cb, kAudioTrackNum, 5);
596 AddSimpleBlock(&cb, kVideoTrackNum, 7); 595 AddSimpleBlock(&cb, kVideoTrackNum, 7);
597 scoped_ptr<Cluster> cluster(cb.Finish()); 596 scoped_ptr<Cluster> cluster(cb.Finish());
598 597
599 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 598 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
600 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 599 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
601 } 600 }
602 601
603 TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) { 602 TEST_F(ChunkDemuxerTest, TestMonotonicallyIncreasingTimestampsAcrossClusters) {
604 ASSERT_TRUE(InitDemuxer(true, true, false)); 603 ASSERT_TRUE(InitDemuxer(true, true, false));
605 604
606 ClusterBuilder cb; 605 ClusterBuilder cb;
607 606
608 // Test strict monotonic increasing timestamps on a per stream 607 // Test strict monotonic increasing timestamps on a per stream
609 // basis across clusters. 608 // basis across clusters.
610 cb.SetClusterTimecode(5); 609 cb.SetClusterTimecode(5);
611 AddSimpleBlock(&cb, kAudioTrackNum, 5); 610 AddSimpleBlock(&cb, kAudioTrackNum, 5);
612 AddSimpleBlock(&cb, kVideoTrackNum, 5); 611 AddSimpleBlock(&cb, kVideoTrackNum, 5);
613 scoped_ptr<Cluster> cluster_a(cb.Finish()); 612 scoped_ptr<Cluster> cluster_a(cb.Finish());
614 613
615 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 614 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
616 615
617 cb.SetClusterTimecode(5); 616 cb.SetClusterTimecode(5);
618 AddSimpleBlock(&cb, kAudioTrackNum, 5); 617 AddSimpleBlock(&cb, kAudioTrackNum, 5);
619 AddSimpleBlock(&cb, kVideoTrackNum, 7); 618 AddSimpleBlock(&cb, kVideoTrackNum, 7);
620 scoped_ptr<Cluster> cluster_b(cb.Finish()); 619 scoped_ptr<Cluster> cluster_b(cb.Finish());
621 620
622 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 621 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
623 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 622 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
624 623
625 // Verify that AppendData() doesn't accept more data now. 624 // Verify that AppendData() doesn't accept more data now.
626 cb.SetClusterTimecode(10); 625 cb.SetClusterTimecode(10);
627 AddSimpleBlock(&cb, kAudioTrackNum, 10); 626 AddSimpleBlock(&cb, kAudioTrackNum, 10);
628 AddSimpleBlock(&cb, kVideoTrackNum, 10); 627 AddSimpleBlock(&cb, kVideoTrackNum, 10);
629 scoped_ptr<Cluster> cluster_c(cb.Finish()); 628 scoped_ptr<Cluster> cluster_c(cb.Finish());
630 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size())); 629 EXPECT_FALSE(demuxer_->AppendData(cluster_c->data(), cluster_c->size()));
631 } 630 }
632 631
633 // Test the case where a cluster is passed to AppendData() before 632 // Test the case where a cluster is passed to AppendData() before
634 // INFO & TRACKS data. 633 // INFO & TRACKS data.
635 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { 634 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) {
636 EXPECT_CALL(*client_, DemuxerOpened(_)); 635 EXPECT_CALL(*client_, DemuxerOpened(_));
637 demuxer_->Initialize(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 636 demuxer_->Initialize(
637 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
638 638
639 ClusterBuilder cb; 639 ClusterBuilder cb;
640 cb.SetClusterTimecode(0); 640 cb.SetClusterTimecode(0);
641 AddSimpleBlock(&cb, kVideoTrackNum, 0); 641 AddSimpleBlock(&cb, kVideoTrackNum, 0);
642 scoped_ptr<Cluster> cluster(cb.Finish()); 642 scoped_ptr<Cluster> cluster(cb.Finish());
643 643
644 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 644 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
645 } 645 }
646 646
647 // Test cases where we get an EndOfStream() call during initialization. 647 // Test cases where we get an EndOfStream() call during initialization.
648 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { 648 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) {
649 EXPECT_CALL(*client_, DemuxerOpened(_)); 649 EXPECT_CALL(*client_, DemuxerOpened(_));
650 demuxer_->Initialize(NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 650 demuxer_->Initialize(
651 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
651 demuxer_->EndOfStream(PIPELINE_OK); 652 demuxer_->EndOfStream(PIPELINE_OK);
652 } 653 }
653 654
654 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 655 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) {
655 ASSERT_TRUE(InitDemuxer(true, true, false)); 656 ASSERT_TRUE(InitDemuxer(true, true, false));
656 657
657 ClusterBuilder cb; 658 ClusterBuilder cb;
658 cb.SetClusterTimecode(0); 659 cb.SetClusterTimecode(0);
659 AddSimpleBlock(&cb, kAudioTrackNum, 0); 660 AddSimpleBlock(&cb, kAudioTrackNum, 0);
660 AddSimpleBlock(&cb, kVideoTrackNum, 0); 661 AddSimpleBlock(&cb, kVideoTrackNum, 0);
661 AddSimpleBlock(&cb, kAudioTrackNum, 23); 662 AddSimpleBlock(&cb, kAudioTrackNum, 23);
662 AddSimpleBlock(&cb, kVideoTrackNum, 33); 663 AddSimpleBlock(&cb, kVideoTrackNum, 33);
663 scoped_ptr<Cluster> cluster(cb.Finish()); 664 scoped_ptr<Cluster> cluster(cb.Finish());
664 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 665 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
665 666
666 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 667 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
667 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE); 668 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE);
668 } 669 }
669 670
670 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 671 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) {
671 ASSERT_TRUE(InitDemuxer(true, true, false)); 672 ASSERT_TRUE(InitDemuxer(true, true, false));
672 673
673 ClusterBuilder cb; 674 ClusterBuilder cb;
674 cb.SetClusterTimecode(0); 675 cb.SetClusterTimecode(0);
675 AddSimpleBlock(&cb, kAudioTrackNum, 0); 676 AddSimpleBlock(&cb, kAudioTrackNum, 0);
676 AddSimpleBlock(&cb, kVideoTrackNum, 0); 677 AddSimpleBlock(&cb, kVideoTrackNum, 0);
677 AddSimpleBlock(&cb, kAudioTrackNum, 23); 678 AddSimpleBlock(&cb, kAudioTrackNum, 23);
678 AddSimpleBlock(&cb, kVideoTrackNum, 33); 679 AddSimpleBlock(&cb, kVideoTrackNum, 33);
679 scoped_ptr<Cluster> cluster(cb.Finish()); 680 scoped_ptr<Cluster> cluster(cb.Finish());
680 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 681 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
681 682
682 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 683 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
683 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 684 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
684 } 685 }
685 686
686 // Helper class to reduce duplicate code when testing end of stream 687 // Helper class to reduce duplicate code when testing end of stream
687 // Read() behavior. 688 // Read() behavior.
688 class EndOfStreamHelper { 689 class EndOfStreamHelper {
689 public: 690 public:
690 EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer) 691 EndOfStreamHelper(const scoped_refptr<Demuxer> demuxer)
691 : demuxer_(demuxer), 692 : demuxer_(demuxer),
692 audio_read_done_(false), 693 audio_read_done_(false),
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 825 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
825 826
826 end_of_stream_helper_3.RequestReads(); 827 end_of_stream_helper_3.RequestReads();
827 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 828 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
828 } 829 }
829 830
830 // Make sure AppendData() will accept elements that span multiple calls. 831 // Make sure AppendData() will accept elements that span multiple calls.
831 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) { 832 TEST_F(ChunkDemuxerTest, TestAppendingInPieces) {
832 833
833 EXPECT_CALL(*client_, DemuxerOpened(_)); 834 EXPECT_CALL(*client_, DemuxerOpened(_));
834 demuxer_->Initialize(CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 835 demuxer_->Initialize(
836 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
835 837
836 scoped_array<uint8> info_tracks; 838 scoped_array<uint8> info_tracks;
837 int info_tracks_size = 0; 839 int info_tracks_size = 0;
838 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); 840 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size);
839 841
840 ClusterBuilder cb; 842 ClusterBuilder cb;
841 cb.SetClusterTimecode(0); 843 cb.SetClusterTimecode(0);
842 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512); 844 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512);
843 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024); 845 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024);
844 scoped_ptr<Cluster> cluster_a(cb.Finish()); 846 scoped_ptr<Cluster> cluster_a(cb.Finish());
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 1021
1020 // Append the remaining data. 1022 // Append the remaining data.
1021 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); 1023 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i));
1022 1024
1023 EXPECT_TRUE(audio_read_done); 1025 EXPECT_TRUE(audio_read_done);
1024 EXPECT_TRUE(video_read_done); 1026 EXPECT_TRUE(video_read_done);
1025 } 1027 }
1026 1028
1027 1029
1028 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { 1030 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) {
1029 EXPECT_CALL(mock_demuxer_host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1031 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1030 1032
1031 EXPECT_CALL(*client_, DemuxerOpened(_)); 1033 EXPECT_CALL(*client_, DemuxerOpened(_));
1032 demuxer_->Initialize(CreateInitDoneCB( 1034 demuxer_->Initialize(
1033 kDefaultDuration(), PIPELINE_OK)); 1035 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
1034 ASSERT_TRUE(AppendInfoTracks(true, true, false)); 1036 ASSERT_TRUE(AppendInfoTracks(true, true, false));
1035 1037
1036 uint8 tmp = 0; 1038 uint8 tmp = 0;
1037 ASSERT_TRUE(demuxer_->AppendData(&tmp, 1)); 1039 ASSERT_TRUE(demuxer_->AppendData(&tmp, 1));
1038 } 1040 }
1039 1041
1040 } // namespace media 1042 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/dummy_demuxer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698