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

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

Issue 1281113002: MSE: Warn when keyframe after track_buffer is significantly in future (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes xhwang@'s nits Created 5 years, 4 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
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 "media/filters/source_buffer_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <string> 8 #include <string>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "media/base/data_buffer.h" 16 #include "media/base/data_buffer.h"
17 #include "media/base/media_log.h" 17 #include "media/base/media_log.h"
18 #include "media/base/mock_media_log.h"
18 #include "media/base/test_helpers.h" 19 #include "media/base/test_helpers.h"
19 #include "media/base/text_track_config.h" 20 #include "media/base/text_track_config.h"
20 #include "media/filters/webvtt_util.h" 21 #include "media/filters/webvtt_util.h"
21 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
22 23
24 using ::testing::HasSubstr;
25 using ::testing::InSequence;
26 using ::testing::StrictMock;
27
28 // Helper macros to reduce boilerplate when verifying media log entries.
29 #define EXPECT_MEDIA_LOG_STRING(x) \
30 EXPECT_CALL(*media_log_, DoAddEventLogString((x)))
31 #define CONTAINS_STRING(arg, x) (std::string::npos != (arg).find(x))
32
23 namespace media { 33 namespace media {
24 34
25 typedef StreamParser::BufferQueue BufferQueue; 35 typedef StreamParser::BufferQueue BufferQueue;
26 36
27 static const int kDefaultFramesPerSecond = 30; 37 static const int kDefaultFramesPerSecond = 30;
28 static const int kDefaultKeyframesPerSecond = 6; 38 static const int kDefaultKeyframesPerSecond = 6;
29 static const uint8 kDataA = 0x11; 39 static const uint8 kDataA = 0x11;
30 static const uint8 kDataB = 0x33; 40 static const uint8 kDataB = 0x33;
31 static const int kDataSize = 1; 41 static const int kDataSize = 1;
32 42
43 // Matchers for verifying common media log entry strings.
44 MATCHER(ContainsMissingKeyframeLog, "") {
45 return CONTAINS_STRING(arg,
46 "Media segment did not begin with key frame. Support "
47 "for such segments will be available in a future "
48 "version. Please see https://crbug.com/229412.");
49 }
50
51 MATCHER(ContainsSameTimestampAt30MillisecondsLog, "") {
52 return CONTAINS_STRING(arg,
53 "Unexpected combination of buffers with the same "
54 "timestamp detected at 0.03");
55 }
56
57 MATCHER_P(ContainsTrackBufferExhaustionSkipLog, skip_milliseconds, "") {
58 return CONTAINS_STRING(arg,
59 "Media append that overlapped current playback "
60 "position caused time gap in playing VIDEO stream "
61 "because the next keyframe is " +
62 base::IntToString(skip_milliseconds) +
63 "ms beyond last overlapped frame. Media may "
64 "appear temporarily frozen.");
65 }
66
67 MATCHER_P2(ContainsGeneratedSpliceLog,
68 duration_microseconds,
69 time_microseconds,
70 "") {
71 return CONTAINS_STRING(arg, "Generated splice of overlap duration " +
72 base::IntToString(duration_microseconds) +
73 "us into new buffer at " +
74 base::IntToString(time_microseconds) + "us.");
75 }
76
33 class SourceBufferStreamTest : public testing::Test { 77 class SourceBufferStreamTest : public testing::Test {
34 protected: 78 protected:
35 SourceBufferStreamTest() { 79 SourceBufferStreamTest() : media_log_(new StrictMock<MockMediaLog>()) {
36 video_config_ = TestVideoConfig::Normal(); 80 video_config_ = TestVideoConfig::Normal();
37 SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond); 81 SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond);
38 stream_.reset(new SourceBufferStream(video_config_, new MediaLog(), true)); 82 stream_.reset(new SourceBufferStream(video_config_, media_log_, true));
39 } 83 }
40 84
41 void SetMemoryLimit(size_t buffers_of_data) { 85 void SetMemoryLimit(size_t buffers_of_data) {
42 stream_->set_memory_limit(buffers_of_data * kDataSize); 86 stream_->set_memory_limit(buffers_of_data * kDataSize);
43 } 87 }
44 88
45 void SetStreamInfo(int frames_per_second, int keyframes_per_second) { 89 void SetStreamInfo(int frames_per_second, int keyframes_per_second) {
46 frames_per_second_ = frames_per_second; 90 frames_per_second_ = frames_per_second;
47 keyframes_per_second_ = keyframes_per_second; 91 keyframes_per_second_ = keyframes_per_second;
48 frame_duration_ = ConvertToFrameDuration(frames_per_second); 92 frame_duration_ = ConvertToFrameDuration(frames_per_second);
49 } 93 }
50 94
51 void SetTextStream() { 95 void SetTextStream() {
52 video_config_ = TestVideoConfig::Invalid(); 96 video_config_ = TestVideoConfig::Invalid();
53 TextTrackConfig config(kTextSubtitles, "", "", ""); 97 TextTrackConfig config(kTextSubtitles, "", "", "");
54 stream_.reset(new SourceBufferStream(config, new MediaLog(), true)); 98 stream_.reset(new SourceBufferStream(config, media_log_, true));
55 SetStreamInfo(2, 2); 99 SetStreamInfo(2, 2);
56 } 100 }
57 101
58 void SetAudioStream() { 102 void SetAudioStream() {
59 video_config_ = TestVideoConfig::Invalid(); 103 video_config_ = TestVideoConfig::Invalid();
60 audio_config_.Initialize(kCodecVorbis, 104 audio_config_.Initialize(kCodecVorbis,
61 kSampleFormatPlanarF32, 105 kSampleFormatPlanarF32,
62 CHANNEL_LAYOUT_STEREO, 106 CHANNEL_LAYOUT_STEREO,
63 1000, 107 1000,
64 NULL, 108 NULL,
65 0, 109 0,
66 false, 110 false,
67 false, 111 false,
68 base::TimeDelta(), 112 base::TimeDelta(),
69 0); 113 0);
70 stream_.reset(new SourceBufferStream(audio_config_, new MediaLog(), true)); 114 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true));
71 115
72 // Equivalent to 2ms per frame. 116 // Equivalent to 2ms per frame.
73 SetStreamInfo(500, 500); 117 SetStreamInfo(500, 500);
74 } 118 }
75 119
76 void NewSegmentAppend(int starting_position, int number_of_buffers) { 120 void NewSegmentAppend(int starting_position, int number_of_buffers) {
77 AppendBuffers(starting_position, number_of_buffers, true, 121 AppendBuffers(starting_position, number_of_buffers, true,
78 base::TimeDelta(), true, &kDataA, kDataSize); 122 base::TimeDelta(), true, &kDataA, kDataSize);
79 } 123 }
80 124
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 EXPECT_TRUE(actual.Matches(config)) 412 EXPECT_TRUE(actual.Matches(config))
369 << "Expected: " << config.AsHumanReadableString() 413 << "Expected: " << config.AsHumanReadableString()
370 << "\nActual: " << actual.AsHumanReadableString(); 414 << "\nActual: " << actual.AsHumanReadableString();
371 } 415 }
372 416
373 base::TimeDelta frame_duration() const { return frame_duration_; } 417 base::TimeDelta frame_duration() const { return frame_duration_; }
374 418
375 scoped_ptr<SourceBufferStream> stream_; 419 scoped_ptr<SourceBufferStream> stream_;
376 VideoDecoderConfig video_config_; 420 VideoDecoderConfig video_config_;
377 AudioDecoderConfig audio_config_; 421 AudioDecoderConfig audio_config_;
422 scoped_refptr<StrictMock<MockMediaLog>> media_log_;
378 423
379 private: 424 private:
380 base::TimeDelta ConvertToFrameDuration(int frames_per_second) { 425 base::TimeDelta ConvertToFrameDuration(int frames_per_second) {
381 return base::TimeDelta::FromMicroseconds( 426 return base::TimeDelta::FromMicroseconds(
382 base::Time::kMicrosecondsPerSecond / frames_per_second); 427 base::Time::kMicrosecondsPerSecond / frames_per_second);
383 } 428 }
384 429
385 void AppendBuffers(int starting_position, 430 void AppendBuffers(int starting_position,
386 int number_of_buffers, 431 int number_of_buffers,
387 bool begin_media_segment, 432 bool begin_media_segment,
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
719 NewSegmentAppend(10, 5); 764 NewSegmentAppend(10, 5);
720 765
721 // Check expected range. 766 // Check expected range.
722 CheckExpectedRanges("{ [0,25) }"); 767 CheckExpectedRanges("{ [0,25) }");
723 // Check buffers in range. 768 // Check buffers in range.
724 Seek(0); 769 Seek(0);
725 CheckExpectedBuffers(0, 25); 770 CheckExpectedBuffers(0, 25);
726 } 771 }
727 772
728 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) { 773 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) {
774 EXPECT_MEDIA_LOG_STRING(ContainsMissingKeyframeLog()).Times(2);
775
729 // Append fails because the range doesn't begin with a keyframe. 776 // Append fails because the range doesn't begin with a keyframe.
730 NewSegmentAppend_ExpectFailure(3, 2); 777 NewSegmentAppend_ExpectFailure(3, 2);
731 778
732 // Append 10 buffers at positions 5 through 14. 779 // Append 10 buffers at positions 5 through 14.
733 NewSegmentAppend(5, 10); 780 NewSegmentAppend(5, 10);
734 781
735 // Check expected range. 782 // Check expected range.
736 CheckExpectedRanges("{ [5,14) }"); 783 CheckExpectedRanges("{ [5,14) }");
737 // Check buffers in range. 784 // Check buffers in range.
738 Seek(5); 785 Seek(5);
739 CheckExpectedBuffers(5, 14); 786 CheckExpectedBuffers(5, 14);
740 787
741 // Append fails because the range doesn't begin with a keyframe. 788 // Append fails because the range doesn't begin with a keyframe.
742 NewSegmentAppend_ExpectFailure(17, 3); 789 NewSegmentAppend_ExpectFailure(17, 3);
743 790
744 CheckExpectedRanges("{ [5,14) }"); 791 CheckExpectedRanges("{ [5,14) }");
745 Seek(5); 792 Seek(5);
746 CheckExpectedBuffers(5, 14); 793 CheckExpectedBuffers(5, 14);
747 } 794 }
748 795
749 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe_Adjacent) { 796 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe_Adjacent) {
797 EXPECT_MEDIA_LOG_STRING(ContainsMissingKeyframeLog());
798
750 // Append 8 buffers at positions 0 through 7. 799 // Append 8 buffers at positions 0 through 7.
751 NewSegmentAppend(0, 8); 800 NewSegmentAppend(0, 8);
752 801
753 // Now start a new media segment at position 8. Append should fail because 802 // Now start a new media segment at position 8. Append should fail because
754 // the media segment does not begin with a keyframe. 803 // the media segment does not begin with a keyframe.
755 NewSegmentAppend_ExpectFailure(8, 2); 804 NewSegmentAppend_ExpectFailure(8, 2);
756 805
757 // Check expected range. 806 // Check expected range.
758 CheckExpectedRanges("{ [0,7) }"); 807 CheckExpectedRanges("{ [0,7) }");
759 // Check buffers in range. 808 // Check buffers in range.
(...skipping 645 matching lines...) Expand 10 before | Expand all | Expand 10 after
1405 // range, and there is no keyframe after the end of the new buffers, then the 1454 // range, and there is no keyframe after the end of the new buffers, then the
1406 // range gets split. 1455 // range gets split.
1407 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1456 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1408 // old  : |A a a a a A*a*| 1457 // old  : |A a a a a A*a*|
1409 // new  : B b b b b B b b b b B 1458 // new  : B b b b b B b b b b B
1410 // after: |B b b b b B b b b b B| 1459 // after: |B b b b b B b b b b B|
1411 // new  : A a a a a A 1460 // new  : A a a a a A
1412 // after: |A a a a a A| |B b b b b B| 1461 // after: |A a a a a A| |B b b b b B|
1413 // track: |a| 1462 // track: |a|
1414 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) { 1463 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) {
1464 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(133));
1465
1415 // Append 7 buffers at positions 10 through 16. 1466 // Append 7 buffers at positions 10 through 16.
1416 NewSegmentAppend(10, 7, &kDataA); 1467 NewSegmentAppend(10, 7, &kDataA);
1417 1468
1418 // Seek to position 15, then move to position 16. 1469 // Seek to position 15, then move to position 16.
1419 Seek(15); 1470 Seek(15);
1420 CheckExpectedBuffers(15, 15, &kDataA); 1471 CheckExpectedBuffers(15, 15, &kDataA);
1421 1472
1422 // Now append 11 buffers at positions 5 through 15. 1473 // Now append 11 buffers at positions 5 through 15.
1423 NewSegmentAppend(5, 11, &kDataB); 1474 NewSegmentAppend(5, 11, &kDataB);
1424 CheckExpectedRanges("{ [5,15) }"); 1475 CheckExpectedRanges("{ [5,15) }");
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1669 // Check the final buffers is correct; the keyframe at 110ms should be 1720 // Check the final buffers is correct; the keyframe at 110ms should be
1670 // deleted. 1721 // deleted.
1671 SeekToTimestampMs(0); 1722 SeekToTimestampMs(0);
1672 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210"); 1723 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210");
1673 } 1724 }
1674 1725
1675 // old : 10K 40 *70* 100K 125 130K 1726 // old : 10K 40 *70* 100K 125 130K
1676 // new : 0K 30 60 90 120K 1727 // new : 0K 30 60 90 120K
1677 // after: 0K 30 60 90 *120K* 130K 1728 // after: 0K 30 60 90 *120K* 130K
1678 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) { 1729 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) {
1730 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(50));
1731
1679 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); 1732 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1680 CheckExpectedRangesByTimestamp("{ [10,160) }"); 1733 CheckExpectedRangesByTimestamp("{ [10,160) }");
1681 1734
1682 // Seek to 70ms. 1735 // Seek to 70ms.
1683 SeekToTimestampMs(70); 1736 SeekToTimestampMs(70);
1684 CheckExpectedBuffers("10K 40"); 1737 CheckExpectedBuffers("10K 40");
1685 1738
1686 // Overlap with a new segment from 0 to 130ms. 1739 // Overlap with a new segment from 0 to 130ms.
1687 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); 1740 NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1688 CheckExpectedRangesByTimestamp("{ [0,160) }"); 1741 CheckExpectedRangesByTimestamp("{ [0,160) }");
(...skipping 10 matching lines...) Expand all
1699 1752
1700 // Overlap the next keyframe after the end of the track buffer with a new 1753 // Overlap the next keyframe after the end of the track buffer with a new
1701 // keyframe. 1754 // keyframe.
1702 // old : 10K 40 *70* 100K 125 130K 1755 // old : 10K 40 *70* 100K 125 130K
1703 // new : 0K 30 60 90 120K 1756 // new : 0K 30 60 90 120K
1704 // after: 0K 30 60 90 *120K* 130K 1757 // after: 0K 30 60 90 *120K* 130K
1705 // track: 70 1758 // track: 70
1706 // new : 110K 130 1759 // new : 110K 130
1707 // after: 0K 30 60 90 *110K* 130 1760 // after: 0K 30 60 90 *110K* 130
1708 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) { 1761 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) {
1762 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(40));
1763
1709 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); 1764 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1710 CheckExpectedRangesByTimestamp("{ [10,160) }"); 1765 CheckExpectedRangesByTimestamp("{ [10,160) }");
1711 1766
1712 // Seek to 70ms. 1767 // Seek to 70ms.
1713 SeekToTimestampMs(70); 1768 SeekToTimestampMs(70);
1714 CheckExpectedBuffers("10K 40"); 1769 CheckExpectedBuffers("10K 40");
1715 1770
1716 // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track 1771 // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track
1717 // buffer. 1772 // buffer.
1718 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); 1773 NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
(...skipping 10 matching lines...) Expand all
1729 // Overlap the next keyframe after the end of the track buffer without a 1784 // Overlap the next keyframe after the end of the track buffer without a
1730 // new keyframe. 1785 // new keyframe.
1731 // old : 10K 40 *70* 100K 125 130K 1786 // old : 10K 40 *70* 100K 125 130K
1732 // new : 0K 30 60 90 120K 1787 // new : 0K 30 60 90 120K
1733 // after: 0K 30 60 90 *120K* 130K 1788 // after: 0K 30 60 90 *120K* 130K
1734 // track: 70 1789 // track: 70
1735 // new : 50K 80 110 140 1790 // new : 50K 80 110 140
1736 // after: 0K 30 50K 80 110 140 * (waiting for keyframe) 1791 // after: 0K 30 50K 80 110 140 * (waiting for keyframe)
1737 // track: 70 1792 // track: 70
1738 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) { 1793 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) {
1794 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(80));
1795
1739 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); 1796 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1740 CheckExpectedRangesByTimestamp("{ [10,160) }"); 1797 CheckExpectedRangesByTimestamp("{ [10,160) }");
1741 1798
1742 // Seek to 70ms. 1799 // Seek to 70ms.
1743 SeekToTimestampMs(70); 1800 SeekToTimestampMs(70);
1744 CheckExpectedBuffers("10K 40"); 1801 CheckExpectedBuffers("10K 40");
1745 1802
1746 // Overlap with a new segment from 0 to 120ms; 70ms goes in track buffer. 1803 // Overlap with a new segment from 0 to 120ms; 70ms goes in track buffer.
1747 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); 1804 NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1748 CheckExpectedRangesByTimestamp("{ [0,160) }"); 1805 CheckExpectedRangesByTimestamp("{ [0,160) }");
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1824 // the track buffer doesn't affect the selected range or track buffer state. 1881 // the track buffer doesn't affect the selected range or track buffer state.
1825 // old : 10K 40 *70* 100K 125 130K ... 200K 230 1882 // old : 10K 40 *70* 100K 125 130K ... 200K 230
1826 // new : 0K 30 60 90 120K 1883 // new : 0K 30 60 90 120K
1827 // after: 0K 30 60 90 *120K* 130K ... 200K 230 1884 // after: 0K 30 60 90 *120K* 130K ... 200K 230
1828 // track: 70 1885 // track: 70
1829 // old : 0K 30 60 90 *120K* 130K ... 200K 230 1886 // old : 0K 30 60 90 *120K* 130K ... 200K 230
1830 // new : 260K 290 1887 // new : 260K 290
1831 // after: 0K 30 60 90 *120K* 130K ... 200K 230 260K 290 1888 // after: 0K 30 60 90 *120K* 130K ... 200K 230 260K 290
1832 // track: 70 1889 // track: 70
1833 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) { 1890 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) {
1891 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(50));
1892
1834 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); 1893 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1835 NewSegmentAppendOneByOne("200K 230"); 1894 NewSegmentAppendOneByOne("200K 230");
1836 CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }"); 1895 CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }");
1837 1896
1838 // Seek to 70ms. 1897 // Seek to 70ms.
1839 SeekToTimestampMs(70); 1898 SeekToTimestampMs(70);
1840 CheckExpectedBuffers("10K 40"); 1899 CheckExpectedBuffers("10K 40");
1841 1900
1842 // Overlap with a new segment from 0 to 120ms. 1901 // Overlap with a new segment from 0 to 120ms.
1843 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); 1902 NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 CheckExpectedRanges("{ [5,9) [15,19) [30,34) }"); 2655 CheckExpectedRanges("{ [5,9) [15,19) [30,34) }");
2597 2656
2598 // Now fulfill the seek at position 10. This will make GC delete the data 2657 // Now fulfill the seek at position 10. This will make GC delete the data
2599 // before position 10 to keep it within cap. 2658 // before position 10 to keep it within cap.
2600 NewSegmentAppend(10, 5, &kDataA); 2659 NewSegmentAppend(10, 5, &kDataA);
2601 CheckExpectedRanges("{ [10,19) [30,34) }"); 2660 CheckExpectedRanges("{ [10,19) [30,34) }");
2602 CheckExpectedBuffers(10, 19, &kDataA); 2661 CheckExpectedBuffers(10, 19, &kDataA);
2603 } 2662 }
2604 2663
2605 TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) { 2664 TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) {
2665 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(99));
2666
2606 // Set memory limit to 3 buffers. 2667 // Set memory limit to 3 buffers.
2607 SetMemoryLimit(3); 2668 SetMemoryLimit(3);
2608 2669
2609 // Seek to position 15. 2670 // Seek to position 15.
2610 Seek(15); 2671 Seek(15);
2611 2672
2612 // Append 18 buffers at positions 0 through 17. 2673 // Append 18 buffers at positions 0 through 17.
2613 NewSegmentAppend(0, 18, &kDataA); 2674 NewSegmentAppend(0, 18, &kDataA);
2614 2675
2615 // Should leave GOP containing seek position. 2676 // Should leave GOP containing seek position.
(...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after
3345 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) { 3406 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) {
3346 Seek(0); 3407 Seek(0);
3347 NewSegmentAppend("0K 30"); 3408 NewSegmentAppend("0K 30");
3348 AppendBuffers("30 60 90 120K 150"); 3409 AppendBuffers("30 60 90 120K 150");
3349 CheckExpectedBuffers("0K 30 30 60 90 120K 150"); 3410 CheckExpectedBuffers("0K 30 30 60 90 120K 150");
3350 } 3411 }
3351 3412
3352 // Verify that a non-keyframe followed by a keyframe with the same timestamp 3413 // Verify that a non-keyframe followed by a keyframe with the same timestamp
3353 // is not allowed. 3414 // is not allowed.
3354 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) { 3415 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) {
3416 EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
3417
3355 Seek(0); 3418 Seek(0);
3356 NewSegmentAppend("0K 30"); 3419 NewSegmentAppend("0K 30");
3357 AppendBuffers_ExpectFailure("30K 60"); 3420 AppendBuffers_ExpectFailure("30K 60");
3358 } 3421 }
3359 3422
3360 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_2) { 3423 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_2) {
3424 EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
3425
3361 Seek(0); 3426 Seek(0);
3362 NewSegmentAppend_ExpectFailure("0K 30 30K 60"); 3427 NewSegmentAppend_ExpectFailure("0K 30 30K 60");
3363 } 3428 }
3364 3429
3365 // Verify that a keyframe followed by a non-keyframe with the same timestamp 3430 // Verify that a keyframe followed by a non-keyframe with the same timestamp
3366 // is allowed. 3431 // is allowed.
3367 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) { 3432 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) {
3368 Seek(0); 3433 Seek(0);
3369 NewSegmentAppend("0K 30K"); 3434 NewSegmentAppend("0K 30K");
3370 AppendBuffers("30 60"); 3435 AppendBuffers("30 60");
(...skipping 30 matching lines...) Expand all
3401 Seek(0); 3466 Seek(0);
3402 CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150"); 3467 CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150");
3403 CheckNoNextBuffer(); 3468 CheckNoNextBuffer();
3404 CheckExpectedRangesByTimestamp("{ [0,190) }"); 3469 CheckExpectedRangesByTimestamp("{ [0,190) }");
3405 } 3470 }
3406 3471
3407 // Test all the valid same timestamp cases for audio. 3472 // Test all the valid same timestamp cases for audio.
3408 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) { 3473 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) {
3409 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, 3474 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
3410 44100, NULL, 0, false); 3475 44100, NULL, 0, false);
3411 stream_.reset(new SourceBufferStream(config, new MediaLog(), true)); 3476 stream_.reset(new SourceBufferStream(config, media_log_, true));
3412 Seek(0); 3477 Seek(0);
3413 NewSegmentAppend("0K 0K 30K 30 60 60"); 3478 NewSegmentAppend("0K 0K 30K 30 60 60");
3414 CheckExpectedBuffers("0K 0K 30K 30 60 60"); 3479 CheckExpectedBuffers("0K 0K 30K 30 60 60");
3415 } 3480 }
3416 3481
3417 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_Invalid_1) { 3482 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_Invalid_1) {
3483 EXPECT_MEDIA_LOG_STRING(ContainsSameTimestampAt30MillisecondsLog());
3484
3418 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, 3485 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
3419 44100, NULL, 0, false); 3486 44100, NULL, 0, false);
3420 stream_.reset(new SourceBufferStream(config, new MediaLog(), true)); 3487 stream_.reset(new SourceBufferStream(config, media_log_, true));
3421 Seek(0); 3488 Seek(0);
3422 NewSegmentAppend_ExpectFailure("0K 30 30K 60"); 3489 NewSegmentAppend_ExpectFailure("0K 30 30K 60");
3423 } 3490 }
3424 3491
3425 // If seeking past any existing range and the seek is pending 3492 // If seeking past any existing range and the seek is pending
3426 // because no data has been provided for that position, 3493 // because no data has been provided for that position,
3427 // the stream position can be considered as the end of stream. 3494 // the stream position can be considered as the end of stream.
3428 TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) { 3495 TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) {
3429 // Append 15 buffers at positions 0 through 14. 3496 // Append 15 buffers at positions 0 through 14.
3430 NewSegmentAppend(0, 15); 3497 NewSegmentAppend(0, 15);
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
3887 CheckExpectedBuffers("7K C"); 3954 CheckExpectedBuffers("7K C");
3888 CheckVideoConfig(new_config); 3955 CheckVideoConfig(new_config);
3889 CheckExpectedBuffers("8 9 C"); 3956 CheckExpectedBuffers("8 9 C");
3890 CheckExpectedBuffers("10 C"); 3957 CheckExpectedBuffers("10 C");
3891 CheckVideoConfig(video_config_); 3958 CheckVideoConfig(video_config_);
3892 CheckExpectedBuffers("20"); 3959 CheckExpectedBuffers("20");
3893 CheckNoNextBuffer(); 3960 CheckNoNextBuffer();
3894 } 3961 }
3895 3962
3896 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) { 3963 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) {
3964 EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
3965
3897 SetAudioStream(); 3966 SetAudioStream();
3898 Seek(0); 3967 Seek(0);
3899 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); 3968 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3900 NewSegmentAppend("11K 13K 15K 17K"); 3969 NewSegmentAppend("11K 13K 15K 17K");
3901 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); 3970 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
3902 CheckNoNextBuffer(); 3971 CheckNoNextBuffer();
3903 } 3972 }
3904 3973
3905 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) { 3974 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) {
3975 EXPECT_MEDIA_LOG_STRING(
3976 HasSubstr("Skipping splice frame generation: first new buffer at 10000us "
3977 "begins at or before existing buffer at 10000us."));
3978
3906 SetAudioStream(); 3979 SetAudioStream();
3907 Seek(0); 3980 Seek(0);
3908 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); 3981 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3909 NewSegmentAppend("10K 14K"); 3982 NewSegmentAppend("10K 14K");
3910 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K"); 3983 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K");
3911 CheckNoNextBuffer(); 3984 CheckNoNextBuffer();
3912 } 3985 }
3913 3986
3914 // Do not allow splices on top of splices. 3987 // Do not allow splices on top of splices.
3915 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) { 3988 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) {
3989 InSequence s;
3990 EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
3991 EXPECT_MEDIA_LOG_STRING(
3992 HasSubstr("Skipping splice frame generation: overlapped buffers at "
3993 "10000us are in a previously buffered splice."));
3994
3916 SetAudioStream(); 3995 SetAudioStream();
3917 Seek(0); 3996 Seek(0);
3918 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); 3997 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3919 NewSegmentAppend("11K 13K 15K 17K"); 3998 NewSegmentAppend("11K 13K 15K 17K");
3920 3999
3921 // Verify the splice was created. 4000 // Verify the splice was created.
3922 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); 4001 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
3923 CheckNoNextBuffer(); 4002 CheckNoNextBuffer();
3924 Seek(0); 4003 Seek(0);
3925 4004
(...skipping 11 matching lines...) Expand all
3937 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) { 4016 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) {
3938 SetAudioStream(); 4017 SetAudioStream();
3939 Seek(0); 4018 Seek(0);
3940 NewSegmentAppend("0K 2K 4K 6K 8K 10K"); 4019 NewSegmentAppend("0K 2K 4K 6K 8K 10K");
3941 NewSegmentAppend("12K 14K 16K 18K"); 4020 NewSegmentAppend("12K 14K 16K 18K");
3942 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K"); 4021 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K");
3943 CheckNoNextBuffer(); 4022 CheckNoNextBuffer();
3944 } 4023 }
3945 4024
3946 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) { 4025 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) {
4026 EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(5000, 1000));
4027
3947 SetAudioStream(); 4028 SetAudioStream();
3948 Seek(0); 4029 Seek(0);
3949 NewSegmentAppend("0K 2K 4K"); 4030 NewSegmentAppend("0K 2K 4K");
3950 CheckExpectedRangesByTimestamp("{ [0,6) }"); 4031 CheckExpectedRangesByTimestamp("{ [0,6) }");
3951 NewSegmentAppend("6K 8K 10K"); 4032 NewSegmentAppend("6K 8K 10K");
3952 CheckExpectedRangesByTimestamp("{ [0,12) }"); 4033 CheckExpectedRangesByTimestamp("{ [0,12) }");
3953 NewSegmentAppend("1K 4D2K"); 4034 NewSegmentAppend("1K 4D2K");
3954 CheckExpectedRangesByTimestamp("{ [0,12) }"); 4035 CheckExpectedRangesByTimestamp("{ [0,12) }");
3955 CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K"); 4036 CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K");
3956 CheckNoNextBuffer(); 4037 CheckNoNextBuffer();
3957 } 4038 }
3958 4039
3959 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) { 4040 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) {
4041 EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 5000));
4042
3960 SetAudioStream(); 4043 SetAudioStream();
3961 4044
3962 AudioDecoderConfig new_config(kCodecVorbis, 4045 AudioDecoderConfig new_config(kCodecVorbis,
3963 kSampleFormatPlanarF32, 4046 kSampleFormatPlanarF32,
3964 CHANNEL_LAYOUT_MONO, 4047 CHANNEL_LAYOUT_MONO,
3965 1000, 4048 1000,
3966 NULL, 4049 NULL,
3967 0, 4050 0,
3968 false); 4051 false);
3969 ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout()); 4052 ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout());
3970 4053
3971 Seek(0); 4054 Seek(0);
3972 CheckAudioConfig(audio_config_); 4055 CheckAudioConfig(audio_config_);
3973 NewSegmentAppend("0K 2K 4K 6K"); 4056 NewSegmentAppend("0K 2K 4K 6K");
3974 stream_->UpdateAudioConfig(new_config); 4057 stream_->UpdateAudioConfig(new_config);
3975 NewSegmentAppend("5K 8K 12K"); 4058 NewSegmentAppend("5K 8K 12K");
3976 CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K"); 4059 CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K");
3977 CheckAudioConfig(new_config); 4060 CheckAudioConfig(new_config);
3978 CheckNoNextBuffer(); 4061 CheckNoNextBuffer();
3979 } 4062 }
3980 4063
3981 // Ensure splices are not created if there are not enough frames to crossfade. 4064 // Ensure splices are not created if there are not enough frames to crossfade.
3982 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) { 4065 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) {
4066 EXPECT_MEDIA_LOG_STRING(HasSubstr(
4067 "Skipping splice frame generation: not enough samples for splicing new "
4068 "buffer at 1000us. Have 1000us, but need 2000us."));
4069
3983 SetAudioStream(); 4070 SetAudioStream();
3984 Seek(0); 4071 Seek(0);
3985 4072
3986 // Overlap the range [0, 2) with [1, 3). Since each frame has a duration of 4073 // Overlap the range [0, 2) with [1, 3). Since each frame has a duration of
3987 // 2ms this results in an overlap of 1ms between the ranges. A splice frame 4074 // 2ms this results in an overlap of 1ms between the ranges. A splice frame
3988 // should not be generated since it requires at least 2 frames, or 2ms in this 4075 // should not be generated since it requires at least 2 frames, or 2ms in this
3989 // case, of data to crossfade. 4076 // case, of data to crossfade.
3990 NewSegmentAppend("0D2K"); 4077 NewSegmentAppend("0D2K");
3991 CheckExpectedRangesByTimestamp("{ [0,2) }"); 4078 CheckExpectedRangesByTimestamp("{ [0,2) }");
3992 NewSegmentAppend("1D2K"); 4079 NewSegmentAppend("1D2K");
3993 CheckExpectedRangesByTimestamp("{ [0,3) }"); 4080 CheckExpectedRangesByTimestamp("{ [0,3) }");
3994 CheckExpectedBuffers("0K 1K"); 4081 CheckExpectedBuffers("0K 1K");
3995 CheckNoNextBuffer(); 4082 CheckNoNextBuffer();
3996 } 4083 }
3997 4084
3998 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) { 4085 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) {
4086 EXPECT_MEDIA_LOG_STRING(
4087 HasSubstr("Skipping splice frame generation: not enough samples for "
4088 "splicing new buffer at 1250us. Have 750us, but need 1000us."));
4089
3999 video_config_ = TestVideoConfig::Invalid(); 4090 video_config_ = TestVideoConfig::Invalid();
4000 audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32, 4091 audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32,
4001 CHANNEL_LAYOUT_STEREO, 4000, NULL, 0, false, false, 4092 CHANNEL_LAYOUT_STEREO, 4000, NULL, 0, false, false,
4002 base::TimeDelta(), 0); 4093 base::TimeDelta(), 0);
4003 stream_.reset(new SourceBufferStream(audio_config_, new MediaLog(), true)); 4094 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true));
4004 // Equivalent to 0.5ms per frame. 4095 // Equivalent to 0.5ms per frame.
4005 SetStreamInfo(2000, 2000); 4096 SetStreamInfo(2000, 2000);
4006 Seek(0); 4097 Seek(0);
4007 4098
4008 // Append four buffers with a 0.5ms duration each. 4099 // Append four buffers with a 0.5ms duration each.
4009 NewSegmentAppend(0, 4); 4100 NewSegmentAppend(0, 4);
4010 CheckExpectedRangesByTimestamp("{ [0,2) }"); 4101 CheckExpectedRangesByTimestamp("{ [0,2) }");
4011 4102
4012 // Overlap the range [0, 2) with [1.25, 2); this results in an overlap of 4103 // Overlap the range [0, 2) with [1.25, 2); this results in an overlap of
4013 // 0.75ms between the ranges. 4104 // 0.75ms between the ranges.
4014 NewSegmentAppend_OffsetFirstBuffer(2, 2, 4105 NewSegmentAppend_OffsetFirstBuffer(2, 2,
4015 base::TimeDelta::FromMillisecondsD(0.25)); 4106 base::TimeDelta::FromMillisecondsD(0.25));
4016 CheckExpectedRangesByTimestamp("{ [0,2) }"); 4107 CheckExpectedRangesByTimestamp("{ [0,2) }");
4017 4108
4018 // A splice frame should not be generated (indicated by the lack of a config 4109 // A splice frame should not be generated (indicated by the lack of a config
4019 // change in the expected buffer string) since it requires at least 1ms of 4110 // change in the expected buffer string) since it requires at least 1ms of
4020 // data to crossfade. 4111 // data to crossfade.
4021 CheckExpectedBuffers("0K 0K 1K 1K 1K"); 4112 CheckExpectedBuffers("0K 0K 1K 1K 1K");
4022 CheckNoNextBuffer(); 4113 CheckNoNextBuffer();
4023 } 4114 }
4024 4115
4025 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) { 4116 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) {
4117 EXPECT_MEDIA_LOG_STRING(ContainsGeneratedSpliceLog(3000, 11000));
4118
4026 SetAudioStream(); 4119 SetAudioStream();
4027 Seek(0); 4120 Seek(0);
4028 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); 4121 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
4029 NewSegmentAppend("11P 13K 15K 17K"); 4122 NewSegmentAppend("11P 13K 15K 17K");
4030 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K"); 4123 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K");
4031 CheckNoNextBuffer(); 4124 CheckNoNextBuffer();
4032 } 4125 }
4033 4126
4034 TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) { 4127 TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) {
4035 Seek(0); 4128 Seek(0);
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after
4278 CheckVideoConfig(video_config_); 4371 CheckVideoConfig(video_config_);
4279 CheckExpectedBuffers("2000K 2010 2020D10"); 4372 CheckExpectedBuffers("2000K 2010 2020D10");
4280 CheckVideoConfig(video_config_); 4373 CheckVideoConfig(video_config_);
4281 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); 4374 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
4282 CheckVideoConfig(new_config); 4375 CheckVideoConfig(new_config);
4283 CheckExpectedBuffers("2030K 2040 2050D10"); 4376 CheckExpectedBuffers("2030K 2040 2050D10");
4284 CheckNoNextBuffer(); 4377 CheckNoNextBuffer();
4285 CheckVideoConfig(new_config); 4378 CheckVideoConfig(new_config);
4286 } 4379 }
4287 4380
4381 TEST_F(SourceBufferStreamTest, TrackBuffer_ExhaustionWithSkipForward) {
4382 NewSegmentAppend("0K 10 20 30 40");
4383
4384 // Read the first 4 buffers, so next buffer is at time 40.
4385 Seek(0);
4386 CheckExpectedRangesByTimestamp("{ [0,50) }");
4387 CheckExpectedBuffers("0K 10 20 30");
4388
4389 // Overlap-append, populating track buffer with timestamp 40 from original
4390 // append. Confirm there could be a large jump in time until the next key
4391 // frame after exhausting the track buffer.
4392 NewSegmentAppend(
4393 "31K 41 51 61 71 81 91 101 111 121 "
4394 "131K 141");
4395 CheckExpectedRangesByTimestamp("{ [0,151) }");
4396
4397 // Confirm the large jump occurs and warning log is generated.
4398 // If this test is changed, update
4399 // TrackBufferExhaustion_ImmediateNewTrackBuffer accordingly.
4400 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(91));
4401
4402 CheckExpectedBuffers("40 131K 141");
4403 CheckNoNextBuffer();
4404 }
4405
4406 TEST_F(SourceBufferStreamTest,
4407 TrackBuffer_ExhaustionAndImmediateNewTrackBuffer) {
4408 NewSegmentAppend("0K 10 20 30 40");
4409
4410 // Read the first 4 buffers, so next buffer is at time 40.
4411 Seek(0);
4412 CheckExpectedRangesByTimestamp("{ [0,50) }");
4413 CheckExpectedBuffers("0K 10 20 30");
4414
4415 // Overlap-append
4416 NewSegmentAppend(
4417 "31K 41 51 61 71 81 91 101 111 121 "
4418 "131K 141");
4419 CheckExpectedRangesByTimestamp("{ [0,151) }");
4420
4421 // Exhaust the track buffer, but don't read any of the overlapping append yet.
4422 CheckExpectedBuffers("40");
4423
4424 // Selected range's next buffer is now the 131K buffer from the overlapping
4425 // append. (See TrackBuffer_ExhaustionWithSkipForward for that verification.)
4426 // Do another overlap-append to immediately create another track buffer and
4427 // verify both track buffer exhaustions skip forward and emit log warnings.
4428 NewSegmentAppend("22K 32 42 52 62 72 82 92 102 112 122K 132 142 152K 162");
4429 CheckExpectedRangesByTimestamp("{ [0,172) }");
4430
4431 InSequence s;
4432 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(91));
4433 EXPECT_MEDIA_LOG_STRING(ContainsTrackBufferExhaustionSkipLog(11));
4434
4435 CheckExpectedBuffers("131K 141 152K 162");
4436 CheckNoNextBuffer();
4437 }
4438
4288 // TODO(vrk): Add unit tests where keyframes are unaligned between streams. 4439 // TODO(vrk): Add unit tests where keyframes are unaligned between streams.
4289 // (crbug.com/133557) 4440 // (crbug.com/133557)
4290 4441
4291 // TODO(vrk): Add unit tests with end of stream being called at interesting 4442 // TODO(vrk): Add unit tests with end of stream being called at interesting
4292 // times. 4443 // times.
4293 4444
4294 } // namespace media 4445 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698