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

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

Issue 10382200: Update WebMClusterParser to compute durations for all StreamParserBuffers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix ChunkDemuxerAbortRead_AudioOnly Created 8 years, 7 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
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 21 matching lines...) Expand all
32 // The size of TrackEntry element in test file "webm_vp8_track_entry" starts at 32 // The size of TrackEntry element in test file "webm_vp8_track_entry" starts at
33 // index 1 and spans 8 bytes. 33 // index 1 and spans 8 bytes.
34 static const int kVideoTrackSizeOffset = 1; 34 static const int kVideoTrackSizeOffset = 1;
35 static const int kVideoTrackSizeWidth = 8; 35 static const int kVideoTrackSizeWidth = 8;
36 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset + 36 static const int kVideoTrackEntryHeaderSize = kVideoTrackSizeOffset +
37 kVideoTrackSizeWidth; 37 kVideoTrackSizeWidth;
38 38
39 static const int kVideoTrackNum = 1; 39 static const int kVideoTrackNum = 1;
40 static const int kAudioTrackNum = 2; 40 static const int kAudioTrackNum = 2;
41 41
42 static const int kAudioBlockDuration = 23;
43 static const int kVideoBlockDuration = 33;
44
42 static const char* kSourceId = "SourceId"; 45 static const char* kSourceId = "SourceId";
43 46
44 base::TimeDelta kDefaultDuration() { 47 base::TimeDelta kDefaultDuration() {
45 return base::TimeDelta::FromMilliseconds(201224); 48 return base::TimeDelta::FromMilliseconds(201224);
46 } 49 }
47 50
48 // Write an integer into buffer in the form of vint that spans 8 bytes. 51 // Write an integer into buffer in the form of vint that spans 8 bytes.
49 // The data pointed by |buffer| should be at least 8 bytes long. 52 // The data pointed by |buffer| should be at least 8 bytes long.
50 // |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF. 53 // |number| should be in the range 0 <= number < 0x00FFFFFFFFFFFFFF.
51 static void WriteInt64(uint8* buffer, int64 number) { 54 static void WriteInt64(uint8* buffer, int64 number) {
52 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF)); 55 DCHECK(number >= 0 && number < GG_LONGLONG(0x00FFFFFFFFFFFFFF));
53 buffer[0] = 0x01; 56 buffer[0] = 0x01;
54 int64 tmp = number; 57 int64 tmp = number;
55 for (int i = 7; i > 0; i--) { 58 for (int i = 7; i > 0; i--) {
56 buffer[i] = tmp & 0xff; 59 buffer[i] = tmp & 0xff;
57 tmp >>= 8; 60 tmp >>= 8;
58 } 61 }
59 } 62 }
60 63
61 MATCHER_P(HasTimestamp, timestamp_in_ms, "") { 64 MATCHER_P(HasTimestamp, timestamp_in_ms, "") {
62 return !arg->IsEndOfStream() && 65 return arg && !arg->IsEndOfStream() &&
63 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms; 66 arg->GetTimestamp().InMilliseconds() == timestamp_in_ms;
64 } 67 }
65 68
66 static void OnReadDone(const base::TimeDelta& expected_time, 69 static void OnReadDone(const base::TimeDelta& expected_time,
67 bool* called, 70 bool* called,
68 const scoped_refptr<Buffer>& buffer) { 71 const scoped_refptr<Buffer>& buffer) {
69 EXPECT_EQ(expected_time, buffer->GetTimestamp()); 72 EXPECT_EQ(expected_time, buffer->GetTimestamp());
70 *called = true; 73 *called = true;
71 } 74 }
72 75
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 } 173 }
171 174
172 ChunkDemuxer::Status AddId() { 175 ChunkDemuxer::Status AddId() {
173 std::vector<std::string> codecs(2); 176 std::vector<std::string> codecs(2);
174 codecs[0] = "vp8"; 177 codecs[0] = "vp8";
175 codecs[1] = "vorbis"; 178 codecs[1] = "vorbis";
176 return demuxer_->AddId(kSourceId, "video/webm", codecs); 179 return demuxer_->AddId(kSourceId, "video/webm", codecs);
177 } 180 }
178 181
179 bool AppendData(const uint8* data, size_t length) { 182 bool AppendData(const uint8* data, size_t length) {
183 if (!length) {
184 LOG(ERROR) << "Test code tried to append a zero length buffer!";
scherkus (not reviewing) 2012/05/17 02:45:46 NOTREACHED() / LOG(FATAL) / CHECK() instead?
acolwell GONE FROM CHROMIUM 2012/05/17 18:28:51 Done.
185 return false;
186 }
187
180 EXPECT_CALL(host_, SetBufferedBytes(_)).Times(AnyNumber()); 188 EXPECT_CALL(host_, SetBufferedBytes(_)).Times(AnyNumber());
181 EXPECT_CALL(host_, SetNetworkActivity(true)) 189 EXPECT_CALL(host_, SetNetworkActivity(true))
182 .Times(AnyNumber()); 190 .Times(AnyNumber());
183 return demuxer_->AppendData(kSourceId, data, length); 191 return demuxer_->AppendData(kSourceId, data, length);
184 } 192 }
185 193
186 bool AppendDataInPieces(const uint8* data, size_t length) { 194 bool AppendDataInPieces(const uint8* data, size_t length) {
187 return AppendDataInPieces(data, length, 7); 195 return AppendDataInPieces(data, length, 7);
188 } 196 }
189 197
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 EXPECT_CALL(*client_, DemuxerClosed()); 254 EXPECT_CALL(*client_, DemuxerClosed());
247 demuxer_->Shutdown(); 255 demuxer_->Shutdown();
248 } 256 }
249 } 257 }
250 258
251 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) { 259 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode) {
252 uint8 data[] = { 0x00 }; 260 uint8 data[] = { 0x00 };
253 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data)); 261 cb->AddSimpleBlock(track_num, timecode, 0, data, sizeof(data));
254 } 262 }
255 263
256 void AddSimpleBlock(ClusterBuilder* cb, int track_num, int64 timecode, 264 scoped_ptr<Cluster> GenerateCluster(int timecode, int block_count) {
257 int size) { 265 CHECK_GT(block_count, 0);
266
267 int size = 10;
258 scoped_array<uint8> data(new uint8[size]); 268 scoped_array<uint8> data(new uint8[size]);
259 cb->AddSimpleBlock(track_num, timecode, 0, data.get(), size); 269
270 ClusterBuilder cb;
271 cb.SetClusterTimecode(timecode);
272 int audio_timecode = timecode;
273 int video_timecode = timecode + 1;
274
275 if (block_count == 1) {
276 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration, 0,
277 data.get(), size);
278 return cb.Finish();
279 }
280
281 // Create simple blocks for everything except the last 2 blocks.
282 for (int i = 0; i < block_count - 2; i++) {
283 if (audio_timecode <= video_timecode) {
284 cb.AddSimpleBlock(kAudioTrackNum, audio_timecode, 0, data.get(), size);
285 audio_timecode += kAudioBlockDuration;
286 continue;
287 }
288
289 cb.AddSimpleBlock(kVideoTrackNum, video_timecode, 0, data.get(), size);
290 video_timecode += kVideoBlockDuration;
291 }
292
293 // Make the last 2 blocks BlockGroups so that they don't get delayed by the
294 // block duration calculation logic.
295 if (audio_timecode <= video_timecode) {
296 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration, 0,
297 data.get(), size);
298 cb.AddBlockGroup(kVideoTrackNum, video_timecode, kVideoBlockDuration, 0,
299 data.get(), size);
300 } else {
301 cb.AddBlockGroup(kVideoTrackNum, video_timecode, kVideoBlockDuration, 0,
302 data.get(), size);
303 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration, 0,
304 data.get(), size);
305 }
306
307 return cb.Finish();
308 }
309
310 void GenerateExpectedReads(int timecode, int block_count,
311 DemuxerStream* audio,
312 DemuxerStream* video) {
313 CHECK_GT(block_count, 0);
314 int audio_timecode = timecode;
315 int video_timecode = timecode + 1;
316
317 if (block_count == 1) {
318 ExpectRead(audio, audio_timecode);
319 return;
320 }
321
322 for (int i = 0; i < block_count; i++) {
323 if (audio_timecode <= video_timecode) {
324 ExpectRead(audio, audio_timecode);
325 audio_timecode += kAudioBlockDuration;
326 continue;
327 }
328
329 ExpectRead(video, video_timecode);
330 video_timecode += kVideoBlockDuration;
331 }
260 } 332 }
261 333
262 MOCK_METHOD1(ReadDone, void(const scoped_refptr<Buffer>&)); 334 MOCK_METHOD1(ReadDone, void(const scoped_refptr<Buffer>&));
263 335
264 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) { 336 void ExpectRead(DemuxerStream* stream, int64 timestamp_in_ms) {
265 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms))); 337 EXPECT_CALL(*this, ReadDone(HasTimestamp(timestamp_in_ms)));
266 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone, 338 stream->Read(base::Bind(&ChunkDemuxerTest::ReadDone,
267 base::Unretained(this))); 339 base::Unretained(this)));
268 } 340 }
269 341
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 481
410 InSequence s; 482 InSequence s;
411 483
412 EXPECT_CALL(*this, Checkpoint(1)); 484 EXPECT_CALL(*this, Checkpoint(1));
413 485
414 demuxer_->Seek(base::TimeDelta::FromSeconds(0), 486 demuxer_->Seek(base::TimeDelta::FromSeconds(0),
415 NewExpectedStatusCB(PIPELINE_OK)); 487 NewExpectedStatusCB(PIPELINE_OK));
416 488
417 EXPECT_CALL(*this, Checkpoint(2)); 489 EXPECT_CALL(*this, Checkpoint(2));
418 490
419 ClusterBuilder cb; 491 scoped_ptr<Cluster> cluster(GenerateCluster(0, 4));
420 cb.SetClusterTimecode(0);
421 AddSimpleBlock(&cb, kVideoTrackNum, 0);
422 scoped_ptr<Cluster> cluster(cb.Finish());
423 492
424 Checkpoint(1); 493 Checkpoint(1);
425 494
426 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 495 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
427 496
428 Checkpoint(2); 497 Checkpoint(2);
429 } 498 }
430 499
431 // Test the case where a Seek() is requested while the parser 500 // Test the case where a Seek() is requested while the parser
432 // is in the middle of cluster. This is to verify that the parser 501 // is in the middle of cluster. This is to verify that the parser
433 // resets itself on seek and is in the right state when data from 502 // resets itself on seek and is in the right state when data from
434 // the new seek point arrives. 503 // the new seek point arrives.
435 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) { 504 TEST_F(ChunkDemuxerTest, TestSeekWhileParsingCluster) {
436 ASSERT_TRUE(InitDemuxer(true, true, false)); 505 ASSERT_TRUE(InitDemuxer(true, true, false));
437 506
438 scoped_refptr<DemuxerStream> audio = 507 scoped_refptr<DemuxerStream> audio =
439 demuxer_->GetStream(DemuxerStream::AUDIO); 508 demuxer_->GetStream(DemuxerStream::AUDIO);
440 scoped_refptr<DemuxerStream> video = 509 scoped_refptr<DemuxerStream> video =
441 demuxer_->GetStream(DemuxerStream::VIDEO); 510 demuxer_->GetStream(DemuxerStream::VIDEO);
442 511
443 InSequence s; 512 InSequence s;
444 513
445 ClusterBuilder cb; 514 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
446 cb.SetClusterTimecode(0); 515 scoped_ptr<Cluster> cluster_b(GenerateCluster(5000, 6));
447 AddSimpleBlock(&cb, kAudioTrackNum, 1);
448 AddSimpleBlock(&cb, kVideoTrackNum, 2);
449 AddSimpleBlock(&cb, kAudioTrackNum, 10);
450 AddSimpleBlock(&cb, kVideoTrackNum, 20);
451 scoped_ptr<Cluster> cluster_a(cb.Finish());
452
453 cb.SetClusterTimecode(5000);
454 AddSimpleBlock(&cb, kAudioTrackNum, 5000);
455 AddSimpleBlock(&cb, kVideoTrackNum, 5005);
456 AddSimpleBlock(&cb, kAudioTrackNum, 5007);
457 AddSimpleBlock(&cb, kVideoTrackNum, 5035);
458 scoped_ptr<Cluster> cluster_b(cb.Finish());
459 516
460 // Append all but the last byte so that everything but 517 // Append all but the last byte so that everything but
461 // the last block can be parsed. 518 // the last block can be parsed.
462 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size() - 1)); 519 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size() - 1));
463 520
464 ExpectRead(audio, 1); 521 ExpectRead(audio, 0);
465 ExpectRead(video, 2); 522 ExpectRead(video, 1);
466 ExpectRead(audio, 10); 523 ExpectRead(audio, kAudioBlockDuration);
524 // Note: We skip trying to read a video buffer here because computing
525 // the duration for this block relies on successfully parsing the last block
526 // in the cluster the cluster.
527 ExpectRead(audio, 2 * kAudioBlockDuration);
467 528
468 demuxer_->FlushData(); 529 demuxer_->FlushData();
469 demuxer_->Seek(base::TimeDelta::FromSeconds(5), 530 demuxer_->Seek(base::TimeDelta::FromSeconds(5),
470 NewExpectedStatusCB(PIPELINE_OK)); 531 NewExpectedStatusCB(PIPELINE_OK));
471 532
472 533
473 // Append the new cluster and verify that only the blocks 534 // Append the new cluster and verify that only the blocks
474 // in the new cluster are returned. 535 // in the new cluster are returned.
475 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 536 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
476 ExpectRead(audio, 5000); 537 GenerateExpectedReads(5000, 6, audio, video);
477 ExpectRead(video, 5005);
478 ExpectRead(audio, 5007);
479 ExpectRead(video, 5035);
480 } 538 }
481 539
482 // Test the case where AppendData() is called before Init(). 540 // Test the case where AppendData() is called before Init().
483 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) { 541 TEST_F(ChunkDemuxerTest, TestAppendDataBeforeInit) {
484 scoped_array<uint8> info_tracks; 542 scoped_array<uint8> info_tracks;
485 int info_tracks_size = 0; 543 int info_tracks_size = 0;
486 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); 544 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size);
487 545
488 EXPECT_FALSE(demuxer_->AppendData(kSourceId, info_tracks.get(), 546 EXPECT_FALSE(demuxer_->AppendData(kSourceId, info_tracks.get(),
489 info_tracks_size)); 547 info_tracks_size));
490 } 548 }
491 549
492 // Make sure Read() callbacks are dispatched with the proper data. 550 // Make sure Read() callbacks are dispatched with the proper data.
493 TEST_F(ChunkDemuxerTest, TestRead) { 551 TEST_F(ChunkDemuxerTest, TestRead) {
494 ASSERT_TRUE(InitDemuxer(true, true, false)); 552 ASSERT_TRUE(InitDemuxer(true, true, false));
495 553
496 scoped_refptr<DemuxerStream> audio = 554 scoped_refptr<DemuxerStream> audio =
497 demuxer_->GetStream(DemuxerStream::AUDIO); 555 demuxer_->GetStream(DemuxerStream::AUDIO);
498 scoped_refptr<DemuxerStream> video = 556 scoped_refptr<DemuxerStream> video =
499 demuxer_->GetStream(DemuxerStream::VIDEO); 557 demuxer_->GetStream(DemuxerStream::VIDEO);
500 558
501 bool audio_read_done = false; 559 bool audio_read_done = false;
502 bool video_read_done = false; 560 bool video_read_done = false;
503 audio->Read(base::Bind(&OnReadDone, 561 audio->Read(base::Bind(&OnReadDone,
504 base::TimeDelta::FromMilliseconds(32), 562 base::TimeDelta::FromMilliseconds(0),
505 &audio_read_done)); 563 &audio_read_done));
506 564
507 video->Read(base::Bind(&OnReadDone, 565 video->Read(base::Bind(&OnReadDone,
508 base::TimeDelta::FromMilliseconds(123), 566 base::TimeDelta::FromMilliseconds(1),
509 &video_read_done)); 567 &video_read_done));
510 568
511 ClusterBuilder cb; 569 scoped_ptr<Cluster> cluster(GenerateCluster(0, 4));
512 cb.SetClusterTimecode(0);
513 AddSimpleBlock(&cb, kAudioTrackNum, 32);
514 AddSimpleBlock(&cb, kVideoTrackNum, 123);
515 scoped_ptr<Cluster> cluster(cb.Finish());
516 570
517 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 571 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
518 572
519 EXPECT_TRUE(audio_read_done); 573 EXPECT_TRUE(audio_read_done);
520 EXPECT_TRUE(video_read_done); 574 EXPECT_TRUE(video_read_done);
521 } 575 }
522 576
523 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) { 577 TEST_F(ChunkDemuxerTest, TestOutOfOrderClusters) {
524 ASSERT_TRUE(InitDemuxer(true, true, false)); 578 ASSERT_TRUE(InitDemuxer(true, true, false));
525 579
526 ClusterBuilder cb; 580 scoped_ptr<Cluster> cluster_a(GenerateCluster(10, 4));
527
528 cb.SetClusterTimecode(10);
529 AddSimpleBlock(&cb, kAudioTrackNum, 10);
530 AddSimpleBlock(&cb, kVideoTrackNum, 10);
531 AddSimpleBlock(&cb, kAudioTrackNum, 33);
532 AddSimpleBlock(&cb, kVideoTrackNum, 43);
533 scoped_ptr<Cluster> cluster_a(cb.Finish());
534 581
535 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 582 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
536 583
537 // Cluster B starts before cluster_a and has data 584 // Cluster B starts before cluster_a and has data
538 // that overlaps. 585 // that overlaps.
539 cb.SetClusterTimecode(5); 586 scoped_ptr<Cluster> cluster_b(GenerateCluster(5, 4));
540 AddSimpleBlock(&cb, kAudioTrackNum, 5);
541 AddSimpleBlock(&cb, kVideoTrackNum, 7);
542 AddSimpleBlock(&cb, kAudioTrackNum, 28);
543 AddSimpleBlock(&cb, kVideoTrackNum, 40);
544 scoped_ptr<Cluster> cluster_b(cb.Finish());
545 587
546 // Make sure that AppendData() fails because this cluster data 588 // Make sure that AppendData() fails because this cluster data
547 // is before previous data. 589 // is before previous data.
548 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 590 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
549 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 591 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
550 592
551 // Verify that AppendData() doesn't accept more data now. 593 // Verify that AppendData() doesn't accept more data now.
552 cb.SetClusterTimecode(45); 594 scoped_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
553 AddSimpleBlock(&cb, kAudioTrackNum, 45);
554 AddSimpleBlock(&cb, kVideoTrackNum, 45);
555 scoped_ptr<Cluster> cluster_c(cb.Finish());
556 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(), 595 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(),
557 cluster_c->size())); 596 cluster_c->size()));
558 } 597 }
559 598
560 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) { 599 TEST_F(ChunkDemuxerTest, TestNonMonotonicButAboveClusterTimecode) {
561 ASSERT_TRUE(InitDemuxer(true, true, false)); 600 ASSERT_TRUE(InitDemuxer(true, true, false));
562 601
563 ClusterBuilder cb; 602 ClusterBuilder cb;
564 603
565 // Test the case where block timecodes are not monotonically 604 // Test the case where block timecodes are not monotonically
566 // increasing but stay above the cluster timecode. 605 // increasing but stay above the cluster timecode.
567 cb.SetClusterTimecode(5); 606 cb.SetClusterTimecode(5);
568 AddSimpleBlock(&cb, kAudioTrackNum, 5); 607 AddSimpleBlock(&cb, kAudioTrackNum, 5);
569 AddSimpleBlock(&cb, kVideoTrackNum, 10); 608 AddSimpleBlock(&cb, kVideoTrackNum, 10);
570 AddSimpleBlock(&cb, kAudioTrackNum, 7); 609 AddSimpleBlock(&cb, kAudioTrackNum, 7);
571 AddSimpleBlock(&cb, kVideoTrackNum, 15); 610 AddSimpleBlock(&cb, kVideoTrackNum, 15);
572 scoped_ptr<Cluster> cluster_a(cb.Finish()); 611 scoped_ptr<Cluster> cluster_a(cb.Finish());
573 612
574 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 613 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
575 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 614 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
576 615
577 // Verify that AppendData() doesn't accept more data now. 616 // Verify that AppendData() doesn't accept more data now.
578 cb.SetClusterTimecode(20); 617 scoped_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
579 AddSimpleBlock(&cb, kAudioTrackNum, 20);
580 AddSimpleBlock(&cb, kVideoTrackNum, 20);
581 scoped_ptr<Cluster> cluster_b(cb.Finish());
582 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), 618 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(),
583 cluster_b->size())); 619 cluster_b->size()));
584 } 620 }
585 621
586 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) { 622 TEST_F(ChunkDemuxerTest, TestBackwardsAndBeforeClusterTimecode) {
587 ASSERT_TRUE(InitDemuxer(true, true, false)); 623 ASSERT_TRUE(InitDemuxer(true, true, false));
588 624
589 ClusterBuilder cb; 625 ClusterBuilder cb;
590 626
591 // Test timecodes going backwards and including values less than the cluster 627 // Test timecodes going backwards and including values less than the cluster
592 // timecode. 628 // timecode.
593 cb.SetClusterTimecode(5); 629 cb.SetClusterTimecode(5);
594 AddSimpleBlock(&cb, kAudioTrackNum, 5); 630 AddSimpleBlock(&cb, kAudioTrackNum, 5);
595 AddSimpleBlock(&cb, kVideoTrackNum, 5); 631 AddSimpleBlock(&cb, kVideoTrackNum, 5);
596 AddSimpleBlock(&cb, kAudioTrackNum, 3); 632 AddSimpleBlock(&cb, kAudioTrackNum, 3);
597 AddSimpleBlock(&cb, kVideoTrackNum, 3); 633 AddSimpleBlock(&cb, kVideoTrackNum, 3);
598 scoped_ptr<Cluster> cluster_a(cb.Finish()); 634 scoped_ptr<Cluster> cluster_a(cb.Finish());
599 635
600 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 636 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
601 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size())); 637 ASSERT_TRUE(AppendData(cluster_a->data(), cluster_a->size()));
602 638
603 // Verify that AppendData() doesn't accept more data now. 639 // Verify that AppendData() doesn't accept more data now.
604 cb.SetClusterTimecode(6); 640 scoped_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
605 AddSimpleBlock(&cb, kAudioTrackNum, 6);
606 AddSimpleBlock(&cb, kVideoTrackNum, 6);
607 scoped_ptr<Cluster> cluster_b(cb.Finish());
608 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(), 641 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_b->data(),
609 cluster_b->size())); 642 cluster_b->size()));
610 } 643 }
611 644
612 645
613 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) { 646 TEST_F(ChunkDemuxerTest, TestPerStreamMonotonicallyIncreasingTimestamps) {
614 ASSERT_TRUE(InitDemuxer(true, true, false)); 647 ASSERT_TRUE(InitDemuxer(true, true, false));
615 648
616 ClusterBuilder cb; 649 ClusterBuilder cb;
617 650
(...skipping 26 matching lines...) Expand all
644 677
645 cb.SetClusterTimecode(5); 678 cb.SetClusterTimecode(5);
646 AddSimpleBlock(&cb, kAudioTrackNum, 5); 679 AddSimpleBlock(&cb, kAudioTrackNum, 5);
647 AddSimpleBlock(&cb, kVideoTrackNum, 7); 680 AddSimpleBlock(&cb, kVideoTrackNum, 7);
648 scoped_ptr<Cluster> cluster_b(cb.Finish()); 681 scoped_ptr<Cluster> cluster_b(cb.Finish());
649 682
650 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 683 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
651 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size())); 684 ASSERT_TRUE(AppendData(cluster_b->data(), cluster_b->size()));
652 685
653 // Verify that AppendData() doesn't accept more data now. 686 // Verify that AppendData() doesn't accept more data now.
654 cb.SetClusterTimecode(10); 687 scoped_ptr<Cluster> cluster_c(GenerateCluster(10, 2));
655 AddSimpleBlock(&cb, kAudioTrackNum, 10);
656 AddSimpleBlock(&cb, kVideoTrackNum, 10);
657 scoped_ptr<Cluster> cluster_c(cb.Finish());
658 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(), 688 EXPECT_FALSE(demuxer_->AppendData(kSourceId, cluster_c->data(),
659 cluster_c->size())); 689 cluster_c->size()));
660 } 690 }
661 691
662 // Test the case where a cluster is passed to AppendData() before 692 // Test the case where a cluster is passed to AppendData() before
663 // INFO & TRACKS data. 693 // INFO & TRACKS data.
664 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) { 694 TEST_F(ChunkDemuxerTest, TestClusterBeforeInfoTracks) {
665 EXPECT_CALL(*client_, DemuxerOpened(_)); 695 EXPECT_CALL(*client_, DemuxerOpened(_));
666 demuxer_->Initialize( 696 demuxer_->Initialize(
667 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 697 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
668 698
669 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 699 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
670 700
671 ClusterBuilder cb; 701 scoped_ptr<Cluster> cluster(GenerateCluster(0, 1));
672 cb.SetClusterTimecode(0);
673 AddSimpleBlock(&cb, kVideoTrackNum, 0);
674 scoped_ptr<Cluster> cluster(cb.Finish());
675 702
676 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 703 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
677 } 704 }
678 705
679 // Test cases where we get an EndOfStream() call during initialization. 706 // Test cases where we get an EndOfStream() call during initialization.
680 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) { 707 TEST_F(ChunkDemuxerTest, TestEOSDuringInit) {
681 EXPECT_CALL(*client_, DemuxerOpened(_)); 708 EXPECT_CALL(*client_, DemuxerOpened(_));
682 demuxer_->Initialize( 709 demuxer_->Initialize(
683 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN)); 710 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN));
684 demuxer_->EndOfStream(PIPELINE_OK); 711 demuxer_->EndOfStream(PIPELINE_OK);
685 } 712 }
686 713
687 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) { 714 TEST_F(ChunkDemuxerTest, TestDecodeErrorEndOfStream) {
688 ASSERT_TRUE(InitDemuxer(true, true, false)); 715 ASSERT_TRUE(InitDemuxer(true, true, false));
689 716
690 ClusterBuilder cb; 717 scoped_ptr<Cluster> cluster(GenerateCluster(0, 4));
691 cb.SetClusterTimecode(0);
692 AddSimpleBlock(&cb, kAudioTrackNum, 0);
693 AddSimpleBlock(&cb, kVideoTrackNum, 0);
694 AddSimpleBlock(&cb, kAudioTrackNum, 23);
695 AddSimpleBlock(&cb, kVideoTrackNum, 33);
696 scoped_ptr<Cluster> cluster(cb.Finish());
697 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 718 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
698 719
699 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 720 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
700 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE); 721 demuxer_->EndOfStream(PIPELINE_ERROR_DECODE);
701 } 722 }
702 723
703 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) { 724 TEST_F(ChunkDemuxerTest, TestNetworkErrorEndOfStream) {
704 ASSERT_TRUE(InitDemuxer(true, true, false)); 725 ASSERT_TRUE(InitDemuxer(true, true, false));
705 726
706 ClusterBuilder cb; 727 scoped_ptr<Cluster> cluster(GenerateCluster(0, 4));
707 cb.SetClusterTimecode(0);
708 AddSimpleBlock(&cb, kAudioTrackNum, 0);
709 AddSimpleBlock(&cb, kVideoTrackNum, 0);
710 AddSimpleBlock(&cb, kAudioTrackNum, 23);
711 AddSimpleBlock(&cb, kVideoTrackNum, 33);
712 scoped_ptr<Cluster> cluster(cb.Finish());
713 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 728 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
714 729
715 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK)); 730 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_NETWORK));
716 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK); 731 demuxer_->EndOfStream(PIPELINE_ERROR_NETWORK);
717 } 732 }
718 733
719 // Helper class to reduce duplicate code when testing end of stream 734 // Helper class to reduce duplicate code when testing end of stream
720 // Read() behavior. 735 // Read() behavior.
721 class EndOfStreamHelper { 736 class EndOfStreamHelper {
722 public: 737 public:
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
773 demuxer_->GetStream(DemuxerStream::AUDIO); 788 demuxer_->GetStream(DemuxerStream::AUDIO);
774 scoped_refptr<DemuxerStream> video = 789 scoped_refptr<DemuxerStream> video =
775 demuxer_->GetStream(DemuxerStream::VIDEO); 790 demuxer_->GetStream(DemuxerStream::VIDEO);
776 791
777 bool audio_read_done_1 = false; 792 bool audio_read_done_1 = false;
778 bool video_read_done_1 = false; 793 bool video_read_done_1 = false;
779 EndOfStreamHelper end_of_stream_helper_1(demuxer_); 794 EndOfStreamHelper end_of_stream_helper_1(demuxer_);
780 EndOfStreamHelper end_of_stream_helper_2(demuxer_); 795 EndOfStreamHelper end_of_stream_helper_2(demuxer_);
781 796
782 audio->Read(base::Bind(&OnReadDone, 797 audio->Read(base::Bind(&OnReadDone,
783 base::TimeDelta::FromMilliseconds(32), 798 base::TimeDelta::FromMilliseconds(0),
784 &audio_read_done_1)); 799 &audio_read_done_1));
785 800
786 video->Read(base::Bind(&OnReadDone, 801 video->Read(base::Bind(&OnReadDone,
787 base::TimeDelta::FromMilliseconds(123), 802 base::TimeDelta::FromMilliseconds(1),
788 &video_read_done_1)); 803 &video_read_done_1));
789 804
790 end_of_stream_helper_1.RequestReads(); 805 end_of_stream_helper_1.RequestReads();
791 end_of_stream_helper_2.RequestReads(); 806 end_of_stream_helper_2.RequestReads();
792 807
793 ClusterBuilder cb; 808 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
794 cb.SetClusterTimecode(0);
795 AddSimpleBlock(&cb, kAudioTrackNum, 32);
796 AddSimpleBlock(&cb, kVideoTrackNum, 123);
797 scoped_ptr<Cluster> cluster(cb.Finish());
798 809
799 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 810 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
800 811
801 EXPECT_TRUE(audio_read_done_1); 812 EXPECT_TRUE(audio_read_done_1);
802 EXPECT_TRUE(video_read_done_1); 813 EXPECT_TRUE(video_read_done_1);
803 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false); 814 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
804 end_of_stream_helper_2.CheckIfReadDonesWereCalled(false); 815 end_of_stream_helper_2.CheckIfReadDonesWereCalled(false);
805 816
806 demuxer_->EndOfStream(PIPELINE_OK); 817 demuxer_->EndOfStream(PIPELINE_OK);
807 818
(...skipping 11 matching lines...) Expand all
819 scoped_refptr<DemuxerStream> video = 830 scoped_refptr<DemuxerStream> video =
820 demuxer_->GetStream(DemuxerStream::VIDEO); 831 demuxer_->GetStream(DemuxerStream::VIDEO);
821 832
822 bool audio_read_done_1 = false; 833 bool audio_read_done_1 = false;
823 bool video_read_done_1 = false; 834 bool video_read_done_1 = false;
824 EndOfStreamHelper end_of_stream_helper_1(demuxer_); 835 EndOfStreamHelper end_of_stream_helper_1(demuxer_);
825 EndOfStreamHelper end_of_stream_helper_2(demuxer_); 836 EndOfStreamHelper end_of_stream_helper_2(demuxer_);
826 EndOfStreamHelper end_of_stream_helper_3(demuxer_); 837 EndOfStreamHelper end_of_stream_helper_3(demuxer_);
827 838
828 audio->Read(base::Bind(&OnReadDone, 839 audio->Read(base::Bind(&OnReadDone,
829 base::TimeDelta::FromMilliseconds(32), 840 base::TimeDelta::FromMilliseconds(0),
830 &audio_read_done_1)); 841 &audio_read_done_1));
831 842
832 video->Read(base::Bind(&OnReadDone, 843 video->Read(base::Bind(&OnReadDone,
833 base::TimeDelta::FromMilliseconds(123), 844 base::TimeDelta::FromMilliseconds(1),
834 &video_read_done_1)); 845 &video_read_done_1));
835 846
836 end_of_stream_helper_1.RequestReads(); 847 end_of_stream_helper_1.RequestReads();
837 848
838 ClusterBuilder cb; 849 scoped_ptr<Cluster> cluster(GenerateCluster(0, 2));
839 cb.SetClusterTimecode(0);
840 AddSimpleBlock(&cb, kAudioTrackNum, 32);
841 AddSimpleBlock(&cb, kVideoTrackNum, 123);
842 scoped_ptr<Cluster> cluster(cb.Finish());
843 850
844 ASSERT_TRUE(AppendData(cluster->data(), cluster->size())); 851 ASSERT_TRUE(AppendData(cluster->data(), cluster->size()));
845 852
846 EXPECT_TRUE(audio_read_done_1); 853 EXPECT_TRUE(audio_read_done_1);
847 EXPECT_TRUE(video_read_done_1); 854 EXPECT_TRUE(video_read_done_1);
848 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false); 855 end_of_stream_helper_1.CheckIfReadDonesWereCalled(false);
849 856
850 demuxer_->EndOfStream(PIPELINE_OK); 857 demuxer_->EndOfStream(PIPELINE_OK);
851 858
852 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true); 859 end_of_stream_helper_1.CheckIfReadDonesWereCalled(true);
(...skipping 13 matching lines...) Expand all
866 EXPECT_CALL(*client_, DemuxerOpened(_)); 873 EXPECT_CALL(*client_, DemuxerOpened(_));
867 demuxer_->Initialize( 874 demuxer_->Initialize(
868 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK)); 875 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK));
869 876
870 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 877 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
871 878
872 scoped_array<uint8> info_tracks; 879 scoped_array<uint8> info_tracks;
873 int info_tracks_size = 0; 880 int info_tracks_size = 0;
874 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size); 881 CreateInfoTracks(true, true, false, &info_tracks, &info_tracks_size);
875 882
876 ClusterBuilder cb; 883 scoped_ptr<Cluster> cluster_a(GenerateCluster(0, 4));
877 cb.SetClusterTimecode(0); 884 scoped_ptr<Cluster> cluster_b(GenerateCluster(68, 4));
878 AddSimpleBlock(&cb, kAudioTrackNum, 32, 512);
879 AddSimpleBlock(&cb, kVideoTrackNum, 123, 1024);
880 scoped_ptr<Cluster> cluster_a(cb.Finish());
881
882 cb.SetClusterTimecode(125);
883 AddSimpleBlock(&cb, kAudioTrackNum, 125, 2048);
884 AddSimpleBlock(&cb, kVideoTrackNum, 150, 2048);
885 scoped_ptr<Cluster> cluster_b(cb.Finish());
886 885
887 size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size(); 886 size_t buffer_size = info_tracks_size + cluster_a->size() + cluster_b->size();
888 scoped_array<uint8> buffer(new uint8[buffer_size]); 887 scoped_array<uint8> buffer(new uint8[buffer_size]);
889 uint8* dst = buffer.get(); 888 uint8* dst = buffer.get();
890 memcpy(dst, info_tracks.get(), info_tracks_size); 889 memcpy(dst, info_tracks.get(), info_tracks_size);
891 dst += info_tracks_size; 890 dst += info_tracks_size;
892 891
893 memcpy(dst, cluster_a->data(), cluster_a->size()); 892 memcpy(dst, cluster_a->data(), cluster_a->size());
894 dst += cluster_a->size(); 893 dst += cluster_a->size();
895 894
896 memcpy(dst, cluster_b->data(), cluster_b->size()); 895 memcpy(dst, cluster_b->data(), cluster_b->size());
897 dst += cluster_b->size(); 896 dst += cluster_b->size();
898 897
899 ASSERT_TRUE(AppendDataInPieces(buffer.get(), buffer_size)); 898 ASSERT_TRUE(AppendDataInPieces(buffer.get(), buffer_size));
900 899
901 scoped_refptr<DemuxerStream> audio = 900 scoped_refptr<DemuxerStream> audio =
902 demuxer_->GetStream(DemuxerStream::AUDIO); 901 demuxer_->GetStream(DemuxerStream::AUDIO);
903 scoped_refptr<DemuxerStream> video = 902 scoped_refptr<DemuxerStream> video =
904 demuxer_->GetStream(DemuxerStream::VIDEO); 903 demuxer_->GetStream(DemuxerStream::VIDEO);
905 904
906 ASSERT_TRUE(audio); 905 ASSERT_TRUE(audio);
907 ASSERT_TRUE(video); 906 ASSERT_TRUE(video);
908 907
909 bool audio_read_done = false; 908 GenerateExpectedReads(0, 4, audio, video);
910 bool video_read_done = false; 909 GenerateExpectedReads(68, 4, audio, video);
911 audio->Read(base::Bind(&OnReadDone,
912 base::TimeDelta::FromMilliseconds(32),
913 &audio_read_done));
914
915 video->Read(base::Bind(&OnReadDone,
916 base::TimeDelta::FromMilliseconds(123),
917 &video_read_done));
918
919 EXPECT_TRUE(audio_read_done);
920 EXPECT_TRUE(video_read_done);
921
922 audio_read_done = false;
923 video_read_done = false;
924 audio->Read(base::Bind(&OnReadDone,
925 base::TimeDelta::FromMilliseconds(125),
926 &audio_read_done));
927
928 video->Read(base::Bind(&OnReadDone,
929 base::TimeDelta::FromMilliseconds(150),
930 &video_read_done));
931
932 EXPECT_TRUE(audio_read_done);
933 EXPECT_TRUE(video_read_done);
934 } 910 }
935 911
936 TEST_F(ChunkDemuxerTest, TestWebMFile_AudioAndVideo) { 912 TEST_F(ChunkDemuxerTest, TestWebMFile_AudioAndVideo) {
937 struct BufferTimestamps buffer_timestamps[] = { 913 struct BufferTimestamps buffer_timestamps[] = {
938 {0, 0}, 914 {0, 0},
939 {33, 3}, 915 {33, 3},
940 {67, 6}, 916 {67, 6},
941 {100, 9}, 917 {100, 9},
942 {133, 12}, 918 {133, 12},
943 {kSkip, kSkip}, 919 {kSkip, kSkip},
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 }; 962 };
987 963
988 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps, 964 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps,
989 base::TimeDelta::FromMilliseconds(2703))); 965 base::TimeDelta::FromMilliseconds(2703)));
990 } 966 }
991 967
992 // Verify that we output buffers before the entire cluster has been parsed. 968 // Verify that we output buffers before the entire cluster has been parsed.
993 TEST_F(ChunkDemuxerTest, TestIncrementalClusterParsing) { 969 TEST_F(ChunkDemuxerTest, TestIncrementalClusterParsing) {
994 ASSERT_TRUE(InitDemuxer(true, true, false)); 970 ASSERT_TRUE(InitDemuxer(true, true, false));
995 971
996 ClusterBuilder cb; 972 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
997 cb.SetClusterTimecode(0);
998 AddSimpleBlock(&cb, kAudioTrackNum, 0, 10);
999 AddSimpleBlock(&cb, kVideoTrackNum, 1, 10);
1000 AddSimpleBlock(&cb, kVideoTrackNum, 2, 10);
1001 AddSimpleBlock(&cb, kAudioTrackNum, 3, 10);
1002 scoped_ptr<Cluster> cluster(cb.Finish());
1003
1004 scoped_refptr<DemuxerStream> audio = 973 scoped_refptr<DemuxerStream> audio =
1005 demuxer_->GetStream(DemuxerStream::AUDIO); 974 demuxer_->GetStream(DemuxerStream::AUDIO);
1006 scoped_refptr<DemuxerStream> video = 975 scoped_refptr<DemuxerStream> video =
1007 demuxer_->GetStream(DemuxerStream::VIDEO); 976 demuxer_->GetStream(DemuxerStream::VIDEO);
1008 977
1009 bool audio_read_done = false; 978 bool audio_read_done = false;
1010 bool video_read_done = false; 979 bool video_read_done = false;
1011 audio->Read(base::Bind(&OnReadDone, 980 audio->Read(base::Bind(&OnReadDone,
1012 base::TimeDelta::FromMilliseconds(0), 981 base::TimeDelta::FromMilliseconds(0),
1013 &audio_read_done)); 982 &audio_read_done));
(...skipping 21 matching lines...) Expand all
1035 for (; i < cluster->size() && !video_read_done; ++i) { 1004 for (; i < cluster->size() && !video_read_done; ++i) {
1036 ASSERT_TRUE(AppendData(cluster->data() + i, 1)); 1005 ASSERT_TRUE(AppendData(cluster->data() + i, 1));
1037 } 1006 }
1038 1007
1039 EXPECT_TRUE(video_read_done); 1008 EXPECT_TRUE(video_read_done);
1040 EXPECT_LT(i, cluster->size()); 1009 EXPECT_LT(i, cluster->size());
1041 1010
1042 audio_read_done = false; 1011 audio_read_done = false;
1043 video_read_done = false; 1012 video_read_done = false;
1044 audio->Read(base::Bind(&OnReadDone, 1013 audio->Read(base::Bind(&OnReadDone,
1045 base::TimeDelta::FromMilliseconds(3), 1014 base::TimeDelta::FromMilliseconds(23),
1046 &audio_read_done)); 1015 &audio_read_done));
1047 1016
1048 video->Read(base::Bind(&OnReadDone, 1017 video->Read(base::Bind(&OnReadDone,
1049 base::TimeDelta::FromMilliseconds(2), 1018 base::TimeDelta::FromMilliseconds(34),
1050 &video_read_done)); 1019 &video_read_done));
1051 1020
1052 // Make sure the reads haven't completed yet. 1021 // Make sure the reads haven't completed yet.
1053 EXPECT_FALSE(audio_read_done); 1022 EXPECT_FALSE(audio_read_done);
1054 EXPECT_FALSE(video_read_done); 1023 EXPECT_FALSE(video_read_done);
1055 1024
1056 // Append the remaining data. 1025 // Append the remaining data.
1026 ASSERT_LT(i, cluster->size());
1057 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i)); 1027 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i));
1058 1028
1059 EXPECT_TRUE(audio_read_done); 1029 EXPECT_TRUE(audio_read_done);
1060 EXPECT_TRUE(video_read_done); 1030 EXPECT_TRUE(video_read_done);
1061 } 1031 }
1062 1032
1063 1033
1064 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) { 1034 TEST_F(ChunkDemuxerTest, TestParseErrorDuringInit) {
1065 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 1035 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
1066 1036
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 1068
1099 std::vector<std::string> codecs(1); 1069 std::vector<std::string> codecs(1);
1100 codecs[0] = "vp8"; 1070 codecs[0] = "vp8";
1101 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 1071 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
1102 ChunkDemuxer::kOk); 1072 ChunkDemuxer::kOk);
1103 1073
1104 ASSERT_TRUE(AppendInfoTracks(true, true, false)); 1074 ASSERT_TRUE(AppendInfoTracks(true, true, false));
1105 } 1075 }
1106 1076
1107 } // namespace media 1077 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/pipeline_integration_test.cc » ('j') | media/webm/webm_cluster_parser.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698