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

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

Issue 205703003: MSE: Use frame duration, if available, in LegacyFrameProcessor (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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 <algorithm> 5 #include <algorithm>
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 block_flags = kWebMFlagKeyframe; 374 block_flags = kWebMFlagKeyframe;
375 // Remove the "K" off of the token. 375 // Remove the "K" off of the token.
376 timestamp_str = timestamp_str.substr(0, timestamps[i].length() - 1); 376 timestamp_str = timestamp_str.substr(0, timestamps[i].length() - 1);
377 } 377 }
378 int timestamp_in_ms; 378 int timestamp_in_ms;
379 CHECK(base::StringToInt(timestamp_str, &timestamp_in_ms)); 379 CHECK(base::StringToInt(timestamp_str, &timestamp_in_ms));
380 380
381 if (i == 0) 381 if (i == 0)
382 cb.SetClusterTimecode(timestamp_in_ms); 382 cb.SetClusterTimecode(timestamp_in_ms);
383 383
384 if (track_number == kTextTrackNum) { 384 switch (track_number) {
385 cb.AddBlockGroup(track_number, timestamp_in_ms, kTextBlockDuration, 385 case kVideoTrackNum:
386 block_flags, &data[0], data.size()); 386 AddVideoBlockGroup(&cb, kVideoTrackNum, timestamp_in_ms,
387 } else { 387 kVideoBlockDuration, block_flags);
388 cb.AddSimpleBlock(track_number, timestamp_in_ms, block_flags, 388 break;
389 &data[0], data.size()); 389 case kAudioTrackNum:
390 cb.AddBlockGroup(kAudioTrackNum, timestamp_in_ms,
391 kAudioBlockDuration, block_flags, &data[0],
392 data.size());
393 break;
394 case kTextTrackNum:
395 cb.AddBlockGroup(kTextTrackNum, timestamp_in_ms,
396 kTextBlockDuration, block_flags, &data[0],
397 data.size());
398 break;
399 default:
400 DCHECK(false) << "Unknown track number: " << track_number;
390 } 401 }
391 } 402 }
392 AppendCluster(source_id, cb.Finish()); 403 AppendCluster(source_id, cb.Finish());
393 } 404 }
394 405
395 void AppendData(const std::string& source_id, 406 void AppendData(const std::string& source_id,
396 const uint8* data, size_t length) { 407 const uint8* data, size_t length) {
397 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber()); 408 EXPECT_CALL(host_, AddBufferedTimeRange(_, _)).Times(AnyNumber());
398 409
399 // TODO(wolenetz): Test timestamp offset updating once "sequence" append 410 // TODO(wolenetz): Test timestamp offset updating once "sequence" append
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 // bear-640x360.webm AudioDecoderConfig returns 3935 for its extra_data_size() 560 // bear-640x360.webm AudioDecoderConfig returns 3935 for its extra_data_size()
550 // The resulting audio stream returns data from each file for the following 561 // The resulting audio stream returns data from each file for the following
551 // time ranges. 562 // time ranges.
552 // bear-320x240.webm : [0-524) [779-2737) 563 // bear-320x240.webm : [0-524) [779-2737)
553 // bear-640x360.webm : [527-759) 564 // bear-640x360.webm : [527-759)
554 bool InitDemuxerWithConfigChangeData() { 565 bool InitDemuxerWithConfigChangeData() {
555 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); 566 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm");
556 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); 567 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm");
557 568
558 EXPECT_CALL(*this, DemuxerOpened()); 569 EXPECT_CALL(*this, DemuxerOpened());
570
571 // TODO(wolenetz/acolwell): Remove this SetDuration expectation once the
572 // files are fixed to have the correct duration in their init segments.
573 // See http://crbug.com/354284.
574 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744)));
acolwell GONE FROM CHROMIUM 2014/03/21 15:50:15 What triggers this? Does this need to be here or c
wolenetz 2014/03/21 18:14:01 The file has 2744 encoded in its init segment. Par
575
559 demuxer_->Initialize( 576 demuxer_->Initialize(
560 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), 577 &host_, CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2768),
561 PIPELINE_OK), true); 578 PIPELINE_OK), true);
562 579
563 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) 580 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk)
564 return false; 581 return false;
565 582
566 // Append the whole bear1 file. 583 // Append the whole bear1 file.
567 AppendData(bear1->data(), bear1->data_size()); 584 AppendData(bear1->data(), bear1->data_size());
568 CheckExpectedRanges(kSourceId, "{ [0,2737) }"); 585 CheckExpectedRanges(kSourceId, "{ [0,2737) }");
569 586
570 // Append initialization segment for bear2. 587 // Append initialization segment for bear2.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 if (block_count == 1) { 645 if (block_count == 1) {
629 cb.AddBlockGroup(kAudioTrackNum, first_audio_timecode, 646 cb.AddBlockGroup(kAudioTrackNum, first_audio_timecode,
630 kAudioBlockDuration, kWebMFlagKeyframe, 647 kAudioBlockDuration, kWebMFlagKeyframe,
631 data.get(), size); 648 data.get(), size);
632 return cb.Finish(); 649 return cb.Finish();
633 } 650 }
634 651
635 int audio_timecode = first_audio_timecode; 652 int audio_timecode = first_audio_timecode;
636 int video_timecode = first_video_timecode; 653 int video_timecode = first_video_timecode;
637 654
638 // Create simple blocks for everything except the last 2 blocks. 655 // Create block groups for everything to ensure parser can emit durations
639 // The first video frame must be a keyframe. 656 // for every buffer. The first video frame must be a keyframe.
657 // TODO(acolwell): Also use simple blocks once WebM stream parser can emit
658 // valid frame durations for them. See http://crbug.com/351166.
640 uint8 video_flag = kWebMFlagKeyframe; 659 uint8 video_flag = kWebMFlagKeyframe;
641 for (int i = 0; i < block_count - 2; i++) { 660 for (int i = 0; i < block_count; i++) {
642 if (audio_timecode <= video_timecode) { 661 if (audio_timecode <= video_timecode) {
643 cb.AddSimpleBlock(kAudioTrackNum, audio_timecode, kWebMFlagKeyframe, 662 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration,
644 data.get(), size); 663 kWebMFlagKeyframe, data.get(), size);
645 audio_timecode += kAudioBlockDuration; 664 audio_timecode += kAudioBlockDuration;
646 continue; 665 continue;
647 } 666 }
648 667
649 cb.AddSimpleBlock(kVideoTrackNum, video_timecode, video_flag, data.get(), 668 AddVideoBlockGroup(&cb, kVideoTrackNum, video_timecode,
650 size); 669 kVideoBlockDuration, video_flag);
651 video_timecode += kVideoBlockDuration; 670 video_timecode += kVideoBlockDuration;
652 video_flag = 0; 671 video_flag = 0;
653 } 672 }
654 673
655 // Make the last 2 blocks BlockGroups so that they don't get delayed by the
656 // block duration calculation logic.
657 if (audio_timecode <= video_timecode) {
658 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration,
659 kWebMFlagKeyframe, data.get(), size);
660 AddVideoBlockGroup(&cb, kVideoTrackNum, video_timecode,
661 kVideoBlockDuration, video_flag);
662 } else {
663 AddVideoBlockGroup(&cb, kVideoTrackNum, video_timecode,
664 kVideoBlockDuration, video_flag);
665 cb.AddBlockGroup(kAudioTrackNum, audio_timecode, kAudioBlockDuration,
666 kWebMFlagKeyframe, data.get(), size);
667 }
668
669 return cb.Finish(); 674 return cb.Finish();
670 } 675 }
671 676
672 scoped_ptr<Cluster> GenerateSingleStreamCluster(int timecode, 677 scoped_ptr<Cluster> GenerateSingleStreamCluster(int timecode,
673 int end_timecode, 678 int end_timecode,
674 int track_number, 679 int track_number,
675 int block_duration) { 680 int block_duration) {
676 CHECK_GT(end_timecode, timecode); 681 CHECK_GT(end_timecode, timecode);
677 682
678 std::vector<uint8> data(kBlockSize); 683 std::vector<uint8> data(kBlockSize);
679 684
680 ClusterBuilder cb; 685 ClusterBuilder cb;
681 cb.SetClusterTimecode(timecode); 686 cb.SetClusterTimecode(timecode);
682 687
688 // Create block groups for everything to ensure parser can emit durations
689 // for every buffer. Sets every frame to be a key frame.
690 // TODO(acolwell): Also use simple blocks once WebM stream parser can emit
691 // valid frame durations for them. See http://crbug.com/351166.
692
683 // Create simple blocks for everything except the last block. 693 // Create simple blocks for everything except the last block.
684 for (int i = 0; timecode < (end_timecode - block_duration); i++) { 694 for (int i = 0; timecode < end_timecode; i++) {
685 cb.AddSimpleBlock(track_number, timecode, kWebMFlagKeyframe, 695 if (track_number == kVideoTrackNum) {
686 &data[0], data.size()); 696 AddVideoBlockGroup(&cb, track_number, timecode, block_duration,
697 kWebMFlagKeyframe);
698 } else {
699 cb.AddBlockGroup(track_number, timecode, block_duration,
700 kWebMFlagKeyframe, &data[0], data.size());
701 }
702
687 timecode += block_duration; 703 timecode += block_duration;
688 } 704 }
689 705
690 // Make the last block a BlockGroup so that it doesn't get delayed by the
691 // block duration calculation logic.
692 if (track_number == kVideoTrackNum) {
acolwell GONE FROM CHROMIUM 2014/03/21 15:50:15 heh.. this is a left over from my previous attempt
693 AddVideoBlockGroup(&cb, track_number, timecode, block_duration,
694 kWebMFlagKeyframe);
695 } else {
696 cb.AddBlockGroup(track_number, timecode, block_duration,
697 kWebMFlagKeyframe, &data[0], data.size());
698 }
699 return cb.Finish(); 706 return cb.Finish();
700 } 707 }
701 708
702 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) { 709 void Read(DemuxerStream::Type type, const DemuxerStream::ReadCB& read_cb) {
703 demuxer_->GetStream(type)->Read(read_cb); 710 demuxer_->GetStream(type)->Read(read_cb);
704 message_loop_.RunUntilIdle(); 711 message_loop_.RunUntilIdle();
705 } 712 }
706 713
707 void ReadAudio(const DemuxerStream::ReadCB& read_cb) { 714 void ReadAudio(const DemuxerStream::ReadCB& read_cb) {
708 Read(DemuxerStream::AUDIO, read_cb); 715 Read(DemuxerStream::AUDIO, read_cb);
(...skipping 860 matching lines...) Expand 10 before | Expand all | Expand 10 after
1569 } 1576 }
1570 1577
1571 // Verify buffered range change behavior for audio/video/text tracks. 1578 // Verify buffered range change behavior for audio/video/text tracks.
1572 TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { 1579 TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) {
1573 DemuxerStream* text_stream = NULL; 1580 DemuxerStream* text_stream = NULL;
1574 1581
1575 EXPECT_CALL(host_, AddTextStream(_, _)) 1582 EXPECT_CALL(host_, AddTextStream(_, _))
1576 .WillOnce(SaveArg<0>(&text_stream)); 1583 .WillOnce(SaveArg<0>(&text_stream));
1577 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT)); 1584 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO | HAS_TEXT));
1578 1585
1579 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 30"); 1586 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 33");
1580 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K"); 1587 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K 23K");
1581 1588
1582 // Check expected ranges and verify that an empty text track does not 1589 // Check expected ranges and verify that an empty text track does not
1583 // affect the expected ranges. 1590 // affect the expected ranges.
1584 CheckExpectedRanges(kSourceId, "{ [0,46) }"); 1591 CheckExpectedRanges(kSourceId, "{ [0,46) }");
1585 1592
1586 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(60))); 1593 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66)));
1587 MarkEndOfStream(PIPELINE_OK); 1594 MarkEndOfStream(PIPELINE_OK);
1588 1595
1589 // Check expected ranges and verify that an empty text track does not 1596 // Check expected ranges and verify that an empty text track does not
1590 // affect the expected ranges. 1597 // affect the expected ranges.
1591 CheckExpectedRanges(kSourceId, "{ [0,60) }"); 1598 CheckExpectedRanges(kSourceId, "{ [0,66) }");
1592 1599
1593 // Unmark end of stream state and verify that the ranges return to 1600 // Unmark end of stream state and verify that the ranges return to
1594 // their pre-"end of stream" values. 1601 // their pre-"end of stream" values.
1595 demuxer_->UnmarkEndOfStream(); 1602 demuxer_->UnmarkEndOfStream();
1596 CheckExpectedRanges(kSourceId, "{ [0,46) }"); 1603 CheckExpectedRanges(kSourceId, "{ [0,46) }");
1597 1604
1598 // Add text track data and verify that the buffered ranges don't change 1605 // Add text track data and verify that the buffered ranges don't change
1599 // since the intersection of all the tracks doesn't change. 1606 // since the intersection of all the tracks doesn't change.
1600 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(200))); 1607 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(200)));
1601 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K"); 1608 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K");
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1643 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { 1650 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
1644 struct BufferTimestamps buffer_timestamps[] = { 1651 struct BufferTimestamps buffer_timestamps[] = {
1645 {0, 0}, 1652 {0, 0},
1646 {33, 3}, 1653 {33, 3},
1647 {67, 6}, 1654 {67, 6},
1648 {100, 9}, 1655 {100, 9},
1649 {133, 12}, 1656 {133, 12},
1650 {kSkip, kSkip}, 1657 {kSkip, kSkip},
1651 }; 1658 };
1652 1659
1660 // TODO(wolenetz/acolwell): Remove this SetDuration expectation once the
1661 // file is fixed to have the correct duration in the init segment.
1662 // See http://crbug.com/354284.
1663 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744)));
1664
1653 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, 1665 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps,
1654 base::TimeDelta::FromMilliseconds(2744))); 1666 base::TimeDelta::FromMilliseconds(2768)));
1655 } 1667 }
1656 1668
1657 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { 1669 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) {
1658 struct BufferTimestamps buffer_timestamps[] = { 1670 struct BufferTimestamps buffer_timestamps[] = {
1659 {0, 0}, 1671 {0, 0},
1660 {33, 3}, 1672 {33, 3},
1661 {67, 6}, 1673 {67, 6},
1662 {100, 9}, 1674 {100, 9},
1663 {133, 12}, 1675 {133, 12},
1664 {kSkip, kSkip}, 1676 {kSkip, kSkip},
1665 }; 1677 };
1666 1678
1667 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps, 1679 ASSERT_TRUE(ParseWebMFile("bear-320x240-live.webm", buffer_timestamps,
1668 kInfiniteDuration())); 1680 kInfiniteDuration()));
1669 } 1681 }
1670 1682
1671 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) { 1683 TEST_F(ChunkDemuxerTest, WebMFile_AudioOnly) {
1672 struct BufferTimestamps buffer_timestamps[] = { 1684 struct BufferTimestamps buffer_timestamps[] = {
1673 {kSkip, 0}, 1685 {kSkip, 0},
1674 {kSkip, 3}, 1686 {kSkip, 3},
1675 {kSkip, 6}, 1687 {kSkip, 6},
1676 {kSkip, 9}, 1688 {kSkip, 9},
1677 {kSkip, 12}, 1689 {kSkip, 12},
1678 {kSkip, kSkip}, 1690 {kSkip, kSkip},
1679 }; 1691 };
1680 1692
1693 // TODO(wolenetz/acolwell): Remove this SetDuration expectation once the
1694 // file is fixed to have the correct duration in the init segment.
1695 // See http://crbug.com/354284.
1696 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2744)));
1697
1681 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, 1698 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps,
1682 base::TimeDelta::FromMilliseconds(2744), 1699 base::TimeDelta::FromMilliseconds(2768),
1683 HAS_AUDIO)); 1700 HAS_AUDIO));
1684 } 1701 }
1685 1702
1686 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) { 1703 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) {
1687 struct BufferTimestamps buffer_timestamps[] = { 1704 struct BufferTimestamps buffer_timestamps[] = {
1688 {0, kSkip}, 1705 {0, kSkip},
1689 {33, kSkip}, 1706 {33, kSkip},
1690 {67, kSkip}, 1707 {67, kSkip},
1691 {100, kSkip}, 1708 {100, kSkip},
1692 {133, kSkip}, 1709 {133, kSkip},
1693 {kSkip, kSkip}, 1710 {kSkip, kSkip},
1694 }; 1711 };
1695 1712
1713 // TODO(wolenetz/acolwell): Remove this SetDuration expectation once the
1714 // file is fixed to have the correct duration in the init segment.
1715 // See http://crbug.com/354284.
1716 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2703)));
1717
1696 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps, 1718 ASSERT_TRUE(ParseWebMFile("bear-320x240-video-only.webm", buffer_timestamps,
1697 base::TimeDelta::FromMilliseconds(2703), 1719 base::TimeDelta::FromMilliseconds(2737),
1698 HAS_VIDEO)); 1720 HAS_VIDEO));
1699 } 1721 }
1700 1722
1701 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { 1723 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) {
1702 struct BufferTimestamps buffer_timestamps[] = { 1724 struct BufferTimestamps buffer_timestamps[] = {
1703 {0, 0}, 1725 {0, 0},
1704 {33, 3}, 1726 {33, 3},
1705 {33, 6}, 1727 {33, 6},
1706 {67, 9}, 1728 {67, 9},
1707 {100, 12}, 1729 {100, 12},
1708 {kSkip, kSkip}, 1730 {kSkip, kSkip},
1709 }; 1731 };
1710 1732
1733 // TODO(wolenetz/acolwell): Remove this SetDuration expectation once the
1734 // file is fixed to have the correct duration in the init segment.
1735 // See http://crbug.com/354284.
1736 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2767)));
1737
1711 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, 1738 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps,
1712 base::TimeDelta::FromMilliseconds(2767))); 1739 base::TimeDelta::FromMilliseconds(2768)));
1713 } 1740 }
1714 1741
1715 // Verify that we output buffers before the entire cluster has been parsed. 1742 // Verify that we output buffers before the entire cluster has been parsed.
1716 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { 1743 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) {
1717 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1744 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1718 AppendEmptyCluster(0); 1745 AppendEmptyCluster(0);
1719 1746
1720 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); 1747 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6));
1721 1748
1722 bool audio_read_done = false; 1749 bool audio_read_done = false;
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
2716 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2743 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2717 const int kStreamDuration = kDefaultDuration().InMilliseconds(); 2744 const int kStreamDuration = kDefaultDuration().InMilliseconds();
2718 2745
2719 // Add data leading up to the currently set duration. 2746 // Add data leading up to the currently set duration.
2720 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, 2747 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
2721 kStreamDuration - kVideoBlockDuration, 2748 kStreamDuration - kVideoBlockDuration,
2722 2)); 2749 2));
2723 2750
2724 CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); 2751 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2725 2752
2726 // Add data at the currently set duration. The duration should not increase. 2753 // Add data beginning at the currently set duration and expect a new duration
2754 // to be signaled. Note that the last video block will have a higher end
2755 // timestamp than the last audio block.
2756 // TODO(wolenetz): Compliant coded frame processor will emit a max of one
2757 // duration change per each ProcessFrames(). Remove the first expectation here
2758 // once compliant coded frame processor is used. See http://crbug.com/249422.
2759 const int kNewStreamDurationAudio = kStreamDuration + kAudioBlockDuration;
2760 EXPECT_CALL(host_, SetDuration(
2761 base::TimeDelta::FromMilliseconds(kNewStreamDurationAudio)));
2762 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration;
2763 EXPECT_CALL(host_, SetDuration(
2764 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
2727 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); 2765 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2));
2728 2766
2729 // Range should not be affected. 2767 CheckExpectedRanges(kSourceId, "{ [201191,201247) }");
2730 CheckExpectedRanges(kSourceId, "{ [201191,201224) }");
2731 2768
2732 // Now add data past the duration and expect a new duration to be signalled. 2769 // Add more data to the end of each media type. Note that the last audio block
2733 const int kNewStreamDuration = kStreamDuration + kAudioBlockDuration * 2; 2770 // will have a higher end timestamp than the last video block.
2771 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3;
2734 EXPECT_CALL(host_, SetDuration( 2772 EXPECT_CALL(host_, SetDuration(
2735 base::TimeDelta::FromMilliseconds(kNewStreamDuration))); 2773 base::TimeDelta::FromMilliseconds(kFinalStreamDuration)));
2736 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration, 2774 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
2737 kStreamDuration + kVideoBlockDuration, 2775 kStreamDuration + kVideoBlockDuration,
2738 2)); 2776 3));
2739 2777
2740 // See that the range has increased appropriately. 2778 // See that the range has increased appropriately (but not to the full
2741 CheckExpectedRanges(kSourceId, "{ [201191,201270) }"); 2779 // duration of 201293, since there is not enough video appended for that).
2780 CheckExpectedRanges(kSourceId, "{ [201191,201290) }");
2742 } 2781 }
2743 2782
2744 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { 2783 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
2745 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2784 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2746 2785
2747 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); 2786 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
2748 2787
2788 // TODO(wolenetz): Compliant coded frame processor will emit a max of one
2789 // duration change per each ProcessFrames(). Remove the first expectation here
2790 // once compliant coded frame processor is used. See http://crbug.com/249422.
2749 EXPECT_CALL(host_, SetDuration( 2791 EXPECT_CALL(host_, SetDuration(
2750 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 2792 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2751 kAudioBlockDuration * 2))); 2793 kAudioBlockDuration * 2)));
2794 EXPECT_CALL(host_, SetDuration(
2795 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
2796 kVideoBlockDuration * 2)));
2752 AppendCluster(GenerateCluster(0, 4)); 2797 AppendCluster(GenerateCluster(0, 4));
2753 } 2798 }
2754 2799
2755 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { 2800 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
2756 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2801 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2757 2802
2758 AppendCluster(kDefaultFirstCluster()); 2803 AppendCluster(kDefaultFirstCluster());
2759 2804
2760 EXPECT_CALL(host_, SetDuration( 2805 EXPECT_CALL(host_, SetDuration(
2761 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 2806 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2806 2851
2807 // Normally this would return an audio buffer at timestamp zero, but 2852 // Normally this would return an audio buffer at timestamp zero, but
2808 // all reads should return EOS buffers when disabled. 2853 // all reads should return EOS buffers when disabled.
2809 bool audio_read_done = false; 2854 bool audio_read_done = false;
2810 stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 2855 stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
2811 message_loop_.RunUntilIdle(); 2856 message_loop_.RunUntilIdle();
2812 2857
2813 EXPECT_TRUE(audio_read_done); 2858 EXPECT_TRUE(audio_read_done);
2814 } 2859 }
2815 2860
2816 // Verifies that signalling end of stream while stalled at a gap 2861 // Verifies that signaling end of stream while stalled at a gap
2817 // boundary does not trigger end of stream buffers to be returned. 2862 // boundary does not trigger end of stream buffers to be returned.
2818 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { 2863 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
2819 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2864 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2820 2865
2821 AppendCluster(0, 10); 2866 AppendCluster(0, 10);
2822 AppendCluster(300, 10); 2867 AppendCluster(300, 10);
2823 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }"); 2868 CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }");
2824 2869
2825
2826 GenerateExpectedReads(0, 10); 2870 GenerateExpectedReads(0, 10);
2827 2871
2828 bool audio_read_done = false; 2872 bool audio_read_done = false;
2829 bool video_read_done = false; 2873 bool video_read_done = false;
2830 ReadAudio(base::Bind(&OnReadDone, 2874 ReadAudio(base::Bind(&OnReadDone,
2831 base::TimeDelta::FromMilliseconds(138), 2875 base::TimeDelta::FromMilliseconds(138),
2832 &audio_read_done)); 2876 &audio_read_done));
2833 ReadVideo(base::Bind(&OnReadDone, 2877 ReadVideo(base::Bind(&OnReadDone,
2834 base::TimeDelta::FromMilliseconds(138), 2878 base::TimeDelta::FromMilliseconds(138),
2835 &video_read_done)); 2879 &video_read_done));
2836 2880
2837 // Verify that the reads didn't complete 2881 // Verify that the reads didn't complete
2838 EXPECT_FALSE(audio_read_done); 2882 EXPECT_FALSE(audio_read_done);
2839 EXPECT_FALSE(video_read_done); 2883 EXPECT_FALSE(video_read_done);
2840 2884
2841 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438))); 2885 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438)));
2842 MarkEndOfStream(PIPELINE_OK); 2886 MarkEndOfStream(PIPELINE_OK);
2843 2887
2844 // Verify that the reads still haven't completed. 2888 // Verify that the reads still haven't completed.
2845 EXPECT_FALSE(audio_read_done); 2889 EXPECT_FALSE(audio_read_done);
2846 EXPECT_FALSE(video_read_done); 2890 EXPECT_FALSE(video_read_done);
2847 2891
2848 demuxer_->UnmarkEndOfStream(); 2892 demuxer_->UnmarkEndOfStream();
2849 2893
2850 AppendCluster(138, 24); 2894 AppendCluster(138, 22);
2851 2895
2852 message_loop_.RunUntilIdle(); 2896 message_loop_.RunUntilIdle();
2853 2897
2854 CheckExpectedRanges(kSourceId, "{ [0,438) }"); 2898 CheckExpectedRanges(kSourceId, "{ [0,435) }");
2855 2899
2856 // Verify that the reads have completed. 2900 // Verify that the reads have completed.
2857 EXPECT_TRUE(audio_read_done); 2901 EXPECT_TRUE(audio_read_done);
2858 EXPECT_TRUE(video_read_done); 2902 EXPECT_TRUE(video_read_done);
2859 2903
2860 // Read the rest of the buffers. 2904 // Read the rest of the buffers.
2861 GenerateExpectedReads(161, 171, 22); 2905 GenerateExpectedReads(161, 171, 20);
2862 2906
2863 // Verify that reads block because the append cleared the end of stream state. 2907 // Verify that reads block because the append cleared the end of stream state.
2864 audio_read_done = false; 2908 audio_read_done = false;
2865 video_read_done = false; 2909 video_read_done = false;
2866 ReadAudio(base::Bind(&OnReadDone_EOSExpected, 2910 ReadAudio(base::Bind(&OnReadDone_EOSExpected,
2867 &audio_read_done)); 2911 &audio_read_done));
2868 ReadVideo(base::Bind(&OnReadDone_EOSExpected, 2912 ReadVideo(base::Bind(&OnReadDone_EOSExpected,
2869 &video_read_done)); 2913 &video_read_done));
2870 2914
2871 // Verify that the reads don't complete. 2915 // Verify that the reads don't complete.
2872 EXPECT_FALSE(audio_read_done); 2916 EXPECT_FALSE(audio_read_done);
2873 EXPECT_FALSE(video_read_done); 2917 EXPECT_FALSE(video_read_done);
2874 2918
2919 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(437)));
2875 MarkEndOfStream(PIPELINE_OK); 2920 MarkEndOfStream(PIPELINE_OK);
2876 2921
2877 EXPECT_TRUE(audio_read_done); 2922 EXPECT_TRUE(audio_read_done);
2878 EXPECT_TRUE(video_read_done); 2923 EXPECT_TRUE(video_read_done);
2879 } 2924 }
2880 2925
2881 TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) { 2926 TEST_F(ChunkDemuxerTest, CanceledSeekDuringInitialPreroll) {
2882 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2927 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2883 2928
2884 // Cancel preroll. 2929 // Cancel preroll.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2953 // Set the append window to [20,280). 2998 // Set the append window to [20,280).
2954 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 2999 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
2955 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3000 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
2956 3001
2957 // Append a cluster that starts before and ends after the append window. 3002 // Append a cluster that starts before and ends after the append window.
2958 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3003 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
2959 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); 3004 "0K 30 60 90 120K 150 180 210 240K 270 300 330K");
2960 3005
2961 // Verify that GOPs that start outside the window are not included 3006 // Verify that GOPs that start outside the window are not included
2962 // in the buffer. Also verify that buffers that start inside the 3007 // in the buffer. Also verify that buffers that start inside the
2963 // window and extend beyond the end of the window are included. 3008 // window and extend beyond the end of the window are not included.
2964 CheckExpectedRanges(kSourceId, "{ [120,300) }"); 3009 CheckExpectedRanges(kSourceId, "{ [120,273) }");
2965 CheckExpectedBuffers(stream, "120 150 180 210 240 270"); 3010 CheckExpectedBuffers(stream, "120 150 180 210 240");
2966 3011
2967 // Extend the append window to [20,650). 3012 // Extend the append window to [20,650).
2968 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 3013 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
2969 3014
2970 // Append more data and verify that adding buffers start at the next 3015 // Append more data and verify that adding buffers start at the next
2971 // keyframe. 3016 // keyframe.
2972 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3017 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
2973 "360 390 420K 450 480 510 540K 570 600 630K"); 3018 "360 390 420K 450 480 510 540K 570 600 630K");
2974 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); 3019 CheckExpectedRanges(kSourceId, "{ [120,273) [420,633) }");
2975 } 3020 }
2976 3021
2977 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { 3022 TEST_F(ChunkDemuxerTest, AppendWindow_Audio) {
2978 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3023 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
2979 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 3024 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
2980 3025
2981 // Set the append window to [20,280). 3026 // Set the append window to [20,280).
2982 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 3027 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
2983 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3028 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
2984 3029
2985 // Append a cluster that starts before and ends after the append window. 3030 // Append a cluster that starts before and ends after the append window.
2986 AppendSingleStreamCluster( 3031 AppendSingleStreamCluster(
2987 kSourceId, kAudioTrackNum, 3032 kSourceId, kAudioTrackNum,
2988 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K"); 3033 "0K 30K 60K 90K 120K 150K 180K 210K 240K 270K 300K 330K");
2989 3034
2990 // Verify that frames that start outside the window are not included 3035 // Verify that frames that start outside the window are not included
2991 // in the buffer. Also verify that buffers that start inside the 3036 // in the buffer. Also verify that buffers that start inside the
2992 // window and extend beyond the end of the window are included. 3037 // window and extend beyond the end of the window are not included.
acolwell GONE FROM CHROMIUM 2014/03/21 15:50:15 Why did this change? Is this an artifact of suppor
wolenetz 2014/03/21 18:14:01 Yes. I included that step's support in this change
2993 CheckExpectedRanges(kSourceId, "{ [30,300) }"); 3038 CheckExpectedRanges(kSourceId, "{ [30,263) }");
2994 CheckExpectedBuffers(stream, "30 60 90 120 150 180 210 240 270"); 3039 CheckExpectedBuffers(stream, "30 60 90 120 150 180 210 240");
2995 3040
2996 // Extend the append window to [20,650). 3041 // Extend the append window to [20,650).
2997 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 3042 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
2998 3043
2999 // Append more data and verify that a new range is created. 3044 // Append more data and verify that a new range is created.
3000 AppendSingleStreamCluster( 3045 AppendSingleStreamCluster(
3001 kSourceId, kAudioTrackNum, 3046 kSourceId, kAudioTrackNum,
3002 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K"); 3047 "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K");
3003 CheckExpectedRanges(kSourceId, "{ [30,300) [360,660) }"); 3048 CheckExpectedRanges(kSourceId, "{ [30,263) [360,623) }");
3004 } 3049 }
3005 3050
3006 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { 3051 TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
3007 DemuxerStream* text_stream = NULL; 3052 DemuxerStream* text_stream = NULL;
3008 EXPECT_CALL(host_, AddTextStream(_, _)) 3053 EXPECT_CALL(host_, AddTextStream(_, _))
3009 .WillOnce(SaveArg<0>(&text_stream)); 3054 .WillOnce(SaveArg<0>(&text_stream));
3010 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT)); 3055 ASSERT_TRUE(InitDemuxer(HAS_VIDEO | HAS_TEXT));
3011 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 3056 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
3012 3057
3013 // Set the append window to [20,280). 3058 // Set the append window to [20,280).
3014 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20); 3059 append_window_start_for_next_append_ = base::TimeDelta::FromMilliseconds(20);
3015 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280); 3060 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(280);
3016 3061
3017 // Append a cluster that starts before and ends after the append 3062 // Append a cluster that starts before and ends after the append
3018 // window. 3063 // window.
3019 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3064 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3020 "0K 30 60 90 120K 150 180 210 240K 270 300 330K"); 3065 "0K 30 60 90 120K 150 180 210 240K 270 300 330K");
3021 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K 200K 300K"); 3066 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "0K 100K 200K 300K");
3022 3067
3023 // Verify that text cues that start outside the window are not included 3068 // Verify that text cues that start outside the window are not included
3024 // in the buffer. Also verify that cues that extend beyond the 3069 // in the buffer. Also verify that cues that extend beyond the
3025 // window are included. 3070 // window are not included.
3026 CheckExpectedRanges(kSourceId, "{ [120,300) }"); 3071 CheckExpectedRanges(kSourceId, "{ [120,273) }");
3027 CheckExpectedBuffers(video_stream, "120 150 180 210 240 270"); 3072 CheckExpectedBuffers(video_stream, "120 150 180 210 240");
3028 CheckExpectedBuffers(text_stream, "100 200"); 3073 CheckExpectedBuffers(text_stream, "100");
3029 3074
3030 // Extend the append window to [20,650). 3075 // Extend the append window to [20,650).
3031 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650); 3076 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(650);
3032 3077
3033 // Append more data and verify that a new range is created. 3078 // Append more data and verify that a new range is created.
3034 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3079 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3035 "360 390 420K 450 480 510 540K 570 600 630K"); 3080 "360 390 420K 450 480 510 540K 570 600 630K");
3036 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K"); 3081 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "400K 500K 600K 700K");
3037 CheckExpectedRanges(kSourceId, "{ [120,300) [420,660) }"); 3082 CheckExpectedRanges(kSourceId, "{ [120,273) [420,633) }");
3038 3083
3039 // Seek to the new range and verify that the expected buffers are returned. 3084 // Seek to the new range and verify that the expected buffers are returned.
3040 Seek(base::TimeDelta::FromMilliseconds(420)); 3085 Seek(base::TimeDelta::FromMilliseconds(420));
3041 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600 630"); 3086 CheckExpectedBuffers(video_stream, "420 450 480 510 540 570 600");
3042 CheckExpectedBuffers(text_stream, "400 500 600"); 3087 CheckExpectedBuffers(text_stream, "400 500");
3043 } 3088 }
3044 3089
3045 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) { 3090 TEST_F(ChunkDemuxerTest, StartWaitingForSeekAfterParseError) {
3046 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3091 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3047 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE)); 3092 EXPECT_CALL(host_, OnDemuxerError(PIPELINE_ERROR_DECODE));
3048 AppendGarbage(); 3093 AppendGarbage();
3049 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50); 3094 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(50);
3050 demuxer_->StartWaitingForSeek(seek_time); 3095 demuxer_->StartWaitingForSeek(seek_time);
3051 } 3096 }
3052 3097
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3113 3158
3114 bool text_read_done = false; 3159 bool text_read_done = false;
3115 text_stream->Read(base::Bind(&OnReadDone, 3160 text_stream->Read(base::Bind(&OnReadDone,
3116 base::TimeDelta::FromMilliseconds(125), 3161 base::TimeDelta::FromMilliseconds(125),
3117 &text_read_done)); 3162 &text_read_done));
3118 3163
3119 // Append audio & video data so the seek completes. 3164 // Append audio & video data so the seek completes.
3120 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3165 AppendSingleStreamCluster(kSourceId, kAudioTrackNum,
3121 "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K"); 3166 "0K 20K 40K 60K 80K 100K 120K 140K 160K 180K");
3122 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 3167 AppendSingleStreamCluster(kSourceId, kVideoTrackNum,
3123 "0K 30 60 90 120K 150 180 210"); 3168 "0K 30 60 90K 120K 150 180 210");
3124 3169
3125 message_loop_.RunUntilIdle(); 3170 message_loop_.RunUntilIdle();
3126 EXPECT_TRUE(seek_cb_was_called); 3171 EXPECT_TRUE(seek_cb_was_called);
3127 EXPECT_FALSE(text_read_done); 3172 EXPECT_FALSE(text_read_done);
3128 3173
3129 // Read some audio & video buffers to further verify seek completion. 3174 // Read some audio & video buffers to further verify seek completion.
3130 CheckExpectedBuffers(audio_stream, "120 140"); 3175 CheckExpectedBuffers(audio_stream, "120 140");
3131 CheckExpectedBuffers(video_stream, "120 150"); 3176 CheckExpectedBuffers(video_stream, "120 150");
3132 3177
3133 EXPECT_FALSE(text_read_done); 3178 EXPECT_FALSE(text_read_done);
3134 3179
3135 // Append text cues that start after the seek point and verify that 3180 // Append text cues that start after the seek point and verify that
3136 // they are returned by Read() calls. 3181 // they are returned by Read() calls.
3137 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "125K 175K 225K"); 3182 AppendSingleStreamCluster(kSourceId, kTextTrackNum, "125K 175K 225K");
3138 3183
3139 message_loop_.RunUntilIdle(); 3184 message_loop_.RunUntilIdle();
3140 EXPECT_TRUE(text_read_done); 3185 EXPECT_TRUE(text_read_done);
3141 3186
3142 // NOTE: we start at 175 here because the buffer at 125 was returned 3187 // NOTE: we start at 175 here because the buffer at 125 was returned
3143 // to the pending read initiated above. 3188 // to the pending read initiated above.
3144 CheckExpectedBuffers(text_stream, "175 225"); 3189 CheckExpectedBuffers(text_stream, "175 225");
3145 3190
3146 // Verify that audio & video streams contiue to return expected values. 3191 // Verify that audio & video streams continue to return expected values.
3147 CheckExpectedBuffers(audio_stream, "160 180"); 3192 CheckExpectedBuffers(audio_stream, "160 180");
3148 CheckExpectedBuffers(video_stream, "180 210"); 3193 CheckExpectedBuffers(video_stream, "180 210");
3149 } 3194 }
3150 3195
3151 } // namespace media 3196 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698