OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |