Chromium Code Reviews| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <string> | 9 #include <string> |
| 10 #include <vector> | 10 #include <vector> |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 typedef StreamParser::BufferQueue BufferQueue; | 35 typedef StreamParser::BufferQueue BufferQueue; |
| 36 | 36 |
| 37 static const int kDefaultFramesPerSecond = 30; | 37 static const int kDefaultFramesPerSecond = 30; |
| 38 static const int kDefaultKeyframesPerSecond = 6; | 38 static const int kDefaultKeyframesPerSecond = 6; |
| 39 static const uint8_t kDataA = 0x11; | 39 static const uint8_t kDataA = 0x11; |
| 40 static const uint8_t kDataB = 0x33; | 40 static const uint8_t kDataB = 0x33; |
| 41 static const int kDataSize = 1; | 41 static const int kDataSize = 1; |
| 42 | 42 |
| 43 // Matchers for verifying common media log entry strings. | 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, "") { | 44 MATCHER(ContainsSameTimestampAt30MillisecondsLog, "") { |
| 52 return CONTAINS_STRING(arg, | 45 return CONTAINS_STRING(arg, |
| 53 "Unexpected combination of buffers with the same " | 46 "Detected an append sequence with keyframe following " |
| 54 "timestamp detected at 0.03"); | 47 "a non-keyframe, both with the same decode timestamp " |
| 48 "of 0.03"); | |
| 55 } | 49 } |
| 56 | 50 |
| 57 MATCHER_P(ContainsTrackBufferExhaustionSkipLog, skip_milliseconds, "") { | 51 MATCHER_P(ContainsTrackBufferExhaustionSkipLog, skip_milliseconds, "") { |
| 58 return CONTAINS_STRING(arg, | 52 return CONTAINS_STRING(arg, |
| 59 "Media append that overlapped current playback " | 53 "Media append that overlapped current playback " |
| 60 "position caused time gap in playing VIDEO stream " | 54 "position caused time gap in playing VIDEO stream " |
| 61 "because the next keyframe is " + | 55 "because the next keyframe is " + |
| 62 base::IntToString(skip_milliseconds) + | 56 base::IntToString(skip_milliseconds) + |
| 63 "ms beyond last overlapped frame. Media may " | 57 "ms beyond last overlapped frame. Media may " |
| 64 "appear temporarily frozen."); | 58 "appear temporarily frozen."); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 108 EmptyExtraData(), | 102 EmptyExtraData(), |
| 109 false, | 103 false, |
| 110 base::TimeDelta(), | 104 base::TimeDelta(), |
| 111 0); | 105 0); |
| 112 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true)); | 106 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true)); |
| 113 | 107 |
| 114 // Equivalent to 2ms per frame. | 108 // Equivalent to 2ms per frame. |
| 115 SetStreamInfo(500, 500); | 109 SetStreamInfo(500, 500); |
| 116 } | 110 } |
| 117 | 111 |
| 118 void NewSegmentAppend(int starting_position, int number_of_buffers) { | 112 void NewCodedFrameGroupAppend(int starting_position, int number_of_buffers) { |
| 119 AppendBuffers(starting_position, number_of_buffers, true, | 113 AppendBuffers(starting_position, number_of_buffers, true, |
| 120 base::TimeDelta(), true, &kDataA, kDataSize); | 114 base::TimeDelta(), true, &kDataA, kDataSize); |
| 121 } | 115 } |
| 122 | 116 |
| 123 void NewSegmentAppend(int starting_position, | 117 void NewCodedFrameGroupAppend(int starting_position, |
| 124 int number_of_buffers, | 118 int number_of_buffers, |
| 125 const uint8_t* data) { | 119 const uint8_t* data) { |
| 126 AppendBuffers(starting_position, number_of_buffers, true, | 120 AppendBuffers(starting_position, number_of_buffers, true, |
| 127 base::TimeDelta(), true, data, kDataSize); | 121 base::TimeDelta(), true, data, kDataSize); |
| 128 } | 122 } |
| 129 | 123 |
| 130 void NewSegmentAppend_OffsetFirstBuffer( | 124 void NewCodedFrameGroupAppend_OffsetFirstBuffer( |
| 131 int starting_position, int number_of_buffers, | 125 int starting_position, |
| 126 int number_of_buffers, | |
| 132 base::TimeDelta first_buffer_offset) { | 127 base::TimeDelta first_buffer_offset) { |
| 133 AppendBuffers(starting_position, number_of_buffers, true, | 128 AppendBuffers(starting_position, number_of_buffers, true, |
| 134 first_buffer_offset, true, &kDataA, kDataSize); | 129 first_buffer_offset, true, &kDataA, kDataSize); |
| 135 } | 130 } |
| 136 | 131 |
| 137 void NewSegmentAppend_ExpectFailure( | 132 void NewCodedFrameGroupAppend_ExpectFailure(int starting_position, |
| 138 int starting_position, int number_of_buffers) { | 133 int number_of_buffers) { |
| 139 AppendBuffers(starting_position, number_of_buffers, true, | 134 AppendBuffers(starting_position, number_of_buffers, true, |
| 140 base::TimeDelta(), false, &kDataA, kDataSize); | 135 base::TimeDelta(), false, &kDataA, kDataSize); |
| 141 } | 136 } |
| 142 | 137 |
| 143 void AppendBuffers(int starting_position, int number_of_buffers) { | 138 void AppendBuffers(int starting_position, int number_of_buffers) { |
| 144 AppendBuffers(starting_position, number_of_buffers, false, | 139 AppendBuffers(starting_position, number_of_buffers, false, |
| 145 base::TimeDelta(), true, &kDataA, kDataSize); | 140 base::TimeDelta(), true, &kDataA, kDataSize); |
| 146 } | 141 } |
| 147 | 142 |
| 148 void AppendBuffers(int starting_position, | 143 void AppendBuffers(int starting_position, |
| 149 int number_of_buffers, | 144 int number_of_buffers, |
| 150 const uint8_t* data) { | 145 const uint8_t* data) { |
| 151 AppendBuffers(starting_position, number_of_buffers, false, | 146 AppendBuffers(starting_position, number_of_buffers, false, |
| 152 base::TimeDelta(), true, data, kDataSize); | 147 base::TimeDelta(), true, data, kDataSize); |
| 153 } | 148 } |
| 154 | 149 |
| 155 void NewSegmentAppend(const std::string& buffers_to_append) { | 150 void NewCodedFrameGroupAppend(const std::string& buffers_to_append) { |
| 156 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, true); | 151 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, true); |
| 157 } | 152 } |
| 158 | 153 |
| 159 void NewSegmentAppend(base::TimeDelta start_timestamp, | 154 void NewCodedFrameGroupAppend(base::TimeDelta start_timestamp, |
| 160 const std::string& buffers_to_append) { | 155 const std::string& buffers_to_append) { |
| 161 AppendBuffers(buffers_to_append, true, start_timestamp, false, true); | 156 AppendBuffers(buffers_to_append, true, start_timestamp, false, true); |
| 162 } | 157 } |
| 163 | 158 |
| 164 void AppendBuffers(const std::string& buffers_to_append) { | 159 void AppendBuffers(const std::string& buffers_to_append) { |
| 165 AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, true); | 160 AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, true); |
| 166 } | 161 } |
| 167 | 162 |
| 168 void NewSegmentAppendOneByOne(const std::string& buffers_to_append) { | 163 void NewCodedFrameGroupAppendOneByOne(const std::string& buffers_to_append) { |
| 169 AppendBuffers(buffers_to_append, true, kNoTimestamp(), true, true); | 164 AppendBuffers(buffers_to_append, true, kNoTimestamp(), true, true); |
| 170 } | 165 } |
| 171 | 166 |
| 172 void AppendBuffersOneByOne(const std::string& buffers_to_append) { | 167 void AppendBuffersOneByOne(const std::string& buffers_to_append) { |
| 173 AppendBuffers(buffers_to_append, false, kNoTimestamp(), true, true); | 168 AppendBuffers(buffers_to_append, false, kNoTimestamp(), true, true); |
| 174 } | 169 } |
| 175 | 170 |
| 176 void NewSegmentAppend_ExpectFailure(const std::string& buffers_to_append) { | 171 void NewCodedFrameGroupAppend_ExpectFailure( |
| 172 const std::string& buffers_to_append) { | |
| 177 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, false); | 173 AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, false); |
| 178 } | 174 } |
| 179 | 175 |
| 180 void AppendBuffers_ExpectFailure(const std::string& buffers_to_append) { | 176 void AppendBuffers_ExpectFailure(const std::string& buffers_to_append) { |
| 181 AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, false); | 177 AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, false); |
| 182 } | 178 } |
| 183 | 179 |
| 184 void Seek(int position) { | 180 void Seek(int position) { |
| 185 stream_->Seek(position * frame_duration_); | 181 stream_->Seek(position * frame_duration_); |
| 186 } | 182 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 199 Remove(base::TimeDelta::FromMilliseconds(start), | 195 Remove(base::TimeDelta::FromMilliseconds(start), |
| 200 base::TimeDelta::FromMilliseconds(end), | 196 base::TimeDelta::FromMilliseconds(end), |
| 201 base::TimeDelta::FromMilliseconds(duration)); | 197 base::TimeDelta::FromMilliseconds(duration)); |
| 202 } | 198 } |
| 203 | 199 |
| 204 void Remove(base::TimeDelta start, base::TimeDelta end, | 200 void Remove(base::TimeDelta start, base::TimeDelta end, |
| 205 base::TimeDelta duration) { | 201 base::TimeDelta duration) { |
| 206 stream_->Remove(start, end, duration); | 202 stream_->Remove(start, end, duration); |
| 207 } | 203 } |
| 208 | 204 |
| 205 void SignalStartOfCodedFrameGroup(base::TimeDelta start_timestamp) { | |
| 206 stream_->OnStartOfCodedFrameGroup( | |
| 207 DecodeTimestamp::FromPresentationTime(start_timestamp)); | |
| 208 } | |
| 209 | |
| 209 int GetRemovalRangeInMs(int start, int end, int bytes_to_free, | 210 int GetRemovalRangeInMs(int start, int end, int bytes_to_free, |
| 210 int* removal_end) { | 211 int* removal_end) { |
| 211 DecodeTimestamp removal_end_timestamp = | 212 DecodeTimestamp removal_end_timestamp = |
| 212 DecodeTimestamp::FromMilliseconds(*removal_end); | 213 DecodeTimestamp::FromMilliseconds(*removal_end); |
| 213 int bytes_removed = stream_->GetRemovalRange( | 214 int bytes_removed = stream_->GetRemovalRange( |
| 214 DecodeTimestamp::FromMilliseconds(start), | 215 DecodeTimestamp::FromMilliseconds(start), |
| 215 DecodeTimestamp::FromMilliseconds(end), bytes_to_free, | 216 DecodeTimestamp::FromMilliseconds(end), bytes_to_free, |
| 216 &removal_end_timestamp); | 217 &removal_end_timestamp); |
| 217 *removal_end = removal_end_timestamp.InMilliseconds(); | 218 *removal_end = removal_end_timestamp.InMilliseconds(); |
| 218 return bytes_removed; | 219 return bytes_removed; |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 432 scoped_refptr<StrictMock<MockMediaLog>> media_log_; | 433 scoped_refptr<StrictMock<MockMediaLog>> media_log_; |
| 433 | 434 |
| 434 private: | 435 private: |
| 435 base::TimeDelta ConvertToFrameDuration(int frames_per_second) { | 436 base::TimeDelta ConvertToFrameDuration(int frames_per_second) { |
| 436 return base::TimeDelta::FromMicroseconds( | 437 return base::TimeDelta::FromMicroseconds( |
| 437 base::Time::kMicrosecondsPerSecond / frames_per_second); | 438 base::Time::kMicrosecondsPerSecond / frames_per_second); |
| 438 } | 439 } |
| 439 | 440 |
| 440 void AppendBuffers(int starting_position, | 441 void AppendBuffers(int starting_position, |
| 441 int number_of_buffers, | 442 int number_of_buffers, |
| 442 bool begin_media_segment, | 443 bool begin_coded_frame_group, |
| 443 base::TimeDelta first_buffer_offset, | 444 base::TimeDelta first_buffer_offset, |
| 444 bool expect_success, | 445 bool expect_success, |
| 445 const uint8_t* data, | 446 const uint8_t* data, |
| 446 int size) { | 447 int size) { |
| 447 if (begin_media_segment) | 448 if (begin_coded_frame_group) |
| 448 stream_->OnNewMediaSegment(DecodeTimestamp::FromPresentationTime( | 449 stream_->OnStartOfCodedFrameGroup(DecodeTimestamp::FromPresentationTime( |
| 449 starting_position * frame_duration_)); | 450 starting_position * frame_duration_)); |
| 450 | 451 |
| 451 int keyframe_interval = frames_per_second_ / keyframes_per_second_; | 452 int keyframe_interval = frames_per_second_ / keyframes_per_second_; |
| 452 | 453 |
| 453 BufferQueue queue; | 454 BufferQueue queue; |
| 454 for (int i = 0; i < number_of_buffers; i++) { | 455 for (int i = 0; i < number_of_buffers; i++) { |
| 455 int position = starting_position + i; | 456 int position = starting_position + i; |
| 456 bool is_keyframe = position % keyframe_interval == 0; | 457 bool is_keyframe = position % keyframe_interval == 0; |
| 457 // Buffer type and track ID are meaningless to these tests. | 458 // Buffer type and track ID are meaningless to these tests. |
| 458 scoped_refptr<StreamParserBuffer> buffer = | 459 scoped_refptr<StreamParserBuffer> buffer = |
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 680 if (buffers.size() >= 2 && | 681 if (buffers.size() >= 2 && |
| 681 buffers.back()->duration() <= base::TimeDelta()) { | 682 buffers.back()->duration() <= base::TimeDelta()) { |
| 682 buffers.back()->set_duration( | 683 buffers.back()->set_duration( |
| 683 buffers[buffers.size() - 2]->duration()); | 684 buffers[buffers.size() - 2]->duration()); |
| 684 } | 685 } |
| 685 | 686 |
| 686 return buffers; | 687 return buffers; |
| 687 } | 688 } |
| 688 | 689 |
| 689 void AppendBuffers(const std::string& buffers_to_append, | 690 void AppendBuffers(const std::string& buffers_to_append, |
| 690 bool start_new_segment, | 691 bool start_new_coded_frame_group, |
| 691 base::TimeDelta segment_start_timestamp, | 692 base::TimeDelta coded_frame_group_start_timestamp, |
| 692 bool one_by_one, | 693 bool one_by_one, |
| 693 bool expect_success) { | 694 bool expect_success) { |
| 694 BufferQueue buffers = StringToBufferQueue(buffers_to_append); | 695 BufferQueue buffers = StringToBufferQueue(buffers_to_append); |
| 695 | 696 |
| 696 if (start_new_segment) { | 697 if (start_new_coded_frame_group) { |
| 697 base::TimeDelta start_timestamp = segment_start_timestamp; | 698 base::TimeDelta start_timestamp = coded_frame_group_start_timestamp; |
| 698 if (start_timestamp == kNoTimestamp()) | 699 if (start_timestamp == kNoTimestamp()) |
| 699 start_timestamp = buffers[0]->timestamp(); | 700 start_timestamp = buffers[0]->timestamp(); |
| 700 | 701 |
| 701 ASSERT_TRUE(start_timestamp <= buffers[0]->timestamp()); | 702 ASSERT_TRUE(start_timestamp <= buffers[0]->timestamp()); |
| 702 | 703 |
| 703 stream_->OnNewMediaSegment( | 704 stream_->OnStartOfCodedFrameGroup( |
| 704 DecodeTimestamp::FromPresentationTime(start_timestamp)); | 705 DecodeTimestamp::FromPresentationTime(start_timestamp)); |
| 705 } | 706 } |
| 706 | 707 |
| 707 if (!one_by_one) { | 708 if (!one_by_one) { |
| 708 EXPECT_EQ(expect_success, stream_->Append(buffers)); | 709 EXPECT_EQ(expect_success, stream_->Append(buffers)); |
| 709 return; | 710 return; |
| 710 } | 711 } |
| 711 | 712 |
| 712 // Append each buffer one by one. | 713 // Append each buffer one by one. |
| 713 for (size_t i = 0; i < buffers.size(); i++) { | 714 for (size_t i = 0; i < buffers.size(); i++) { |
| 714 BufferQueue wrapper; | 715 BufferQueue wrapper; |
| 715 wrapper.push_back(buffers[i]); | 716 wrapper.push_back(buffers[i]); |
| 716 EXPECT_TRUE(stream_->Append(wrapper)); | 717 EXPECT_TRUE(stream_->Append(wrapper)); |
| 717 } | 718 } |
| 718 } | 719 } |
| 719 | 720 |
| 720 int frames_per_second_; | 721 int frames_per_second_; |
| 721 int keyframes_per_second_; | 722 int keyframes_per_second_; |
| 722 base::TimeDelta frame_duration_; | 723 base::TimeDelta frame_duration_; |
| 723 DISALLOW_COPY_AND_ASSIGN(SourceBufferStreamTest); | 724 DISALLOW_COPY_AND_ASSIGN(SourceBufferStreamTest); |
| 724 }; | 725 }; |
| 725 | 726 |
| 726 TEST_F(SourceBufferStreamTest, Append_SingleRange) { | 727 TEST_F(SourceBufferStreamTest, Append_SingleRange) { |
| 727 // Append 15 buffers at positions 0 through 14. | 728 // Append 15 buffers at positions 0 through 14. |
| 728 NewSegmentAppend(0, 15); | 729 NewCodedFrameGroupAppend(0, 15); |
| 729 | 730 |
| 730 // Check expected range. | 731 // Check expected range. |
| 731 CheckExpectedRanges("{ [0,14) }"); | 732 CheckExpectedRanges("{ [0,14) }"); |
| 732 // Check buffers in range. | 733 // Check buffers in range. |
| 733 Seek(0); | 734 Seek(0); |
| 734 CheckExpectedBuffers(0, 14); | 735 CheckExpectedBuffers(0, 14); |
| 735 } | 736 } |
| 736 | 737 |
| 737 TEST_F(SourceBufferStreamTest, Append_SingleRange_OneBufferAtATime) { | 738 TEST_F(SourceBufferStreamTest, Append_SingleRange_OneBufferAtATime) { |
| 738 // Append 15 buffers starting at position 0, one buffer at a time. | 739 // Append 15 buffers starting at position 0, one buffer at a time. |
| 739 NewSegmentAppend(0, 1); | 740 NewCodedFrameGroupAppend(0, 1); |
| 740 for (int i = 1; i < 15; i++) | 741 for (int i = 1; i < 15; i++) |
| 741 AppendBuffers(i, 1); | 742 AppendBuffers(i, 1); |
| 742 | 743 |
| 743 // Check expected range. | 744 // Check expected range. |
| 744 CheckExpectedRanges("{ [0,14) }"); | 745 CheckExpectedRanges("{ [0,14) }"); |
| 745 // Check buffers in range. | 746 // Check buffers in range. |
| 746 Seek(0); | 747 Seek(0); |
| 747 CheckExpectedBuffers(0, 14); | 748 CheckExpectedBuffers(0, 14); |
| 748 } | 749 } |
| 749 | 750 |
| 750 TEST_F(SourceBufferStreamTest, Append_DisjointRanges) { | 751 TEST_F(SourceBufferStreamTest, Append_DisjointRanges) { |
| 751 // Append 5 buffers at positions 0 through 4. | 752 // Append 5 buffers at positions 0 through 4. |
| 752 NewSegmentAppend(0, 5); | 753 NewCodedFrameGroupAppend(0, 5); |
| 753 | 754 |
| 754 // Append 10 buffers at positions 15 through 24. | 755 // Append 10 buffers at positions 15 through 24. |
| 755 NewSegmentAppend(15, 10); | 756 NewCodedFrameGroupAppend(15, 10); |
| 756 | 757 |
| 757 // Check expected ranges. | 758 // Check expected ranges. |
| 758 CheckExpectedRanges("{ [0,4) [15,24) }"); | 759 CheckExpectedRanges("{ [0,4) [15,24) }"); |
| 759 // Check buffers in ranges. | 760 // Check buffers in ranges. |
| 760 Seek(0); | 761 Seek(0); |
| 761 CheckExpectedBuffers(0, 4); | 762 CheckExpectedBuffers(0, 4); |
| 762 Seek(15); | 763 Seek(15); |
| 763 CheckExpectedBuffers(15, 24); | 764 CheckExpectedBuffers(15, 24); |
| 764 } | 765 } |
| 765 | 766 |
| 766 TEST_F(SourceBufferStreamTest, Append_AdjacentRanges) { | 767 TEST_F(SourceBufferStreamTest, Append_AdjacentRanges) { |
| 767 // Append 10 buffers at positions 0 through 9. | 768 // Append 10 buffers at positions 0 through 9. |
| 768 NewSegmentAppend(0, 10); | 769 NewCodedFrameGroupAppend(0, 10); |
| 769 | 770 |
| 770 // Append 11 buffers at positions 15 through 25. | 771 // Append 11 buffers at positions 15 through 25. |
| 771 NewSegmentAppend(15, 11); | 772 NewCodedFrameGroupAppend(15, 11); |
| 772 | 773 |
| 773 // Append 5 buffers at positions 10 through 14 to bridge the gap. | 774 // Append 5 buffers at positions 10 through 14 to bridge the gap. |
| 774 NewSegmentAppend(10, 5); | 775 NewCodedFrameGroupAppend(10, 5); |
| 775 | 776 |
| 776 // Check expected range. | 777 // Check expected range. |
| 777 CheckExpectedRanges("{ [0,25) }"); | 778 CheckExpectedRanges("{ [0,25) }"); |
| 778 // Check buffers in range. | 779 // Check buffers in range. |
| 779 Seek(0); | 780 Seek(0); |
| 780 CheckExpectedBuffers(0, 25); | 781 CheckExpectedBuffers(0, 25); |
| 781 } | 782 } |
| 782 | 783 |
| 783 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) { | |
| 784 EXPECT_MEDIA_LOG(ContainsMissingKeyframeLog()).Times(2); | |
| 785 | |
| 786 // Append fails because the range doesn't begin with a keyframe. | |
| 787 NewSegmentAppend_ExpectFailure(3, 2); | |
| 788 | |
| 789 // Append 10 buffers at positions 5 through 14. | |
| 790 NewSegmentAppend(5, 10); | |
| 791 | |
| 792 // Check expected range. | |
| 793 CheckExpectedRanges("{ [5,14) }"); | |
| 794 // Check buffers in range. | |
| 795 Seek(5); | |
| 796 CheckExpectedBuffers(5, 14); | |
| 797 | |
| 798 // Append fails because the range doesn't begin with a keyframe. | |
| 799 NewSegmentAppend_ExpectFailure(17, 3); | |
| 800 | |
| 801 CheckExpectedRanges("{ [5,14) }"); | |
| 802 Seek(5); | |
| 803 CheckExpectedBuffers(5, 14); | |
| 804 } | |
| 805 | |
| 806 TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe_Adjacent) { | |
| 807 EXPECT_MEDIA_LOG(ContainsMissingKeyframeLog()); | |
| 808 | |
| 809 // Append 8 buffers at positions 0 through 7. | |
| 810 NewSegmentAppend(0, 8); | |
| 811 | |
| 812 // Now start a new media segment at position 8. Append should fail because | |
| 813 // the media segment does not begin with a keyframe. | |
| 814 NewSegmentAppend_ExpectFailure(8, 2); | |
| 815 | |
| 816 // Check expected range. | |
| 817 CheckExpectedRanges("{ [0,7) }"); | |
| 818 // Check buffers in range. | |
| 819 Seek(0); | |
| 820 CheckExpectedBuffers(0, 7); | |
| 821 } | |
| 822 | |
| 823 TEST_F(SourceBufferStreamTest, Complete_Overlap) { | 784 TEST_F(SourceBufferStreamTest, Complete_Overlap) { |
| 824 // Append 5 buffers at positions 5 through 9. | 785 // Append 5 buffers at positions 5 through 9. |
| 825 NewSegmentAppend(5, 5); | 786 NewCodedFrameGroupAppend(5, 5); |
| 826 | 787 |
| 827 // Append 15 buffers at positions 0 through 14. | 788 // Append 15 buffers at positions 0 through 14. |
| 828 NewSegmentAppend(0, 15); | 789 NewCodedFrameGroupAppend(0, 15); |
| 829 | 790 |
| 830 // Check expected range. | 791 // Check expected range. |
| 831 CheckExpectedRanges("{ [0,14) }"); | 792 CheckExpectedRanges("{ [0,14) }"); |
| 832 // Check buffers in range. | 793 // Check buffers in range. |
| 833 Seek(0); | 794 Seek(0); |
| 834 CheckExpectedBuffers(0, 14); | 795 CheckExpectedBuffers(0, 14); |
| 835 } | 796 } |
| 836 | 797 |
| 837 TEST_F(SourceBufferStreamTest, | 798 TEST_F(SourceBufferStreamTest, |
| 838 Complete_Overlap_AfterSegmentTimestampAndBeforeFirstBufferTimestamp) { | 799 Complete_Overlap_AfterGroupTimestampAndBeforeFirstBufferTimestamp) { |
| 839 // Append a segment with a start timestamp of 0, but the first | 800 // Append a coded frame group with a start timestamp of 0, but the first |
| 840 // buffer starts at 30ms. This can happen in muxed content where the | 801 // buffer starts at 30ms. This can happen in muxed content where the |
| 841 // audio starts before the first frame. | 802 // audio starts before the first frame. |
| 842 NewSegmentAppend(base::TimeDelta::FromMilliseconds(0), "30K 60K 90K 120K"); | 803 NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(0), |
| 804 "30K 60K 90K 120K"); | |
| 843 | 805 |
| 844 CheckExpectedRangesByTimestamp("{ [0,150) }"); | 806 CheckExpectedRangesByTimestamp("{ [0,150) }"); |
| 845 | 807 |
| 846 // Completely overlap the old buffers, with a segment that starts | 808 // Completely overlap the old buffers, with a coded frame group that starts |
| 847 // after the old segment start timestamp, but before the timestamp | 809 // after the old coded frame group start timestamp, but before the timestamp |
| 848 // of the first buffer in the segment. | 810 // of the first buffer in the coded frame group. |
| 849 NewSegmentAppend("20K 50K 80K 110D10K"); | 811 NewCodedFrameGroupAppend("20K 50K 80K 110D10K"); |
| 850 | 812 |
| 851 // Verify that the buffered ranges are updated properly and we don't crash. | 813 // Verify that the buffered ranges are updated properly and we don't crash. |
| 852 CheckExpectedRangesByTimestamp("{ [20,150) }"); | 814 CheckExpectedRangesByTimestamp("{ [20,150) }"); |
| 853 | 815 |
| 854 SeekToTimestampMs(20); | 816 SeekToTimestampMs(20); |
| 855 CheckExpectedBuffers("20K 50K 80K 110K 120K"); | 817 CheckExpectedBuffers("20K 50K 80K 110K 120K"); |
| 856 } | 818 } |
| 857 | 819 |
| 858 TEST_F(SourceBufferStreamTest, Complete_Overlap_EdgeCase) { | 820 TEST_F(SourceBufferStreamTest, Complete_Overlap_EdgeCase) { |
| 859 // Make each frame a keyframe so that it's okay to overlap frames at any point | 821 // Make each frame a keyframe so that it's okay to overlap frames at any point |
| 860 // (instead of needing to respect keyframe boundaries). | 822 // (instead of needing to respect keyframe boundaries). |
| 861 SetStreamInfo(30, 30); | 823 SetStreamInfo(30, 30); |
| 862 | 824 |
| 863 // Append 6 buffers at positions 6 through 11. | 825 // Append 6 buffers at positions 6 through 11. |
| 864 NewSegmentAppend(6, 6); | 826 NewCodedFrameGroupAppend(6, 6); |
| 865 | 827 |
| 866 // Append 8 buffers at positions 5 through 12. | 828 // Append 8 buffers at positions 5 through 12. |
| 867 NewSegmentAppend(5, 8); | 829 NewCodedFrameGroupAppend(5, 8); |
| 868 | 830 |
| 869 // Check expected range. | 831 // Check expected range. |
| 870 CheckExpectedRanges("{ [5,12) }"); | 832 CheckExpectedRanges("{ [5,12) }"); |
| 871 // Check buffers in range. | 833 // Check buffers in range. |
| 872 Seek(5); | 834 Seek(5); |
| 873 CheckExpectedBuffers(5, 12); | 835 CheckExpectedBuffers(5, 12); |
| 874 } | 836 } |
| 875 | 837 |
| 876 TEST_F(SourceBufferStreamTest, Start_Overlap) { | 838 TEST_F(SourceBufferStreamTest, Start_Overlap) { |
| 877 // Append 10 buffers at positions 5 through 14. | 839 // Append 10 buffers at positions 5 through 14. |
| 878 NewSegmentAppend(5, 5); | 840 NewCodedFrameGroupAppend(5, 5); |
| 879 | 841 |
| 880 // Append 6 buffers at positions 10 through 15. | 842 // Append 6 buffers at positions 10 through 15. |
| 881 NewSegmentAppend(10, 6); | 843 NewCodedFrameGroupAppend(10, 6); |
| 882 | 844 |
| 883 // Check expected range. | 845 // Check expected range. |
| 884 CheckExpectedRanges("{ [5,15) }"); | 846 CheckExpectedRanges("{ [5,15) }"); |
| 885 // Check buffers in range. | 847 // Check buffers in range. |
| 886 Seek(5); | 848 Seek(5); |
| 887 CheckExpectedBuffers(5, 15); | 849 CheckExpectedBuffers(5, 15); |
| 888 } | 850 } |
| 889 | 851 |
| 890 TEST_F(SourceBufferStreamTest, End_Overlap) { | 852 TEST_F(SourceBufferStreamTest, End_Overlap) { |
| 891 // Append 10 buffers at positions 10 through 19. | 853 // Append 10 buffers at positions 10 through 19. |
| 892 NewSegmentAppend(10, 10); | 854 NewCodedFrameGroupAppend(10, 10); |
| 893 | 855 |
| 894 // Append 10 buffers at positions 5 through 14. | 856 // Append 10 buffers at positions 5 through 14. |
| 895 NewSegmentAppend(5, 10); | 857 NewCodedFrameGroupAppend(5, 10); |
| 896 | 858 |
| 897 // Check expected range. | 859 // Check expected range. |
| 898 CheckExpectedRanges("{ [5,19) }"); | 860 CheckExpectedRanges("{ [5,19) }"); |
| 899 // Check buffers in range. | 861 // Check buffers in range. |
| 900 Seek(5); | 862 Seek(5); |
| 901 CheckExpectedBuffers(5, 19); | 863 CheckExpectedBuffers(5, 19); |
| 902 } | 864 } |
| 903 | 865 |
| 904 TEST_F(SourceBufferStreamTest, End_Overlap_Several) { | 866 TEST_F(SourceBufferStreamTest, End_Overlap_Several) { |
| 905 // Append 10 buffers at positions 10 through 19. | 867 // Append 10 buffers at positions 10 through 19. |
| 906 NewSegmentAppend(10, 10); | 868 NewCodedFrameGroupAppend(10, 10); |
| 907 | 869 |
| 908 // Append 8 buffers at positions 5 through 12. | 870 // Append 8 buffers at positions 5 through 12. |
| 909 NewSegmentAppend(5, 8); | 871 NewCodedFrameGroupAppend(5, 8); |
| 910 | 872 |
| 911 // Check expected ranges: stream should not have kept buffers 13 and 14 | 873 // Check expected ranges: stream should not have kept buffers 13 and 14 |
| 912 // because the keyframe on which they depended was overwritten. | 874 // because the keyframe on which they depended was overwritten. |
| 913 CheckExpectedRanges("{ [5,12) [15,19) }"); | 875 CheckExpectedRanges("{ [5,12) [15,19) }"); |
| 914 | 876 |
| 915 // Check buffers in range. | 877 // Check buffers in range. |
| 916 Seek(5); | 878 Seek(5); |
| 917 CheckExpectedBuffers(5, 12); | 879 CheckExpectedBuffers(5, 12); |
| 918 CheckNoNextBuffer(); | 880 CheckNoNextBuffer(); |
| 919 | 881 |
| 920 Seek(19); | 882 Seek(19); |
| 921 CheckExpectedBuffers(15, 19); | 883 CheckExpectedBuffers(15, 19); |
| 922 } | 884 } |
| 923 | 885 |
| 924 // Test an end overlap edge case where a single buffer overlaps the | 886 // Test an end overlap edge case where a single buffer overlaps the |
| 925 // beginning of a range. | 887 // beginning of a range. |
| 926 // old : *0K* 30 60 90 120K 150 | 888 // old : *0K* 30 60 90 120K 150 |
| 927 // new : *0K* | 889 // new : *0K* |
| 928 // after: *0K* *120K* 150K | 890 // after: *0K* *120K* 150K |
| 929 // track: | 891 // track: |
| 930 TEST_F(SourceBufferStreamTest, End_Overlap_SingleBuffer) { | 892 TEST_F(SourceBufferStreamTest, End_Overlap_SingleBuffer) { |
| 931 // Seek to start of stream. | 893 // Seek to start of stream. |
| 932 SeekToTimestampMs(0); | 894 SeekToTimestampMs(0); |
| 933 | 895 |
| 934 NewSegmentAppend("0K 30 60 90 120K 150"); | 896 NewCodedFrameGroupAppend("0K 30 60 90 120K 150"); |
| 935 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 897 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 936 | 898 |
| 937 NewSegmentAppend("0D30K"); | 899 NewCodedFrameGroupAppend("0D30K"); |
| 938 CheckExpectedRangesByTimestamp("{ [0,30) [120,180) }"); | 900 CheckExpectedRangesByTimestamp("{ [0,30) [120,180) }"); |
| 939 | 901 |
| 940 CheckExpectedBuffers("0K"); | 902 CheckExpectedBuffers("0K"); |
| 941 CheckNoNextBuffer(); | 903 CheckNoNextBuffer(); |
| 942 } | 904 } |
| 943 | 905 |
| 944 TEST_F(SourceBufferStreamTest, Complete_Overlap_Several) { | 906 TEST_F(SourceBufferStreamTest, Complete_Overlap_Several) { |
| 945 // Append 2 buffers at positions 5 through 6. | 907 // Append 2 buffers at positions 5 through 6. |
| 946 NewSegmentAppend(5, 2); | 908 NewCodedFrameGroupAppend(5, 2); |
| 947 | 909 |
| 948 // Append 2 buffers at positions 10 through 11. | 910 // Append 2 buffers at positions 10 through 11. |
| 949 NewSegmentAppend(10, 2); | 911 NewCodedFrameGroupAppend(10, 2); |
| 950 | 912 |
| 951 // Append 2 buffers at positions 15 through 16. | 913 // Append 2 buffers at positions 15 through 16. |
| 952 NewSegmentAppend(15, 2); | 914 NewCodedFrameGroupAppend(15, 2); |
| 953 | 915 |
| 954 // Check expected ranges. | 916 // Check expected ranges. |
| 955 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); | 917 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); |
| 956 | 918 |
| 957 // Append buffers at positions 0 through 19. | 919 // Append buffers at positions 0 through 19. |
| 958 NewSegmentAppend(0, 20); | 920 NewCodedFrameGroupAppend(0, 20); |
| 959 | 921 |
| 960 // Check expected range. | 922 // Check expected range. |
| 961 CheckExpectedRanges("{ [0,19) }"); | 923 CheckExpectedRanges("{ [0,19) }"); |
| 962 // Check buffers in range. | 924 // Check buffers in range. |
| 963 Seek(0); | 925 Seek(0); |
| 964 CheckExpectedBuffers(0, 19); | 926 CheckExpectedBuffers(0, 19); |
| 965 } | 927 } |
| 966 | 928 |
| 967 TEST_F(SourceBufferStreamTest, Complete_Overlap_Several_Then_Merge) { | 929 TEST_F(SourceBufferStreamTest, Complete_Overlap_Several_Then_Merge) { |
| 968 // Append 2 buffers at positions 5 through 6. | 930 // Append 2 buffers at positions 5 through 6. |
| 969 NewSegmentAppend(5, 2); | 931 NewCodedFrameGroupAppend(5, 2); |
| 970 | 932 |
| 971 // Append 2 buffers at positions 10 through 11. | 933 // Append 2 buffers at positions 10 through 11. |
| 972 NewSegmentAppend(10, 2); | 934 NewCodedFrameGroupAppend(10, 2); |
| 973 | 935 |
| 974 // Append 2 buffers at positions 15 through 16. | 936 // Append 2 buffers at positions 15 through 16. |
| 975 NewSegmentAppend(15, 2); | 937 NewCodedFrameGroupAppend(15, 2); |
| 976 | 938 |
| 977 // Append 2 buffers at positions 20 through 21. | 939 // Append 2 buffers at positions 20 through 21. |
| 978 NewSegmentAppend(20, 2); | 940 NewCodedFrameGroupAppend(20, 2); |
| 979 | 941 |
| 980 // Append buffers at positions 0 through 19. | 942 // Append buffers at positions 0 through 19. |
| 981 NewSegmentAppend(0, 20); | 943 NewCodedFrameGroupAppend(0, 20); |
| 982 | 944 |
| 983 // Check expected ranges. | 945 // Check expected ranges. |
| 984 CheckExpectedRanges("{ [0,21) }"); | 946 CheckExpectedRanges("{ [0,21) }"); |
| 985 // Check buffers in range. | 947 // Check buffers in range. |
| 986 Seek(0); | 948 Seek(0); |
| 987 CheckExpectedBuffers(0, 21); | 949 CheckExpectedBuffers(0, 21); |
| 988 } | 950 } |
| 989 | 951 |
| 990 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected) { | 952 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected) { |
| 991 // Append 10 buffers at positions 5 through 14. | 953 // Append 10 buffers at positions 5 through 14. |
| 992 NewSegmentAppend(5, 10, &kDataA); | 954 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 993 | 955 |
| 994 // Seek to buffer at position 5. | 956 // Seek to buffer at position 5. |
| 995 Seek(5); | 957 Seek(5); |
| 996 | 958 |
| 997 // Replace old data with new data. | 959 // Replace old data with new data. |
| 998 NewSegmentAppend(5, 10, &kDataB); | 960 NewCodedFrameGroupAppend(5, 10, &kDataB); |
| 999 | 961 |
| 1000 // Check ranges are correct. | 962 // Check ranges are correct. |
| 1001 CheckExpectedRanges("{ [5,14) }"); | 963 CheckExpectedRanges("{ [5,14) }"); |
| 1002 | 964 |
| 1003 // Check that data has been replaced with new data. | 965 // Check that data has been replaced with new data. |
| 1004 CheckExpectedBuffers(5, 14, &kDataB); | 966 CheckExpectedBuffers(5, 14, &kDataB); |
| 1005 } | 967 } |
| 1006 | 968 |
| 1007 // This test is testing that a client can append data to SourceBufferStream that | 969 // This test is testing that a client can append data to SourceBufferStream that |
| 1008 // overlaps the range from which the client is currently grabbing buffers. We | 970 // overlaps the range from which the client is currently grabbing buffers. We |
| 1009 // would expect that the SourceBufferStream would return old data until it hits | 971 // would expect that the SourceBufferStream would return old data until it hits |
| 1010 // the keyframe of the new data, after which it will return the new data. | 972 // the keyframe of the new data, after which it will return the new data. |
| 1011 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_TrackBuffer) { | 973 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_TrackBuffer) { |
| 1012 // Append 10 buffers at positions 5 through 14. | 974 // Append 10 buffers at positions 5 through 14. |
| 1013 NewSegmentAppend(5, 10, &kDataA); | 975 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1014 | 976 |
| 1015 // Seek to buffer at position 5 and get next buffer. | 977 // Seek to buffer at position 5 and get next buffer. |
| 1016 Seek(5); | 978 Seek(5); |
| 1017 CheckExpectedBuffers(5, 5, &kDataA); | 979 CheckExpectedBuffers(5, 5, &kDataA); |
| 1018 | 980 |
| 1019 // Do a complete overlap by appending 20 buffers at positions 0 through 19. | 981 // Do a complete overlap by appending 20 buffers at positions 0 through 19. |
| 1020 NewSegmentAppend(0, 20, &kDataB); | 982 NewCodedFrameGroupAppend(0, 20, &kDataB); |
| 1021 | 983 |
| 1022 // Check range is correct. | 984 // Check range is correct. |
| 1023 CheckExpectedRanges("{ [0,19) }"); | 985 CheckExpectedRanges("{ [0,19) }"); |
| 1024 | 986 |
| 1025 // Expect old data up until next keyframe in new data. | 987 // Expect old data up until next keyframe in new data. |
| 1026 CheckExpectedBuffers(6, 9, &kDataA); | 988 CheckExpectedBuffers(6, 9, &kDataA); |
| 1027 CheckExpectedBuffers(10, 10, &kDataB, true); | 989 CheckExpectedBuffers(10, 10, &kDataB, true); |
| 1028 | 990 |
| 1029 // Expect rest of data to be new. | 991 // Expect rest of data to be new. |
| 1030 CheckExpectedBuffers(11, 19, &kDataB); | 992 CheckExpectedBuffers(11, 19, &kDataB); |
| 1031 | 993 |
| 1032 // Seek back to beginning; all data should be new. | 994 // Seek back to beginning; all data should be new. |
| 1033 Seek(0); | 995 Seek(0); |
| 1034 CheckExpectedBuffers(0, 19, &kDataB); | 996 CheckExpectedBuffers(0, 19, &kDataB); |
| 1035 | 997 |
| 1036 // Check range continues to be correct. | 998 // Check range continues to be correct. |
| 1037 CheckExpectedRanges("{ [0,19) }"); | 999 CheckExpectedRanges("{ [0,19) }"); |
| 1038 } | 1000 } |
| 1039 | 1001 |
| 1040 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_EdgeCase) { | 1002 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_EdgeCase) { |
| 1041 // Append 10 buffers at positions 5 through 14. | 1003 // Append 10 buffers at positions 5 through 14. |
| 1042 NewSegmentAppend(5, 10, &kDataA); | 1004 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1043 | 1005 |
| 1044 // Seek to buffer at position 5 and get next buffer. | 1006 // Seek to buffer at position 5 and get next buffer. |
| 1045 Seek(5); | 1007 Seek(5); |
| 1046 CheckExpectedBuffers(5, 5, &kDataA); | 1008 CheckExpectedBuffers(5, 5, &kDataA); |
| 1047 | 1009 |
| 1048 // Replace existing data with new data. | 1010 // Replace existing data with new data. |
| 1049 NewSegmentAppend(5, 10, &kDataB); | 1011 NewCodedFrameGroupAppend(5, 10, &kDataB); |
| 1050 | 1012 |
| 1051 // Check ranges are correct. | 1013 // Check ranges are correct. |
| 1052 CheckExpectedRanges("{ [5,14) }"); | 1014 CheckExpectedRanges("{ [5,14) }"); |
| 1053 | 1015 |
| 1054 // Expect old data up until next keyframe in new data. | 1016 // Expect old data up until next keyframe in new data. |
| 1055 CheckExpectedBuffers(6, 9, &kDataA); | 1017 CheckExpectedBuffers(6, 9, &kDataA); |
| 1056 CheckExpectedBuffers(10, 10, &kDataB, true); | 1018 CheckExpectedBuffers(10, 10, &kDataB, true); |
| 1057 | 1019 |
| 1058 // Expect rest of data to be new. | 1020 // Expect rest of data to be new. |
| 1059 CheckExpectedBuffers(11, 14, &kDataB); | 1021 CheckExpectedBuffers(11, 14, &kDataB); |
| 1060 | 1022 |
| 1061 // Seek back to beginning; all data should be new. | 1023 // Seek back to beginning; all data should be new. |
| 1062 Seek(5); | 1024 Seek(5); |
| 1063 CheckExpectedBuffers(5, 14, &kDataB); | 1025 CheckExpectedBuffers(5, 14, &kDataB); |
| 1064 | 1026 |
| 1065 // Check range continues to be correct. | 1027 // Check range continues to be correct. |
| 1066 CheckExpectedRanges("{ [5,14) }"); | 1028 CheckExpectedRanges("{ [5,14) }"); |
| 1067 } | 1029 } |
| 1068 | 1030 |
| 1069 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) { | 1031 TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) { |
| 1070 static const uint8_t kDataC = 0x55; | 1032 static const uint8_t kDataC = 0x55; |
| 1071 static const uint8_t kDataD = 0x77; | 1033 static const uint8_t kDataD = 0x77; |
| 1072 | 1034 |
| 1073 // Append 5 buffers at positions 5 through 9. | 1035 // Append 5 buffers at positions 5 through 9. |
| 1074 NewSegmentAppend(5, 5, &kDataA); | 1036 NewCodedFrameGroupAppend(5, 5, &kDataA); |
| 1075 | 1037 |
| 1076 // Seek to buffer at position 5 and get next buffer. | 1038 // Seek to buffer at position 5 and get next buffer. |
| 1077 Seek(5); | 1039 Seek(5); |
| 1078 CheckExpectedBuffers(5, 5, &kDataA); | 1040 CheckExpectedBuffers(5, 5, &kDataA); |
| 1079 | 1041 |
| 1080 // Replace existing data with new data. | 1042 // Replace existing data with new data. |
| 1081 NewSegmentAppend(5, 5, &kDataB); | 1043 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 1082 | 1044 |
| 1083 // Then replace it again with different data. | 1045 // Then replace it again with different data. |
| 1084 NewSegmentAppend(5, 5, &kDataC); | 1046 NewCodedFrameGroupAppend(5, 5, &kDataC); |
| 1085 | 1047 |
| 1086 // Now append 5 new buffers at positions 10 through 14. | 1048 // Now append 5 new buffers at positions 10 through 14. |
| 1087 NewSegmentAppend(10, 5, &kDataC); | 1049 NewCodedFrameGroupAppend(10, 5, &kDataC); |
| 1088 | 1050 |
| 1089 // Now replace all the data entirely. | 1051 // Now replace all the data entirely. |
| 1090 NewSegmentAppend(5, 10, &kDataD); | 1052 NewCodedFrameGroupAppend(5, 10, &kDataD); |
| 1091 | 1053 |
| 1092 // Expect buffers 6 through 9 to be DataA, and the remaining | 1054 // Expect buffers 6 through 9 to be DataA, and the remaining |
| 1093 // buffers to be kDataD. | 1055 // buffers to be kDataD. |
| 1094 CheckExpectedBuffers(6, 9, &kDataA); | 1056 CheckExpectedBuffers(6, 9, &kDataA); |
| 1095 CheckExpectedBuffers(10, 14, &kDataD); | 1057 CheckExpectedBuffers(10, 14, &kDataD); |
| 1096 | 1058 |
| 1097 // At this point we cannot fulfill request. | 1059 // At this point we cannot fulfill request. |
| 1098 CheckNoNextBuffer(); | 1060 CheckNoNextBuffer(); |
| 1099 | 1061 |
| 1100 // Seek back to beginning; all data should be new. | 1062 // Seek back to beginning; all data should be new. |
| 1101 Seek(5); | 1063 Seek(5); |
| 1102 CheckExpectedBuffers(5, 14, &kDataD); | 1064 CheckExpectedBuffers(5, 14, &kDataD); |
| 1103 } | 1065 } |
| 1104 | 1066 |
| 1105 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected) { | 1067 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected) { |
| 1106 // Append 10 buffers at positions 0 through 9. | 1068 // Append 10 buffers at positions 0 through 9. |
| 1107 NewSegmentAppend(0, 10, &kDataA); | 1069 NewCodedFrameGroupAppend(0, 10, &kDataA); |
| 1108 | 1070 |
| 1109 // Seek to position 5, then add buffers to overlap data at that position. | 1071 // Seek to position 5, then add buffers to overlap data at that position. |
| 1110 Seek(5); | 1072 Seek(5); |
| 1111 NewSegmentAppend(5, 10, &kDataB); | 1073 NewCodedFrameGroupAppend(5, 10, &kDataB); |
| 1112 | 1074 |
| 1113 // Check expected range. | 1075 // Check expected range. |
| 1114 CheckExpectedRanges("{ [0,14) }"); | 1076 CheckExpectedRanges("{ [0,14) }"); |
| 1115 | 1077 |
| 1116 // Because we seeked to a keyframe, the next buffers should all be new data. | 1078 // Because we seeked to a keyframe, the next buffers should all be new data. |
| 1117 CheckExpectedBuffers(5, 14, &kDataB); | 1079 CheckExpectedBuffers(5, 14, &kDataB); |
| 1118 | 1080 |
| 1119 // Make sure all data is correct. | 1081 // Make sure all data is correct. |
| 1120 Seek(0); | 1082 Seek(0); |
| 1121 CheckExpectedBuffers(0, 4, &kDataA); | 1083 CheckExpectedBuffers(0, 4, &kDataA); |
| 1122 CheckExpectedBuffers(5, 14, &kDataB); | 1084 CheckExpectedBuffers(5, 14, &kDataB); |
| 1123 } | 1085 } |
| 1124 | 1086 |
| 1125 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_TrackBuffer) { | 1087 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_TrackBuffer) { |
| 1126 // Append 15 buffers at positions 0 through 14. | 1088 // Append 15 buffers at positions 0 through 14. |
| 1127 NewSegmentAppend(0, 15, &kDataA); | 1089 NewCodedFrameGroupAppend(0, 15, &kDataA); |
| 1128 | 1090 |
| 1129 // Seek to 10 and get buffer. | 1091 // Seek to 10 and get buffer. |
| 1130 Seek(10); | 1092 Seek(10); |
| 1131 CheckExpectedBuffers(10, 10, &kDataA); | 1093 CheckExpectedBuffers(10, 10, &kDataA); |
| 1132 | 1094 |
| 1133 // Now append 10 buffers of new data at positions 10 through 19. | 1095 // Now append 10 buffers of new data at positions 10 through 19. |
| 1134 NewSegmentAppend(10, 10, &kDataB); | 1096 NewCodedFrameGroupAppend(10, 10, &kDataB); |
| 1135 | 1097 |
| 1136 // Check expected range. | 1098 // Check expected range. |
| 1137 CheckExpectedRanges("{ [0,19) }"); | 1099 CheckExpectedRanges("{ [0,19) }"); |
| 1138 | 1100 |
| 1139 // The next 4 buffers should be a from the old buffer, followed by a keyframe | 1101 // The next 4 buffers should be a from the old buffer, followed by a keyframe |
| 1140 // from the new data. | 1102 // from the new data. |
| 1141 CheckExpectedBuffers(11, 14, &kDataA); | 1103 CheckExpectedBuffers(11, 14, &kDataA); |
| 1142 CheckExpectedBuffers(15, 15, &kDataB, true); | 1104 CheckExpectedBuffers(15, 15, &kDataB, true); |
| 1143 | 1105 |
| 1144 // The rest of the buffers should be new data. | 1106 // The rest of the buffers should be new data. |
| 1145 CheckExpectedBuffers(16, 19, &kDataB); | 1107 CheckExpectedBuffers(16, 19, &kDataB); |
| 1146 | 1108 |
| 1147 // Now seek to the beginning; positions 0 through 9 should be the original | 1109 // Now seek to the beginning; positions 0 through 9 should be the original |
| 1148 // data, positions 10 through 19 should be the new data. | 1110 // data, positions 10 through 19 should be the new data. |
| 1149 Seek(0); | 1111 Seek(0); |
| 1150 CheckExpectedBuffers(0, 9, &kDataA); | 1112 CheckExpectedBuffers(0, 9, &kDataA); |
| 1151 CheckExpectedBuffers(10, 19, &kDataB); | 1113 CheckExpectedBuffers(10, 19, &kDataB); |
| 1152 | 1114 |
| 1153 // Make sure range is still correct. | 1115 // Make sure range is still correct. |
| 1154 CheckExpectedRanges("{ [0,19) }"); | 1116 CheckExpectedRanges("{ [0,19) }"); |
| 1155 } | 1117 } |
| 1156 | 1118 |
| 1157 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_EdgeCase) { | 1119 TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_EdgeCase) { |
| 1158 // Append 10 buffers at positions 5 through 14. | 1120 // Append 10 buffers at positions 5 through 14. |
| 1159 NewSegmentAppend(5, 10, &kDataA); | 1121 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1160 | 1122 |
| 1161 Seek(10); | 1123 Seek(10); |
| 1162 CheckExpectedBuffers(10, 10, &kDataA); | 1124 CheckExpectedBuffers(10, 10, &kDataA); |
| 1163 | 1125 |
| 1164 // Now replace the last 5 buffers with new data. | 1126 // Now replace the last 5 buffers with new data. |
| 1165 NewSegmentAppend(10, 5, &kDataB); | 1127 NewCodedFrameGroupAppend(10, 5, &kDataB); |
| 1166 | 1128 |
| 1167 // The next 4 buffers should be the origial data, held in the track buffer. | 1129 // The next 4 buffers should be the origial data, held in the track buffer. |
| 1168 CheckExpectedBuffers(11, 14, &kDataA); | 1130 CheckExpectedBuffers(11, 14, &kDataA); |
| 1169 | 1131 |
| 1170 // The next buffer is at position 15, so we should fail to fulfill the | 1132 // The next buffer is at position 15, so we should fail to fulfill the |
| 1171 // request. | 1133 // request. |
| 1172 CheckNoNextBuffer(); | 1134 CheckNoNextBuffer(); |
| 1173 | 1135 |
| 1174 // Now append data at 15 through 19 and check to make sure it's correct. | 1136 // Now append data at 15 through 19 and check to make sure it's correct. |
| 1175 NewSegmentAppend(15, 5, &kDataB); | 1137 NewCodedFrameGroupAppend(15, 5, &kDataB); |
| 1176 CheckExpectedBuffers(15, 19, &kDataB); | 1138 CheckExpectedBuffers(15, 19, &kDataB); |
| 1177 | 1139 |
| 1178 // Seek to beginning of buffered range and check buffers. | 1140 // Seek to beginning of buffered range and check buffers. |
| 1179 Seek(5); | 1141 Seek(5); |
| 1180 CheckExpectedBuffers(5, 9, &kDataA); | 1142 CheckExpectedBuffers(5, 9, &kDataA); |
| 1181 CheckExpectedBuffers(10, 19, &kDataB); | 1143 CheckExpectedBuffers(10, 19, &kDataB); |
| 1182 | 1144 |
| 1183 // Check expected range. | 1145 // Check expected range. |
| 1184 CheckExpectedRanges("{ [5,19) }"); | 1146 CheckExpectedRanges("{ [5,19) }"); |
| 1185 } | 1147 } |
| 1186 | 1148 |
| 1187 // This test covers the case where new buffers end-overlap an existing, selected | 1149 // This test covers the case where new buffers end-overlap an existing, selected |
| 1188 // range, and the next buffer is a keyframe that's being overlapped by new | 1150 // range, and the next buffer is a keyframe that's being overlapped by new |
| 1189 // buffers. | 1151 // buffers. |
| 1190 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1152 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1191 // old  : *A*a a a a A a a a a | 1153 // old  : *A*a a a a A a a a a |
| 1192 // new  : B b b b b B b b b b | 1154 // new  : B b b b b B b b b b |
| 1193 // after: B b b b b*B*b b b b A a a a a | 1155 // after: B b b b b*B*b b b b A a a a a |
| 1194 TEST_F(SourceBufferStreamTest, End_Overlap_Selected) { | 1156 TEST_F(SourceBufferStreamTest, End_Overlap_Selected) { |
| 1195 // Append 10 buffers at positions 5 through 14. | 1157 // Append 10 buffers at positions 5 through 14. |
| 1196 NewSegmentAppend(5, 10, &kDataA); | 1158 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1197 | 1159 |
| 1198 // Seek to position 5. | 1160 // Seek to position 5. |
| 1199 Seek(5); | 1161 Seek(5); |
| 1200 | 1162 |
| 1201 // Now append 10 buffers at positions 0 through 9. | 1163 // Now append 10 buffers at positions 0 through 9. |
| 1202 NewSegmentAppend(0, 10, &kDataB); | 1164 NewCodedFrameGroupAppend(0, 10, &kDataB); |
| 1203 | 1165 |
| 1204 // Check expected range. | 1166 // Check expected range. |
| 1205 CheckExpectedRanges("{ [0,14) }"); | 1167 CheckExpectedRanges("{ [0,14) }"); |
| 1206 | 1168 |
| 1207 // Because we seeked to a keyframe, the next buffers should be new. | 1169 // Because we seeked to a keyframe, the next buffers should be new. |
| 1208 CheckExpectedBuffers(5, 9, &kDataB); | 1170 CheckExpectedBuffers(5, 9, &kDataB); |
| 1209 | 1171 |
| 1210 // Make sure all data is correct. | 1172 // Make sure all data is correct. |
| 1211 Seek(0); | 1173 Seek(0); |
| 1212 CheckExpectedBuffers(0, 9, &kDataB); | 1174 CheckExpectedBuffers(0, 9, &kDataB); |
| 1213 CheckExpectedBuffers(10, 14, &kDataA); | 1175 CheckExpectedBuffers(10, 14, &kDataA); |
| 1214 } | 1176 } |
| 1215 | 1177 |
| 1216 // This test covers the case where new buffers end-overlap an existing, selected | 1178 // This test covers the case where new buffers end-overlap an existing, selected |
| 1217 // range, and the next buffer in the range is after the newly appended buffers. | 1179 // range, and the next buffer in the range is after the newly appended buffers. |
| 1218 // In this particular case, the end overlap does not require a split. | 1180 // In this particular case, the end overlap does not require a split. |
| 1219 // | 1181 // |
| 1220 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1182 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1221 // old  : |A a a a a A a a*a*a| | 1183 // old  : |A a a a a A a a*a*a| |
| 1222 // new  : B b b b b B b b b b | 1184 // new  : B b b b b B b b b b |
| 1223 // after: |B b b b b B b b b b A a a*a*a| | 1185 // after: |B b b b b B b b b b A a a*a*a| |
| 1224 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_1) { | 1186 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_1) { |
| 1225 // Append 10 buffers at positions 5 through 14. | 1187 // Append 10 buffers at positions 5 through 14. |
| 1226 NewSegmentAppend(5, 10, &kDataA); | 1188 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1227 | 1189 |
| 1228 // Seek to position 10, then move to position 13. | 1190 // Seek to position 10, then move to position 13. |
| 1229 Seek(10); | 1191 Seek(10); |
| 1230 CheckExpectedBuffers(10, 12, &kDataA); | 1192 CheckExpectedBuffers(10, 12, &kDataA); |
| 1231 | 1193 |
| 1232 // Now append 10 buffers at positions 0 through 9. | 1194 // Now append 10 buffers at positions 0 through 9. |
| 1233 NewSegmentAppend(0, 10, &kDataB); | 1195 NewCodedFrameGroupAppend(0, 10, &kDataB); |
| 1234 | 1196 |
| 1235 // Check expected range. | 1197 // Check expected range. |
| 1236 CheckExpectedRanges("{ [0,14) }"); | 1198 CheckExpectedRanges("{ [0,14) }"); |
| 1237 | 1199 |
| 1238 // Make sure rest of data is as expected. | 1200 // Make sure rest of data is as expected. |
| 1239 CheckExpectedBuffers(13, 14, &kDataA); | 1201 CheckExpectedBuffers(13, 14, &kDataA); |
| 1240 | 1202 |
| 1241 // Make sure all data is correct. | 1203 // Make sure all data is correct. |
| 1242 Seek(0); | 1204 Seek(0); |
| 1243 CheckExpectedBuffers(0, 9, &kDataB); | 1205 CheckExpectedBuffers(0, 9, &kDataB); |
| 1244 CheckExpectedBuffers(10, 14, &kDataA); | 1206 CheckExpectedBuffers(10, 14, &kDataA); |
| 1245 } | 1207 } |
| 1246 | 1208 |
| 1247 // This test covers the case where new buffers end-overlap an existing, selected | 1209 // This test covers the case where new buffers end-overlap an existing, selected |
| 1248 // range, and the next buffer in the range is after the newly appended buffers. | 1210 // range, and the next buffer in the range is after the newly appended buffers. |
| 1249 // In this particular case, the end overlap requires a split, and the next | 1211 // In this particular case, the end overlap requires a split, and the next |
| 1250 // buffer is in the split range. | 1212 // buffer is in the split range. |
| 1251 // | 1213 // |
| 1252 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1214 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1253 // old  : |A a a a a A a a*a*a| | 1215 // old  : |A a a a a A a a*a*a| |
| 1254 // new  : B b b b b B b b | 1216 // new  : B b b b b B b b |
| 1255 // after: |B b b b b B b b| |A a a*a*a| | 1217 // after: |B b b b b B b b| |A a a*a*a| |
| 1256 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_2) { | 1218 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_2) { |
| 1257 // Append 10 buffers at positions 5 through 14. | 1219 // Append 10 buffers at positions 5 through 14. |
| 1258 NewSegmentAppend(5, 10, &kDataA); | 1220 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1259 | 1221 |
| 1260 // Seek to position 10, then move to position 13. | 1222 // Seek to position 10, then move to position 13. |
| 1261 Seek(10); | 1223 Seek(10); |
| 1262 CheckExpectedBuffers(10, 12, &kDataA); | 1224 CheckExpectedBuffers(10, 12, &kDataA); |
| 1263 | 1225 |
| 1264 // Now append 8 buffers at positions 0 through 7. | 1226 // Now append 8 buffers at positions 0 through 7. |
| 1265 NewSegmentAppend(0, 8, &kDataB); | 1227 NewCodedFrameGroupAppend(0, 8, &kDataB); |
| 1266 | 1228 |
| 1267 // Check expected ranges. | 1229 // Check expected ranges. |
| 1268 CheckExpectedRanges("{ [0,7) [10,14) }"); | 1230 CheckExpectedRanges("{ [0,7) [10,14) }"); |
| 1269 | 1231 |
| 1270 // Make sure rest of data is as expected. | 1232 // Make sure rest of data is as expected. |
| 1271 CheckExpectedBuffers(13, 14, &kDataA); | 1233 CheckExpectedBuffers(13, 14, &kDataA); |
| 1272 | 1234 |
| 1273 // Make sure all data is correct. | 1235 // Make sure all data is correct. |
| 1274 Seek(0); | 1236 Seek(0); |
| 1275 CheckExpectedBuffers(0, 7, &kDataB); | 1237 CheckExpectedBuffers(0, 7, &kDataB); |
| 1276 CheckNoNextBuffer(); | 1238 CheckNoNextBuffer(); |
| 1277 | 1239 |
| 1278 Seek(10); | 1240 Seek(10); |
| 1279 CheckExpectedBuffers(10, 14, &kDataA); | 1241 CheckExpectedBuffers(10, 14, &kDataA); |
| 1280 } | 1242 } |
| 1281 | 1243 |
| 1282 // This test covers the case where new buffers end-overlap an existing, selected | 1244 // This test covers the case where new buffers end-overlap an existing, selected |
| 1283 // range, and the next buffer in the range is after the newly appended buffers. | 1245 // range, and the next buffer in the range is after the newly appended buffers. |
| 1284 // In this particular case, the end overlap requires a split, and the next | 1246 // In this particular case, the end overlap requires a split, and the next |
| 1285 // buffer was in between the end of the new data and the split range. | 1247 // buffer was in between the end of the new data and the split range. |
| 1286 // | 1248 // |
| 1287 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1249 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1288 // old  : |A a a*a*a A a a a a| | 1250 // old  : |A a a*a*a A a a a a| |
| 1289 // new  : B b b b b B b b | 1251 // new  : B b b b b B b b |
| 1290 // after: |B b b b b B b b| |A a a a a| | 1252 // after: |B b b b b B b b| |A a a a a| |
| 1291 // track: |a a| | 1253 // track: |a a| |
| 1292 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_3) { | 1254 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_3) { |
| 1293 // Append 10 buffers at positions 5 through 14. | 1255 // Append 10 buffers at positions 5 through 14. |
| 1294 NewSegmentAppend(5, 10, &kDataA); | 1256 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1295 | 1257 |
| 1296 // Seek to position 5, then move to position 8. | 1258 // Seek to position 5, then move to position 8. |
| 1297 Seek(5); | 1259 Seek(5); |
| 1298 CheckExpectedBuffers(5, 7, &kDataA); | 1260 CheckExpectedBuffers(5, 7, &kDataA); |
| 1299 | 1261 |
| 1300 // Now append 8 buffers at positions 0 through 7. | 1262 // Now append 8 buffers at positions 0 through 7. |
| 1301 NewSegmentAppend(0, 8, &kDataB); | 1263 NewCodedFrameGroupAppend(0, 8, &kDataB); |
| 1302 | 1264 |
| 1303 // Check expected ranges. | 1265 // Check expected ranges. |
| 1304 CheckExpectedRanges("{ [0,7) [10,14) }"); | 1266 CheckExpectedRanges("{ [0,7) [10,14) }"); |
| 1305 | 1267 |
| 1306 // Check for data in the track buffer. | 1268 // Check for data in the track buffer. |
| 1307 CheckExpectedBuffers(8, 9, &kDataA); | 1269 CheckExpectedBuffers(8, 9, &kDataA); |
| 1308 // The buffer immediately after the track buffer should be a keyframe. | 1270 // The buffer immediately after the track buffer should be a keyframe. |
| 1309 CheckExpectedBuffers(10, 10, &kDataA, true); | 1271 CheckExpectedBuffers(10, 10, &kDataA, true); |
| 1310 | 1272 |
| 1311 // Make sure all data is correct. | 1273 // Make sure all data is correct. |
| 1312 Seek(0); | 1274 Seek(0); |
| 1313 CheckExpectedBuffers(0, 7, &kDataB); | 1275 CheckExpectedBuffers(0, 7, &kDataB); |
| 1314 Seek(10); | 1276 Seek(10); |
| 1315 CheckExpectedBuffers(10, 14, &kDataA); | 1277 CheckExpectedBuffers(10, 14, &kDataA); |
| 1316 } | 1278 } |
| 1317 | 1279 |
| 1318 // This test covers the case where new buffers end-overlap an existing, selected | 1280 // This test covers the case where new buffers end-overlap an existing, selected |
| 1319 // range, and the next buffer in the range is overlapped by the new buffers. | 1281 // range, and the next buffer in the range is overlapped by the new buffers. |
| 1320 // In this particular case, the end overlap does not require a split. | 1282 // In this particular case, the end overlap does not require a split. |
| 1321 // | 1283 // |
| 1322 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1284 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1323 // old  : |A a a*a*a A a a a a| | 1285 // old  : |A a a*a*a A a a a a| |
| 1324 // new  : B b b b b B b b b b | 1286 // new  : B b b b b B b b b b |
| 1325 // after: |B b b b b B b b b b A a a a a| | 1287 // after: |B b b b b B b b b b A a a a a| |
| 1326 // track: |a a| | 1288 // track: |a a| |
| 1327 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_1) { | 1289 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_1) { |
| 1328 // Append 10 buffers at positions 5 through 14. | 1290 // Append 10 buffers at positions 5 through 14. |
| 1329 NewSegmentAppend(5, 10, &kDataA); | 1291 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1330 | 1292 |
| 1331 // Seek to position 5, then move to position 8. | 1293 // Seek to position 5, then move to position 8. |
| 1332 Seek(5); | 1294 Seek(5); |
| 1333 CheckExpectedBuffers(5, 7, &kDataA); | 1295 CheckExpectedBuffers(5, 7, &kDataA); |
| 1334 | 1296 |
| 1335 // Now append 10 buffers at positions 0 through 9. | 1297 // Now append 10 buffers at positions 0 through 9. |
| 1336 NewSegmentAppend(0, 10, &kDataB); | 1298 NewCodedFrameGroupAppend(0, 10, &kDataB); |
| 1337 | 1299 |
| 1338 // Check expected range. | 1300 // Check expected range. |
| 1339 CheckExpectedRanges("{ [0,14) }"); | 1301 CheckExpectedRanges("{ [0,14) }"); |
| 1340 | 1302 |
| 1341 // Check for data in the track buffer. | 1303 // Check for data in the track buffer. |
| 1342 CheckExpectedBuffers(8, 9, &kDataA); | 1304 CheckExpectedBuffers(8, 9, &kDataA); |
| 1343 // The buffer immediately after the track buffer should be a keyframe. | 1305 // The buffer immediately after the track buffer should be a keyframe. |
| 1344 CheckExpectedBuffers(10, 10, &kDataA, true); | 1306 CheckExpectedBuffers(10, 10, &kDataA, true); |
| 1345 | 1307 |
| 1346 // Make sure all data is correct. | 1308 // Make sure all data is correct. |
| 1347 Seek(0); | 1309 Seek(0); |
| 1348 CheckExpectedBuffers(0, 9, &kDataB); | 1310 CheckExpectedBuffers(0, 9, &kDataB); |
| 1349 CheckExpectedBuffers(10, 14, &kDataA); | 1311 CheckExpectedBuffers(10, 14, &kDataA); |
| 1350 } | 1312 } |
| 1351 | 1313 |
| 1352 // This test covers the case where new buffers end-overlap an existing, selected | 1314 // This test covers the case where new buffers end-overlap an existing, selected |
| 1353 // range, and the next buffer in the range is overlapped by the new buffers. | 1315 // range, and the next buffer in the range is overlapped by the new buffers. |
| 1354 // In this particular case, the end overlap requires a split, and the next | 1316 // In this particular case, the end overlap requires a split, and the next |
| 1355 // keyframe after the track buffer is in the split range. | 1317 // keyframe after the track buffer is in the split range. |
| 1356 // | 1318 // |
| 1357 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1319 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1358 // old  : |A*a*a a a A a a a a| | 1320 // old  : |A*a*a a a A a a a a| |
| 1359 // new  : B b b b b B b | 1321 // new  : B b b b b B b |
| 1360 // after: |B b b b b B b| |A a a a a| | 1322 // after: |B b b b b B b| |A a a a a| |
| 1361 // track: |a a a a| | 1323 // track: |a a a a| |
| 1362 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_2) { | 1324 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_2) { |
| 1363 // Append 10 buffers at positions 5 through 14. | 1325 // Append 10 buffers at positions 5 through 14. |
| 1364 NewSegmentAppend(5, 10, &kDataA); | 1326 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1365 | 1327 |
| 1366 // Seek to position 5, then move to position 6. | 1328 // Seek to position 5, then move to position 6. |
| 1367 Seek(5); | 1329 Seek(5); |
| 1368 CheckExpectedBuffers(5, 5, &kDataA); | 1330 CheckExpectedBuffers(5, 5, &kDataA); |
| 1369 | 1331 |
| 1370 // Now append 7 buffers at positions 0 through 6. | 1332 // Now append 7 buffers at positions 0 through 6. |
| 1371 NewSegmentAppend(0, 7, &kDataB); | 1333 NewCodedFrameGroupAppend(0, 7, &kDataB); |
| 1372 | 1334 |
| 1373 // Check expected ranges. | 1335 // Check expected ranges. |
| 1374 CheckExpectedRanges("{ [0,6) [10,14) }"); | 1336 CheckExpectedRanges("{ [0,6) [10,14) }"); |
| 1375 | 1337 |
| 1376 // Check for data in the track buffer. | 1338 // Check for data in the track buffer. |
| 1377 CheckExpectedBuffers(6, 9, &kDataA); | 1339 CheckExpectedBuffers(6, 9, &kDataA); |
| 1378 // The buffer immediately after the track buffer should be a keyframe. | 1340 // The buffer immediately after the track buffer should be a keyframe. |
| 1379 CheckExpectedBuffers(10, 10, &kDataA, true); | 1341 CheckExpectedBuffers(10, 10, &kDataA, true); |
| 1380 | 1342 |
| 1381 // Make sure all data is correct. | 1343 // Make sure all data is correct. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 1392 // In this particular case, the end overlap requires a split, and the next | 1354 // In this particular case, the end overlap requires a split, and the next |
| 1393 // keyframe after the track buffer is in the range with the new buffers. | 1355 // keyframe after the track buffer is in the range with the new buffers. |
| 1394 // | 1356 // |
| 1395 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1357 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1396 // old  : |A*a*a a a A a a a a A a a a a| | 1358 // old  : |A*a*a a a A a a a a A a a a a| |
| 1397 // new  : B b b b b B b b b b B b b | 1359 // new  : B b b b b B b b b b B b b |
| 1398 // after: |B b b b b B b b b b B b b| |A a a a a| | 1360 // after: |B b b b b B b b b b B b b| |A a a a a| |
| 1399 // track: |a a a a| | 1361 // track: |a a a a| |
| 1400 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_3) { | 1362 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_3) { |
| 1401 // Append 15 buffers at positions 5 through 19. | 1363 // Append 15 buffers at positions 5 through 19. |
| 1402 NewSegmentAppend(5, 15, &kDataA); | 1364 NewCodedFrameGroupAppend(5, 15, &kDataA); |
| 1403 | 1365 |
| 1404 // Seek to position 5, then move to position 6. | 1366 // Seek to position 5, then move to position 6. |
| 1405 Seek(5); | 1367 Seek(5); |
| 1406 CheckExpectedBuffers(5, 5, &kDataA); | 1368 CheckExpectedBuffers(5, 5, &kDataA); |
| 1407 | 1369 |
| 1408 // Now append 13 buffers at positions 0 through 12. | 1370 // Now append 13 buffers at positions 0 through 12. |
| 1409 NewSegmentAppend(0, 13, &kDataB); | 1371 NewCodedFrameGroupAppend(0, 13, &kDataB); |
| 1410 | 1372 |
| 1411 // Check expected ranges. | 1373 // Check expected ranges. |
| 1412 CheckExpectedRanges("{ [0,12) [15,19) }"); | 1374 CheckExpectedRanges("{ [0,12) [15,19) }"); |
| 1413 | 1375 |
| 1414 // Check for data in the track buffer. | 1376 // Check for data in the track buffer. |
| 1415 CheckExpectedBuffers(6, 9, &kDataA); | 1377 CheckExpectedBuffers(6, 9, &kDataA); |
| 1416 // The buffer immediately after the track buffer should be a keyframe | 1378 // The buffer immediately after the track buffer should be a keyframe |
| 1417 // from the new data. | 1379 // from the new data. |
| 1418 CheckExpectedBuffers(10, 10, &kDataB, true); | 1380 CheckExpectedBuffers(10, 10, &kDataB, true); |
| 1419 | 1381 |
| 1420 // Make sure all data is correct. | 1382 // Make sure all data is correct. |
| 1421 Seek(0); | 1383 Seek(0); |
| 1422 CheckExpectedBuffers(0, 12, &kDataB); | 1384 CheckExpectedBuffers(0, 12, &kDataB); |
| 1423 CheckNoNextBuffer(); | 1385 CheckNoNextBuffer(); |
| 1424 | 1386 |
| 1425 Seek(15); | 1387 Seek(15); |
| 1426 CheckExpectedBuffers(15, 19, &kDataA); | 1388 CheckExpectedBuffers(15, 19, &kDataA); |
| 1427 } | 1389 } |
| 1428 | 1390 |
| 1429 // This test covers the case where new buffers end-overlap an existing, selected | 1391 // This test covers the case where new buffers end-overlap an existing, selected |
| 1430 // range, and there is no keyframe after the end of the new buffers. | 1392 // range, and there is no keyframe after the end of the new buffers. |
| 1431 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1393 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1432 // old  : |A*a*a a a| | 1394 // old  : |A*a*a a a| |
| 1433 // new  : B b b b b B | 1395 // new  : B b b b b B |
| 1434 // after: |B b b b b B| | 1396 // after: |B b b b b B| |
| 1435 // track: |a a a a| | 1397 // track: |a a a a| |
| 1436 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew) { | 1398 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew) { |
| 1437 // Append 5 buffers at positions 5 through 9. | 1399 // Append 5 buffers at positions 5 through 9. |
| 1438 NewSegmentAppend(5, 5, &kDataA); | 1400 NewCodedFrameGroupAppend(5, 5, &kDataA); |
| 1439 | 1401 |
| 1440 // Seek to position 5, then move to position 6. | 1402 // Seek to position 5, then move to position 6. |
| 1441 Seek(5); | 1403 Seek(5); |
| 1442 CheckExpectedBuffers(5, 5, &kDataA); | 1404 CheckExpectedBuffers(5, 5, &kDataA); |
| 1443 | 1405 |
| 1444 // Now append 6 buffers at positions 0 through 5. | 1406 // Now append 6 buffers at positions 0 through 5. |
| 1445 NewSegmentAppend(0, 6, &kDataB); | 1407 NewCodedFrameGroupAppend(0, 6, &kDataB); |
| 1446 | 1408 |
| 1447 // Check expected range. | 1409 // Check expected range. |
| 1448 CheckExpectedRanges("{ [0,5) }"); | 1410 CheckExpectedRanges("{ [0,5) }"); |
| 1449 | 1411 |
| 1450 // Check for data in the track buffer. | 1412 // Check for data in the track buffer. |
| 1451 CheckExpectedBuffers(6, 9, &kDataA); | 1413 CheckExpectedBuffers(6, 9, &kDataA); |
| 1452 | 1414 |
| 1453 // Now there's no data to fulfill the request. | 1415 // Now there's no data to fulfill the request. |
| 1454 CheckNoNextBuffer(); | 1416 CheckNoNextBuffer(); |
| 1455 | 1417 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 1467 // old  : |A a a a a A*a*| | 1429 // old  : |A a a a a A*a*| |
| 1468 // new  : B b b b b B b b b b B | 1430 // new  : B b b b b B b b b b B |
| 1469 // after: |B b b b b B b b b b B| | 1431 // after: |B b b b b B b b b b B| |
| 1470 // new  : A a a a a A | 1432 // new  : A a a a a A |
| 1471 // after: |A a a a a A| |B b b b b B| | 1433 // after: |A a a a a A| |B b b b b B| |
| 1472 // track: |a| | 1434 // track: |a| |
| 1473 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) { | 1435 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) { |
| 1474 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(133)); | 1436 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(133)); |
| 1475 | 1437 |
| 1476 // Append 7 buffers at positions 10 through 16. | 1438 // Append 7 buffers at positions 10 through 16. |
| 1477 NewSegmentAppend(10, 7, &kDataA); | 1439 NewCodedFrameGroupAppend(10, 7, &kDataA); |
| 1478 | 1440 |
| 1479 // Seek to position 15, then move to position 16. | 1441 // Seek to position 15, then move to position 16. |
| 1480 Seek(15); | 1442 Seek(15); |
| 1481 CheckExpectedBuffers(15, 15, &kDataA); | 1443 CheckExpectedBuffers(15, 15, &kDataA); |
| 1482 | 1444 |
| 1483 // Now append 11 buffers at positions 5 through 15. | 1445 // Now append 11 buffers at positions 5 through 15. |
| 1484 NewSegmentAppend(5, 11, &kDataB); | 1446 NewCodedFrameGroupAppend(5, 11, &kDataB); |
| 1485 CheckExpectedRanges("{ [5,15) }"); | 1447 CheckExpectedRanges("{ [5,15) }"); |
| 1486 | 1448 |
| 1487 // Now do another end-overlap to split the range into two parts, where the | 1449 // Now do another end-overlap to split the range into two parts, where the |
| 1488 // 2nd range should have the next buffer position. | 1450 // 2nd range should have the next buffer position. |
| 1489 NewSegmentAppend(0, 6, &kDataA); | 1451 NewCodedFrameGroupAppend(0, 6, &kDataA); |
| 1490 CheckExpectedRanges("{ [0,5) [10,15) }"); | 1452 CheckExpectedRanges("{ [0,5) [10,15) }"); |
| 1491 | 1453 |
| 1492 // Check for data in the track buffer. | 1454 // Check for data in the track buffer. |
| 1493 CheckExpectedBuffers(16, 16, &kDataA); | 1455 CheckExpectedBuffers(16, 16, &kDataA); |
| 1494 | 1456 |
| 1495 // Now there's no data to fulfill the request. | 1457 // Now there's no data to fulfill the request. |
| 1496 CheckNoNextBuffer(); | 1458 CheckNoNextBuffer(); |
| 1497 | 1459 |
| 1498 // Add data to the 2nd range, should not be able to fulfill the next read | 1460 // Add data to the 2nd range, should not be able to fulfill the next read |
| 1499 // until we've added a keyframe. | 1461 // until we've added a keyframe. |
| 1500 NewSegmentAppend(15, 1, &kDataB); | 1462 NewCodedFrameGroupAppend(15, 1, &kDataB); |
| 1501 CheckNoNextBuffer(); | 1463 CheckNoNextBuffer(); |
| 1502 for (int i = 16; i <= 19; i++) { | 1464 for (int i = 16; i <= 19; i++) { |
| 1503 AppendBuffers(i, 1, &kDataB); | 1465 AppendBuffers(i, 1, &kDataB); |
| 1504 CheckNoNextBuffer(); | 1466 CheckNoNextBuffer(); |
| 1505 } | 1467 } |
| 1506 | 1468 |
| 1507 // Now append a keyframe. | 1469 // Now append a keyframe. |
| 1508 AppendBuffers(20, 1, &kDataB); | 1470 AppendBuffers(20, 1, &kDataB); |
| 1509 | 1471 |
| 1510 // We should be able to get the next buffer. | 1472 // We should be able to get the next buffer. |
| 1511 CheckExpectedBuffers(20, 20, &kDataB, true); | 1473 CheckExpectedBuffers(20, 20, &kDataB, true); |
| 1512 } | 1474 } |
| 1513 | 1475 |
| 1514 // This test covers the case where new buffers end-overlap an existing, selected | 1476 // This test covers the case where new buffers end-overlap an existing, selected |
| 1515 // range, and the next keyframe in a separate range. | 1477 // range, and the next keyframe in a separate range. |
| 1516 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1478 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1517 // old  : |A*a*a a a| |A a a a a| | 1479 // old  : |A*a*a a a| |A a a a a| |
| 1518 // new  : B b b b b B | 1480 // new  : B b b b b B |
| 1519 // after: |B b b b b B| |A a a a a| | 1481 // after: |B b b b b B| |A a a a a| |
| 1520 // track: |a a a a| | 1482 // track: |a a a a| |
| 1521 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew3) { | 1483 TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew3) { |
| 1522 // Append 5 buffers at positions 5 through 9. | 1484 // Append 5 buffers at positions 5 through 9. |
| 1523 NewSegmentAppend(5, 5, &kDataA); | 1485 NewCodedFrameGroupAppend(5, 5, &kDataA); |
| 1524 | 1486 |
| 1525 // Append 5 buffers at positions 15 through 19. | 1487 // Append 5 buffers at positions 15 through 19. |
| 1526 NewSegmentAppend(15, 5, &kDataA); | 1488 NewCodedFrameGroupAppend(15, 5, &kDataA); |
| 1527 | 1489 |
| 1528 // Check expected range. | 1490 // Check expected range. |
| 1529 CheckExpectedRanges("{ [5,9) [15,19) }"); | 1491 CheckExpectedRanges("{ [5,9) [15,19) }"); |
| 1530 | 1492 |
| 1531 // Seek to position 5, then move to position 6. | 1493 // Seek to position 5, then move to position 6. |
| 1532 Seek(5); | 1494 Seek(5); |
| 1533 CheckExpectedBuffers(5, 5, &kDataA); | 1495 CheckExpectedBuffers(5, 5, &kDataA); |
| 1534 | 1496 |
| 1535 // Now append 6 buffers at positions 0 through 5. | 1497 // Now append 6 buffers at positions 0 through 5. |
| 1536 NewSegmentAppend(0, 6, &kDataB); | 1498 NewCodedFrameGroupAppend(0, 6, &kDataB); |
| 1537 | 1499 |
| 1538 // Check expected range. | 1500 // Check expected range. |
| 1539 CheckExpectedRanges("{ [0,5) [15,19) }"); | 1501 CheckExpectedRanges("{ [0,5) [15,19) }"); |
| 1540 | 1502 |
| 1541 // Check for data in the track buffer. | 1503 // Check for data in the track buffer. |
| 1542 CheckExpectedBuffers(6, 9, &kDataA); | 1504 CheckExpectedBuffers(6, 9, &kDataA); |
| 1543 | 1505 |
| 1544 // Now there's no data to fulfill the request. | 1506 // Now there's no data to fulfill the request. |
| 1545 CheckNoNextBuffer(); | 1507 CheckNoNextBuffer(); |
| 1546 | 1508 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1559 | 1521 |
| 1560 // This test covers the case when new buffers overlap the middle of a selected | 1522 // This test covers the case when new buffers overlap the middle of a selected |
| 1561 // range. This tests the case when there is no split and the next buffer is a | 1523 // range. This tests the case when there is no split and the next buffer is a |
| 1562 // keyframe. | 1524 // keyframe. |
| 1563 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1525 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1564 // old  : A a a a a*A*a a a a A a a a a | 1526 // old  : A a a a a*A*a a a a A a a a a |
| 1565 // new  : B b b b b | 1527 // new  : B b b b b |
| 1566 // after: A a a a a*B*b b b b A a a a a | 1528 // after: A a a a a*B*b b b b A a a a a |
| 1567 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_1) { | 1529 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_1) { |
| 1568 // Append 15 buffers at positions 0 through 14. | 1530 // Append 15 buffers at positions 0 through 14. |
| 1569 NewSegmentAppend(0, 15, &kDataA); | 1531 NewCodedFrameGroupAppend(0, 15, &kDataA); |
| 1570 | 1532 |
| 1571 // Seek to position 5. | 1533 // Seek to position 5. |
| 1572 Seek(5); | 1534 Seek(5); |
| 1573 | 1535 |
| 1574 // Now append 5 buffers at positions 5 through 9. | 1536 // Now append 5 buffers at positions 5 through 9. |
| 1575 NewSegmentAppend(5, 5, &kDataB); | 1537 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 1576 | 1538 |
| 1577 // Check expected range. | 1539 // Check expected range. |
| 1578 CheckExpectedRanges("{ [0,14) }"); | 1540 CheckExpectedRanges("{ [0,14) }"); |
| 1579 | 1541 |
| 1580 // Check for next data; should be new data. | 1542 // Check for next data; should be new data. |
| 1581 CheckExpectedBuffers(5, 9, &kDataB); | 1543 CheckExpectedBuffers(5, 9, &kDataB); |
| 1582 | 1544 |
| 1583 // Make sure all data is correct. | 1545 // Make sure all data is correct. |
| 1584 Seek(0); | 1546 Seek(0); |
| 1585 CheckExpectedBuffers(0, 4, &kDataA); | 1547 CheckExpectedBuffers(0, 4, &kDataA); |
| 1586 CheckExpectedBuffers(5, 9, &kDataB); | 1548 CheckExpectedBuffers(5, 9, &kDataB); |
| 1587 CheckExpectedBuffers(10, 14, &kDataA); | 1549 CheckExpectedBuffers(10, 14, &kDataA); |
| 1588 } | 1550 } |
| 1589 | 1551 |
| 1590 // This test covers the case when new buffers overlap the middle of a selected | 1552 // This test covers the case when new buffers overlap the middle of a selected |
| 1591 // range. This tests the case when there is no split and the next buffer is | 1553 // range. This tests the case when there is no split and the next buffer is |
| 1592 // after the new buffers. | 1554 // after the new buffers. |
| 1593 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1555 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1594 // old  : A a a a a A a a a a A*a*a a a | 1556 // old  : A a a a a A a a a a A*a*a a a |
| 1595 // new  : B b b b b | 1557 // new  : B b b b b |
| 1596 // after: A a a a a B b b b b A*a*a a a | 1558 // after: A a a a a B b b b b A*a*a a a |
| 1597 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_2) { | 1559 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_2) { |
| 1598 // Append 15 buffers at positions 0 through 14. | 1560 // Append 15 buffers at positions 0 through 14. |
| 1599 NewSegmentAppend(0, 15, &kDataA); | 1561 NewCodedFrameGroupAppend(0, 15, &kDataA); |
| 1600 | 1562 |
| 1601 // Seek to 10 then move to position 11. | 1563 // Seek to 10 then move to position 11. |
| 1602 Seek(10); | 1564 Seek(10); |
| 1603 CheckExpectedBuffers(10, 10, &kDataA); | 1565 CheckExpectedBuffers(10, 10, &kDataA); |
| 1604 | 1566 |
| 1605 // Now append 5 buffers at positions 5 through 9. | 1567 // Now append 5 buffers at positions 5 through 9. |
| 1606 NewSegmentAppend(5, 5, &kDataB); | 1568 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 1607 | 1569 |
| 1608 // Check expected range. | 1570 // Check expected range. |
| 1609 CheckExpectedRanges("{ [0,14) }"); | 1571 CheckExpectedRanges("{ [0,14) }"); |
| 1610 | 1572 |
| 1611 // Make sure data is correct. | 1573 // Make sure data is correct. |
| 1612 CheckExpectedBuffers(11, 14, &kDataA); | 1574 CheckExpectedBuffers(11, 14, &kDataA); |
| 1613 Seek(0); | 1575 Seek(0); |
| 1614 CheckExpectedBuffers(0, 4, &kDataA); | 1576 CheckExpectedBuffers(0, 4, &kDataA); |
| 1615 CheckExpectedBuffers(5, 9, &kDataB); | 1577 CheckExpectedBuffers(5, 9, &kDataB); |
| 1616 CheckExpectedBuffers(10, 14, &kDataA); | 1578 CheckExpectedBuffers(10, 14, &kDataA); |
| 1617 } | 1579 } |
| 1618 | 1580 |
| 1619 // This test covers the case when new buffers overlap the middle of a selected | 1581 // This test covers the case when new buffers overlap the middle of a selected |
| 1620 // range. This tests the case when there is a split and the next buffer is | 1582 // range. This tests the case when there is a split and the next buffer is |
| 1621 // before the new buffers. | 1583 // before the new buffers. |
| 1622 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1584 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1623 // old  : A a*a*a a A a a a a A a a a a | 1585 // old  : A a*a*a a A a a a a A a a a a |
| 1624 // new  : B b b | 1586 // new  : B b b |
| 1625 // after: A a*a*a a B b b| |A a a a a | 1587 // after: A a*a*a a B b b| |A a a a a |
| 1626 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_3) { | 1588 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_3) { |
| 1627 // Append 15 buffers at positions 0 through 14. | 1589 // Append 15 buffers at positions 0 through 14. |
| 1628 NewSegmentAppend(0, 15, &kDataA); | 1590 NewCodedFrameGroupAppend(0, 15, &kDataA); |
| 1629 | 1591 |
| 1630 // Seek to beginning then move to position 2. | 1592 // Seek to beginning then move to position 2. |
| 1631 Seek(0); | 1593 Seek(0); |
| 1632 CheckExpectedBuffers(0, 1, &kDataA); | 1594 CheckExpectedBuffers(0, 1, &kDataA); |
| 1633 | 1595 |
| 1634 // Now append 3 buffers at positions 5 through 7. | 1596 // Now append 3 buffers at positions 5 through 7. |
| 1635 NewSegmentAppend(5, 3, &kDataB); | 1597 NewCodedFrameGroupAppend(5, 3, &kDataB); |
| 1636 | 1598 |
| 1637 // Check expected range. | 1599 // Check expected range. |
| 1638 CheckExpectedRanges("{ [0,7) [10,14) }"); | 1600 CheckExpectedRanges("{ [0,7) [10,14) }"); |
| 1639 | 1601 |
| 1640 // Make sure data is correct. | 1602 // Make sure data is correct. |
| 1641 CheckExpectedBuffers(2, 4, &kDataA); | 1603 CheckExpectedBuffers(2, 4, &kDataA); |
| 1642 CheckExpectedBuffers(5, 7, &kDataB); | 1604 CheckExpectedBuffers(5, 7, &kDataB); |
| 1643 Seek(10); | 1605 Seek(10); |
| 1644 CheckExpectedBuffers(10, 14, &kDataA); | 1606 CheckExpectedBuffers(10, 14, &kDataA); |
| 1645 } | 1607 } |
| 1646 | 1608 |
| 1647 // This test covers the case when new buffers overlap the middle of a selected | 1609 // This test covers the case when new buffers overlap the middle of a selected |
| 1648 // range. This tests the case when there is a split and the next buffer is after | 1610 // range. This tests the case when there is a split and the next buffer is after |
| 1649 // the new buffers but before the split range. | 1611 // the new buffers but before the split range. |
| 1650 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 | 1612 // index: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 |
| 1651 // old  : A a a a a A a a*a*a A a a a a | 1613 // old  : A a a a a A a a*a*a A a a a a |
| 1652 // new  : B b b | 1614 // new  : B b b |
| 1653 // after: |A a a a a B b b| |A a a a a| | 1615 // after: |A a a a a B b b| |A a a a a| |
| 1654 // track: |a a| | 1616 // track: |a a| |
| 1655 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_4) { | 1617 TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_4) { |
| 1656 // Append 15 buffers at positions 0 through 14. | 1618 // Append 15 buffers at positions 0 through 14. |
| 1657 NewSegmentAppend(0, 15, &kDataA); | 1619 NewCodedFrameGroupAppend(0, 15, &kDataA); |
| 1658 | 1620 |
| 1659 // Seek to 5 then move to position 8. | 1621 // Seek to 5 then move to position 8. |
| 1660 Seek(5); | 1622 Seek(5); |
| 1661 CheckExpectedBuffers(5, 7, &kDataA); | 1623 CheckExpectedBuffers(5, 7, &kDataA); |
| 1662 | 1624 |
| 1663 // Now append 3 buffers at positions 5 through 7. | 1625 // Now append 3 buffers at positions 5 through 7. |
| 1664 NewSegmentAppend(5, 3, &kDataB); | 1626 NewCodedFrameGroupAppend(5, 3, &kDataB); |
| 1665 | 1627 |
| 1666 // Check expected range. | 1628 // Check expected range. |
| 1667 CheckExpectedRanges("{ [0,7) [10,14) }"); | 1629 CheckExpectedRanges("{ [0,7) [10,14) }"); |
| 1668 | 1630 |
| 1669 // Buffers 8 and 9 should be in the track buffer. | 1631 // Buffers 8 and 9 should be in the track buffer. |
| 1670 CheckExpectedBuffers(8, 9, &kDataA); | 1632 CheckExpectedBuffers(8, 9, &kDataA); |
| 1671 // The buffer immediately after the track buffer should be a keyframe. | 1633 // The buffer immediately after the track buffer should be a keyframe. |
| 1672 CheckExpectedBuffers(10, 10, &kDataA, true); | 1634 CheckExpectedBuffers(10, 10, &kDataA, true); |
| 1673 | 1635 |
| 1674 // Make sure all data is correct. | 1636 // Make sure all data is correct. |
| 1675 Seek(0); | 1637 Seek(0); |
| 1676 CheckExpectedBuffers(0, 4, &kDataA); | 1638 CheckExpectedBuffers(0, 4, &kDataA); |
| 1677 CheckExpectedBuffers(5, 7, &kDataB); | 1639 CheckExpectedBuffers(5, 7, &kDataB); |
| 1678 Seek(10); | 1640 Seek(10); |
| 1679 CheckExpectedBuffers(10, 14, &kDataA); | 1641 CheckExpectedBuffers(10, 14, &kDataA); |
| 1680 } | 1642 } |
| 1681 | 1643 |
| 1682 TEST_F(SourceBufferStreamTest, Overlap_OneByOne) { | 1644 TEST_F(SourceBufferStreamTest, Overlap_OneByOne) { |
| 1683 // Append 5 buffers starting at 10ms, 30ms apart. | 1645 // Append 5 buffers starting at 10ms, 30ms apart. |
| 1684 NewSegmentAppendOneByOne("10K 40 70 100 130"); | 1646 NewCodedFrameGroupAppendOneByOne("10K 40 70 100 130"); |
| 1685 | 1647 |
| 1686 // The range ends at 160, accounting for the last buffer's duration. | 1648 // The range ends at 160, accounting for the last buffer's duration. |
| 1687 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1649 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1688 | 1650 |
| 1689 // Overlap with 10 buffers starting at the beginning, appended one at a | 1651 // Overlap with 10 buffers starting at the beginning, appended one at a |
| 1690 // time. | 1652 // time. |
| 1691 NewSegmentAppend(0, 1, &kDataB); | 1653 NewCodedFrameGroupAppend(0, 1, &kDataB); |
| 1692 for (int i = 1; i < 10; i++) | 1654 for (int i = 1; i < 10; i++) |
| 1693 AppendBuffers(i, 1, &kDataB); | 1655 AppendBuffers(i, 1, &kDataB); |
| 1694 | 1656 |
| 1695 // All data should be replaced. | 1657 // All data should be replaced. |
| 1696 Seek(0); | 1658 Seek(0); |
| 1697 CheckExpectedRanges("{ [0,9) }"); | 1659 CheckExpectedRanges("{ [0,9) }"); |
| 1698 CheckExpectedBuffers(0, 9, &kDataB); | 1660 CheckExpectedBuffers(0, 9, &kDataB); |
| 1699 } | 1661 } |
| 1700 | 1662 |
| 1701 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_DeleteGroup) { | 1663 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_DeleteGroup) { |
| 1702 NewSegmentAppendOneByOne("10K 40 70 100 130K"); | 1664 NewCodedFrameGroupAppendOneByOne("10K 40 70 100 130K"); |
| 1703 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1665 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1704 | 1666 |
| 1705 // Seek to 130ms. | 1667 // Seek to 130ms. |
| 1706 SeekToTimestampMs(130); | 1668 SeekToTimestampMs(130); |
| 1707 | 1669 |
| 1708 // Overlap with a new segment from 0 to 130ms. | 1670 // Overlap with a new coded frame group from 0 to 130ms. |
| 1709 NewSegmentAppendOneByOne("0K 120D10"); | 1671 NewCodedFrameGroupAppendOneByOne("0K 120D10"); |
| 1710 | 1672 |
| 1711 // Next buffer should still be 130ms. | 1673 // Next buffer should still be 130ms. |
| 1712 CheckExpectedBuffers("130K"); | 1674 CheckExpectedBuffers("130K"); |
| 1713 | 1675 |
| 1714 // Check the final buffers is correct. | 1676 // Check the final buffers is correct. |
| 1715 SeekToTimestampMs(0); | 1677 SeekToTimestampMs(0); |
| 1716 CheckExpectedBuffers("0K 120 130K"); | 1678 CheckExpectedBuffers("0K 120 130K"); |
| 1717 } | 1679 } |
| 1718 | 1680 |
| 1719 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_BetweenMediaSegments) { | 1681 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_BetweenCodedFrameGroups) { |
| 1720 // Append 5 buffers starting at 110ms, 30ms apart. | 1682 // Append 5 buffers starting at 110ms, 30ms apart. |
| 1721 NewSegmentAppendOneByOne("110K 140 170 200 230"); | 1683 NewCodedFrameGroupAppendOneByOne("110K 140 170 200 230"); |
| 1722 CheckExpectedRangesByTimestamp("{ [110,260) }"); | 1684 CheckExpectedRangesByTimestamp("{ [110,260) }"); |
| 1723 | 1685 |
| 1724 // Now append 2 media segments from 0ms to 210ms, 30ms apart. Note that the | 1686 // Now append 2 coded frame groups from 0ms to 210ms, 30ms apart. Note that |
| 1725 // old keyframe 110ms falls in between these two segments. | 1687 // the |
| 1726 NewSegmentAppendOneByOne("0K 30 60 90"); | 1688 // old keyframe 110ms falls in between these two groups. |
| 1727 NewSegmentAppendOneByOne("120K 150 180 210"); | 1689 NewCodedFrameGroupAppendOneByOne("0K 30 60 90"); |
| 1690 NewCodedFrameGroupAppendOneByOne("120K 150 180 210"); | |
| 1728 CheckExpectedRangesByTimestamp("{ [0,240) }"); | 1691 CheckExpectedRangesByTimestamp("{ [0,240) }"); |
| 1729 | 1692 |
| 1730 // Check the final buffers is correct; the keyframe at 110ms should be | 1693 // Check the final buffers is correct; the keyframe at 110ms should be |
| 1731 // deleted. | 1694 // deleted. |
| 1732 SeekToTimestampMs(0); | 1695 SeekToTimestampMs(0); |
| 1733 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210"); | 1696 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210"); |
| 1734 } | 1697 } |
| 1735 | 1698 |
| 1736 // old : 10K 40 *70* 100K 125 130K | 1699 // old : 10K 40 *70* 100K 125 130K |
| 1737 // new : 0K 30 60 90 120K | 1700 // new : 0K 30 60 90 120K |
| 1738 // after: 0K 30 60 90 *120K* 130K | 1701 // after: 0K 30 60 90 *120K* 130K |
| 1739 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) { | 1702 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) { |
| 1740 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50)); | 1703 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50)); |
| 1741 | 1704 |
| 1742 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); | 1705 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K"); |
| 1743 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1706 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1744 | 1707 |
| 1745 // Seek to 70ms. | 1708 // Seek to 70ms. |
| 1746 SeekToTimestampMs(70); | 1709 SeekToTimestampMs(70); |
| 1747 CheckExpectedBuffers("10K 40"); | 1710 CheckExpectedBuffers("10K 40"); |
| 1748 | 1711 |
| 1749 // Overlap with a new segment from 0 to 130ms. | 1712 // Overlap with a new coded frame group from 0 to 130ms. |
| 1750 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); | 1713 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K"); |
| 1751 CheckExpectedRangesByTimestamp("{ [0,160) }"); | 1714 CheckExpectedRangesByTimestamp("{ [0,160) }"); |
| 1752 | 1715 |
| 1753 // Should return frame 70ms from the track buffer, then switch | 1716 // Should return frame 70ms from the track buffer, then switch |
| 1754 // to the new data at 120K, then switch back to the old data at 130K. The | 1717 // to the new data at 120K, then switch back to the old data at 130K. The |
| 1755 // frame at 125ms that depended on keyframe 100ms should have been deleted. | 1718 // frame at 125ms that depended on keyframe 100ms should have been deleted. |
| 1756 CheckExpectedBuffers("70 120K 130K"); | 1719 CheckExpectedBuffers("70 120K 130K"); |
| 1757 | 1720 |
| 1758 // Check the final result: should not include data from the track buffer. | 1721 // Check the final result: should not include data from the track buffer. |
| 1759 SeekToTimestampMs(0); | 1722 SeekToTimestampMs(0); |
| 1760 CheckExpectedBuffers("0K 30 60 90 120K 130K"); | 1723 CheckExpectedBuffers("0K 30 60 90 120K 130K"); |
| 1761 } | 1724 } |
| 1762 | 1725 |
| 1763 // Overlap the next keyframe after the end of the track buffer with a new | 1726 // Overlap the next keyframe after the end of the track buffer with a new |
| 1764 // keyframe. | 1727 // keyframe. |
| 1765 // old : 10K 40 *70* 100K 125 130K | 1728 // old : 10K 40 *70* 100K 125 130K |
| 1766 // new : 0K 30 60 90 120K | 1729 // new : 0K 30 60 90 120K |
| 1767 // after: 0K 30 60 90 *120K* 130K | 1730 // after: 0K 30 60 90 *120K* 130K |
| 1768 // track: 70 | 1731 // track: 70 |
| 1769 // new : 110K 130 | 1732 // new : 110K 130 |
| 1770 // after: 0K 30 60 90 *110K* 130 | 1733 // after: 0K 30 60 90 *110K* 130 |
| 1771 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) { | 1734 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) { |
| 1772 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(40)); | 1735 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(40)); |
| 1773 | 1736 |
| 1774 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); | 1737 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K"); |
| 1775 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1738 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1776 | 1739 |
| 1777 // Seek to 70ms. | 1740 // Seek to 70ms. |
| 1778 SeekToTimestampMs(70); | 1741 SeekToTimestampMs(70); |
| 1779 CheckExpectedBuffers("10K 40"); | 1742 CheckExpectedBuffers("10K 40"); |
| 1780 | 1743 |
| 1781 // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track | 1744 // Overlap with a new coded frame group from 0 to 120ms; 70ms and 100ms go in |
| 1745 // track | |
| 1782 // buffer. | 1746 // buffer. |
| 1783 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); | 1747 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K"); |
| 1784 CheckExpectedRangesByTimestamp("{ [0,160) }"); | 1748 CheckExpectedRangesByTimestamp("{ [0,160) }"); |
| 1785 | 1749 |
| 1786 // Now overlap the keyframe at 120ms. | 1750 // Now overlap the keyframe at 120ms. |
| 1787 NewSegmentAppendOneByOne("110K 130"); | 1751 NewCodedFrameGroupAppendOneByOne("110K 130"); |
| 1788 | 1752 |
| 1789 // Should return frame 70ms from the track buffer. Then it should | 1753 // Should return frame 70ms from the track buffer. Then it should |
| 1790 // return the keyframe after the track buffer, which is at 110ms. | 1754 // return the keyframe after the track buffer, which is at 110ms. |
| 1791 CheckExpectedBuffers("70 110K 130"); | 1755 CheckExpectedBuffers("70 110K 130"); |
| 1792 } | 1756 } |
| 1793 | 1757 |
| 1794 // Overlap the next keyframe after the end of the track buffer without a | 1758 // Overlap the next keyframe after the end of the track buffer without a |
| 1795 // new keyframe. | 1759 // new keyframe. |
| 1796 // old : 10K 40 *70* 100K 125 130K | 1760 // old : 10K 40 *70* 100K 125 130K |
| 1797 // new : 0K 30 60 90 120K | 1761 // new : 0K 30 60 90 120K |
| 1798 // after: 0K 30 60 90 *120K* 130K | 1762 // after: 0K 30 60 90 *120K* 130K |
| 1799 // track: 70 | 1763 // track: 70 |
| 1800 // new : 50K 80 110 140 | 1764 // new : 50K 80 110 140 |
| 1801 // after: 0K 30 50K 80 110 140 * (waiting for keyframe) | 1765 // after: 0K 30 50K 80 110 140 * (waiting for keyframe) |
| 1802 // track: 70 | 1766 // track: 70 |
| 1803 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) { | 1767 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) { |
| 1804 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(80)); | 1768 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(80)); |
| 1805 | 1769 |
| 1806 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); | 1770 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K"); |
| 1807 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1771 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1808 | 1772 |
| 1809 // Seek to 70ms. | 1773 // Seek to 70ms. |
| 1810 SeekToTimestampMs(70); | 1774 SeekToTimestampMs(70); |
| 1811 CheckExpectedBuffers("10K 40"); | 1775 CheckExpectedBuffers("10K 40"); |
| 1812 | 1776 |
| 1813 // Overlap with a new segment from 0 to 120ms; 70ms goes in track buffer. | 1777 // Overlap with a new coded frame group from 0 to 120ms; 70ms goes in track |
| 1814 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); | 1778 // buffer. |
| 1779 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K"); | |
| 1815 CheckExpectedRangesByTimestamp("{ [0,160) }"); | 1780 CheckExpectedRangesByTimestamp("{ [0,160) }"); |
| 1816 | 1781 |
| 1817 // Now overlap the keyframe at 120ms and 130ms. | 1782 // Now overlap the keyframe at 120ms and 130ms. |
| 1818 NewSegmentAppendOneByOne("50K 80 110 140"); | 1783 NewCodedFrameGroupAppendOneByOne("50K 80 110 140"); |
| 1819 CheckExpectedRangesByTimestamp("{ [0,170) }"); | 1784 CheckExpectedRangesByTimestamp("{ [0,170) }"); |
| 1820 | 1785 |
| 1821 // Should have all the buffers from the track buffer, then stall. | 1786 // Should have all the buffers from the track buffer, then stall. |
| 1822 CheckExpectedBuffers("70"); | 1787 CheckExpectedBuffers("70"); |
| 1823 CheckNoNextBuffer(); | 1788 CheckNoNextBuffer(); |
| 1824 | 1789 |
| 1825 // Appending a keyframe should fulfill the read. | 1790 // Appending a keyframe should fulfill the read. |
| 1826 AppendBuffersOneByOne("150D30K"); | 1791 AppendBuffersOneByOne("150D30K"); |
| 1827 CheckExpectedBuffers("150K"); | 1792 CheckExpectedBuffers("150K"); |
| 1828 CheckNoNextBuffer(); | 1793 CheckNoNextBuffer(); |
| 1829 } | 1794 } |
| 1830 | 1795 |
| 1831 // Overlap the next keyframe after the end of the track buffer with a keyframe | 1796 // Overlap the next keyframe after the end of the track buffer with a keyframe |
| 1832 // that comes before the end of the track buffer. | 1797 // that comes before the end of the track buffer. |
| 1833 // old : 10K 40 *70* 100K 125 130K | 1798 // old : 10K 40 *70* 100K 125 130K |
| 1834 // new : 0K 30 60 90 120K | 1799 // new : 0K 30 60 90 120K |
| 1835 // after: 0K 30 60 90 *120K* 130K | 1800 // after: 0K 30 60 90 *120K* 130K |
| 1836 // track: 70 | 1801 // track: 70 |
| 1837 // new : 80K 110 140 | 1802 // new : 80K 110 140 |
| 1838 // after: 0K 30 60 *80K* 110 140 | 1803 // after: 0K 30 60 *80K* 110 140 |
| 1839 // track: 70 | 1804 // track: 70 |
| 1840 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer4) { | 1805 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer4) { |
| 1841 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); | 1806 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K"); |
| 1842 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 1807 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 1843 | 1808 |
| 1844 // Seek to 70ms. | 1809 // Seek to 70ms. |
| 1845 SeekToTimestampMs(70); | 1810 SeekToTimestampMs(70); |
| 1846 CheckExpectedBuffers("10K 40"); | 1811 CheckExpectedBuffers("10K 40"); |
| 1847 | 1812 |
| 1848 // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track | 1813 // Overlap with a new coded frame group from 0 to 120ms; 70ms and 100ms go in |
| 1814 // track | |
| 1849 // buffer. | 1815 // buffer. |
| 1850 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); | 1816 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K"); |
| 1851 CheckExpectedRangesByTimestamp("{ [0,160) }"); | 1817 CheckExpectedRangesByTimestamp("{ [0,160) }"); |
| 1852 | 1818 |
| 1853 // Now append a keyframe at 80ms. | 1819 // Now append a keyframe at 80ms. |
| 1854 NewSegmentAppendOneByOne("80K 110 140"); | 1820 NewCodedFrameGroupAppendOneByOne("80K 110 140"); |
| 1855 | 1821 |
| 1856 CheckExpectedBuffers("70 80K 110 140"); | 1822 CheckExpectedBuffers("70 80K 110 140"); |
| 1857 CheckNoNextBuffer(); | 1823 CheckNoNextBuffer(); |
| 1858 } | 1824 } |
| 1859 | 1825 |
| 1860 // Overlap the next keyframe after the end of the track buffer with a keyframe | 1826 // Overlap the next keyframe after the end of the track buffer with a keyframe |
| 1861 // that comes before the end of the track buffer, when the selected stream was | 1827 // that comes before the end of the track buffer, when the selected stream was |
| 1862 // waiting for the next keyframe. | 1828 // waiting for the next keyframe. |
| 1863 // old : 10K 40 *70* 100K | 1829 // old : 10K 40 *70* 100K |
| 1864 // new : 0K 30 60 90 120 | 1830 // new : 0K 30 60 90 120 |
| 1865 // after: 0K 30 60 90 120 * (waiting for keyframe) | 1831 // after: 0K 30 60 90 120 * (waiting for keyframe) |
| 1866 // track: 70 | 1832 // track: 70 |
| 1867 // new : 80K 110 140 | 1833 // new : 80K 110 140 |
| 1868 // after: 0K 30 60 *80K* 110 140 | 1834 // after: 0K 30 60 *80K* 110 140 |
| 1869 // track: 70 | 1835 // track: 70 |
| 1870 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer5) { | 1836 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer5) { |
| 1871 NewSegmentAppendOneByOne("10K 40 70 100K"); | 1837 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K"); |
| 1872 CheckExpectedRangesByTimestamp("{ [10,130) }"); | 1838 CheckExpectedRangesByTimestamp("{ [10,130) }"); |
| 1873 | 1839 |
| 1874 // Seek to 70ms. | 1840 // Seek to 70ms. |
| 1875 SeekToTimestampMs(70); | 1841 SeekToTimestampMs(70); |
| 1876 CheckExpectedBuffers("10K 40"); | 1842 CheckExpectedBuffers("10K 40"); |
| 1877 | 1843 |
| 1878 // Overlap with a new segment from 0 to 120ms; 70ms goes in track | 1844 // Overlap with a new coded frame group from 0 to 120ms; 70ms goes in track |
| 1879 // buffer. | 1845 // buffer. |
| 1880 NewSegmentAppendOneByOne("0K 30 60 90 120"); | 1846 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120"); |
| 1881 CheckExpectedRangesByTimestamp("{ [0,150) }"); | 1847 CheckExpectedRangesByTimestamp("{ [0,150) }"); |
| 1882 | 1848 |
| 1883 // Now append a keyframe at 80ms. | 1849 // Now append a keyframe at 80ms. |
| 1884 NewSegmentAppendOneByOne("80K 110 140"); | 1850 NewCodedFrameGroupAppendOneByOne("80K 110 140"); |
| 1885 | 1851 |
| 1886 CheckExpectedBuffers("70 80K 110 140"); | 1852 CheckExpectedBuffers("70 80K 110 140"); |
| 1887 CheckNoNextBuffer(); | 1853 CheckNoNextBuffer(); |
| 1888 } | 1854 } |
| 1889 | 1855 |
| 1890 // Test that appending to a different range while there is data in | 1856 // Test that appending to a different range while there is data in |
| 1891 // the track buffer doesn't affect the selected range or track buffer state. | 1857 // the track buffer doesn't affect the selected range or track buffer state. |
| 1892 // old : 10K 40 *70* 100K 125 130K ... 200K 230 | 1858 // old : 10K 40 *70* 100K 125 130K ... 200K 230 |
| 1893 // new : 0K 30 60 90 120K | 1859 // new : 0K 30 60 90 120K |
| 1894 // after: 0K 30 60 90 *120K* 130K ... 200K 230 | 1860 // after: 0K 30 60 90 *120K* 130K ... 200K 230 |
| 1895 // track: 70 | 1861 // track: 70 |
| 1896 // old : 0K 30 60 90 *120K* 130K ... 200K 230 | 1862 // old : 0K 30 60 90 *120K* 130K ... 200K 230 |
| 1897 // new : 260K 290 | 1863 // new : 260K 290 |
| 1898 // after: 0K 30 60 90 *120K* 130K ... 200K 230 260K 290 | 1864 // after: 0K 30 60 90 *120K* 130K ... 200K 230 260K 290 |
| 1899 // track: 70 | 1865 // track: 70 |
| 1900 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) { | 1866 TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) { |
| 1901 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50)); | 1867 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(50)); |
| 1902 | 1868 |
| 1903 NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K"); | 1869 NewCodedFrameGroupAppendOneByOne("10K 40 70 100K 125 130D30K"); |
| 1904 NewSegmentAppendOneByOne("200K 230"); | 1870 NewCodedFrameGroupAppendOneByOne("200K 230"); |
| 1905 CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }"); | 1871 CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }"); |
| 1906 | 1872 |
| 1907 // Seek to 70ms. | 1873 // Seek to 70ms. |
| 1908 SeekToTimestampMs(70); | 1874 SeekToTimestampMs(70); |
| 1909 CheckExpectedBuffers("10K 40"); | 1875 CheckExpectedBuffers("10K 40"); |
| 1910 | 1876 |
| 1911 // Overlap with a new segment from 0 to 120ms. | 1877 // Overlap with a new coded frame group from 0 to 120ms. |
| 1912 NewSegmentAppendOneByOne("0K 30 60 90 120D10K"); | 1878 NewCodedFrameGroupAppendOneByOne("0K 30 60 90 120D10K"); |
| 1913 CheckExpectedRangesByTimestamp("{ [0,160) [200,260) }"); | 1879 CheckExpectedRangesByTimestamp("{ [0,160) [200,260) }"); |
| 1914 | 1880 |
| 1915 // Verify that 70 gets read out of the track buffer. | 1881 // Verify that 70 gets read out of the track buffer. |
| 1916 CheckExpectedBuffers("70"); | 1882 CheckExpectedBuffers("70"); |
| 1917 | 1883 |
| 1918 // Append more data to the unselected range. | 1884 // Append more data to the unselected range. |
| 1919 NewSegmentAppendOneByOne("260K 290"); | 1885 NewCodedFrameGroupAppendOneByOne("260K 290"); |
| 1920 CheckExpectedRangesByTimestamp("{ [0,160) [200,320) }"); | 1886 CheckExpectedRangesByTimestamp("{ [0,160) [200,320) }"); |
| 1921 | 1887 |
| 1922 CheckExpectedBuffers("120K 130K"); | 1888 CheckExpectedBuffers("120K 130K"); |
| 1923 CheckNoNextBuffer(); | 1889 CheckNoNextBuffer(); |
| 1924 | 1890 |
| 1925 // Check the final result: should not include data from the track buffer. | 1891 // Check the final result: should not include data from the track buffer. |
| 1926 SeekToTimestampMs(0); | 1892 SeekToTimestampMs(0); |
| 1927 CheckExpectedBuffers("0K 30 60 90 120K 130K"); | 1893 CheckExpectedBuffers("0K 30 60 90 120K 130K"); |
| 1928 CheckNoNextBuffer(); | 1894 CheckNoNextBuffer(); |
| 1929 } | 1895 } |
| 1930 | 1896 |
| 1931 TEST_F(SourceBufferStreamTest, Seek_Keyframe) { | 1897 TEST_F(SourceBufferStreamTest, Seek_Keyframe) { |
| 1932 // Append 6 buffers at positions 0 through 5. | 1898 // Append 6 buffers at positions 0 through 5. |
| 1933 NewSegmentAppend(0, 6); | 1899 NewCodedFrameGroupAppend(0, 6); |
| 1934 | 1900 |
| 1935 // Seek to beginning. | 1901 // Seek to beginning. |
| 1936 Seek(0); | 1902 Seek(0); |
| 1937 CheckExpectedBuffers(0, 5, true); | 1903 CheckExpectedBuffers(0, 5, true); |
| 1938 } | 1904 } |
| 1939 | 1905 |
| 1940 TEST_F(SourceBufferStreamTest, Seek_NonKeyframe) { | 1906 TEST_F(SourceBufferStreamTest, Seek_NonKeyframe) { |
| 1941 // Append 15 buffers at positions 0 through 14. | 1907 // Append 15 buffers at positions 0 through 14. |
| 1942 NewSegmentAppend(0, 15); | 1908 NewCodedFrameGroupAppend(0, 15); |
| 1943 | 1909 |
| 1944 // Seek to buffer at position 13. | 1910 // Seek to buffer at position 13. |
| 1945 Seek(13); | 1911 Seek(13); |
| 1946 | 1912 |
| 1947 // Expect seeking back to the nearest keyframe. | 1913 // Expect seeking back to the nearest keyframe. |
| 1948 CheckExpectedBuffers(10, 14, true); | 1914 CheckExpectedBuffers(10, 14, true); |
| 1949 | 1915 |
| 1950 // Seek to buffer at position 3. | 1916 // Seek to buffer at position 3. |
| 1951 Seek(3); | 1917 Seek(3); |
| 1952 | 1918 |
| 1953 // Expect seeking back to the nearest keyframe. | 1919 // Expect seeking back to the nearest keyframe. |
| 1954 CheckExpectedBuffers(0, 3, true); | 1920 CheckExpectedBuffers(0, 3, true); |
| 1955 } | 1921 } |
| 1956 | 1922 |
| 1957 TEST_F(SourceBufferStreamTest, Seek_NotBuffered) { | 1923 TEST_F(SourceBufferStreamTest, Seek_NotBuffered) { |
| 1958 // Seek to beginning. | 1924 // Seek to beginning. |
| 1959 Seek(0); | 1925 Seek(0); |
| 1960 | 1926 |
| 1961 // Try to get buffer; nothing's appended. | 1927 // Try to get buffer; nothing's appended. |
| 1962 CheckNoNextBuffer(); | 1928 CheckNoNextBuffer(); |
| 1963 | 1929 |
| 1964 // Append 2 buffers at positions 0. | 1930 // Append 2 buffers at positions 0. |
| 1965 NewSegmentAppend(0, 2); | 1931 NewCodedFrameGroupAppend(0, 2); |
| 1966 Seek(0); | 1932 Seek(0); |
| 1967 CheckExpectedBuffers(0, 1); | 1933 CheckExpectedBuffers(0, 1); |
| 1968 | 1934 |
| 1969 // Try to get buffer out of range. | 1935 // Try to get buffer out of range. |
| 1970 Seek(2); | 1936 Seek(2); |
| 1971 CheckNoNextBuffer(); | 1937 CheckNoNextBuffer(); |
| 1972 } | 1938 } |
| 1973 | 1939 |
| 1974 TEST_F(SourceBufferStreamTest, Seek_InBetweenTimestamps) { | 1940 TEST_F(SourceBufferStreamTest, Seek_InBetweenTimestamps) { |
| 1975 // Append 10 buffers at positions 0 through 9. | 1941 // Append 10 buffers at positions 0 through 9. |
| 1976 NewSegmentAppend(0, 10); | 1942 NewCodedFrameGroupAppend(0, 10); |
| 1977 | 1943 |
| 1978 base::TimeDelta bump = frame_duration() / 4; | 1944 base::TimeDelta bump = frame_duration() / 4; |
| 1979 CHECK(bump > base::TimeDelta()); | 1945 CHECK(bump > base::TimeDelta()); |
| 1980 | 1946 |
| 1981 // Seek to buffer a little after position 5. | 1947 // Seek to buffer a little after position 5. |
| 1982 stream_->Seek(5 * frame_duration() + bump); | 1948 stream_->Seek(5 * frame_duration() + bump); |
| 1983 CheckExpectedBuffers(5, 5, true); | 1949 CheckExpectedBuffers(5, 5, true); |
| 1984 | 1950 |
| 1985 // Seek to buffer a little before position 5. | 1951 // Seek to buffer a little before position 5. |
| 1986 stream_->Seek(5 * frame_duration() - bump); | 1952 stream_->Seek(5 * frame_duration() - bump); |
| 1987 CheckExpectedBuffers(0, 0, true); | 1953 CheckExpectedBuffers(0, 0, true); |
| 1988 } | 1954 } |
| 1989 | 1955 |
| 1990 // This test will do a complete overlap of an existing range in order to add | 1956 // This test will do a complete overlap of an existing range in order to add |
| 1991 // buffers to the track buffers. Then the test does a seek to another part of | 1957 // buffers to the track buffers. Then the test does a seek to another part of |
| 1992 // the stream. The SourceBufferStream should clear its internal track buffer in | 1958 // the stream. The SourceBufferStream should clear its internal track buffer in |
| 1993 // response to the Seek(). | 1959 // response to the Seek(). |
| 1994 TEST_F(SourceBufferStreamTest, Seek_After_TrackBuffer_Filled) { | 1960 TEST_F(SourceBufferStreamTest, Seek_After_TrackBuffer_Filled) { |
| 1995 // Append 10 buffers at positions 5 through 14. | 1961 // Append 10 buffers at positions 5 through 14. |
| 1996 NewSegmentAppend(5, 10, &kDataA); | 1962 NewCodedFrameGroupAppend(5, 10, &kDataA); |
| 1997 | 1963 |
| 1998 // Seek to buffer at position 5 and get next buffer. | 1964 // Seek to buffer at position 5 and get next buffer. |
| 1999 Seek(5); | 1965 Seek(5); |
| 2000 CheckExpectedBuffers(5, 5, &kDataA); | 1966 CheckExpectedBuffers(5, 5, &kDataA); |
| 2001 | 1967 |
| 2002 // Do a complete overlap by appending 20 buffers at positions 0 through 19. | 1968 // Do a complete overlap by appending 20 buffers at positions 0 through 19. |
| 2003 NewSegmentAppend(0, 20, &kDataB); | 1969 NewCodedFrameGroupAppend(0, 20, &kDataB); |
| 2004 | 1970 |
| 2005 // Check range is correct. | 1971 // Check range is correct. |
| 2006 CheckExpectedRanges("{ [0,19) }"); | 1972 CheckExpectedRanges("{ [0,19) }"); |
| 2007 | 1973 |
| 2008 // Seek to beginning; all data should be new. | 1974 // Seek to beginning; all data should be new. |
| 2009 Seek(0); | 1975 Seek(0); |
| 2010 CheckExpectedBuffers(0, 19, &kDataB); | 1976 CheckExpectedBuffers(0, 19, &kDataB); |
| 2011 | 1977 |
| 2012 // Check range continues to be correct. | 1978 // Check range continues to be correct. |
| 2013 CheckExpectedRanges("{ [0,19) }"); | 1979 CheckExpectedRanges("{ [0,19) }"); |
| 2014 } | 1980 } |
| 2015 | 1981 |
| 2016 TEST_F(SourceBufferStreamTest, Seek_StartOfSegment) { | 1982 TEST_F(SourceBufferStreamTest, Seek_StartOfGroup) { |
| 2017 base::TimeDelta bump = frame_duration() / 4; | 1983 base::TimeDelta bump = frame_duration() / 4; |
| 2018 CHECK(bump > base::TimeDelta()); | 1984 CHECK(bump > base::TimeDelta()); |
| 2019 | 1985 |
| 2020 // Append 5 buffers at position (5 + |bump|) through 9, where the media | 1986 // Append 5 buffers at position (5 + |bump|) through 9, where the coded frame |
| 2021 // segment begins at position 5. | 1987 // group begins at position 5. |
| 2022 Seek(5); | 1988 Seek(5); |
| 2023 NewSegmentAppend_OffsetFirstBuffer(5, 5, bump); | 1989 NewCodedFrameGroupAppend_OffsetFirstBuffer(5, 5, bump); |
| 2024 scoped_refptr<StreamParserBuffer> buffer; | 1990 scoped_refptr<StreamParserBuffer> buffer; |
| 2025 | 1991 |
| 2026 // GetNextBuffer() should return the next buffer at position (5 + |bump|). | 1992 // GetNextBuffer() should return the next buffer at position (5 + |bump|). |
| 2027 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); | 1993 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| 2028 EXPECT_EQ(buffer->GetDecodeTimestamp(), | 1994 EXPECT_EQ(buffer->GetDecodeTimestamp(), |
| 2029 DecodeTimestamp::FromPresentationTime(5 * frame_duration() + bump)); | 1995 DecodeTimestamp::FromPresentationTime(5 * frame_duration() + bump)); |
| 2030 | 1996 |
| 2031 // Check rest of buffers. | 1997 // Check rest of buffers. |
| 2032 CheckExpectedBuffers(6, 9); | 1998 CheckExpectedBuffers(6, 9); |
| 2033 | 1999 |
| 2034 // Seek to position 15. | 2000 // Seek to position 15. |
| 2035 Seek(15); | 2001 Seek(15); |
| 2036 | 2002 |
| 2037 // Append 5 buffers at positions (15 + |bump|) through 19, where the media | 2003 // Append 5 buffers at positions (15 + |bump|) through 19, where the coded |
| 2038 // segment begins at 15. | 2004 // frame group begins at 15. |
| 2039 NewSegmentAppend_OffsetFirstBuffer(15, 5, bump); | 2005 NewCodedFrameGroupAppend_OffsetFirstBuffer(15, 5, bump); |
| 2040 | 2006 |
| 2041 // GetNextBuffer() should return the next buffer at position (15 + |bump|). | 2007 // GetNextBuffer() should return the next buffer at position (15 + |bump|). |
| 2042 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); | 2008 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| 2043 EXPECT_EQ(buffer->GetDecodeTimestamp(), DecodeTimestamp::FromPresentationTime( | 2009 EXPECT_EQ(buffer->GetDecodeTimestamp(), DecodeTimestamp::FromPresentationTime( |
| 2044 15 * frame_duration() + bump)); | 2010 15 * frame_duration() + bump)); |
| 2045 | 2011 |
| 2046 // Check rest of buffers. | 2012 // Check rest of buffers. |
| 2047 CheckExpectedBuffers(16, 19); | 2013 CheckExpectedBuffers(16, 19); |
| 2048 } | 2014 } |
| 2049 | 2015 |
| 2050 TEST_F(SourceBufferStreamTest, Seek_BeforeStartOfSegment) { | 2016 TEST_F(SourceBufferStreamTest, Seek_BeforeStartOfGroup) { |
| 2051 // Append 10 buffers at positions 5 through 14. | 2017 // Append 10 buffers at positions 5 through 14. |
| 2052 NewSegmentAppend(5, 10); | 2018 NewCodedFrameGroupAppend(5, 10); |
| 2053 | 2019 |
| 2054 // Seek to a time before the first buffer in the range. | 2020 // Seek to a time before the first buffer in the range. |
| 2055 Seek(0); | 2021 Seek(0); |
| 2056 | 2022 |
| 2057 // Should return buffers from the beginning of the range. | 2023 // Should return buffers from the beginning of the range. |
| 2058 CheckExpectedBuffers(5, 14); | 2024 CheckExpectedBuffers(5, 14); |
| 2059 } | 2025 } |
| 2060 | 2026 |
| 2061 TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap) { | 2027 TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap) { |
| 2062 // Append 5 buffers at positions 0 through 4. | 2028 // Append 5 buffers at positions 0 through 4. |
| 2063 NewSegmentAppend(0, 4); | 2029 NewCodedFrameGroupAppend(0, 4); |
| 2064 | 2030 |
| 2065 // Append 5 buffers at positions 10 through 14, and seek to the beginning of | 2031 // Append 5 buffers at positions 10 through 14, and seek to the beginning of |
| 2066 // this range. | 2032 // this range. |
| 2067 NewSegmentAppend(10, 5); | 2033 NewCodedFrameGroupAppend(10, 5); |
| 2068 Seek(10); | 2034 Seek(10); |
| 2069 | 2035 |
| 2070 // Now seek to the beginning of the first range. | 2036 // Now seek to the beginning of the first range. |
| 2071 Seek(0); | 2037 Seek(0); |
| 2072 | 2038 |
| 2073 // Completely overlap the old seek point. | 2039 // Completely overlap the old seek point. |
| 2074 NewSegmentAppend(5, 15); | 2040 NewCodedFrameGroupAppend(5, 15); |
| 2075 | 2041 |
| 2076 // The GetNextBuffer() call should respect the 2nd seek point. | 2042 // The GetNextBuffer() call should respect the 2nd seek point. |
| 2077 CheckExpectedBuffers(0, 0); | 2043 CheckExpectedBuffers(0, 0); |
| 2078 } | 2044 } |
| 2079 | 2045 |
| 2080 TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap_Pending) { | 2046 TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap_Pending) { |
| 2081 // Append 2 buffers at positions 0 through 1. | 2047 // Append 2 buffers at positions 0 through 1. |
| 2082 NewSegmentAppend(0, 2); | 2048 NewCodedFrameGroupAppend(0, 2); |
| 2083 | 2049 |
| 2084 // Append 5 buffers at positions 15 through 19 and seek to beginning of the | 2050 // Append 5 buffers at positions 15 through 19 and seek to beginning of the |
| 2085 // range. | 2051 // range. |
| 2086 NewSegmentAppend(15, 5); | 2052 NewCodedFrameGroupAppend(15, 5); |
| 2087 Seek(15); | 2053 Seek(15); |
| 2088 | 2054 |
| 2089 // Now seek position 5. | 2055 // Now seek position 5. |
| 2090 Seek(5); | 2056 Seek(5); |
| 2091 | 2057 |
| 2092 // Completely overlap the old seek point. | 2058 // Completely overlap the old seek point. |
| 2093 NewSegmentAppend(10, 15); | 2059 NewCodedFrameGroupAppend(10, 15); |
| 2094 | 2060 |
| 2095 // The seek at position 5 should still be pending. | 2061 // The seek at position 5 should still be pending. |
| 2096 CheckNoNextBuffer(); | 2062 CheckNoNextBuffer(); |
| 2097 } | 2063 } |
| 2098 | 2064 |
| 2099 TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap) { | 2065 TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap) { |
| 2100 // Append 2 buffers at positions 0 through 1. | 2066 // Append 2 buffers at positions 0 through 1. |
| 2101 NewSegmentAppend(0, 2); | 2067 NewCodedFrameGroupAppend(0, 2); |
| 2102 | 2068 |
| 2103 // Append 15 buffers at positions 5 through 19 and seek to position 15. | 2069 // Append 15 buffers at positions 5 through 19 and seek to position 15. |
| 2104 NewSegmentAppend(5, 15); | 2070 NewCodedFrameGroupAppend(5, 15); |
| 2105 Seek(15); | 2071 Seek(15); |
| 2106 | 2072 |
| 2107 // Now seek to the beginning of the stream. | 2073 // Now seek to the beginning of the stream. |
| 2108 Seek(0); | 2074 Seek(0); |
| 2109 | 2075 |
| 2110 // Overlap the middle of the range such that there are now three ranges. | 2076 // Overlap the middle of the range such that there are now three ranges. |
| 2111 NewSegmentAppend(10, 3); | 2077 NewCodedFrameGroupAppend(10, 3); |
| 2112 CheckExpectedRanges("{ [0,1) [5,12) [15,19) }"); | 2078 CheckExpectedRanges("{ [0,1) [5,12) [15,19) }"); |
| 2113 | 2079 |
| 2114 // The GetNextBuffer() call should respect the 2nd seek point. | 2080 // The GetNextBuffer() call should respect the 2nd seek point. |
| 2115 CheckExpectedBuffers(0, 0); | 2081 CheckExpectedBuffers(0, 0); |
| 2116 } | 2082 } |
| 2117 | 2083 |
| 2118 TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap_Pending) { | 2084 TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap_Pending) { |
| 2119 // Append 2 buffers at positions 0 through 1. | 2085 // Append 2 buffers at positions 0 through 1. |
| 2120 NewSegmentAppend(0, 2); | 2086 NewCodedFrameGroupAppend(0, 2); |
| 2121 | 2087 |
| 2122 // Append 15 buffers at positions 10 through 24 and seek to position 20. | 2088 // Append 15 buffers at positions 10 through 24 and seek to position 20. |
| 2123 NewSegmentAppend(10, 15); | 2089 NewCodedFrameGroupAppend(10, 15); |
| 2124 Seek(20); | 2090 Seek(20); |
| 2125 | 2091 |
| 2126 // Now seek to position 5. | 2092 // Now seek to position 5. |
| 2127 Seek(5); | 2093 Seek(5); |
| 2128 | 2094 |
| 2129 // Overlap the middle of the range such that it is now split into two ranges. | 2095 // Overlap the middle of the range such that it is now split into two ranges. |
| 2130 NewSegmentAppend(15, 3); | 2096 NewCodedFrameGroupAppend(15, 3); |
| 2131 CheckExpectedRanges("{ [0,1) [10,17) [20,24) }"); | 2097 CheckExpectedRanges("{ [0,1) [10,17) [20,24) }"); |
| 2132 | 2098 |
| 2133 // The seek at position 5 should still be pending. | 2099 // The seek at position 5 should still be pending. |
| 2134 CheckNoNextBuffer(); | 2100 CheckNoNextBuffer(); |
| 2135 } | 2101 } |
| 2136 | 2102 |
| 2137 TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap) { | 2103 TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap) { |
| 2138 // Append 2 buffers at positions 0 through 1. | 2104 // Append 2 buffers at positions 0 through 1. |
| 2139 NewSegmentAppend(0, 2); | 2105 NewCodedFrameGroupAppend(0, 2); |
| 2140 | 2106 |
| 2141 // Append 15 buffers at positions 5 through 19 and seek to position 15. | 2107 // Append 15 buffers at positions 5 through 19 and seek to position 15. |
| 2142 NewSegmentAppend(5, 15); | 2108 NewCodedFrameGroupAppend(5, 15); |
| 2143 Seek(15); | 2109 Seek(15); |
| 2144 | 2110 |
| 2145 // Now seek to the beginning of the stream. | 2111 // Now seek to the beginning of the stream. |
| 2146 Seek(0); | 2112 Seek(0); |
| 2147 | 2113 |
| 2148 // Start overlap the old seek point. | 2114 // Start overlap the old seek point. |
| 2149 NewSegmentAppend(10, 10); | 2115 NewCodedFrameGroupAppend(10, 10); |
| 2150 | 2116 |
| 2151 // The GetNextBuffer() call should respect the 2nd seek point. | 2117 // The GetNextBuffer() call should respect the 2nd seek point. |
| 2152 CheckExpectedBuffers(0, 0); | 2118 CheckExpectedBuffers(0, 0); |
| 2153 } | 2119 } |
| 2154 | 2120 |
| 2155 TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap_Pending) { | 2121 TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap_Pending) { |
| 2156 // Append 2 buffers at positions 0 through 1. | 2122 // Append 2 buffers at positions 0 through 1. |
| 2157 NewSegmentAppend(0, 2); | 2123 NewCodedFrameGroupAppend(0, 2); |
| 2158 | 2124 |
| 2159 // Append 15 buffers at positions 10 through 24 and seek to position 20. | 2125 // Append 15 buffers at positions 10 through 24 and seek to position 20. |
| 2160 NewSegmentAppend(10, 15); | 2126 NewCodedFrameGroupAppend(10, 15); |
| 2161 Seek(20); | 2127 Seek(20); |
| 2162 | 2128 |
| 2163 // Now seek to position 5. | 2129 // Now seek to position 5. |
| 2164 Seek(5); | 2130 Seek(5); |
| 2165 | 2131 |
| 2166 // Start overlap the old seek point. | 2132 // Start overlap the old seek point. |
| 2167 NewSegmentAppend(15, 10); | 2133 NewCodedFrameGroupAppend(15, 10); |
| 2168 | 2134 |
| 2169 // The seek at time 0 should still be pending. | 2135 // The seek at time 0 should still be pending. |
| 2170 CheckNoNextBuffer(); | 2136 CheckNoNextBuffer(); |
| 2171 } | 2137 } |
| 2172 | 2138 |
| 2173 TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap) { | 2139 TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap) { |
| 2174 // Append 5 buffers at positions 0 through 4. | 2140 // Append 5 buffers at positions 0 through 4. |
| 2175 NewSegmentAppend(0, 4); | 2141 NewCodedFrameGroupAppend(0, 4); |
| 2176 | 2142 |
| 2177 // Append 15 buffers at positions 10 through 24 and seek to start of range. | 2143 // Append 15 buffers at positions 10 through 24 and seek to start of range. |
| 2178 NewSegmentAppend(10, 15); | 2144 NewCodedFrameGroupAppend(10, 15); |
| 2179 Seek(10); | 2145 Seek(10); |
| 2180 | 2146 |
| 2181 // Now seek to the beginning of the stream. | 2147 // Now seek to the beginning of the stream. |
| 2182 Seek(0); | 2148 Seek(0); |
| 2183 | 2149 |
| 2184 // End overlap the old seek point. | 2150 // End overlap the old seek point. |
| 2185 NewSegmentAppend(5, 10); | 2151 NewCodedFrameGroupAppend(5, 10); |
| 2186 | 2152 |
| 2187 // The GetNextBuffer() call should respect the 2nd seek point. | 2153 // The GetNextBuffer() call should respect the 2nd seek point. |
| 2188 CheckExpectedBuffers(0, 0); | 2154 CheckExpectedBuffers(0, 0); |
| 2189 } | 2155 } |
| 2190 | 2156 |
| 2191 TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap_Pending) { | 2157 TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap_Pending) { |
| 2192 // Append 2 buffers at positions 0 through 1. | 2158 // Append 2 buffers at positions 0 through 1. |
| 2193 NewSegmentAppend(0, 2); | 2159 NewCodedFrameGroupAppend(0, 2); |
| 2194 | 2160 |
| 2195 // Append 15 buffers at positions 15 through 29 and seek to start of range. | 2161 // Append 15 buffers at positions 15 through 29 and seek to start of range. |
| 2196 NewSegmentAppend(15, 15); | 2162 NewCodedFrameGroupAppend(15, 15); |
| 2197 Seek(15); | 2163 Seek(15); |
| 2198 | 2164 |
| 2199 // Now seek to position 5 | 2165 // Now seek to position 5 |
| 2200 Seek(5); | 2166 Seek(5); |
| 2201 | 2167 |
| 2202 // End overlap the old seek point. | 2168 // End overlap the old seek point. |
| 2203 NewSegmentAppend(10, 10); | 2169 NewCodedFrameGroupAppend(10, 10); |
| 2204 | 2170 |
| 2205 // The seek at time 0 should still be pending. | 2171 // The seek at time 0 should still be pending. |
| 2206 CheckNoNextBuffer(); | 2172 CheckNoNextBuffer(); |
| 2207 } | 2173 } |
| 2208 | 2174 |
| 2209 TEST_F(SourceBufferStreamTest, GetNextBuffer_AfterMerges) { | 2175 TEST_F(SourceBufferStreamTest, GetNextBuffer_AfterMerges) { |
| 2210 // Append 5 buffers at positions 10 through 14. | 2176 // Append 5 buffers at positions 10 through 14. |
| 2211 NewSegmentAppend(10, 5); | 2177 NewCodedFrameGroupAppend(10, 5); |
| 2212 | 2178 |
| 2213 // Seek to buffer at position 12. | 2179 // Seek to buffer at position 12. |
| 2214 Seek(12); | 2180 Seek(12); |
| 2215 | 2181 |
| 2216 // Append 5 buffers at positions 5 through 9. | 2182 // Append 5 buffers at positions 5 through 9. |
| 2217 NewSegmentAppend(5, 5); | 2183 NewCodedFrameGroupAppend(5, 5); |
| 2218 | 2184 |
| 2219 // Make sure ranges are merged. | 2185 // Make sure ranges are merged. |
| 2220 CheckExpectedRanges("{ [5,14) }"); | 2186 CheckExpectedRanges("{ [5,14) }"); |
| 2221 | 2187 |
| 2222 // Make sure the next buffer is correct. | 2188 // Make sure the next buffer is correct. |
| 2223 CheckExpectedBuffers(10, 10); | 2189 CheckExpectedBuffers(10, 10); |
| 2224 | 2190 |
| 2225 // Append 5 buffers at positions 15 through 19. | 2191 // Append 5 buffers at positions 15 through 19. |
| 2226 NewSegmentAppend(15, 5); | 2192 NewCodedFrameGroupAppend(15, 5); |
| 2227 CheckExpectedRanges("{ [5,19) }"); | 2193 CheckExpectedRanges("{ [5,19) }"); |
| 2228 | 2194 |
| 2229 // Make sure the remaining next buffers are correct. | 2195 // Make sure the remaining next buffers are correct. |
| 2230 CheckExpectedBuffers(11, 14); | 2196 CheckExpectedBuffers(11, 14); |
| 2231 } | 2197 } |
| 2232 | 2198 |
| 2233 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenAppend) { | 2199 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenAppend) { |
| 2234 // Append 4 buffers at positions 0 through 3. | 2200 // Append 4 buffers at positions 0 through 3. |
| 2235 NewSegmentAppend(0, 4); | 2201 NewCodedFrameGroupAppend(0, 4); |
| 2236 | 2202 |
| 2237 // Seek to buffer at position 0 and get all buffers. | 2203 // Seek to buffer at position 0 and get all buffers. |
| 2238 Seek(0); | 2204 Seek(0); |
| 2239 CheckExpectedBuffers(0, 3); | 2205 CheckExpectedBuffers(0, 3); |
| 2240 | 2206 |
| 2241 // Next buffer is at position 4, so should not be able to fulfill request. | 2207 // Next buffer is at position 4, so should not be able to fulfill request. |
| 2242 CheckNoNextBuffer(); | 2208 CheckNoNextBuffer(); |
| 2243 | 2209 |
| 2244 // Append 2 buffers at positions 4 through 5. | 2210 // Append 2 buffers at positions 4 through 5. |
| 2245 AppendBuffers(4, 2); | 2211 AppendBuffers(4, 2); |
| 2246 CheckExpectedBuffers(4, 5); | 2212 CheckExpectedBuffers(4, 5); |
| 2247 } | 2213 } |
| 2248 | 2214 |
| 2249 // This test covers the case where new buffers start-overlap a range whose next | 2215 // This test covers the case where new buffers start-overlap a range whose next |
| 2250 // buffer is not buffered. | 2216 // buffer is not buffered. |
| 2251 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap) { | 2217 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap) { |
| 2252 // Append 10 buffers at positions 0 through 9 and exhaust the buffers. | 2218 // Append 10 buffers at positions 0 through 9 and exhaust the buffers. |
| 2253 NewSegmentAppend(0, 10, &kDataA); | 2219 NewCodedFrameGroupAppend(0, 10, &kDataA); |
| 2254 Seek(0); | 2220 Seek(0); |
| 2255 CheckExpectedBuffers(0, 9, &kDataA); | 2221 CheckExpectedBuffers(0, 9, &kDataA); |
| 2256 | 2222 |
| 2257 // Next buffer is at position 10, so should not be able to fulfill request. | 2223 // Next buffer is at position 10, so should not be able to fulfill request. |
| 2258 CheckNoNextBuffer(); | 2224 CheckNoNextBuffer(); |
| 2259 | 2225 |
| 2260 // Append 6 buffers at positons 5 through 10. This is to test that doing a | 2226 // Append 6 buffers at positons 5 through 10. This is to test that doing a |
| 2261 // start-overlap successfully fulfills the read at position 10, even though | 2227 // start-overlap successfully fulfills the read at position 10, even though |
| 2262 // position 10 was unbuffered. | 2228 // position 10 was unbuffered. |
| 2263 NewSegmentAppend(5, 6, &kDataB); | 2229 NewCodedFrameGroupAppend(5, 6, &kDataB); |
| 2264 CheckExpectedBuffers(10, 10, &kDataB); | 2230 CheckExpectedBuffers(10, 10, &kDataB); |
| 2265 | 2231 |
| 2266 // Then add 5 buffers from positions 11 though 15. | 2232 // Then add 5 buffers from positions 11 though 15. |
| 2267 AppendBuffers(11, 5, &kDataB); | 2233 AppendBuffers(11, 5, &kDataB); |
| 2268 | 2234 |
| 2269 // Check the next 4 buffers are correct, which also effectively seeks to | 2235 // Check the next 4 buffers are correct, which also effectively seeks to |
| 2270 // position 15. | 2236 // position 15. |
| 2271 CheckExpectedBuffers(11, 14, &kDataB); | 2237 CheckExpectedBuffers(11, 14, &kDataB); |
| 2272 | 2238 |
| 2273 // Replace the next buffer at position 15 with another start overlap. | 2239 // Replace the next buffer at position 15 with another start overlap. |
| 2274 NewSegmentAppend(15, 2, &kDataA); | 2240 NewCodedFrameGroupAppend(15, 2, &kDataA); |
| 2275 CheckExpectedBuffers(15, 16, &kDataA); | 2241 CheckExpectedBuffers(15, 16, &kDataA); |
| 2276 } | 2242 } |
| 2277 | 2243 |
| 2278 // Tests a start overlap that occurs right at the timestamp of the last output | 2244 // Tests a start overlap that occurs right at the timestamp of the last output |
| 2279 // buffer that was returned by GetNextBuffer(). This test verifies that | 2245 // buffer that was returned by GetNextBuffer(). This test verifies that |
| 2280 // GetNextBuffer() skips to second GOP in the newly appended data instead | 2246 // GetNextBuffer() skips to second GOP in the newly appended data instead |
| 2281 // of returning two buffers with the same timestamp. | 2247 // of returning two buffers with the same timestamp. |
| 2282 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap2) { | 2248 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap2) { |
| 2283 NewSegmentAppend("0K 30 60 90 120"); | 2249 NewCodedFrameGroupAppend("0K 30 60 90 120"); |
| 2284 | 2250 |
| 2285 Seek(0); | 2251 Seek(0); |
| 2286 CheckExpectedBuffers("0K 30 60 90 120"); | 2252 CheckExpectedBuffers("0K 30 60 90 120"); |
| 2287 CheckNoNextBuffer(); | 2253 CheckNoNextBuffer(); |
| 2288 | 2254 |
| 2289 // Append a keyframe with the same timestamp as the last buffer output. | 2255 // Append a keyframe with the same timestamp as the last buffer output. |
| 2290 NewSegmentAppend("120D30K"); | 2256 NewCodedFrameGroupAppend("120D30K"); |
| 2291 CheckNoNextBuffer(); | 2257 CheckNoNextBuffer(); |
| 2292 | 2258 |
| 2293 // Append the rest of the segment and make sure that buffers are returned | 2259 // Append the rest of the coded frame group and make sure that buffers are |
| 2294 // from the first GOP after 120. | 2260 // returned from the first GOP after 120. |
| 2295 AppendBuffers("150 180 210K 240"); | 2261 AppendBuffers("150 180 210K 240"); |
| 2296 CheckExpectedBuffers("210K 240"); | 2262 CheckExpectedBuffers("210K 240"); |
| 2297 | 2263 |
| 2298 // Seek to the beginning and verify the contents of the source buffer. | 2264 // Seek to the beginning and verify the contents of the source buffer. |
| 2299 Seek(0); | 2265 Seek(0); |
| 2300 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210K 240"); | 2266 CheckExpectedBuffers("0K 30 60 90 120K 150 180 210K 240"); |
| 2301 CheckNoNextBuffer(); | 2267 CheckNoNextBuffer(); |
| 2302 } | 2268 } |
| 2303 | 2269 |
| 2304 // This test covers the case where new buffers completely overlap a range | 2270 // This test covers the case where new buffers completely overlap a range |
| 2305 // whose next buffer is not buffered. | 2271 // whose next buffer is not buffered. |
| 2306 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenCompleteOverlap) { | 2272 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenCompleteOverlap) { |
| 2307 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. | 2273 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. |
| 2308 NewSegmentAppend(10, 5, &kDataA); | 2274 NewCodedFrameGroupAppend(10, 5, &kDataA); |
| 2309 Seek(10); | 2275 Seek(10); |
| 2310 CheckExpectedBuffers(10, 14, &kDataA); | 2276 CheckExpectedBuffers(10, 14, &kDataA); |
| 2311 | 2277 |
| 2312 // Next buffer is at position 15, so should not be able to fulfill request. | 2278 // Next buffer is at position 15, so should not be able to fulfill request. |
| 2313 CheckNoNextBuffer(); | 2279 CheckNoNextBuffer(); |
| 2314 | 2280 |
| 2315 // Do a complete overlap and test that this successfully fulfills the read | 2281 // Do a complete overlap and test that this successfully fulfills the read |
| 2316 // at position 15. | 2282 // at position 15. |
| 2317 NewSegmentAppend(5, 11, &kDataB); | 2283 NewCodedFrameGroupAppend(5, 11, &kDataB); |
| 2318 CheckExpectedBuffers(15, 15, &kDataB); | 2284 CheckExpectedBuffers(15, 15, &kDataB); |
| 2319 | 2285 |
| 2320 // Then add 5 buffers from positions 16 though 20. | 2286 // Then add 5 buffers from positions 16 though 20. |
| 2321 AppendBuffers(16, 5, &kDataB); | 2287 AppendBuffers(16, 5, &kDataB); |
| 2322 | 2288 |
| 2323 // Check the next 4 buffers are correct, which also effectively seeks to | 2289 // Check the next 4 buffers are correct, which also effectively seeks to |
| 2324 // position 20. | 2290 // position 20. |
| 2325 CheckExpectedBuffers(16, 19, &kDataB); | 2291 CheckExpectedBuffers(16, 19, &kDataB); |
| 2326 | 2292 |
| 2327 // Do a complete overlap and replace the buffer at position 20. | 2293 // Do a complete overlap and replace the buffer at position 20. |
| 2328 NewSegmentAppend(0, 21, &kDataA); | 2294 NewCodedFrameGroupAppend(0, 21, &kDataA); |
| 2329 CheckExpectedBuffers(20, 20, &kDataA); | 2295 CheckExpectedBuffers(20, 20, &kDataA); |
| 2330 } | 2296 } |
| 2331 | 2297 |
| 2332 // This test covers the case where a range is stalled waiting for its next | 2298 // This test covers the case where a range is stalled waiting for its next |
| 2333 // buffer, then an end-overlap causes the end of the range to be deleted. | 2299 // buffer, then an end-overlap causes the end of the range to be deleted. |
| 2334 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenEndOverlap) { | 2300 TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenEndOverlap) { |
| 2335 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. | 2301 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. |
| 2336 NewSegmentAppend(10, 5, &kDataA); | 2302 NewCodedFrameGroupAppend(10, 5, &kDataA); |
| 2337 Seek(10); | 2303 Seek(10); |
| 2338 CheckExpectedBuffers(10, 14, &kDataA); | 2304 CheckExpectedBuffers(10, 14, &kDataA); |
| 2339 CheckExpectedRanges("{ [10,14) }"); | 2305 CheckExpectedRanges("{ [10,14) }"); |
| 2340 | 2306 |
| 2341 // Next buffer is at position 15, so should not be able to fulfill request. | 2307 // Next buffer is at position 15, so should not be able to fulfill request. |
| 2342 CheckNoNextBuffer(); | 2308 CheckNoNextBuffer(); |
| 2343 | 2309 |
| 2344 // Do an end overlap that causes the latter half of the range to be deleted. | 2310 // Do an end overlap that causes the latter half of the range to be deleted. |
| 2345 NewSegmentAppend(5, 6, &kDataB); | 2311 NewCodedFrameGroupAppend(5, 6, &kDataB); |
| 2346 CheckNoNextBuffer(); | 2312 CheckNoNextBuffer(); |
| 2347 CheckExpectedRanges("{ [5,10) }"); | 2313 CheckExpectedRanges("{ [5,10) }"); |
| 2348 | 2314 |
| 2349 // Fill in the gap. Getting the next buffer should still stall at position 15. | 2315 // Fill in the gap. Getting the next buffer should still stall at position 15. |
| 2350 for (int i = 11; i <= 14; i++) { | 2316 for (int i = 11; i <= 14; i++) { |
| 2351 AppendBuffers(i, 1, &kDataB); | 2317 AppendBuffers(i, 1, &kDataB); |
| 2352 CheckNoNextBuffer(); | 2318 CheckNoNextBuffer(); |
| 2353 } | 2319 } |
| 2354 | 2320 |
| 2355 // Append the buffer at position 15 and check to make sure all is correct. | 2321 // Append the buffer at position 15 and check to make sure all is correct. |
| 2356 AppendBuffers(15, 1); | 2322 AppendBuffers(15, 1); |
| 2357 CheckExpectedBuffers(15, 15); | 2323 CheckExpectedBuffers(15, 15); |
| 2358 CheckExpectedRanges("{ [5,15) }"); | 2324 CheckExpectedRanges("{ [5,15) }"); |
| 2359 } | 2325 } |
| 2360 | 2326 |
| 2361 // This test is testing the "next buffer" logic after a complete overlap. In | 2327 // This test is testing the "next buffer" logic after a complete overlap. In |
| 2362 // this scenario, when the track buffer is exhausted, there is no buffered data | 2328 // this scenario, when the track buffer is exhausted, there is no buffered data |
| 2363 // to fulfill the request. The SourceBufferStream should be able to fulfill the | 2329 // to fulfill the request. The SourceBufferStream should be able to fulfill the |
| 2364 // request when the data is later appended, and should not lose track of the | 2330 // request when the data is later appended, and should not lose track of the |
| 2365 // "next buffer" position. | 2331 // "next buffer" position. |
| 2366 TEST_F(SourceBufferStreamTest, GetNextBuffer_Overlap_Selected_Complete) { | 2332 TEST_F(SourceBufferStreamTest, GetNextBuffer_Overlap_Selected_Complete) { |
| 2367 // Append 5 buffers at positions 5 through 9. | 2333 // Append 5 buffers at positions 5 through 9. |
| 2368 NewSegmentAppend(5, 5, &kDataA); | 2334 NewCodedFrameGroupAppend(5, 5, &kDataA); |
| 2369 | 2335 |
| 2370 // Seek to buffer at position 5 and get next buffer. | 2336 // Seek to buffer at position 5 and get next buffer. |
| 2371 Seek(5); | 2337 Seek(5); |
| 2372 CheckExpectedBuffers(5, 5, &kDataA); | 2338 CheckExpectedBuffers(5, 5, &kDataA); |
| 2373 | 2339 |
| 2374 // Replace existing data with new data. | 2340 // Replace existing data with new data. |
| 2375 NewSegmentAppend(5, 5, &kDataB); | 2341 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 2376 | 2342 |
| 2377 // Expect old data up until next keyframe in new data. | 2343 // Expect old data up until next keyframe in new data. |
| 2378 CheckExpectedBuffers(6, 9, &kDataA); | 2344 CheckExpectedBuffers(6, 9, &kDataA); |
| 2379 | 2345 |
| 2380 // Next buffer is at position 10, so should not be able to fulfill the | 2346 // Next buffer is at position 10, so should not be able to fulfill the |
| 2381 // request. | 2347 // request. |
| 2382 CheckNoNextBuffer(); | 2348 CheckNoNextBuffer(); |
| 2383 | 2349 |
| 2384 // Now add 5 new buffers at positions 10 through 14. | 2350 // Now add 5 new buffers at positions 10 through 14. |
| 2385 AppendBuffers(10, 5, &kDataB); | 2351 AppendBuffers(10, 5, &kDataB); |
| 2386 CheckExpectedBuffers(10, 14, &kDataB); | 2352 CheckExpectedBuffers(10, 14, &kDataB); |
| 2387 } | 2353 } |
| 2388 | 2354 |
| 2389 TEST_F(SourceBufferStreamTest, PresentationTimestampIndependence) { | 2355 TEST_F(SourceBufferStreamTest, PresentationTimestampIndependence) { |
| 2390 // Append 20 buffers at position 0. | 2356 // Append 20 buffers at position 0. |
| 2391 NewSegmentAppend(0, 20); | 2357 NewCodedFrameGroupAppend(0, 20); |
| 2392 Seek(0); | 2358 Seek(0); |
| 2393 | 2359 |
| 2394 int last_keyframe_idx = -1; | 2360 int last_keyframe_idx = -1; |
| 2395 base::TimeDelta last_keyframe_presentation_timestamp; | 2361 base::TimeDelta last_keyframe_presentation_timestamp; |
| 2396 base::TimeDelta last_p_frame_presentation_timestamp; | 2362 base::TimeDelta last_p_frame_presentation_timestamp; |
| 2397 | 2363 |
| 2398 // Check for IBB...BBP pattern. | 2364 // Check for IBB...BBP pattern. |
| 2399 for (int i = 0; i < 20; i++) { | 2365 for (int i = 0; i < 20; i++) { |
| 2400 scoped_refptr<StreamParserBuffer> buffer; | 2366 scoped_refptr<StreamParserBuffer> buffer; |
| 2401 ASSERT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); | 2367 ASSERT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 2417 buffer->GetDecodeTimestamp()); | 2383 buffer->GetDecodeTimestamp()); |
| 2418 } | 2384 } |
| 2419 } | 2385 } |
| 2420 } | 2386 } |
| 2421 | 2387 |
| 2422 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFront) { | 2388 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFront) { |
| 2423 // Set memory limit to 20 buffers. | 2389 // Set memory limit to 20 buffers. |
| 2424 SetMemoryLimit(20); | 2390 SetMemoryLimit(20); |
| 2425 | 2391 |
| 2426 // Append 20 buffers at positions 0 through 19. | 2392 // Append 20 buffers at positions 0 through 19. |
| 2427 NewSegmentAppend(0, 1, &kDataA); | 2393 NewCodedFrameGroupAppend(0, 1, &kDataA); |
| 2428 for (int i = 1; i < 20; i++) | 2394 for (int i = 1; i < 20; i++) |
| 2429 AppendBuffers(i, 1, &kDataA); | 2395 AppendBuffers(i, 1, &kDataA); |
| 2430 | 2396 |
| 2431 // GC should be a no-op, since we are just under memory limit. | 2397 // GC should be a no-op, since we are just under memory limit. |
| 2432 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2398 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2433 CheckExpectedRanges("{ [0,19) }"); | 2399 CheckExpectedRanges("{ [0,19) }"); |
| 2434 Seek(0); | 2400 Seek(0); |
| 2435 CheckExpectedBuffers(0, 19, &kDataA); | 2401 CheckExpectedBuffers(0, 19, &kDataA); |
| 2436 | 2402 |
| 2437 // Seek to the middle of the stream. | 2403 // Seek to the middle of the stream. |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 2449 CheckExpectedBuffers(10, 24, &kDataA); | 2415 CheckExpectedBuffers(10, 24, &kDataA); |
| 2450 Seek(5); | 2416 Seek(5); |
| 2451 CheckExpectedBuffers(5, 9, &kDataA); | 2417 CheckExpectedBuffers(5, 9, &kDataA); |
| 2452 } | 2418 } |
| 2453 | 2419 |
| 2454 TEST_F(SourceBufferStreamTest, | 2420 TEST_F(SourceBufferStreamTest, |
| 2455 GarbageCollection_DeleteFront_PreserveSeekedGOP) { | 2421 GarbageCollection_DeleteFront_PreserveSeekedGOP) { |
| 2456 // Set memory limit to 15 buffers. | 2422 // Set memory limit to 15 buffers. |
| 2457 SetMemoryLimit(15); | 2423 SetMemoryLimit(15); |
| 2458 | 2424 |
| 2459 NewSegmentAppend("0K 10 20 30 40 50K 60 70 80 90"); | 2425 NewCodedFrameGroupAppend("0K 10 20 30 40 50K 60 70 80 90"); |
| 2460 NewSegmentAppend("1000K 1010 1020 1030 1040"); | 2426 NewCodedFrameGroupAppend("1000K 1010 1020 1030 1040"); |
| 2461 | 2427 |
| 2462 // GC should be a no-op, since we are just under memory limit. | 2428 // GC should be a no-op, since we are just under memory limit. |
| 2463 EXPECT_TRUE(stream_->GarbageCollectIfNeeded(DecodeTimestamp(), 0)); | 2429 EXPECT_TRUE(stream_->GarbageCollectIfNeeded(DecodeTimestamp(), 0)); |
| 2464 CheckExpectedRangesByTimestamp("{ [0,100) [1000,1050) }"); | 2430 CheckExpectedRangesByTimestamp("{ [0,100) [1000,1050) }"); |
| 2465 | 2431 |
| 2466 // Seek to the near the end of the first range | 2432 // Seek to the near the end of the first range |
| 2467 SeekToTimestampMs(95); | 2433 SeekToTimestampMs(95); |
| 2468 | 2434 |
| 2469 // We are about to append 7 new buffers and current playback position is at | 2435 // We are about to append 7 new buffers and current playback position is at |
| 2470 // the end of the last GOP in the first range, so the GC algorithm should be | 2436 // the end of the last GOP in the first range, so the GC algorithm should be |
| 2471 // able to delete some old data from the front, but must not collect the last | 2437 // able to delete some old data from the front, but must not collect the last |
| 2472 // GOP in that first range. Neither can it collect the last appended GOP | 2438 // GOP in that first range. Neither can it collect the last appended GOP |
| 2473 // (which is the entire second range), so GC should return false since it | 2439 // (which is the entire second range), so GC should return false since it |
| 2474 // couldn't collect enough. | 2440 // couldn't collect enough. |
| 2475 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2441 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2476 DecodeTimestamp::FromMilliseconds(95), 7)); | 2442 DecodeTimestamp::FromMilliseconds(95), 7)); |
| 2477 CheckExpectedRangesByTimestamp("{ [50,100) [1000,1050) }"); | 2443 CheckExpectedRangesByTimestamp("{ [50,100) [1000,1050) }"); |
| 2478 } | 2444 } |
| 2479 | 2445 |
| 2480 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontGOPsAtATime) { | 2446 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontGOPsAtATime) { |
| 2481 // Set memory limit to 20 buffers. | 2447 // Set memory limit to 20 buffers. |
| 2482 SetMemoryLimit(20); | 2448 SetMemoryLimit(20); |
| 2483 | 2449 |
| 2484 // Append 20 buffers at positions 0 through 19. | 2450 // Append 20 buffers at positions 0 through 19. |
| 2485 NewSegmentAppend(0, 20, &kDataA); | 2451 NewCodedFrameGroupAppend(0, 20, &kDataA); |
| 2486 | 2452 |
| 2487 // Seek to position 10. | 2453 // Seek to position 10. |
| 2488 Seek(10); | 2454 Seek(10); |
| 2489 CheckExpectedRanges("{ [0,19) }"); | 2455 CheckExpectedRanges("{ [0,19) }"); |
| 2490 | 2456 |
| 2491 // Add one buffer to put the memory over the cap. | 2457 // Add one buffer to put the memory over the cap. |
| 2492 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 1)); | 2458 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 1)); |
| 2493 AppendBuffers(20, 1, &kDataA); | 2459 AppendBuffers(20, 1, &kDataA); |
| 2494 | 2460 |
| 2495 // GC should have deleted the first 5 buffers so that the range still begins | 2461 // GC should have deleted the first 5 buffers so that the range still begins |
| 2496 // with a keyframe. | 2462 // with a keyframe. |
| 2497 CheckExpectedRanges("{ [5,20) }"); | 2463 CheckExpectedRanges("{ [5,20) }"); |
| 2498 CheckExpectedBuffers(10, 20, &kDataA); | 2464 CheckExpectedBuffers(10, 20, &kDataA); |
| 2499 Seek(5); | 2465 Seek(5); |
| 2500 CheckExpectedBuffers(5, 9, &kDataA); | 2466 CheckExpectedBuffers(5, 9, &kDataA); |
| 2501 } | 2467 } |
| 2502 | 2468 |
| 2503 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteBack) { | 2469 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteBack) { |
| 2504 // Set memory limit to 5 buffers. | 2470 // Set memory limit to 5 buffers. |
| 2505 SetMemoryLimit(5); | 2471 SetMemoryLimit(5); |
| 2506 | 2472 |
| 2507 // Append 5 buffers at positions 15 through 19. | 2473 // Append 5 buffers at positions 15 through 19. |
| 2508 NewSegmentAppend(15, 5, &kDataA); | 2474 NewCodedFrameGroupAppend(15, 5, &kDataA); |
| 2509 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2475 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2510 | 2476 |
| 2511 // Append 5 buffers at positions 0 through 4. | 2477 // Append 5 buffers at positions 0 through 4. |
| 2512 NewSegmentAppend(0, 5, &kDataA); | 2478 NewCodedFrameGroupAppend(0, 5, &kDataA); |
| 2513 CheckExpectedRanges("{ [0,4) [15,19) }"); | 2479 CheckExpectedRanges("{ [0,4) [15,19) }"); |
| 2514 | 2480 |
| 2515 // Seek to position 0. | 2481 // Seek to position 0. |
| 2516 Seek(0); | 2482 Seek(0); |
| 2517 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2483 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2518 // Should leave the first 5 buffers from 0 to 4. | 2484 // Should leave the first 5 buffers from 0 to 4. |
| 2519 CheckExpectedRanges("{ [0,4) }"); | 2485 CheckExpectedRanges("{ [0,4) }"); |
| 2520 CheckExpectedBuffers(0, 4, &kDataA); | 2486 CheckExpectedBuffers(0, 4, &kDataA); |
| 2521 } | 2487 } |
| 2522 | 2488 |
| 2523 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontAndBack) { | 2489 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontAndBack) { |
| 2524 // Set memory limit to 3 buffers. | 2490 // Set memory limit to 3 buffers. |
| 2525 SetMemoryLimit(3); | 2491 SetMemoryLimit(3); |
| 2526 | 2492 |
| 2527 // Seek to position 15. | 2493 // Seek to position 15. |
| 2528 Seek(15); | 2494 Seek(15); |
| 2529 | 2495 |
| 2530 // Append 40 buffers at positions 0 through 39. | 2496 // Append 40 buffers at positions 0 through 39. |
| 2531 NewSegmentAppend(0, 40, &kDataA); | 2497 NewCodedFrameGroupAppend(0, 40, &kDataA); |
| 2532 // GC will try to keep data between current playback position and last append | 2498 // GC will try to keep data between current playback position and last append |
| 2533 // position. This will ensure that the last append position is 19 and will | 2499 // position. This will ensure that the last append position is 19 and will |
| 2534 // allow GC algorithm to collect data outside of the range [15,19) | 2500 // allow GC algorithm to collect data outside of the range [15,19) |
| 2535 NewSegmentAppend(15, 5, &kDataA); | 2501 NewCodedFrameGroupAppend(15, 5, &kDataA); |
| 2536 CheckExpectedRanges("{ [0,39) }"); | 2502 CheckExpectedRanges("{ [0,39) }"); |
| 2537 | 2503 |
| 2538 // Should leave the GOP containing the current playback position 15 and the | 2504 // Should leave the GOP containing the current playback position 15 and the |
| 2539 // last append position 19. GC returns false, since we are still above limit. | 2505 // last append position 19. GC returns false, since we are still above limit. |
| 2540 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0)); | 2506 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0)); |
| 2541 CheckExpectedRanges("{ [15,19) }"); | 2507 CheckExpectedRanges("{ [15,19) }"); |
| 2542 CheckExpectedBuffers(15, 19, &kDataA); | 2508 CheckExpectedBuffers(15, 19, &kDataA); |
| 2543 CheckNoNextBuffer(); | 2509 CheckNoNextBuffer(); |
| 2544 } | 2510 } |
| 2545 | 2511 |
| 2546 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteSeveralRanges) { | 2512 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteSeveralRanges) { |
| 2547 // Append 5 buffers at positions 0 through 4. | 2513 // Append 5 buffers at positions 0 through 4. |
| 2548 NewSegmentAppend(0, 5); | 2514 NewCodedFrameGroupAppend(0, 5); |
| 2549 | 2515 |
| 2550 // Append 5 buffers at positions 10 through 14. | 2516 // Append 5 buffers at positions 10 through 14. |
| 2551 NewSegmentAppend(10, 5); | 2517 NewCodedFrameGroupAppend(10, 5); |
| 2552 | 2518 |
| 2553 // Append 5 buffers at positions 20 through 24. | 2519 // Append 5 buffers at positions 20 through 24. |
| 2554 NewSegmentAppend(20, 5); | 2520 NewCodedFrameGroupAppend(20, 5); |
| 2555 | 2521 |
| 2556 // Append 5 buffers at positions 40 through 44. | 2522 // Append 5 buffers at positions 40 through 44. |
| 2557 NewSegmentAppend(40, 5); | 2523 NewCodedFrameGroupAppend(40, 5); |
| 2558 | 2524 |
| 2559 CheckExpectedRanges("{ [0,4) [10,14) [20,24) [40,44) }"); | 2525 CheckExpectedRanges("{ [0,4) [10,14) [20,24) [40,44) }"); |
| 2560 | 2526 |
| 2561 // Seek to position 20. | 2527 // Seek to position 20. |
| 2562 Seek(20); | 2528 Seek(20); |
| 2563 CheckExpectedBuffers(20, 20); | 2529 CheckExpectedBuffers(20, 20); |
| 2564 | 2530 |
| 2565 // Set memory limit to 1 buffer. | 2531 // Set memory limit to 1 buffer. |
| 2566 SetMemoryLimit(1); | 2532 SetMemoryLimit(1); |
| 2567 | 2533 |
| 2568 // Append 5 buffers at positions 30 through 34. | 2534 // Append 5 buffers at positions 30 through 34. |
| 2569 NewSegmentAppend(30, 5); | 2535 NewCodedFrameGroupAppend(30, 5); |
| 2570 | 2536 |
| 2571 // We will have more than 1 buffer left, GC will fail | 2537 // We will have more than 1 buffer left, GC will fail |
| 2572 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0)); | 2538 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0)); |
| 2573 | 2539 |
| 2574 // Should have deleted all buffer ranges before the current buffer and after | 2540 // Should have deleted all buffer ranges before the current buffer and after |
| 2575 // last GOP | 2541 // last GOP |
| 2576 CheckExpectedRanges("{ [20,24) [30,34) }"); | 2542 CheckExpectedRanges("{ [20,24) [30,34) }"); |
| 2577 CheckExpectedBuffers(21, 24); | 2543 CheckExpectedBuffers(21, 24); |
| 2578 CheckNoNextBuffer(); | 2544 CheckNoNextBuffer(); |
| 2579 | 2545 |
| 2580 // Continue appending into the last range to make sure it didn't break. | 2546 // Continue appending into the last range to make sure it didn't break. |
| 2581 AppendBuffers(35, 10); | 2547 AppendBuffers(35, 10); |
| 2582 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0)); | 2548 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(20, 0)); |
| 2583 // Should save everything between read head and last appended | 2549 // Should save everything between read head and last appended |
| 2584 CheckExpectedRanges("{ [20,24) [30,44) }"); | 2550 CheckExpectedRanges("{ [20,24) [30,44) }"); |
| 2585 | 2551 |
| 2586 // Make sure appending before and after the ranges didn't somehow break. | 2552 // Make sure appending before and after the ranges didn't somehow break. |
| 2587 SetMemoryLimit(100); | 2553 SetMemoryLimit(100); |
| 2588 NewSegmentAppend(0, 10); | 2554 NewCodedFrameGroupAppend(0, 10); |
| 2589 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(20, 0)); | 2555 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(20, 0)); |
| 2590 CheckExpectedRanges("{ [0,9) [20,24) [30,44) }"); | 2556 CheckExpectedRanges("{ [0,9) [20,24) [30,44) }"); |
| 2591 Seek(0); | 2557 Seek(0); |
| 2592 CheckExpectedBuffers(0, 9); | 2558 CheckExpectedBuffers(0, 9); |
| 2593 | 2559 |
| 2594 NewSegmentAppend(90, 10); | 2560 NewCodedFrameGroupAppend(90, 10); |
| 2595 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2561 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2596 CheckExpectedRanges("{ [0,9) [20,24) [30,44) [90,99) }"); | 2562 CheckExpectedRanges("{ [0,9) [20,24) [30,44) [90,99) }"); |
| 2597 Seek(30); | 2563 Seek(30); |
| 2598 CheckExpectedBuffers(30, 44); | 2564 CheckExpectedBuffers(30, 44); |
| 2599 CheckNoNextBuffer(); | 2565 CheckNoNextBuffer(); |
| 2600 Seek(90); | 2566 Seek(90); |
| 2601 CheckExpectedBuffers(90, 99); | 2567 CheckExpectedBuffers(90, 99); |
| 2602 CheckNoNextBuffer(); | 2568 CheckNoNextBuffer(); |
| 2603 } | 2569 } |
| 2604 | 2570 |
| 2605 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppend) { | 2571 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppend) { |
| 2606 // Set memory limit to 10 buffers. | 2572 // Set memory limit to 10 buffers. |
| 2607 SetMemoryLimit(10); | 2573 SetMemoryLimit(10); |
| 2608 | 2574 |
| 2609 // Append 1 GOP starting at 310ms, 30ms apart. | 2575 // Append 1 GOP starting at 310ms, 30ms apart. |
| 2610 NewSegmentAppend("310K 340 370"); | 2576 NewCodedFrameGroupAppend("310K 340 370"); |
| 2611 | 2577 |
| 2612 // Append 2 GOPs starting at 490ms, 30ms apart. | 2578 // Append 2 GOPs starting at 490ms, 30ms apart. |
| 2613 NewSegmentAppend("490K 520 550 580K 610 640"); | 2579 NewCodedFrameGroupAppend("490K 520 550 580K 610 640"); |
| 2614 | 2580 |
| 2615 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2581 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2616 | 2582 |
| 2617 CheckExpectedRangesByTimestamp("{ [310,400) [490,670) }"); | 2583 CheckExpectedRangesByTimestamp("{ [310,400) [490,670) }"); |
| 2618 | 2584 |
| 2619 // Seek to the GOP at 580ms. | 2585 // Seek to the GOP at 580ms. |
| 2620 SeekToTimestampMs(580); | 2586 SeekToTimestampMs(580); |
| 2621 | 2587 |
| 2622 // Append 2 GOPs before the existing ranges. | 2588 // Append 2 GOPs before the existing ranges. |
| 2623 // So the ranges before GC are "{ [100,280) [310,400) [490,670) }". | 2589 // So the ranges before GC are "{ [100,280) [310,400) [490,670) }". |
| 2624 NewSegmentAppend("100K 130 160 190K 220 250K"); | 2590 NewCodedFrameGroupAppend("100K 130 160 190K 220 250K"); |
| 2625 | 2591 |
| 2626 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( | 2592 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( |
| 2627 DecodeTimestamp::FromMilliseconds(580), 0)); | 2593 DecodeTimestamp::FromMilliseconds(580), 0)); |
| 2628 | 2594 |
| 2629 // Should save the newly appended GOPs. | 2595 // Should save the newly appended GOPs. |
| 2630 CheckExpectedRangesByTimestamp("{ [100,280) [580,670) }"); | 2596 CheckExpectedRangesByTimestamp("{ [100,280) [580,670) }"); |
| 2631 } | 2597 } |
| 2632 | 2598 |
| 2633 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppendMerged) { | 2599 TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppendMerged) { |
| 2634 // Set memory limit to 10 buffers. | 2600 // Set memory limit to 10 buffers. |
| 2635 SetMemoryLimit(10); | 2601 SetMemoryLimit(10); |
| 2636 | 2602 |
| 2637 // Append 3 GOPs starting at 400ms, 30ms apart. | 2603 // Append 3 GOPs starting at 400ms, 30ms apart. |
| 2638 NewSegmentAppend("400K 430 460 490K 520 550 580K 610 640"); | 2604 NewCodedFrameGroupAppend("400K 430 460 490K 520 550 580K 610 640"); |
| 2639 | 2605 |
| 2640 // Seek to the GOP at 580ms. | 2606 // Seek to the GOP at 580ms. |
| 2641 SeekToTimestampMs(580); | 2607 SeekToTimestampMs(580); |
| 2642 | 2608 |
| 2643 // Append 2 GOPs starting at 220ms, and they will be merged with the existing | 2609 // Append 2 GOPs starting at 220ms, and they will be merged with the existing |
| 2644 // range. So the range before GC is "{ [220,670) }". | 2610 // range. So the range before GC is "{ [220,670) }". |
| 2645 NewSegmentAppend("220K 250 280 310K 340 370"); | 2611 NewCodedFrameGroupAppend("220K 250 280 310K 340 370"); |
| 2646 | 2612 |
| 2647 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( | 2613 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( |
| 2648 DecodeTimestamp::FromMilliseconds(580), 0)); | 2614 DecodeTimestamp::FromMilliseconds(580), 0)); |
| 2649 | 2615 |
| 2650 // Should save the newly appended GOPs. | 2616 // Should save the newly appended GOPs. |
| 2651 CheckExpectedRangesByTimestamp("{ [220,400) [580,670) }"); | 2617 CheckExpectedRangesByTimestamp("{ [220,400) [580,670) }"); |
| 2652 } | 2618 } |
| 2653 | 2619 |
| 2654 TEST_F(SourceBufferStreamTest, GarbageCollection_NoSeek) { | 2620 TEST_F(SourceBufferStreamTest, GarbageCollection_NoSeek) { |
| 2655 // Set memory limit to 20 buffers. | 2621 // Set memory limit to 20 buffers. |
| 2656 SetMemoryLimit(20); | 2622 SetMemoryLimit(20); |
| 2657 | 2623 |
| 2658 // Append 25 buffers at positions 0 through 24. | 2624 // Append 25 buffers at positions 0 through 24. |
| 2659 NewSegmentAppend(0, 25, &kDataA); | 2625 NewCodedFrameGroupAppend(0, 25, &kDataA); |
| 2660 | 2626 |
| 2661 // If playback is still in the first GOP (starting at 0), GC should fail. | 2627 // If playback is still in the first GOP (starting at 0), GC should fail. |
| 2662 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(2, 0)); | 2628 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(2, 0)); |
| 2663 CheckExpectedRanges("{ [0,24) }"); | 2629 CheckExpectedRanges("{ [0,24) }"); |
| 2664 | 2630 |
| 2665 // As soon as playback position moves past the first GOP, it should be removed | 2631 // As soon as playback position moves past the first GOP, it should be removed |
| 2666 // and after removing the first GOP we are under memory limit. | 2632 // and after removing the first GOP we are under memory limit. |
| 2667 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(5, 0)); | 2633 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(5, 0)); |
| 2668 CheckExpectedRanges("{ [5,24) }"); | 2634 CheckExpectedRanges("{ [5,24) }"); |
| 2669 CheckNoNextBuffer(); | 2635 CheckNoNextBuffer(); |
| 2670 Seek(5); | 2636 Seek(5); |
| 2671 CheckExpectedBuffers(5, 24, &kDataA); | 2637 CheckExpectedBuffers(5, 24, &kDataA); |
| 2672 } | 2638 } |
| 2673 | 2639 |
| 2674 TEST_F(SourceBufferStreamTest, GarbageCollection_PendingSeek) { | 2640 TEST_F(SourceBufferStreamTest, GarbageCollection_PendingSeek) { |
| 2675 // Append 10 buffers at positions 0 through 9. | 2641 // Append 10 buffers at positions 0 through 9. |
| 2676 NewSegmentAppend(0, 10, &kDataA); | 2642 NewCodedFrameGroupAppend(0, 10, &kDataA); |
| 2677 | 2643 |
| 2678 // Append 5 buffers at positions 25 through 29. | 2644 // Append 5 buffers at positions 25 through 29. |
| 2679 NewSegmentAppend(25, 5, &kDataA); | 2645 NewCodedFrameGroupAppend(25, 5, &kDataA); |
| 2680 | 2646 |
| 2681 // Seek to position 15. | 2647 // Seek to position 15. |
| 2682 Seek(15); | 2648 Seek(15); |
| 2683 CheckNoNextBuffer(); | 2649 CheckNoNextBuffer(); |
| 2684 CheckExpectedRanges("{ [0,9) [25,29) }"); | 2650 CheckExpectedRanges("{ [0,9) [25,29) }"); |
| 2685 | 2651 |
| 2686 // Set memory limit to 5 buffers. | 2652 // Set memory limit to 5 buffers. |
| 2687 SetMemoryLimit(5); | 2653 SetMemoryLimit(5); |
| 2688 | 2654 |
| 2689 // Append 5 buffers as positions 30 to 34 to trigger GC. | 2655 // Append 5 buffers as positions 30 to 34 to trigger GC. |
| 2690 AppendBuffers(30, 5, &kDataA); | 2656 AppendBuffers(30, 5, &kDataA); |
| 2691 | 2657 |
| 2692 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 0)); | 2658 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 0)); |
| 2693 | 2659 |
| 2694 // The current algorithm will delete from the beginning until the memory is | 2660 // The current algorithm will delete from the beginning until the memory is |
| 2695 // under cap. | 2661 // under cap. |
| 2696 CheckExpectedRanges("{ [30,34) }"); | 2662 CheckExpectedRanges("{ [30,34) }"); |
| 2697 | 2663 |
| 2698 // Expand memory limit again so that GC won't be triggered. | 2664 // Expand memory limit again so that GC won't be triggered. |
| 2699 SetMemoryLimit(100); | 2665 SetMemoryLimit(100); |
| 2700 | 2666 |
| 2701 // Append data to fulfill seek. | 2667 // Append data to fulfill seek. |
| 2702 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 5)); | 2668 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(30, 5)); |
| 2703 NewSegmentAppend(15, 5, &kDataA); | 2669 NewCodedFrameGroupAppend(15, 5, &kDataA); |
| 2704 | 2670 |
| 2705 // Check to make sure all is well. | 2671 // Check to make sure all is well. |
| 2706 CheckExpectedRanges("{ [15,19) [30,34) }"); | 2672 CheckExpectedRanges("{ [15,19) [30,34) }"); |
| 2707 CheckExpectedBuffers(15, 19, &kDataA); | 2673 CheckExpectedBuffers(15, 19, &kDataA); |
| 2708 Seek(30); | 2674 Seek(30); |
| 2709 CheckExpectedBuffers(30, 34, &kDataA); | 2675 CheckExpectedBuffers(30, 34, &kDataA); |
| 2710 } | 2676 } |
| 2711 | 2677 |
| 2712 TEST_F(SourceBufferStreamTest, GarbageCollection_NeedsMoreData) { | 2678 TEST_F(SourceBufferStreamTest, GarbageCollection_NeedsMoreData) { |
| 2713 // Set memory limit to 15 buffers. | 2679 // Set memory limit to 15 buffers. |
| 2714 SetMemoryLimit(15); | 2680 SetMemoryLimit(15); |
| 2715 | 2681 |
| 2716 // Append 10 buffers at positions 0 through 9. | 2682 // Append 10 buffers at positions 0 through 9. |
| 2717 NewSegmentAppend(0, 10, &kDataA); | 2683 NewCodedFrameGroupAppend(0, 10, &kDataA); |
| 2718 | 2684 |
| 2719 // Advance next buffer position to 10. | 2685 // Advance next buffer position to 10. |
| 2720 Seek(0); | 2686 Seek(0); |
| 2721 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2687 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2722 CheckExpectedBuffers(0, 9, &kDataA); | 2688 CheckExpectedBuffers(0, 9, &kDataA); |
| 2723 CheckNoNextBuffer(); | 2689 CheckNoNextBuffer(); |
| 2724 | 2690 |
| 2725 // Append 20 buffers at positions 15 through 34. | 2691 // Append 20 buffers at positions 15 through 34. |
| 2726 NewSegmentAppend(15, 20, &kDataA); | 2692 NewCodedFrameGroupAppend(15, 20, &kDataA); |
| 2727 CheckExpectedRanges("{ [0,9) [15,34) }"); | 2693 CheckExpectedRanges("{ [0,9) [15,34) }"); |
| 2728 | 2694 |
| 2729 // GC should save the keyframe before the next buffer position and the data | 2695 // GC should save the keyframe before the next buffer position and the data |
| 2730 // closest to the next buffer position. It will also save all buffers from | 2696 // closest to the next buffer position. It will also save all buffers from |
| 2731 // next buffer to the last GOP appended, which overflows limit and leads to | 2697 // next buffer to the last GOP appended, which overflows limit and leads to |
| 2732 // failure. | 2698 // failure. |
| 2733 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(5, 0)); | 2699 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(5, 0)); |
| 2734 CheckExpectedRanges("{ [5,9) [15,34) }"); | 2700 CheckExpectedRanges("{ [5,9) [15,34) }"); |
| 2735 | 2701 |
| 2736 // Now fulfill the seek at position 10. This will make GC delete the data | 2702 // Now fulfill the seek at position 10. This will make GC delete the data |
| 2737 // before position 10 to keep it within cap. | 2703 // before position 10 to keep it within cap. |
| 2738 NewSegmentAppend(10, 5, &kDataA); | 2704 NewCodedFrameGroupAppend(10, 5, &kDataA); |
| 2739 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 0)); | 2705 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(10, 0)); |
| 2740 CheckExpectedRanges("{ [10,24) }"); | 2706 CheckExpectedRanges("{ [10,24) }"); |
| 2741 CheckExpectedBuffers(10, 24, &kDataA); | 2707 CheckExpectedBuffers(10, 24, &kDataA); |
| 2742 } | 2708 } |
| 2743 | 2709 |
| 2744 TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) { | 2710 TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) { |
| 2745 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(99)); | 2711 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(99)); |
| 2746 | 2712 |
| 2747 // Set memory limit to 3 buffers. | 2713 // Set memory limit to 3 buffers. |
| 2748 SetMemoryLimit(3); | 2714 SetMemoryLimit(3); |
| 2749 | 2715 |
| 2750 // Seek to position 15. | 2716 // Seek to position 15. |
| 2751 Seek(15); | 2717 Seek(15); |
| 2752 | 2718 |
| 2753 // Append 18 buffers at positions 0 through 17. | 2719 // Append 18 buffers at positions 0 through 17. |
| 2754 NewSegmentAppend(0, 18, &kDataA); | 2720 NewCodedFrameGroupAppend(0, 18, &kDataA); |
| 2755 | 2721 |
| 2756 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(15, 0)); | 2722 EXPECT_TRUE(GarbageCollectWithPlaybackAtBuffer(15, 0)); |
| 2757 | 2723 |
| 2758 // Should leave GOP containing seek position. | 2724 // Should leave GOP containing seek position. |
| 2759 CheckExpectedRanges("{ [15,17) }"); | 2725 CheckExpectedRanges("{ [15,17) }"); |
| 2760 | 2726 |
| 2761 // Move next buffer position to 16. | 2727 // Move next buffer position to 16. |
| 2762 CheckExpectedBuffers(15, 15, &kDataA); | 2728 CheckExpectedBuffers(15, 15, &kDataA); |
| 2763 | 2729 |
| 2764 // Completely overlap the existing buffers. | 2730 // Completely overlap the existing buffers. |
| 2765 NewSegmentAppend(0, 20, &kDataB); | 2731 NewCodedFrameGroupAppend(0, 20, &kDataB); |
| 2766 | 2732 |
| 2767 // Final GOP [15,19) contains 5 buffers, which is more than memory limit of | 2733 // Final GOP [15,19) contains 5 buffers, which is more than memory limit of |
| 2768 // 3 buffers set at the beginning of the test, so GC will fail. | 2734 // 3 buffers set at the beginning of the test, so GC will fail. |
| 2769 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0)); | 2735 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(15, 0)); |
| 2770 | 2736 |
| 2771 // Because buffers 16 and 17 are not keyframes, they are moved to the track | 2737 // Because buffers 16 and 17 are not keyframes, they are moved to the track |
| 2772 // buffer upon overlap. The source buffer (i.e. not the track buffer) is now | 2738 // buffer upon overlap. The source buffer (i.e. not the track buffer) is now |
| 2773 // waiting for the next keyframe. | 2739 // waiting for the next keyframe. |
| 2774 CheckExpectedRanges("{ [15,19) }"); | 2740 CheckExpectedRanges("{ [15,19) }"); |
| 2775 CheckExpectedBuffers(16, 17, &kDataA); | 2741 CheckExpectedBuffers(16, 17, &kDataA); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 2786 CheckExpectedRanges("{ [20,24) }"); | 2752 CheckExpectedRanges("{ [20,24) }"); |
| 2787 CheckExpectedBuffers(20, 24, &kDataB); | 2753 CheckExpectedBuffers(20, 24, &kDataB); |
| 2788 CheckNoNextBuffer(); | 2754 CheckNoNextBuffer(); |
| 2789 } | 2755 } |
| 2790 | 2756 |
| 2791 // Test GC preserves data starting at first GOP containing playback position. | 2757 // Test GC preserves data starting at first GOP containing playback position. |
| 2792 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveDataAtPlaybackPosition) { | 2758 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveDataAtPlaybackPosition) { |
| 2793 // Set memory limit to 30 buffers = 1 second of data. | 2759 // Set memory limit to 30 buffers = 1 second of data. |
| 2794 SetMemoryLimit(30); | 2760 SetMemoryLimit(30); |
| 2795 // And append 300 buffers = 10 seconds of data. | 2761 // And append 300 buffers = 10 seconds of data. |
| 2796 NewSegmentAppend(0, 300, &kDataA); | 2762 NewCodedFrameGroupAppend(0, 300, &kDataA); |
| 2797 CheckExpectedRanges("{ [0,299) }"); | 2763 CheckExpectedRanges("{ [0,299) }"); |
| 2798 | 2764 |
| 2799 // Playback position at 0, all data must be preserved. | 2765 // Playback position at 0, all data must be preserved. |
| 2800 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2766 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2801 DecodeTimestamp::FromMilliseconds(0), 0)); | 2767 DecodeTimestamp::FromMilliseconds(0), 0)); |
| 2802 CheckExpectedRanges("{ [0,299) }"); | 2768 CheckExpectedRanges("{ [0,299) }"); |
| 2803 | 2769 |
| 2804 // Playback position at 1 sec, the first second of data [0,29) should be | 2770 // Playback position at 1 sec, the first second of data [0,29) should be |
| 2805 // collected, since we are way over memory limit. | 2771 // collected, since we are way over memory limit. |
| 2806 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2772 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2844 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( | 2810 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( |
| 2845 DecodeTimestamp::FromMilliseconds(15000), 0)); | 2811 DecodeTimestamp::FromMilliseconds(15000), 0)); |
| 2846 CheckExpectedRanges("{ [270,299) }"); | 2812 CheckExpectedRanges("{ [270,299) }"); |
| 2847 } | 2813 } |
| 2848 | 2814 |
| 2849 // Test saving the last GOP appended when this GOP is the only GOP in its range. | 2815 // Test saving the last GOP appended when this GOP is the only GOP in its range. |
| 2850 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP) { | 2816 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP) { |
| 2851 // Set memory limit to 3 and make sure the 4-byte GOP is not garbage | 2817 // Set memory limit to 3 and make sure the 4-byte GOP is not garbage |
| 2852 // collected. | 2818 // collected. |
| 2853 SetMemoryLimit(3); | 2819 SetMemoryLimit(3); |
| 2854 NewSegmentAppend("0K 30 60 90"); | 2820 NewCodedFrameGroupAppend("0K 30 60 90"); |
| 2855 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2821 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2856 CheckExpectedRangesByTimestamp("{ [0,120) }"); | 2822 CheckExpectedRangesByTimestamp("{ [0,120) }"); |
| 2857 | 2823 |
| 2858 // Make sure you can continue appending data to this GOP; again, GC should not | 2824 // Make sure you can continue appending data to this GOP; again, GC should not |
| 2859 // wipe out anything. | 2825 // wipe out anything. |
| 2860 AppendBuffers("120D30"); | 2826 AppendBuffers("120D30"); |
| 2861 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0)); | 2827 EXPECT_FALSE(GarbageCollectWithPlaybackAtBuffer(0, 0)); |
| 2862 CheckExpectedRangesByTimestamp("{ [0,150) }"); | 2828 CheckExpectedRangesByTimestamp("{ [0,150) }"); |
| 2863 | 2829 |
| 2864 // Append a 2nd range after this without triggering GC. | 2830 // Append a 2nd range after this without triggering GC. |
| 2865 NewSegmentAppend("200K 230 260 290K 320 350"); | 2831 NewCodedFrameGroupAppend("200K 230 260 290K 320 350"); |
| 2866 CheckExpectedRangesByTimestamp("{ [0,150) [200,380) }"); | 2832 CheckExpectedRangesByTimestamp("{ [0,150) [200,380) }"); |
| 2867 | 2833 |
| 2868 // Seek to 290ms. | 2834 // Seek to 290ms. |
| 2869 SeekToTimestampMs(290); | 2835 SeekToTimestampMs(290); |
| 2870 | 2836 |
| 2871 // Now append a GOP in a separate range after the selected range and trigger | 2837 // Now append a GOP in a separate range after the selected range and trigger |
| 2872 // GC. Because it is after 290ms, this tests that the GOP is saved when | 2838 // GC. Because it is after 290ms, this tests that the GOP is saved when |
| 2873 // deleting from the back. | 2839 // deleting from the back. |
| 2874 NewSegmentAppend("500K 530 560 590"); | 2840 NewCodedFrameGroupAppend("500K 530 560 590"); |
| 2875 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2841 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2876 DecodeTimestamp::FromMilliseconds(290), 0)); | 2842 DecodeTimestamp::FromMilliseconds(290), 0)); |
| 2877 | 2843 |
| 2878 // Should save GOPs between 290ms and the last GOP appended. | 2844 // Should save GOPs between 290ms and the last GOP appended. |
| 2879 CheckExpectedRangesByTimestamp("{ [290,380) [500,620) }"); | 2845 CheckExpectedRangesByTimestamp("{ [290,380) [500,620) }"); |
| 2880 | 2846 |
| 2881 // Continue appending to this GOP after GC. | 2847 // Continue appending to this GOP after GC. |
| 2882 AppendBuffers("620D30"); | 2848 AppendBuffers("620D30"); |
| 2883 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2849 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2884 DecodeTimestamp::FromMilliseconds(290), 0)); | 2850 DecodeTimestamp::FromMilliseconds(290), 0)); |
| 2885 CheckExpectedRangesByTimestamp("{ [290,380) [500,650) }"); | 2851 CheckExpectedRangesByTimestamp("{ [290,380) [500,650) }"); |
| 2886 } | 2852 } |
| 2887 | 2853 |
| 2888 // Test saving the last GOP appended when this GOP is in the middle of a | 2854 // Test saving the last GOP appended when this GOP is in the middle of a |
| 2889 // non-selected range. | 2855 // non-selected range. |
| 2890 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Middle) { | 2856 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Middle) { |
| 2891 // Append 3 GOPs starting at 0ms, 30ms apart. | 2857 // Append 3 GOPs starting at 0ms, 30ms apart. |
| 2892 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240"); | 2858 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240"); |
| 2893 CheckExpectedRangesByTimestamp("{ [0,270) }"); | 2859 CheckExpectedRangesByTimestamp("{ [0,270) }"); |
| 2894 | 2860 |
| 2895 // Now set the memory limit to 1 and overlap the middle of the range with a | 2861 // Now set the memory limit to 1 and overlap the middle of the range with a |
| 2896 // new GOP. | 2862 // new GOP. |
| 2897 SetMemoryLimit(1); | 2863 SetMemoryLimit(1); |
| 2898 NewSegmentAppend("80K 110 140"); | 2864 NewCodedFrameGroupAppend("80K 110 140"); |
| 2899 | 2865 |
| 2900 // This whole GOP should be saved after GC, which will fail due to GOP being | 2866 // This whole GOP should be saved after GC, which will fail due to GOP being |
| 2901 // larger than 1 buffer | 2867 // larger than 1 buffer |
| 2902 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2868 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2903 DecodeTimestamp::FromMilliseconds(80), 0)); | 2869 DecodeTimestamp::FromMilliseconds(80), 0)); |
| 2904 CheckExpectedRangesByTimestamp("{ [80,170) }"); | 2870 CheckExpectedRangesByTimestamp("{ [80,170) }"); |
| 2905 // We should still be able to continue appending data to GOP | 2871 // We should still be able to continue appending data to GOP |
| 2906 AppendBuffers("170D30"); | 2872 AppendBuffers("170D30"); |
| 2907 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2873 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2908 DecodeTimestamp::FromMilliseconds(80), 0)); | 2874 DecodeTimestamp::FromMilliseconds(80), 0)); |
| 2909 CheckExpectedRangesByTimestamp("{ [80,200) }"); | 2875 CheckExpectedRangesByTimestamp("{ [80,200) }"); |
| 2910 | 2876 |
| 2911 // Append a 2nd range after this range, without triggering GC. | 2877 // Append a 2nd range after this range, without triggering GC. |
| 2912 NewSegmentAppend("400K 430 460 490K 520 550 580K 610 640"); | 2878 NewCodedFrameGroupAppend("400K 430 460 490K 520 550 580K 610 640"); |
| 2913 CheckExpectedRangesByTimestamp("{ [80,200) [400,670) }"); | 2879 CheckExpectedRangesByTimestamp("{ [80,200) [400,670) }"); |
| 2914 | 2880 |
| 2915 // Seek to 80ms to make the first range the selected range. | 2881 // Seek to 80ms to make the first range the selected range. |
| 2916 SeekToTimestampMs(80); | 2882 SeekToTimestampMs(80); |
| 2917 | 2883 |
| 2918 // Now append a GOP in the middle of the second range and trigger GC. Because | 2884 // Now append a GOP in the middle of the second range and trigger GC. Because |
| 2919 // it is after the selected range, this tests that the GOP is saved when | 2885 // it is after the selected range, this tests that the GOP is saved when |
| 2920 // deleting from the back. | 2886 // deleting from the back. |
| 2921 NewSegmentAppend("500K 530 560 590"); | 2887 NewCodedFrameGroupAppend("500K 530 560 590"); |
| 2922 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2888 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2923 DecodeTimestamp::FromMilliseconds(80), 0)); | 2889 DecodeTimestamp::FromMilliseconds(80), 0)); |
| 2924 | 2890 |
| 2925 // Should save the GOPs between the seek point and GOP that was last appended | 2891 // Should save the GOPs between the seek point and GOP that was last appended |
| 2926 CheckExpectedRangesByTimestamp("{ [80,200) [400,620) }"); | 2892 CheckExpectedRangesByTimestamp("{ [80,200) [400,620) }"); |
| 2927 | 2893 |
| 2928 // Continue appending to this GOP after GC. | 2894 // Continue appending to this GOP after GC. |
| 2929 AppendBuffers("620D30"); | 2895 AppendBuffers("620D30"); |
| 2930 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2896 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2931 DecodeTimestamp::FromMilliseconds(80), 0)); | 2897 DecodeTimestamp::FromMilliseconds(80), 0)); |
| 2932 CheckExpectedRangesByTimestamp("{ [80,200) [400,650) }"); | 2898 CheckExpectedRangesByTimestamp("{ [80,200) [400,650) }"); |
| 2933 } | 2899 } |
| 2934 | 2900 |
| 2935 // Test saving the last GOP appended when the GOP containing the next buffer is | 2901 // Test saving the last GOP appended when the GOP containing the next buffer is |
| 2936 // adjacent to the last GOP appended. | 2902 // adjacent to the last GOP appended. |
| 2937 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected1) { | 2903 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected1) { |
| 2938 // Append 3 GOPs at 0ms, 90ms, and 180ms. | 2904 // Append 3 GOPs at 0ms, 90ms, and 180ms. |
| 2939 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240"); | 2905 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240"); |
| 2940 CheckExpectedRangesByTimestamp("{ [0,270) }"); | 2906 CheckExpectedRangesByTimestamp("{ [0,270) }"); |
| 2941 | 2907 |
| 2942 // Seek to the GOP at 90ms. | 2908 // Seek to the GOP at 90ms. |
| 2943 SeekToTimestampMs(90); | 2909 SeekToTimestampMs(90); |
| 2944 | 2910 |
| 2945 // Set the memory limit to 1, then overlap the GOP at 0. | 2911 // Set the memory limit to 1, then overlap the GOP at 0. |
| 2946 SetMemoryLimit(1); | 2912 SetMemoryLimit(1); |
| 2947 NewSegmentAppend("0K 30 60"); | 2913 NewCodedFrameGroupAppend("0K 30 60"); |
| 2948 | 2914 |
| 2949 // GC should save the GOP at 0ms and 90ms, and will fail since GOP larger | 2915 // GC should save the GOP at 0ms and 90ms, and will fail since GOP larger |
| 2950 // than 1 buffer | 2916 // than 1 buffer |
| 2951 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2917 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2952 DecodeTimestamp::FromMilliseconds(90), 0)); | 2918 DecodeTimestamp::FromMilliseconds(90), 0)); |
| 2953 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 2919 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 2954 | 2920 |
| 2955 // Seek to 0 and check all buffers. | 2921 // Seek to 0 and check all buffers. |
| 2956 SeekToTimestampMs(0); | 2922 SeekToTimestampMs(0); |
| 2957 CheckExpectedBuffers("0K 30 60 90K 120 150"); | 2923 CheckExpectedBuffers("0K 30 60 90K 120 150"); |
| 2958 CheckNoNextBuffer(); | 2924 CheckNoNextBuffer(); |
| 2959 | 2925 |
| 2960 // Now seek back to 90ms and append a GOP at 180ms. | 2926 // Now seek back to 90ms and append a GOP at 180ms. |
| 2961 SeekToTimestampMs(90); | 2927 SeekToTimestampMs(90); |
| 2962 NewSegmentAppend("180K 210 240"); | 2928 NewCodedFrameGroupAppend("180K 210 240"); |
| 2963 | 2929 |
| 2964 // Should save the GOP at 90ms and the GOP at 180ms. | 2930 // Should save the GOP at 90ms and the GOP at 180ms. |
| 2965 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2931 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2966 DecodeTimestamp::FromMilliseconds(90), 0)); | 2932 DecodeTimestamp::FromMilliseconds(90), 0)); |
| 2967 CheckExpectedRangesByTimestamp("{ [90,270) }"); | 2933 CheckExpectedRangesByTimestamp("{ [90,270) }"); |
| 2968 CheckExpectedBuffers("90K 120 150 180K 210 240"); | 2934 CheckExpectedBuffers("90K 120 150 180K 210 240"); |
| 2969 CheckNoNextBuffer(); | 2935 CheckNoNextBuffer(); |
| 2970 } | 2936 } |
| 2971 | 2937 |
| 2972 // Test saving the last GOP appended when it is at the beginning or end of the | 2938 // Test saving the last GOP appended when it is at the beginning or end of the |
| 2973 // selected range. This tests when the last GOP appended is before or after the | 2939 // selected range. This tests when the last GOP appended is before or after the |
| 2974 // GOP containing the next buffer, but not directly adjacent to this GOP. | 2940 // GOP containing the next buffer, but not directly adjacent to this GOP. |
| 2975 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected2) { | 2941 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected2) { |
| 2976 // Append 4 GOPs starting at positions 0ms, 90ms, 180ms, 270ms. | 2942 // Append 4 GOPs starting at positions 0ms, 90ms, 180ms, 270ms. |
| 2977 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); | 2943 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); |
| 2978 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 2944 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 2979 | 2945 |
| 2980 // Seek to the last GOP at 270ms. | 2946 // Seek to the last GOP at 270ms. |
| 2981 SeekToTimestampMs(270); | 2947 SeekToTimestampMs(270); |
| 2982 | 2948 |
| 2983 // Set the memory limit to 1, then overlap the GOP at 90ms. | 2949 // Set the memory limit to 1, then overlap the GOP at 90ms. |
| 2984 SetMemoryLimit(1); | 2950 SetMemoryLimit(1); |
| 2985 NewSegmentAppend("90K 120 150"); | 2951 NewCodedFrameGroupAppend("90K 120 150"); |
| 2986 | 2952 |
| 2987 // GC will save data in the range where the most recent append has happened | 2953 // GC will save data in the range where the most recent append has happened |
| 2988 // [0; 180) and the range where the next read position is [270;360) | 2954 // [0; 180) and the range where the next read position is [270;360) |
| 2989 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2955 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 2990 DecodeTimestamp::FromMilliseconds(270), 0)); | 2956 DecodeTimestamp::FromMilliseconds(270), 0)); |
| 2991 CheckExpectedRangesByTimestamp("{ [0,180) [270,360) }"); | 2957 CheckExpectedRangesByTimestamp("{ [0,180) [270,360) }"); |
| 2992 | 2958 |
| 2993 // Add 3 GOPs to the end of the selected range at 360ms, 450ms, and 540ms. | 2959 // Add 3 GOPs to the end of the selected range at 360ms, 450ms, and 540ms. |
| 2994 NewSegmentAppend("360K 390 420 450K 480 510 540K 570 600"); | 2960 NewCodedFrameGroupAppend("360K 390 420 450K 480 510 540K 570 600"); |
| 2995 CheckExpectedRangesByTimestamp("{ [0,180) [270,630) }"); | 2961 CheckExpectedRangesByTimestamp("{ [0,180) [270,630) }"); |
| 2996 | 2962 |
| 2997 // Overlap the GOP at 450ms and garbage collect to test deleting from the | 2963 // Overlap the GOP at 450ms and garbage collect to test deleting from the |
| 2998 // back. | 2964 // back. |
| 2999 NewSegmentAppend("450K 480 510"); | 2965 NewCodedFrameGroupAppend("450K 480 510"); |
| 3000 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2966 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 3001 DecodeTimestamp::FromMilliseconds(270), 0)); | 2967 DecodeTimestamp::FromMilliseconds(270), 0)); |
| 3002 | 2968 |
| 3003 // Should save GOPs from GOP at 270ms to GOP at 450ms. | 2969 // Should save GOPs from GOP at 270ms to GOP at 450ms. |
| 3004 CheckExpectedRangesByTimestamp("{ [270,540) }"); | 2970 CheckExpectedRangesByTimestamp("{ [270,540) }"); |
| 3005 } | 2971 } |
| 3006 | 2972 |
| 3007 // Test saving the last GOP appended when it is the same as the GOP containing | 2973 // Test saving the last GOP appended when it is the same as the GOP containing |
| 3008 // the next buffer. | 2974 // the next buffer. |
| 3009 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected3) { | 2975 TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected3) { |
| 3010 // Seek to start of stream. | 2976 // Seek to start of stream. |
| 3011 SeekToTimestampMs(0); | 2977 SeekToTimestampMs(0); |
| 3012 | 2978 |
| 3013 // Append 3 GOPs starting at 0ms, 90ms, 180ms. | 2979 // Append 3 GOPs starting at 0ms, 90ms, 180ms. |
| 3014 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240"); | 2980 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240"); |
| 3015 CheckExpectedRangesByTimestamp("{ [0,270) }"); | 2981 CheckExpectedRangesByTimestamp("{ [0,270) }"); |
| 3016 | 2982 |
| 3017 // Set the memory limit to 1 then begin appending the start of a GOP starting | 2983 // Set the memory limit to 1 then begin appending the start of a GOP starting |
| 3018 // at 0ms. | 2984 // at 0ms. |
| 3019 SetMemoryLimit(1); | 2985 SetMemoryLimit(1); |
| 3020 NewSegmentAppend("0K 30"); | 2986 NewCodedFrameGroupAppend("0K 30"); |
| 3021 | 2987 |
| 3022 // GC should save the newly appended GOP, which is also the next GOP that | 2988 // GC should save the newly appended GOP, which is also the next GOP that |
| 3023 // will be returned from the seek request. | 2989 // will be returned from the seek request. |
| 3024 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 2990 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 3025 DecodeTimestamp::FromMilliseconds(0), 0)); | 2991 DecodeTimestamp::FromMilliseconds(0), 0)); |
| 3026 CheckExpectedRangesByTimestamp("{ [0,60) }"); | 2992 CheckExpectedRangesByTimestamp("{ [0,60) }"); |
| 3027 | 2993 |
| 3028 // Check the buffers in the range. | 2994 // Check the buffers in the range. |
| 3029 CheckExpectedBuffers("0K 30"); | 2995 CheckExpectedBuffers("0K 30"); |
| 3030 CheckNoNextBuffer(); | 2996 CheckNoNextBuffer(); |
| 3031 | 2997 |
| 3032 // Continue appending to this buffer. | 2998 // Continue appending to this buffer. |
| 3033 AppendBuffers("60 90"); | 2999 AppendBuffers("60 90"); |
| 3034 | 3000 |
| 3035 // GC should still save the rest of this GOP and should be able to fulfill | 3001 // GC should still save the rest of this GOP and should be able to fulfill |
| 3036 // the read. | 3002 // the read. |
| 3037 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( | 3003 EXPECT_FALSE(stream_->GarbageCollectIfNeeded( |
| 3038 DecodeTimestamp::FromMilliseconds(0), 0)); | 3004 DecodeTimestamp::FromMilliseconds(0), 0)); |
| 3039 CheckExpectedRangesByTimestamp("{ [0,120) }"); | 3005 CheckExpectedRangesByTimestamp("{ [0,120) }"); |
| 3040 CheckExpectedBuffers("60 90"); | 3006 CheckExpectedBuffers("60 90"); |
| 3041 CheckNoNextBuffer(); | 3007 CheckNoNextBuffer(); |
| 3042 } | 3008 } |
| 3043 | 3009 |
| 3044 // Currently disabled because of bug: crbug.com/140875. | 3010 // Currently disabled because of bug: crbug.com/140875. |
| 3045 TEST_F(SourceBufferStreamTest, DISABLED_GarbageCollection_WaitingForKeyframe) { | 3011 TEST_F(SourceBufferStreamTest, DISABLED_GarbageCollection_WaitingForKeyframe) { |
| 3046 // Set memory limit to 10 buffers. | 3012 // Set memory limit to 10 buffers. |
| 3047 SetMemoryLimit(10); | 3013 SetMemoryLimit(10); |
| 3048 | 3014 |
| 3049 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. | 3015 // Append 5 buffers at positions 10 through 14 and exhaust the buffers. |
| 3050 NewSegmentAppend(10, 5, &kDataA); | 3016 NewCodedFrameGroupAppend(10, 5, &kDataA); |
| 3051 Seek(10); | 3017 Seek(10); |
| 3052 CheckExpectedBuffers(10, 14, &kDataA); | 3018 CheckExpectedBuffers(10, 14, &kDataA); |
| 3053 CheckExpectedRanges("{ [10,14) }"); | 3019 CheckExpectedRanges("{ [10,14) }"); |
| 3054 | 3020 |
| 3055 // We are now stalled at position 15. | 3021 // We are now stalled at position 15. |
| 3056 CheckNoNextBuffer(); | 3022 CheckNoNextBuffer(); |
| 3057 | 3023 |
| 3058 // Do an end overlap that causes the latter half of the range to be deleted. | 3024 // Do an end overlap that causes the latter half of the range to be deleted. |
| 3059 NewSegmentAppend(5, 6, &kDataA); | 3025 NewCodedFrameGroupAppend(5, 6, &kDataA); |
| 3060 CheckNoNextBuffer(); | 3026 CheckNoNextBuffer(); |
| 3061 CheckExpectedRanges("{ [5,10) }"); | 3027 CheckExpectedRanges("{ [5,10) }"); |
| 3062 | 3028 |
| 3063 // Append buffers from position 20 to 29. This should trigger GC. | 3029 // Append buffers from position 20 to 29. This should trigger GC. |
| 3064 NewSegmentAppend(20, 10, &kDataA); | 3030 NewCodedFrameGroupAppend(20, 10, &kDataA); |
| 3065 | 3031 |
| 3066 // GC should keep the keyframe before the seek position 15, and the next 9 | 3032 // GC should keep the keyframe before the seek position 15, and the next 9 |
| 3067 // buffers closest to the seek position. | 3033 // buffers closest to the seek position. |
| 3068 CheckNoNextBuffer(); | 3034 CheckNoNextBuffer(); |
| 3069 CheckExpectedRanges("{ [10,10) [20,28) }"); | 3035 CheckExpectedRanges("{ [10,10) [20,28) }"); |
| 3070 | 3036 |
| 3071 // Fulfill the seek by appending one buffer at 15. | 3037 // Fulfill the seek by appending one buffer at 15. |
| 3072 NewSegmentAppend(15, 1, &kDataA); | 3038 NewCodedFrameGroupAppend(15, 1, &kDataA); |
| 3073 CheckExpectedBuffers(15, 15, &kDataA); | 3039 CheckExpectedBuffers(15, 15, &kDataA); |
| 3074 CheckExpectedRanges("{ [15,15) [20,28) }"); | 3040 CheckExpectedRanges("{ [15,15) [20,28) }"); |
| 3075 } | 3041 } |
| 3076 | 3042 |
| 3077 // Test the performance of garbage collection. | 3043 // Test the performance of garbage collection. |
| 3078 TEST_F(SourceBufferStreamTest, GarbageCollection_Performance) { | 3044 TEST_F(SourceBufferStreamTest, GarbageCollection_Performance) { |
| 3079 // Force |keyframes_per_second_| to be equal to kDefaultFramesPerSecond. | 3045 // Force |keyframes_per_second_| to be equal to kDefaultFramesPerSecond. |
| 3080 SetStreamInfo(kDefaultFramesPerSecond, kDefaultFramesPerSecond); | 3046 SetStreamInfo(kDefaultFramesPerSecond, kDefaultFramesPerSecond); |
| 3081 | 3047 |
| 3082 const int kBuffersToKeep = 1000; | 3048 const int kBuffersToKeep = 1000; |
| 3083 SetMemoryLimit(kBuffersToKeep); | 3049 SetMemoryLimit(kBuffersToKeep); |
| 3084 | 3050 |
| 3085 int buffers_appended = 0; | 3051 int buffers_appended = 0; |
| 3086 | 3052 |
| 3087 NewSegmentAppend(0, kBuffersToKeep); | 3053 NewCodedFrameGroupAppend(0, kBuffersToKeep); |
| 3088 buffers_appended += kBuffersToKeep; | 3054 buffers_appended += kBuffersToKeep; |
| 3089 | 3055 |
| 3090 const int kBuffersToAppend = 1000; | 3056 const int kBuffersToAppend = 1000; |
| 3091 const int kGarbageCollections = 3; | 3057 const int kGarbageCollections = 3; |
| 3092 for (int i = 0; i < kGarbageCollections; ++i) { | 3058 for (int i = 0; i < kGarbageCollections; ++i) { |
| 3093 AppendBuffers(buffers_appended, kBuffersToAppend); | 3059 AppendBuffers(buffers_appended, kBuffersToAppend); |
| 3094 buffers_appended += kBuffersToAppend; | 3060 buffers_appended += kBuffersToAppend; |
| 3095 } | 3061 } |
| 3096 } | 3062 } |
| 3097 | 3063 |
| 3098 TEST_F(SourceBufferStreamTest, GarbageCollection_MediaTimeAfterLastAppendTime) { | 3064 TEST_F(SourceBufferStreamTest, GarbageCollection_MediaTimeAfterLastAppendTime) { |
| 3099 // Set memory limit to 10 buffers. | 3065 // Set memory limit to 10 buffers. |
| 3100 SetMemoryLimit(10); | 3066 SetMemoryLimit(10); |
| 3101 | 3067 |
| 3102 // Append 12 buffers. The duration of the last buffer is 30 | 3068 // Append 12 buffers. The duration of the last buffer is 30 |
| 3103 NewSegmentAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330D30"); | 3069 NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330D30"); |
| 3104 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 3070 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 3105 | 3071 |
| 3106 // Do a garbage collection with the media time higher than the timestamp of | 3072 // Do a garbage collection with the media time higher than the timestamp of |
| 3107 // the last appended buffer (330), but still within buffered ranges, taking | 3073 // the last appended buffer (330), but still within buffered ranges, taking |
| 3108 // into account the duration of the last frame (timestamp of the last frame is | 3074 // into account the duration of the last frame (timestamp of the last frame is |
| 3109 // 330, duration is 30, so the latest valid buffered position is 330+30=360). | 3075 // 330, duration is 30, so the latest valid buffered position is 330+30=360). |
| 3110 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( | 3076 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( |
| 3111 DecodeTimestamp::FromMilliseconds(360), 0)); | 3077 DecodeTimestamp::FromMilliseconds(360), 0)); |
| 3112 | 3078 |
| 3113 // GC should collect one GOP from the front to bring us back under memory | 3079 // GC should collect one GOP from the front to bring us back under memory |
| 3114 // limit of 10 buffers. | 3080 // limit of 10 buffers. |
| 3115 CheckExpectedRangesByTimestamp("{ [120,360) }"); | 3081 CheckExpectedRangesByTimestamp("{ [120,360) }"); |
| 3116 } | 3082 } |
| 3117 | 3083 |
| 3118 TEST_F(SourceBufferStreamTest, | 3084 TEST_F(SourceBufferStreamTest, |
| 3119 GarbageCollection_MediaTimeOutsideOfStreamBufferedRange) { | 3085 GarbageCollection_MediaTimeOutsideOfStreamBufferedRange) { |
| 3120 // Set memory limit to 10 buffers. | 3086 // Set memory limit to 10 buffers. |
| 3121 SetMemoryLimit(10); | 3087 SetMemoryLimit(10); |
| 3122 | 3088 |
| 3123 // Append 12 buffers. | 3089 // Append 12 buffers. |
| 3124 NewSegmentAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330"); | 3090 NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210K 240 270 300K 330"); |
| 3125 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 3091 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 3126 | 3092 |
| 3127 // Seek in order to set the stream read position to 330 an ensure that the | 3093 // Seek in order to set the stream read position to 330 an ensure that the |
| 3128 // stream selects the buffered range. | 3094 // stream selects the buffered range. |
| 3129 SeekToTimestampMs(330); | 3095 SeekToTimestampMs(330); |
| 3130 | 3096 |
| 3131 // Do a garbage collection with the media time outside the buffered ranges | 3097 // Do a garbage collection with the media time outside the buffered ranges |
| 3132 // (this might happen when there's both audio and video streams, audio stream | 3098 // (this might happen when there's both audio and video streams, audio stream |
| 3133 // buffered range is longer than the video stream buffered range, since | 3099 // buffered range is longer than the video stream buffered range, since |
| 3134 // media::Pipeline uses audio stream as a time source in that case, it might | 3100 // media::Pipeline uses audio stream as a time source in that case, it might |
| 3135 // return a media_time that is slightly outside of video buffered range). In | 3101 // return a media_time that is slightly outside of video buffered range). In |
| 3136 // those cases the GC algorithm should clamp the media_time value to the | 3102 // those cases the GC algorithm should clamp the media_time value to the |
| 3137 // buffered ranges to work correctly (see crbug.com/563292). | 3103 // buffered ranges to work correctly (see crbug.com/563292). |
| 3138 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( | 3104 EXPECT_TRUE(stream_->GarbageCollectIfNeeded( |
| 3139 DecodeTimestamp::FromMilliseconds(361), 0)); | 3105 DecodeTimestamp::FromMilliseconds(361), 0)); |
| 3140 | 3106 |
| 3141 // GC should collect one GOP from the front to bring us back under memory | 3107 // GC should collect one GOP from the front to bring us back under memory |
| 3142 // limit of 10 buffers. | 3108 // limit of 10 buffers. |
| 3143 CheckExpectedRangesByTimestamp("{ [120,360) }"); | 3109 CheckExpectedRangesByTimestamp("{ [120,360) }"); |
| 3144 } | 3110 } |
| 3145 | 3111 |
| 3146 TEST_F(SourceBufferStreamTest, GetRemovalRange_BytesToFree) { | 3112 TEST_F(SourceBufferStreamTest, GetRemovalRange_BytesToFree) { |
| 3147 // Append 2 GOPs starting at 300ms, 30ms apart. | 3113 // Append 2 GOPs starting at 300ms, 30ms apart. |
| 3148 NewSegmentAppend("300K 330 360 390K 420 450"); | 3114 NewCodedFrameGroupAppend("300K 330 360 390K 420 450"); |
| 3149 | 3115 |
| 3150 // Append 2 GOPs starting at 600ms, 30ms apart. | 3116 // Append 2 GOPs starting at 600ms, 30ms apart. |
| 3151 NewSegmentAppend("600K 630 660 690K 720 750"); | 3117 NewCodedFrameGroupAppend("600K 630 660 690K 720 750"); |
| 3152 | 3118 |
| 3153 // Append 2 GOPs starting at 900ms, 30ms apart. | 3119 // Append 2 GOPs starting at 900ms, 30ms apart. |
| 3154 NewSegmentAppend("900K 930 960 990K 1020 1050"); | 3120 NewCodedFrameGroupAppend("900K 930 960 990K 1020 1050"); |
| 3155 | 3121 |
| 3156 CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }"); | 3122 CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }"); |
| 3157 | 3123 |
| 3158 int remove_range_end = -1; | 3124 int remove_range_end = -1; |
| 3159 int bytes_removed = -1; | 3125 int bytes_removed = -1; |
| 3160 | 3126 |
| 3161 // Size 0. | 3127 // Size 0. |
| 3162 bytes_removed = GetRemovalRangeInMs(300, 1080, 0, &remove_range_end); | 3128 bytes_removed = GetRemovalRangeInMs(300, 1080, 0, &remove_range_end); |
| 3163 EXPECT_EQ(-1, remove_range_end); | 3129 EXPECT_EQ(-1, remove_range_end); |
| 3164 EXPECT_EQ(0, bytes_removed); | 3130 EXPECT_EQ(0, bytes_removed); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3200 EXPECT_EQ(18, bytes_removed); | 3166 EXPECT_EQ(18, bytes_removed); |
| 3201 | 3167 |
| 3202 // Larger than the whole ranges. | 3168 // Larger than the whole ranges. |
| 3203 bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end); | 3169 bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end); |
| 3204 EXPECT_EQ(1080, remove_range_end); | 3170 EXPECT_EQ(1080, remove_range_end); |
| 3205 EXPECT_EQ(18, bytes_removed); | 3171 EXPECT_EQ(18, bytes_removed); |
| 3206 } | 3172 } |
| 3207 | 3173 |
| 3208 TEST_F(SourceBufferStreamTest, GetRemovalRange_Range) { | 3174 TEST_F(SourceBufferStreamTest, GetRemovalRange_Range) { |
| 3209 // Append 2 GOPs starting at 300ms, 30ms apart. | 3175 // Append 2 GOPs starting at 300ms, 30ms apart. |
| 3210 NewSegmentAppend("300K 330 360 390K 420 450"); | 3176 NewCodedFrameGroupAppend("300K 330 360 390K 420 450"); |
| 3211 | 3177 |
| 3212 // Append 2 GOPs starting at 600ms, 30ms apart. | 3178 // Append 2 GOPs starting at 600ms, 30ms apart. |
| 3213 NewSegmentAppend("600K 630 660 690K 720 750"); | 3179 NewCodedFrameGroupAppend("600K 630 660 690K 720 750"); |
| 3214 | 3180 |
| 3215 // Append 2 GOPs starting at 900ms, 30ms apart. | 3181 // Append 2 GOPs starting at 900ms, 30ms apart. |
| 3216 NewSegmentAppend("900K 930 960 990K 1020 1050"); | 3182 NewCodedFrameGroupAppend("900K 930 960 990K 1020 1050"); |
| 3217 | 3183 |
| 3218 CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }"); | 3184 CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }"); |
| 3219 | 3185 |
| 3220 int remove_range_end = -1; | 3186 int remove_range_end = -1; |
| 3221 int bytes_removed = -1; | 3187 int bytes_removed = -1; |
| 3222 | 3188 |
| 3223 // Within a GOP and no keyframe. | 3189 // Within a GOP and no keyframe. |
| 3224 bytes_removed = GetRemovalRangeInMs(630, 660, 20, &remove_range_end); | 3190 bytes_removed = GetRemovalRangeInMs(630, 660, 20, &remove_range_end); |
| 3225 EXPECT_EQ(-1, remove_range_end); | 3191 EXPECT_EQ(-1, remove_range_end); |
| 3226 EXPECT_EQ(0, bytes_removed); | 3192 EXPECT_EQ(0, bytes_removed); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3272 } | 3238 } |
| 3273 | 3239 |
| 3274 TEST_F(SourceBufferStreamTest, ConfigChange_Basic) { | 3240 TEST_F(SourceBufferStreamTest, ConfigChange_Basic) { |
| 3275 VideoDecoderConfig new_config = TestVideoConfig::Large(); | 3241 VideoDecoderConfig new_config = TestVideoConfig::Large(); |
| 3276 ASSERT_FALSE(new_config.Matches(video_config_)); | 3242 ASSERT_FALSE(new_config.Matches(video_config_)); |
| 3277 | 3243 |
| 3278 Seek(0); | 3244 Seek(0); |
| 3279 CheckVideoConfig(video_config_); | 3245 CheckVideoConfig(video_config_); |
| 3280 | 3246 |
| 3281 // Append 5 buffers at positions 0 through 4 | 3247 // Append 5 buffers at positions 0 through 4 |
| 3282 NewSegmentAppend(0, 5, &kDataA); | 3248 NewCodedFrameGroupAppend(0, 5, &kDataA); |
| 3283 | 3249 |
| 3284 CheckVideoConfig(video_config_); | 3250 CheckVideoConfig(video_config_); |
| 3285 | 3251 |
| 3286 // Signal a config change. | 3252 // Signal a config change. |
| 3287 stream_->UpdateVideoConfig(new_config); | 3253 stream_->UpdateVideoConfig(new_config); |
| 3288 | 3254 |
| 3289 // Make sure updating the config doesn't change anything since new_config | 3255 // Make sure updating the config doesn't change anything since new_config |
| 3290 // should not be associated with the buffer GetNextBuffer() will return. | 3256 // should not be associated with the buffer GetNextBuffer() will return. |
| 3291 CheckVideoConfig(video_config_); | 3257 CheckVideoConfig(video_config_); |
| 3292 | 3258 |
| 3293 // Append 5 buffers at positions 5 through 9. | 3259 // Append 5 buffers at positions 5 through 9. |
| 3294 NewSegmentAppend(5, 5, &kDataB); | 3260 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 3295 | 3261 |
| 3296 // Consume the buffers associated with the initial config. | 3262 // Consume the buffers associated with the initial config. |
| 3297 scoped_refptr<StreamParserBuffer> buffer; | 3263 scoped_refptr<StreamParserBuffer> buffer; |
| 3298 for (int i = 0; i < 5; i++) { | 3264 for (int i = 0; i < 5; i++) { |
| 3299 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); | 3265 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| 3300 CheckVideoConfig(video_config_); | 3266 CheckVideoConfig(video_config_); |
| 3301 } | 3267 } |
| 3302 | 3268 |
| 3303 // Verify the next attempt to get a buffer will signal that a config change | 3269 // Verify the next attempt to get a buffer will signal that a config change |
| 3304 // has happened. | 3270 // has happened. |
| 3305 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 3271 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 3306 | 3272 |
| 3307 // Verify that the new config is now returned. | 3273 // Verify that the new config is now returned. |
| 3308 CheckVideoConfig(new_config); | 3274 CheckVideoConfig(new_config); |
| 3309 | 3275 |
| 3310 // Consume the remaining buffers associated with the new config. | 3276 // Consume the remaining buffers associated with the new config. |
| 3311 for (int i = 0; i < 5; i++) { | 3277 for (int i = 0; i < 5; i++) { |
| 3312 CheckVideoConfig(new_config); | 3278 CheckVideoConfig(new_config); |
| 3313 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); | 3279 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess); |
| 3314 } | 3280 } |
| 3315 } | 3281 } |
| 3316 | 3282 |
| 3317 TEST_F(SourceBufferStreamTest, ConfigChange_Seek) { | 3283 TEST_F(SourceBufferStreamTest, ConfigChange_Seek) { |
| 3318 scoped_refptr<StreamParserBuffer> buffer; | 3284 scoped_refptr<StreamParserBuffer> buffer; |
| 3319 VideoDecoderConfig new_config = TestVideoConfig::Large(); | 3285 VideoDecoderConfig new_config = TestVideoConfig::Large(); |
| 3320 | 3286 |
| 3321 Seek(0); | 3287 Seek(0); |
| 3322 NewSegmentAppend(0, 5, &kDataA); | 3288 NewCodedFrameGroupAppend(0, 5, &kDataA); |
| 3323 stream_->UpdateVideoConfig(new_config); | 3289 stream_->UpdateVideoConfig(new_config); |
| 3324 NewSegmentAppend(5, 5, &kDataB); | 3290 NewCodedFrameGroupAppend(5, 5, &kDataB); |
| 3325 | 3291 |
| 3326 // Seek to the start of the buffers with the new config and make sure a | 3292 // Seek to the start of the buffers with the new config and make sure a |
| 3327 // config change is signalled. | 3293 // config change is signalled. |
| 3328 CheckVideoConfig(video_config_); | 3294 CheckVideoConfig(video_config_); |
| 3329 Seek(5); | 3295 Seek(5); |
| 3330 CheckVideoConfig(video_config_); | 3296 CheckVideoConfig(video_config_); |
| 3331 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 3297 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 3332 CheckVideoConfig(new_config); | 3298 CheckVideoConfig(new_config); |
| 3333 CheckExpectedBuffers(5, 9, &kDataB); | 3299 CheckExpectedBuffers(5, 9, &kDataB); |
| 3334 | 3300 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 3346 CheckVideoConfig(new_config); | 3312 CheckVideoConfig(new_config); |
| 3347 Seek(0); | 3313 Seek(0); |
| 3348 CheckVideoConfig(new_config); | 3314 CheckVideoConfig(new_config); |
| 3349 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 3315 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 3350 CheckVideoConfig(video_config_); | 3316 CheckVideoConfig(video_config_); |
| 3351 CheckExpectedBuffers(0, 4, &kDataA); | 3317 CheckExpectedBuffers(0, 4, &kDataA); |
| 3352 } | 3318 } |
| 3353 | 3319 |
| 3354 TEST_F(SourceBufferStreamTest, SetExplicitDuration) { | 3320 TEST_F(SourceBufferStreamTest, SetExplicitDuration) { |
| 3355 // Append 2 buffers at positions 5 through 6. | 3321 // Append 2 buffers at positions 5 through 6. |
| 3356 NewSegmentAppend(5, 2); | 3322 NewCodedFrameGroupAppend(5, 2); |
| 3357 | 3323 |
| 3358 // Append 2 buffers at positions 10 through 11. | 3324 // Append 2 buffers at positions 10 through 11. |
| 3359 NewSegmentAppend(10, 2); | 3325 NewCodedFrameGroupAppend(10, 2); |
| 3360 | 3326 |
| 3361 // Append 2 buffers at positions 15 through 16. | 3327 // Append 2 buffers at positions 15 through 16. |
| 3362 NewSegmentAppend(15, 2); | 3328 NewCodedFrameGroupAppend(15, 2); |
| 3363 | 3329 |
| 3364 // Check expected ranges. | 3330 // Check expected ranges. |
| 3365 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); | 3331 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); |
| 3366 | 3332 |
| 3367 // Set duration to be between buffers 6 and 10. | 3333 // Set duration to be between buffers 6 and 10. |
| 3368 stream_->OnSetDuration(frame_duration() * 8); | 3334 stream_->OnSetDuration(frame_duration() * 8); |
| 3369 | 3335 |
| 3370 // Should truncate the data after 6. | 3336 // Should truncate the data after 6. |
| 3371 CheckExpectedRanges("{ [5,6) }"); | 3337 CheckExpectedRanges("{ [5,6) }"); |
| 3372 | 3338 |
| 3373 // Adding data past the previous duration should still work. | 3339 // Adding data past the previous duration should still work. |
| 3374 NewSegmentAppend(0, 20); | 3340 NewCodedFrameGroupAppend(0, 20); |
| 3375 CheckExpectedRanges("{ [0,19) }"); | 3341 CheckExpectedRanges("{ [0,19) }"); |
| 3376 } | 3342 } |
| 3377 | 3343 |
| 3378 TEST_F(SourceBufferStreamTest, SetExplicitDuration_EdgeCase) { | 3344 TEST_F(SourceBufferStreamTest, SetExplicitDuration_EdgeCase) { |
| 3379 // Append 10 buffers at positions 10 through 19. | 3345 // Append 10 buffers at positions 10 through 19. |
| 3380 NewSegmentAppend(10, 10); | 3346 NewCodedFrameGroupAppend(10, 10); |
| 3381 | 3347 |
| 3382 // Append 5 buffers at positions 25 through 29. | 3348 // Append 5 buffers at positions 25 through 29. |
| 3383 NewSegmentAppend(25, 5); | 3349 NewCodedFrameGroupAppend(25, 5); |
| 3384 | 3350 |
| 3385 // Check expected ranges. | 3351 // Check expected ranges. |
| 3386 CheckExpectedRanges("{ [10,19) [25,29) }"); | 3352 CheckExpectedRanges("{ [10,19) [25,29) }"); |
| 3387 | 3353 |
| 3388 // Set duration to be right before buffer 25. | 3354 // Set duration to be right before buffer 25. |
| 3389 stream_->OnSetDuration(frame_duration() * 25); | 3355 stream_->OnSetDuration(frame_duration() * 25); |
| 3390 | 3356 |
| 3391 // Should truncate the last range. | 3357 // Should truncate the last range. |
| 3392 CheckExpectedRanges("{ [10,19) }"); | 3358 CheckExpectedRanges("{ [10,19) }"); |
| 3393 } | 3359 } |
| 3394 | 3360 |
| 3395 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialRange) { | 3361 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialRange) { |
| 3396 // Append 5 buffers at positions 0 through 4. | 3362 // Append 5 buffers at positions 0 through 4. |
| 3397 NewSegmentAppend(0, 5); | 3363 NewCodedFrameGroupAppend(0, 5); |
| 3398 | 3364 |
| 3399 // Append 10 buffers at positions 10 through 19. | 3365 // Append 10 buffers at positions 10 through 19. |
| 3400 NewSegmentAppend(10, 10); | 3366 NewCodedFrameGroupAppend(10, 10); |
| 3401 | 3367 |
| 3402 // Append 5 buffers at positions 25 through 29. | 3368 // Append 5 buffers at positions 25 through 29. |
| 3403 NewSegmentAppend(25, 5); | 3369 NewCodedFrameGroupAppend(25, 5); |
| 3404 | 3370 |
| 3405 // Check expected ranges. | 3371 // Check expected ranges. |
| 3406 CheckExpectedRanges("{ [0,4) [10,19) [25,29) }"); | 3372 CheckExpectedRanges("{ [0,4) [10,19) [25,29) }"); |
| 3407 | 3373 |
| 3408 // Set duration to be between buffers 13 and 14. | 3374 // Set duration to be between buffers 13 and 14. |
| 3409 stream_->OnSetDuration(frame_duration() * 14); | 3375 stream_->OnSetDuration(frame_duration() * 14); |
| 3410 | 3376 |
| 3411 // Should truncate the data after 13. | 3377 // Should truncate the data after 13. |
| 3412 CheckExpectedRanges("{ [0,4) [10,13) }"); | 3378 CheckExpectedRanges("{ [0,4) [10,13) }"); |
| 3413 } | 3379 } |
| 3414 | 3380 |
| 3415 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeleteSelectedRange) { | 3381 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeleteSelectedRange) { |
| 3416 // Append 2 buffers at positions 5 through 6. | 3382 // Append 2 buffers at positions 5 through 6. |
| 3417 NewSegmentAppend(5, 2); | 3383 NewCodedFrameGroupAppend(5, 2); |
| 3418 | 3384 |
| 3419 // Append 2 buffers at positions 10 through 11. | 3385 // Append 2 buffers at positions 10 through 11. |
| 3420 NewSegmentAppend(10, 2); | 3386 NewCodedFrameGroupAppend(10, 2); |
| 3421 | 3387 |
| 3422 // Append 2 buffers at positions 15 through 16. | 3388 // Append 2 buffers at positions 15 through 16. |
| 3423 NewSegmentAppend(15, 2); | 3389 NewCodedFrameGroupAppend(15, 2); |
| 3424 | 3390 |
| 3425 // Check expected ranges. | 3391 // Check expected ranges. |
| 3426 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); | 3392 CheckExpectedRanges("{ [5,6) [10,11) [15,16) }"); |
| 3427 | 3393 |
| 3428 // Seek to 10. | 3394 // Seek to 10. |
| 3429 Seek(10); | 3395 Seek(10); |
| 3430 | 3396 |
| 3431 // Set duration to be after position 3. | 3397 // Set duration to be after position 3. |
| 3432 stream_->OnSetDuration(frame_duration() * 4); | 3398 stream_->OnSetDuration(frame_duration() * 4); |
| 3433 | 3399 |
| 3434 // Expect everything to be deleted, and should not have next buffer anymore. | 3400 // Expect everything to be deleted, and should not have next buffer anymore. |
| 3435 CheckNoNextBuffer(); | 3401 CheckNoNextBuffer(); |
| 3436 CheckExpectedRanges("{ }"); | 3402 CheckExpectedRanges("{ }"); |
| 3437 | 3403 |
| 3438 // Appending data at position 10 should not fulfill the seek. | 3404 // Appending data at position 10 should not fulfill the seek. |
| 3439 // (If the duration is set to be something smaller than the current seek | 3405 // (If the duration is set to be something smaller than the current seek |
| 3440 // point, then the seek point is reset and the SourceBufferStream waits | 3406 // point, then the seek point is reset and the SourceBufferStream waits |
| 3441 // for a new seek request. Therefore even if the data is re-appended, it | 3407 // for a new seek request. Therefore even if the data is re-appended, it |
| 3442 // should not fulfill the old seek.) | 3408 // should not fulfill the old seek.) |
| 3443 NewSegmentAppend(0, 15); | 3409 NewCodedFrameGroupAppend(0, 15); |
| 3444 CheckNoNextBuffer(); | 3410 CheckNoNextBuffer(); |
| 3445 CheckExpectedRanges("{ [0,14) }"); | 3411 CheckExpectedRanges("{ [0,14) }"); |
| 3446 } | 3412 } |
| 3447 | 3413 |
| 3448 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialSelectedRange) { | 3414 TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialSelectedRange) { |
| 3449 // Append 5 buffers at positions 0 through 4. | 3415 // Append 5 buffers at positions 0 through 4. |
| 3450 NewSegmentAppend(0, 5); | 3416 NewCodedFrameGroupAppend(0, 5); |
| 3451 | 3417 |
| 3452 // Append 20 buffers at positions 10 through 29. | 3418 // Append 20 buffers at positions 10 through 29. |
| 3453 NewSegmentAppend(10, 20); | 3419 NewCodedFrameGroupAppend(10, 20); |
| 3454 | 3420 |
| 3455 // Check expected ranges. | 3421 // Check expected ranges. |
| 3456 CheckExpectedRanges("{ [0,4) [10,29) }"); | 3422 CheckExpectedRanges("{ [0,4) [10,29) }"); |
| 3457 | 3423 |
| 3458 // Seek to position 10. | 3424 // Seek to position 10. |
| 3459 Seek(10); | 3425 Seek(10); |
| 3460 | 3426 |
| 3461 // Set duration to be between buffers 24 and 25. | 3427 // Set duration to be between buffers 24 and 25. |
| 3462 stream_->OnSetDuration(frame_duration() * 25); | 3428 stream_->OnSetDuration(frame_duration() * 25); |
| 3463 | 3429 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 3476 } | 3442 } |
| 3477 | 3443 |
| 3478 // Test the case where duration is set while the stream parser buffers | 3444 // Test the case where duration is set while the stream parser buffers |
| 3479 // already start passing the data to decoding pipeline. Selected range, | 3445 // already start passing the data to decoding pipeline. Selected range, |
| 3480 // when invalidated by getting truncated, should be updated to NULL | 3446 // when invalidated by getting truncated, should be updated to NULL |
| 3481 // accordingly so that successive append operations keep working. | 3447 // accordingly so that successive append operations keep working. |
| 3482 TEST_F(SourceBufferStreamTest, SetExplicitDuration_UpdateSelectedRange) { | 3448 TEST_F(SourceBufferStreamTest, SetExplicitDuration_UpdateSelectedRange) { |
| 3483 // Seek to start of stream. | 3449 // Seek to start of stream. |
| 3484 SeekToTimestampMs(0); | 3450 SeekToTimestampMs(0); |
| 3485 | 3451 |
| 3486 NewSegmentAppend("0K 30 60 90"); | 3452 NewCodedFrameGroupAppend("0K 30 60 90"); |
| 3487 | 3453 |
| 3488 // Read out the first few buffers. | 3454 // Read out the first few buffers. |
| 3489 CheckExpectedBuffers("0K 30"); | 3455 CheckExpectedBuffers("0K 30"); |
| 3490 | 3456 |
| 3491 // Set duration to be right before buffer 1. | 3457 // Set duration to be right before buffer 1. |
| 3492 stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(60)); | 3458 stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(60)); |
| 3493 | 3459 |
| 3494 // Verify that there is no next buffer. | 3460 // Verify that there is no next buffer. |
| 3495 CheckNoNextBuffer(); | 3461 CheckNoNextBuffer(); |
| 3496 | 3462 |
| 3497 // We should be able to append new buffers at this point. | 3463 // We should be able to append new buffers at this point. |
| 3498 NewSegmentAppend("120K 150"); | 3464 NewCodedFrameGroupAppend("120K 150"); |
| 3499 | 3465 |
| 3500 CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }"); | 3466 CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }"); |
| 3501 } | 3467 } |
| 3502 | 3468 |
| 3503 TEST_F(SourceBufferStreamTest, | 3469 TEST_F(SourceBufferStreamTest, |
| 3504 SetExplicitDuration_AfterSegmentTimestampAndBeforeFirstBufferTimestamp) { | 3470 SetExplicitDuration_AfterGroupTimestampAndBeforeFirstBufferTimestamp) { |
| 3471 NewCodedFrameGroupAppend("0K 30K 60K"); | |
| 3505 | 3472 |
| 3506 NewSegmentAppend("0K 30K 60K"); | 3473 // Append a coded frame group with a start timestamp of 200, but the first |
| 3507 | |
| 3508 // Append a segment with a start timestamp of 200, but the first | |
| 3509 // buffer starts at 230ms. This can happen in muxed content where the | 3474 // buffer starts at 230ms. This can happen in muxed content where the |
| 3510 // audio starts before the first frame. | 3475 // audio starts before the first frame. |
| 3511 NewSegmentAppend(base::TimeDelta::FromMilliseconds(200), | 3476 NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(200), |
| 3512 "230K 260K 290K 320K"); | 3477 "230K 260K 290K 320K"); |
| 3513 | 3478 |
| 3514 NewSegmentAppend("400K 430K 460K"); | 3479 NewCodedFrameGroupAppend("400K 430K 460K"); |
| 3515 | 3480 |
| 3516 CheckExpectedRangesByTimestamp("{ [0,90) [200,350) [400,490) }"); | 3481 CheckExpectedRangesByTimestamp("{ [0,90) [200,350) [400,490) }"); |
| 3517 | 3482 |
| 3518 stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(120)); | 3483 stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(120)); |
| 3519 | 3484 |
| 3520 // Verify that the buffered ranges are updated properly and we don't crash. | 3485 // Verify that the buffered ranges are updated properly and we don't crash. |
| 3521 CheckExpectedRangesByTimestamp("{ [0,90) }"); | 3486 CheckExpectedRangesByTimestamp("{ [0,90) }"); |
| 3522 } | 3487 } |
| 3523 | 3488 |
| 3524 TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS) { | 3489 TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS) { |
| 3525 // Append 1 buffer at positions 0 through 8. | 3490 // Append 1 buffer at positions 0 through 8. |
| 3526 NewSegmentAppend(0, 9); | 3491 NewCodedFrameGroupAppend(0, 9); |
| 3527 | 3492 |
| 3528 // Check expected ranges. | 3493 // Check expected ranges. |
| 3529 CheckExpectedRanges("{ [0,8) }"); | 3494 CheckExpectedRanges("{ [0,8) }"); |
| 3530 | 3495 |
| 3531 // Seek to 5. | 3496 // Seek to 5. |
| 3532 Seek(5); | 3497 Seek(5); |
| 3533 | 3498 |
| 3534 // Set duration to be before the seeked to position. | 3499 // Set duration to be before the seeked to position. |
| 3535 // This will result in truncation of the selected range and a reset | 3500 // This will result in truncation of the selected range and a reset |
| 3536 // of NextBufferPosition. | 3501 // of NextBufferPosition. |
| 3537 stream_->OnSetDuration(frame_duration() * 4); | 3502 stream_->OnSetDuration(frame_duration() * 4); |
| 3538 | 3503 |
| 3539 // Check the expected ranges. | 3504 // Check the expected ranges. |
| 3540 CheckExpectedRanges("{ [0,3) }"); | 3505 CheckExpectedRanges("{ [0,3) }"); |
| 3541 | 3506 |
| 3542 // Mark EOS reached. | 3507 // Mark EOS reached. |
| 3543 stream_->MarkEndOfStream(); | 3508 stream_->MarkEndOfStream(); |
| 3544 | 3509 |
| 3545 // Expect EOS to be reached. | 3510 // Expect EOS to be reached. |
| 3546 CheckEOSReached(); | 3511 CheckEOSReached(); |
| 3547 } | 3512 } |
| 3548 | 3513 |
| 3549 TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS_IsSeekPending) { | 3514 TEST_F(SourceBufferStreamTest, SetExplicitDuration_MarkEOS_IsSeekPending) { |
| 3550 // Append 1 buffer at positions 0 through 8. | 3515 // Append 1 buffer at positions 0 through 8. |
| 3551 NewSegmentAppend(0, 9); | 3516 NewCodedFrameGroupAppend(0, 9); |
| 3552 | 3517 |
| 3553 // Check expected ranges. | 3518 // Check expected ranges. |
| 3554 CheckExpectedRanges("{ [0,8) }"); | 3519 CheckExpectedRanges("{ [0,8) }"); |
| 3555 | 3520 |
| 3556 // Seek to 9 which will result in a pending seek. | 3521 // Seek to 9 which will result in a pending seek. |
| 3557 Seek(9); | 3522 Seek(9); |
| 3558 | 3523 |
| 3559 // Set duration to be before the seeked to position. | 3524 // Set duration to be before the seeked to position. |
| 3560 // This will result in truncation of the selected range and a reset | 3525 // This will result in truncation of the selected range and a reset |
| 3561 // of NextBufferPosition. | 3526 // of NextBufferPosition. |
| 3562 stream_->OnSetDuration(frame_duration() * 4); | 3527 stream_->OnSetDuration(frame_duration() * 4); |
| 3563 | 3528 |
| 3564 // Check the expected ranges. | 3529 // Check the expected ranges. |
| 3565 CheckExpectedRanges("{ [0,3) }"); | 3530 CheckExpectedRanges("{ [0,3) }"); |
| 3566 | 3531 |
| 3567 EXPECT_TRUE(stream_->IsSeekPending()); | 3532 EXPECT_TRUE(stream_->IsSeekPending()); |
| 3568 // Mark EOS reached. | 3533 // Mark EOS reached. |
| 3569 stream_->MarkEndOfStream(); | 3534 stream_->MarkEndOfStream(); |
| 3570 EXPECT_FALSE(stream_->IsSeekPending()); | 3535 EXPECT_FALSE(stream_->IsSeekPending()); |
| 3571 } | 3536 } |
| 3572 | 3537 |
| 3573 // Test the case were the current playback position is at the end of the | 3538 // Test the case were the current playback position is at the end of the |
| 3574 // buffered data and several overlaps occur that causes the selected | 3539 // buffered data and several overlaps occur that causes the selected |
| 3575 // range to get split and then merged back into a single range. | 3540 // range to get split and then merged back into a single range. |
| 3576 TEST_F(SourceBufferStreamTest, OverlapSplitAndMergeWhileWaitingForMoreData) { | 3541 TEST_F(SourceBufferStreamTest, OverlapSplitAndMergeWhileWaitingForMoreData) { |
| 3577 // Seek to start of stream. | 3542 // Seek to start of stream. |
| 3578 SeekToTimestampMs(0); | 3543 SeekToTimestampMs(0); |
| 3579 | 3544 |
| 3580 NewSegmentAppend("0K 30 60 90 120K 150"); | 3545 NewCodedFrameGroupAppend("0K 30 60 90 120K 150"); |
| 3581 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 3546 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 3582 | 3547 |
| 3583 // Read all the buffered data. | 3548 // Read all the buffered data. |
| 3584 CheckExpectedBuffers("0K 30 60 90 120K 150"); | 3549 CheckExpectedBuffers("0K 30 60 90 120K 150"); |
| 3585 CheckNoNextBuffer(); | 3550 CheckNoNextBuffer(); |
| 3586 | 3551 |
| 3587 // Append data over the current GOP so that a keyframe is needed before | 3552 // Append data over the current GOP so that a keyframe is needed before |
| 3588 // playback can continue from the current position. | 3553 // playback can continue from the current position. |
| 3589 NewSegmentAppend("120K 150"); | 3554 NewCodedFrameGroupAppend("120K 150"); |
| 3590 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 3555 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 3591 | 3556 |
| 3592 // Append buffers that cause the range to get split. | 3557 // Append buffers that cause the range to get split. |
| 3593 NewSegmentAppend("0K 30"); | 3558 NewCodedFrameGroupAppend("0K 30"); |
| 3594 CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }"); | 3559 CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }"); |
| 3595 | 3560 |
| 3596 // Append buffers that cause the ranges to get merged. | 3561 // Append buffers that cause the ranges to get merged. |
| 3597 AppendBuffers("60 90"); | 3562 AppendBuffers("60 90"); |
| 3598 | 3563 |
| 3599 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 3564 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 3600 | 3565 |
| 3601 // Verify that we still don't have a next buffer. | 3566 // Verify that we still don't have a next buffer. |
| 3602 CheckNoNextBuffer(); | 3567 CheckNoNextBuffer(); |
| 3603 | 3568 |
| 3604 // Add more data to the end and verify that this new data is read correctly. | 3569 // Add more data to the end and verify that this new data is read correctly. |
| 3605 NewSegmentAppend("180K 210"); | 3570 NewCodedFrameGroupAppend("180K 210"); |
| 3606 CheckExpectedRangesByTimestamp("{ [0,240) }"); | 3571 CheckExpectedRangesByTimestamp("{ [0,240) }"); |
| 3607 CheckExpectedBuffers("180K 210"); | 3572 CheckExpectedBuffers("180K 210"); |
| 3608 } | 3573 } |
| 3609 | 3574 |
| 3610 // Verify that non-keyframes with the same timestamp in the same | 3575 // Verify that non-keyframes with the same timestamp in the same |
| 3611 // append are handled correctly. | 3576 // append are handled correctly. |
| 3612 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend) { | 3577 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend) { |
| 3613 Seek(0); | 3578 Seek(0); |
| 3614 NewSegmentAppend("0K 30 30 60 90 120K 150"); | 3579 NewCodedFrameGroupAppend("0K 30 30 60 90 120K 150"); |
| 3615 CheckExpectedBuffers("0K 30 30 60 90 120K 150"); | 3580 CheckExpectedBuffers("0K 30 30 60 90 120K 150"); |
| 3616 } | 3581 } |
| 3617 | 3582 |
| 3618 // Verify that non-keyframes with the same timestamp can occur | 3583 // Verify that non-keyframes with the same timestamp can occur |
| 3619 // in different appends. | 3584 // in different appends. |
| 3620 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) { | 3585 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) { |
| 3621 Seek(0); | 3586 Seek(0); |
| 3622 NewSegmentAppend("0K 30"); | 3587 NewCodedFrameGroupAppend("0K 30"); |
| 3623 AppendBuffers("30 60 90 120K 150"); | 3588 AppendBuffers("30 60 90 120K 150"); |
| 3624 CheckExpectedBuffers("0K 30 30 60 90 120K 150"); | 3589 CheckExpectedBuffers("0K 30 30 60 90 120K 150"); |
| 3625 } | 3590 } |
| 3626 | 3591 |
| 3627 // Verify that a non-keyframe followed by a keyframe with the same timestamp | 3592 // Verify that a non-keyframe followed by a keyframe with the same timestamp |
| 3628 // is not allowed. | 3593 // is allowed, but also results in a MediaLog. |
| 3629 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) { | 3594 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend_Warning) { |
| 3630 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); | 3595 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); |
| 3631 | 3596 |
| 3632 Seek(0); | 3597 Seek(0); |
| 3633 NewSegmentAppend("0K 30"); | 3598 NewCodedFrameGroupAppend("0K 30 30K 60"); |
| 3634 AppendBuffers_ExpectFailure("30K 60"); | 3599 CheckExpectedBuffers("0K 30 30K 60"); |
| 3635 } | 3600 } |
| 3636 | 3601 |
| 3637 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_2) { | 3602 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends_Warning) { |
| 3638 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); | 3603 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); |
| 3639 | 3604 |
| 3640 Seek(0); | 3605 Seek(0); |
| 3641 NewSegmentAppend_ExpectFailure("0K 30 30K 60"); | 3606 NewCodedFrameGroupAppend("0K 30"); |
| 3607 AppendBuffers("30K 60"); | |
| 3608 CheckExpectedBuffers("0K 30 30K 60"); | |
| 3642 } | 3609 } |
| 3643 | 3610 |
| 3644 // Verify that a keyframe followed by a non-keyframe with the same timestamp | 3611 // Verify that a keyframe followed by a non-keyframe with the same timestamp |
| 3645 // is allowed. | 3612 // is allowed. |
| 3646 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) { | 3613 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) { |
| 3647 Seek(0); | 3614 Seek(0); |
| 3648 NewSegmentAppend("0K 30K"); | 3615 NewCodedFrameGroupAppend("0K 30K"); |
| 3649 AppendBuffers("30 60"); | 3616 AppendBuffers("30 60"); |
| 3650 CheckExpectedBuffers("0K 30K 30 60"); | 3617 CheckExpectedBuffers("0K 30K 30 60"); |
| 3651 } | 3618 } |
| 3652 | 3619 |
| 3653 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_SingleAppend) { | 3620 TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_SingleAppend) { |
| 3654 Seek(0); | 3621 Seek(0); |
| 3655 NewSegmentAppend("0K 30K 30 60"); | 3622 NewCodedFrameGroupAppend("0K 30K 30 60"); |
| 3656 CheckExpectedBuffers("0K 30K 30 60"); | 3623 CheckExpectedBuffers("0K 30K 30 60"); |
| 3657 } | 3624 } |
| 3658 | 3625 |
| 3659 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_1) { | 3626 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_1) { |
| 3660 Seek(0); | 3627 Seek(0); |
| 3661 NewSegmentAppend("0K 30 60 60 90 120K 150"); | 3628 NewCodedFrameGroupAppend("0K 30 60 60 90 120K 150"); |
| 3662 | 3629 |
| 3663 NewSegmentAppend("60K 91 121K 151"); | 3630 NewCodedFrameGroupAppend("60K 91 121K 151"); |
| 3664 CheckExpectedBuffers("0K 30 60K 91 121K 151"); | 3631 CheckExpectedBuffers("0K 30 60K 91 121K 151"); |
| 3665 } | 3632 } |
| 3666 | 3633 |
| 3667 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_2) { | 3634 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_2) { |
| 3668 Seek(0); | 3635 Seek(0); |
| 3669 NewSegmentAppend("0K 30 60 60 90 120K 150"); | 3636 NewCodedFrameGroupAppend("0K 30 60 60 90 120K 150"); |
| 3670 NewSegmentAppend("0K 30 61"); | 3637 NewCodedFrameGroupAppend("0K 30 61"); |
| 3671 CheckExpectedBuffers("0K 30 61 120K 150"); | 3638 CheckExpectedBuffers("0K 30 61 120K 150"); |
| 3672 } | 3639 } |
| 3673 | 3640 |
| 3674 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_3) { | 3641 TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_3) { |
| 3675 Seek(0); | 3642 Seek(0); |
| 3676 NewSegmentAppend("0K 20 40 60 80 100K 101 102 103K"); | 3643 NewCodedFrameGroupAppend("0K 20 40 60 80 100K 101 102 103K"); |
| 3677 NewSegmentAppend("0K 20 40 60 80 90"); | 3644 NewCodedFrameGroupAppend("0K 20 40 60 80 90"); |
| 3678 CheckExpectedBuffers("0K 20 40 60 80 90 100K 101 102 103K"); | 3645 CheckExpectedBuffers("0K 20 40 60 80 90 100K 101 102 103K"); |
| 3679 AppendBuffers("90 110K 150"); | 3646 AppendBuffers("90 110K 150"); |
| 3680 Seek(0); | 3647 Seek(0); |
| 3681 CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150"); | 3648 CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150"); |
| 3682 CheckNoNextBuffer(); | 3649 CheckNoNextBuffer(); |
| 3683 CheckExpectedRangesByTimestamp("{ [0,190) }"); | 3650 CheckExpectedRangesByTimestamp("{ [0,190) }"); |
| 3684 } | 3651 } |
| 3685 | 3652 |
| 3686 // Test all the valid same timestamp cases for audio. | 3653 // Test all the valid same timestamp cases for audio. |
| 3687 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) { | 3654 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) { |
| 3688 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, | 3655 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, |
| 3689 44100, EmptyExtraData(), false); | 3656 44100, EmptyExtraData(), false); |
| 3690 stream_.reset(new SourceBufferStream(config, media_log_, true)); | 3657 stream_.reset(new SourceBufferStream(config, media_log_, true)); |
| 3691 Seek(0); | 3658 Seek(0); |
| 3692 NewSegmentAppend("0K 0K 30K 30 60 60"); | 3659 NewCodedFrameGroupAppend("0K 0K 30K 30 60 60"); |
| 3693 CheckExpectedBuffers("0K 0K 30K 30 60 60"); | 3660 CheckExpectedBuffers("0K 0K 30K 30 60 60"); |
| 3694 } | 3661 } |
| 3695 | 3662 |
| 3696 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_Invalid_1) { | 3663 TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_SingleAppend_Warning) { |
| 3697 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); | 3664 EXPECT_MEDIA_LOG(ContainsSameTimestampAt30MillisecondsLog()); |
| 3698 | 3665 |
| 3699 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, | 3666 AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO, |
| 3700 44100, EmptyExtraData(), false); | 3667 44100, EmptyExtraData(), false); |
| 3701 stream_.reset(new SourceBufferStream(config, media_log_, true)); | 3668 stream_.reset(new SourceBufferStream(config, media_log_, true)); |
| 3702 Seek(0); | 3669 Seek(0); |
| 3703 NewSegmentAppend_ExpectFailure("0K 30 30K 60"); | 3670 |
| 3671 // Note, in reality, a non-keyframe audio frame is rare or perhaps not | |
| 3672 // possible. | |
| 3673 NewCodedFrameGroupAppend("0K 30 30K 60"); | |
| 3674 CheckExpectedBuffers("0K 30 30K 60"); | |
| 3704 } | 3675 } |
| 3705 | 3676 |
| 3706 // If seeking past any existing range and the seek is pending | 3677 // If seeking past any existing range and the seek is pending |
| 3707 // because no data has been provided for that position, | 3678 // because no data has been provided for that position, |
| 3708 // the stream position can be considered as the end of stream. | 3679 // the stream position can be considered as the end of stream. |
| 3709 TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) { | 3680 TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) { |
| 3710 // Append 15 buffers at positions 0 through 14. | 3681 // Append 15 buffers at positions 0 through 14. |
| 3711 NewSegmentAppend(0, 15); | 3682 NewCodedFrameGroupAppend(0, 15); |
| 3712 | 3683 |
| 3713 Seek(20); | 3684 Seek(20); |
| 3714 EXPECT_TRUE(stream_->IsSeekPending()); | 3685 EXPECT_TRUE(stream_->IsSeekPending()); |
| 3715 stream_->MarkEndOfStream(); | 3686 stream_->MarkEndOfStream(); |
| 3716 EXPECT_FALSE(stream_->IsSeekPending()); | 3687 EXPECT_FALSE(stream_->IsSeekPending()); |
| 3717 } | 3688 } |
| 3718 | 3689 |
| 3719 // If there is a pending seek between 2 existing ranges, | 3690 // If there is a pending seek between 2 existing ranges, |
| 3720 // the end of the stream has not been reached. | 3691 // the end of the stream has not been reached. |
| 3721 TEST_F(SourceBufferStreamTest, EndNotSelected_During_PendingSeek) { | 3692 TEST_F(SourceBufferStreamTest, EndNotSelected_During_PendingSeek) { |
| 3722 // Append: | 3693 // Append: |
| 3723 // - 10 buffers at positions 0 through 9. | 3694 // - 10 buffers at positions 0 through 9. |
| 3724 // - 10 buffers at positions 30 through 39 | 3695 // - 10 buffers at positions 30 through 39 |
| 3725 NewSegmentAppend(0, 10); | 3696 NewCodedFrameGroupAppend(0, 10); |
| 3726 NewSegmentAppend(30, 10); | 3697 NewCodedFrameGroupAppend(30, 10); |
| 3727 | 3698 |
| 3728 Seek(20); | 3699 Seek(20); |
| 3729 EXPECT_TRUE(stream_->IsSeekPending()); | 3700 EXPECT_TRUE(stream_->IsSeekPending()); |
| 3730 stream_->MarkEndOfStream(); | 3701 stream_->MarkEndOfStream(); |
| 3731 EXPECT_TRUE(stream_->IsSeekPending()); | 3702 EXPECT_TRUE(stream_->IsSeekPending()); |
| 3732 } | 3703 } |
| 3733 | 3704 |
| 3734 | 3705 |
| 3735 // Removing exact start & end of a range. | 3706 // Removing exact start & end of a range. |
| 3736 TEST_F(SourceBufferStreamTest, Remove_WholeRange1) { | 3707 TEST_F(SourceBufferStreamTest, Remove_WholeRange1) { |
| 3737 Seek(0); | 3708 Seek(0); |
| 3738 NewSegmentAppend("10K 40 70K 100 130K"); | 3709 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3739 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 3710 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 3740 RemoveInMs(10, 160, 160); | 3711 RemoveInMs(10, 160, 160); |
| 3741 CheckExpectedRangesByTimestamp("{ }"); | 3712 CheckExpectedRangesByTimestamp("{ }"); |
| 3742 } | 3713 } |
| 3743 | 3714 |
| 3744 // Removal range starts before range and ends exactly at end. | 3715 // Removal range starts before range and ends exactly at end. |
| 3745 TEST_F(SourceBufferStreamTest, Remove_WholeRange2) { | 3716 TEST_F(SourceBufferStreamTest, Remove_WholeRange2) { |
| 3746 Seek(0); | 3717 Seek(0); |
| 3747 NewSegmentAppend("10K 40 70K 100 130K"); | 3718 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3748 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 3719 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 3749 RemoveInMs(0, 160, 160); | 3720 RemoveInMs(0, 160, 160); |
| 3750 CheckExpectedRangesByTimestamp("{ }"); | 3721 CheckExpectedRangesByTimestamp("{ }"); |
| 3751 } | 3722 } |
| 3752 | 3723 |
| 3753 // Removal range starts at the start of a range and ends beyond the | 3724 // Removal range starts at the start of a range and ends beyond the |
| 3754 // range end. | 3725 // range end. |
| 3755 TEST_F(SourceBufferStreamTest, Remove_WholeRange3) { | 3726 TEST_F(SourceBufferStreamTest, Remove_WholeRange3) { |
| 3756 Seek(0); | 3727 Seek(0); |
| 3757 NewSegmentAppend("10K 40 70K 100 130K"); | 3728 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3758 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 3729 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 3759 RemoveInMs(10, 200, 200); | 3730 RemoveInMs(10, 200, 200); |
| 3760 CheckExpectedRangesByTimestamp("{ }"); | 3731 CheckExpectedRangesByTimestamp("{ }"); |
| 3761 } | 3732 } |
| 3762 | 3733 |
| 3763 // Removal range starts before range start and ends after the range end. | 3734 // Removal range starts before range start and ends after the range end. |
| 3764 TEST_F(SourceBufferStreamTest, Remove_WholeRange4) { | 3735 TEST_F(SourceBufferStreamTest, Remove_WholeRange4) { |
| 3765 Seek(0); | 3736 Seek(0); |
| 3766 NewSegmentAppend("10K 40 70K 100 130K"); | 3737 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3767 CheckExpectedRangesByTimestamp("{ [10,160) }"); | 3738 CheckExpectedRangesByTimestamp("{ [10,160) }"); |
| 3768 RemoveInMs(0, 200, 200); | 3739 RemoveInMs(0, 200, 200); |
| 3769 CheckExpectedRangesByTimestamp("{ }"); | 3740 CheckExpectedRangesByTimestamp("{ }"); |
| 3770 } | 3741 } |
| 3771 | 3742 |
| 3772 // Removes multiple ranges. | 3743 // Removes multiple ranges. |
| 3773 TEST_F(SourceBufferStreamTest, Remove_WholeRange5) { | 3744 TEST_F(SourceBufferStreamTest, Remove_WholeRange5) { |
| 3774 Seek(0); | 3745 Seek(0); |
| 3775 NewSegmentAppend("10K 40 70K 100 130K"); | 3746 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3776 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3747 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3777 NewSegmentAppend("2000K 2030 2060K 2090 2120K"); | 3748 NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K"); |
| 3778 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); | 3749 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); |
| 3779 RemoveInMs(10, 3000, 3000); | 3750 RemoveInMs(10, 3000, 3000); |
| 3780 CheckExpectedRangesByTimestamp("{ }"); | 3751 CheckExpectedRangesByTimestamp("{ }"); |
| 3781 } | 3752 } |
| 3782 | 3753 |
| 3783 // Verifies a [0-infinity) range removes everything. | 3754 // Verifies a [0-infinity) range removes everything. |
| 3784 TEST_F(SourceBufferStreamTest, Remove_ZeroToInfinity) { | 3755 TEST_F(SourceBufferStreamTest, Remove_ZeroToInfinity) { |
| 3785 Seek(0); | 3756 Seek(0); |
| 3786 NewSegmentAppend("10K 40 70K 100 130K"); | 3757 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3787 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3758 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3788 NewSegmentAppend("2000K 2030 2060K 2090 2120K"); | 3759 NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K"); |
| 3789 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); | 3760 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); |
| 3790 Remove(base::TimeDelta(), kInfiniteDuration(), kInfiniteDuration()); | 3761 Remove(base::TimeDelta(), kInfiniteDuration(), kInfiniteDuration()); |
| 3791 CheckExpectedRangesByTimestamp("{ }"); | 3762 CheckExpectedRangesByTimestamp("{ }"); |
| 3792 } | 3763 } |
| 3793 | 3764 |
| 3794 // Removal range starts at the beginning of the range and ends in the | 3765 // Removal range starts at the beginning of the range and ends in the |
| 3795 // middle of the range. This test verifies that full GOPs are removed. | 3766 // middle of the range. This test verifies that full GOPs are removed. |
| 3796 TEST_F(SourceBufferStreamTest, Remove_Partial1) { | 3767 TEST_F(SourceBufferStreamTest, Remove_Partial1) { |
| 3797 Seek(0); | 3768 Seek(0); |
| 3798 NewSegmentAppend("10K 40 70K 100 130K"); | 3769 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3799 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3770 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3800 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); | 3771 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); |
| 3801 RemoveInMs(0, 80, 2200); | 3772 RemoveInMs(0, 80, 2200); |
| 3802 CheckExpectedRangesByTimestamp("{ [130,160) [1000,1150) }"); | 3773 CheckExpectedRangesByTimestamp("{ [130,160) [1000,1150) }"); |
| 3803 } | 3774 } |
| 3804 | 3775 |
| 3805 // Removal range starts in the middle of a range and ends at the exact | 3776 // Removal range starts in the middle of a range and ends at the exact |
| 3806 // end of the range. | 3777 // end of the range. |
| 3807 TEST_F(SourceBufferStreamTest, Remove_Partial2) { | 3778 TEST_F(SourceBufferStreamTest, Remove_Partial2) { |
| 3808 Seek(0); | 3779 Seek(0); |
| 3809 NewSegmentAppend("10K 40 70K 100 130K"); | 3780 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3810 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3781 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3811 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); | 3782 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); |
| 3812 RemoveInMs(40, 160, 2200); | 3783 RemoveInMs(40, 160, 2200); |
| 3813 CheckExpectedRangesByTimestamp("{ [10,40) [1000,1150) }"); | 3784 CheckExpectedRangesByTimestamp("{ [10,40) [1000,1150) }"); |
| 3814 } | 3785 } |
| 3815 | 3786 |
| 3816 // Removal range starts and ends within a range. | 3787 // Removal range starts and ends within a range. |
| 3817 TEST_F(SourceBufferStreamTest, Remove_Partial3) { | 3788 TEST_F(SourceBufferStreamTest, Remove_Partial3) { |
| 3818 Seek(0); | 3789 Seek(0); |
| 3819 NewSegmentAppend("10K 40 70K 100 130K"); | 3790 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3820 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3791 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3821 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); | 3792 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }"); |
| 3822 RemoveInMs(40, 120, 2200); | 3793 RemoveInMs(40, 120, 2200); |
| 3823 CheckExpectedRangesByTimestamp("{ [10,40) [130,160) [1000,1150) }"); | 3794 CheckExpectedRangesByTimestamp("{ [10,40) [130,160) [1000,1150) }"); |
| 3824 } | 3795 } |
| 3825 | 3796 |
| 3826 // Removal range starts in the middle of one range and ends in the | 3797 // Removal range starts in the middle of one range and ends in the |
| 3827 // middle of another range. | 3798 // middle of another range. |
| 3828 TEST_F(SourceBufferStreamTest, Remove_Partial4) { | 3799 TEST_F(SourceBufferStreamTest, Remove_Partial4) { |
| 3829 Seek(0); | 3800 Seek(0); |
| 3830 NewSegmentAppend("10K 40 70K 100 130K"); | 3801 NewCodedFrameGroupAppend("10K 40 70K 100 130K"); |
| 3831 NewSegmentAppend("1000K 1030 1060K 1090 1120K"); | 3802 NewCodedFrameGroupAppend("1000K 1030 1060K 1090 1120K"); |
| 3832 NewSegmentAppend("2000K 2030 2060K 2090 2120K"); | 3803 NewCodedFrameGroupAppend("2000K 2030 2060K 2090 2120K"); |
| 3833 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); | 3804 CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }"); |
| 3834 RemoveInMs(40, 2030, 2200); | 3805 RemoveInMs(40, 2030, 2200); |
| 3835 CheckExpectedRangesByTimestamp("{ [10,40) [2060,2150) }"); | 3806 CheckExpectedRangesByTimestamp("{ [10,40) [2060,2150) }"); |
| 3836 } | 3807 } |
| 3837 | 3808 |
| 3838 // Test behavior when the current position is removed and new buffers | 3809 // Test behavior when the current position is removed and new buffers |
| 3839 // are appended over the removal range. | 3810 // are appended over the removal range. |
| 3840 TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) { | 3811 TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) { |
| 3841 Seek(0); | 3812 Seek(0); |
| 3842 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); | 3813 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); |
| 3843 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 3814 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 3844 CheckExpectedBuffers("0K 30 60 90K 120"); | 3815 CheckExpectedBuffers("0K 30 60 90K 120"); |
| 3845 | 3816 |
| 3846 // Remove a range that includes the next buffer (i.e., 150). | 3817 // Remove a range that includes the next buffer (i.e., 150). |
| 3847 RemoveInMs(150, 210, 360); | 3818 RemoveInMs(150, 210, 360); |
| 3848 CheckExpectedRangesByTimestamp("{ [0,150) [270,360) }"); | 3819 CheckExpectedRangesByTimestamp("{ [0,150) [270,360) }"); |
| 3849 | 3820 |
| 3850 // Verify that no next buffer is returned. | 3821 // Verify that no next buffer is returned. |
| 3851 CheckNoNextBuffer(); | 3822 CheckNoNextBuffer(); |
| 3852 | 3823 |
| 3853 // Append some buffers to fill the gap that was created. | 3824 // Append some buffers to fill the gap that was created. |
| 3854 NewSegmentAppend("120K 150 180 210K 240"); | 3825 NewCodedFrameGroupAppend("120K 150 180 210K 240"); |
| 3855 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 3826 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 3856 | 3827 |
| 3857 // Verify that buffers resume at the next keyframe after the | 3828 // Verify that buffers resume at the next keyframe after the |
| 3858 // current position. | 3829 // current position. |
| 3859 CheckExpectedBuffers("210K 240 270K 300 330"); | 3830 CheckExpectedBuffers("210K 240 270K 300 330"); |
| 3860 } | 3831 } |
| 3861 | 3832 |
| 3862 // Test behavior when buffers in the selected range before the current position | 3833 // Test behavior when buffers in the selected range before the current position |
| 3863 // are removed. | 3834 // are removed. |
| 3864 TEST_F(SourceBufferStreamTest, Remove_BeforeCurrentPosition) { | 3835 TEST_F(SourceBufferStreamTest, Remove_BeforeCurrentPosition) { |
| 3865 Seek(0); | 3836 Seek(0); |
| 3866 NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); | 3837 NewCodedFrameGroupAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330"); |
| 3867 CheckExpectedRangesByTimestamp("{ [0,360) }"); | 3838 CheckExpectedRangesByTimestamp("{ [0,360) }"); |
| 3868 CheckExpectedBuffers("0K 30 60 90K 120"); | 3839 CheckExpectedBuffers("0K 30 60 90K 120"); |
| 3869 | 3840 |
| 3870 // Remove a range that is before the current playback position. | 3841 // Remove a range that is before the current playback position. |
| 3871 RemoveInMs(0, 90, 360); | 3842 RemoveInMs(0, 90, 360); |
| 3872 CheckExpectedRangesByTimestamp("{ [90,360) }"); | 3843 CheckExpectedRangesByTimestamp("{ [90,360) }"); |
| 3873 | 3844 |
| 3874 CheckExpectedBuffers("150 180K 210 240 270K 300 330"); | 3845 CheckExpectedBuffers("150 180K 210 240 270K 300 330"); |
| 3875 } | 3846 } |
| 3876 | 3847 |
| 3877 // Test removing the entire range for the current media segment | 3848 // Test removing the entire range for the current coded frame group |
| 3878 // being appended. | 3849 // being appended. |
| 3879 TEST_F(SourceBufferStreamTest, Remove_MidSegment) { | 3850 TEST_F(SourceBufferStreamTest, Remove_MidGroup) { |
| 3880 Seek(0); | 3851 Seek(0); |
| 3881 NewSegmentAppend("0K 30 60 90 120K 150 180 210"); | 3852 NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180 210"); |
| 3882 CheckExpectedRangesByTimestamp("{ [0,240) }"); | 3853 CheckExpectedRangesByTimestamp("{ [0,240) }"); |
| 3883 | 3854 |
| 3884 NewSegmentAppend("0K 30"); | 3855 NewCodedFrameGroupAppend("0K 30"); |
| 3885 | 3856 |
| 3886 CheckExpectedBuffers("0K"); | 3857 CheckExpectedBuffers("0K"); |
| 3887 | 3858 |
| 3888 CheckExpectedRangesByTimestamp("{ [0,60) [120,240) }"); | 3859 CheckExpectedRangesByTimestamp("{ [0,60) [120,240) }"); |
| 3889 | 3860 |
| 3890 // Remove the entire range that is being appended to. | 3861 // Remove the entire range that is being appended to. |
| 3891 RemoveInMs(0, 60, 240); | 3862 RemoveInMs(0, 60, 240); |
| 3892 | 3863 |
| 3893 // Verify that there is no next buffer since it was removed. | 3864 // Verify that there is no next buffer since it was removed. |
| 3894 CheckNoNextBuffer(); | 3865 CheckNoNextBuffer(); |
| 3895 | 3866 |
| 3896 CheckExpectedRangesByTimestamp("{ [120,240) }"); | 3867 CheckExpectedRangesByTimestamp("{ [120,240) }"); |
| 3897 | 3868 |
| 3898 // Continue appending frames for the current GOP. | 3869 // Continue appending frames for the current GOP. |
| 3899 AppendBuffers("60 90"); | 3870 AppendBuffers("60 90"); |
| 3900 | 3871 |
| 3901 // Verify that the non-keyframes are not added. | 3872 // Verify that the non-keyframes are not added. |
| 3902 CheckExpectedRangesByTimestamp("{ [120,240) }"); | 3873 CheckExpectedRangesByTimestamp("{ [120,240) }"); |
| 3903 | 3874 |
| 3904 // Finish the previous GOP and start the next one. | 3875 // Finish the previous GOP and start the next one. |
| 3905 AppendBuffers("120 150K 180"); | 3876 AppendBuffers("120 150K 180"); |
| 3906 | 3877 |
| 3907 // Verify that new GOP replaces the existing range. | 3878 // Verify that new GOP replaces the existing range. |
| 3908 CheckExpectedRangesByTimestamp("{ [150,210) }"); | 3879 CheckExpectedRangesByTimestamp("{ [150,210) }"); |
| 3909 | 3880 |
| 3910 | |
| 3911 SeekToTimestampMs(150); | 3881 SeekToTimestampMs(150); |
| 3912 CheckExpectedBuffers("150K 180"); | 3882 CheckExpectedBuffers("150K 180"); |
| 3913 CheckNoNextBuffer(); | 3883 CheckNoNextBuffer(); |
| 3914 } | 3884 } |
| 3915 | 3885 |
| 3916 // Test removing the current GOP being appended, while not removing | 3886 // Test removing the current GOP being appended, while not removing |
| 3917 // the entire range the GOP belongs to. | 3887 // the entire range the GOP belongs to. |
| 3918 TEST_F(SourceBufferStreamTest, Remove_GOPBeingAppended) { | 3888 TEST_F(SourceBufferStreamTest, Remove_GOPBeingAppended) { |
| 3919 Seek(0); | 3889 Seek(0); |
| 3920 NewSegmentAppend("0K 30 60 90 120K 150 180"); | 3890 NewCodedFrameGroupAppend("0K 30 60 90 120K 150 180"); |
| 3921 CheckExpectedRangesByTimestamp("{ [0,210) }"); | 3891 CheckExpectedRangesByTimestamp("{ [0,210) }"); |
| 3922 | 3892 |
| 3923 // Remove the current GOP being appended. | 3893 // Remove the current GOP being appended. |
| 3924 RemoveInMs(120, 150, 240); | 3894 RemoveInMs(120, 150, 240); |
| 3925 CheckExpectedRangesByTimestamp("{ [0,120) }"); | 3895 CheckExpectedRangesByTimestamp("{ [0,120) }"); |
| 3926 | 3896 |
| 3927 // Continue appending the current GOP and the next one. | 3897 // Continue appending the current GOP and the next one. |
| 3928 AppendBuffers("210 240K 270 300"); | 3898 AppendBuffers("210 240K 270 300"); |
| 3929 | 3899 |
| 3930 // Verify that the non-keyframe in the previous GOP does | 3900 // Verify that the non-keyframe in the previous GOP does |
| 3931 // not effect any existing ranges and a new range is started at the | 3901 // not effect any existing ranges and a new range is started at the |
| 3932 // beginning of the next GOP. | 3902 // beginning of the next GOP. |
| 3933 CheckExpectedRangesByTimestamp("{ [0,120) [240,330) }"); | 3903 CheckExpectedRangesByTimestamp("{ [0,120) [240,330) }"); |
| 3934 | 3904 |
| 3935 // Verify the buffers in the ranges. | 3905 // Verify the buffers in the ranges. |
| 3936 CheckExpectedBuffers("0K 30 60 90"); | 3906 CheckExpectedBuffers("0K 30 60 90"); |
| 3937 CheckNoNextBuffer(); | 3907 CheckNoNextBuffer(); |
| 3938 SeekToTimestampMs(240); | 3908 SeekToTimestampMs(240); |
| 3939 CheckExpectedBuffers("240K 270 300"); | 3909 CheckExpectedBuffers("240K 270 300"); |
| 3940 } | 3910 } |
| 3941 | 3911 |
| 3942 TEST_F(SourceBufferStreamTest, Remove_WholeGOPBeingAppended) { | 3912 TEST_F(SourceBufferStreamTest, Remove_WholeGOPBeingAppended) { |
| 3943 SeekToTimestampMs(1000); | 3913 SeekToTimestampMs(1000); |
| 3944 NewSegmentAppend("1000K 1030 1060 1090"); | 3914 NewCodedFrameGroupAppend("1000K 1030 1060 1090"); |
| 3945 CheckExpectedRangesByTimestamp("{ [1000,1120) }"); | 3915 CheckExpectedRangesByTimestamp("{ [1000,1120) }"); |
| 3946 | 3916 |
| 3947 // Remove the keyframe of the current GOP being appended. | 3917 // Remove the keyframe of the current GOP being appended. |
| 3948 RemoveInMs(1000, 1030, 1120); | 3918 RemoveInMs(1000, 1030, 1120); |
| 3949 CheckExpectedRangesByTimestamp("{ }"); | 3919 CheckExpectedRangesByTimestamp("{ }"); |
| 3950 | 3920 |
| 3951 // Continue appending the current GOP. | 3921 // Continue appending the current GOP. |
| 3952 AppendBuffers("1210 1240"); | 3922 AppendBuffers("1210 1240"); |
| 3953 | 3923 |
| 3954 CheckExpectedRangesByTimestamp("{ }"); | 3924 CheckExpectedRangesByTimestamp("{ }"); |
| 3955 | 3925 |
| 3956 // Append the beginning of the next GOP. | 3926 // Append the beginning of the next GOP. |
| 3957 AppendBuffers("1270K 1300"); | 3927 AppendBuffers("1270K 1300"); |
| 3958 | 3928 |
| 3959 // Verify that the new range is started at the | 3929 // Verify that the new range is started at the |
| 3960 // beginning of the next GOP. | 3930 // beginning of the next GOP. |
| 3961 CheckExpectedRangesByTimestamp("{ [1270,1330) }"); | 3931 CheckExpectedRangesByTimestamp("{ [1270,1330) }"); |
| 3962 | 3932 |
| 3963 // Verify the buffers in the ranges. | 3933 // Verify the buffers in the ranges. |
| 3964 CheckNoNextBuffer(); | 3934 CheckNoNextBuffer(); |
| 3965 SeekToTimestampMs(1270); | 3935 SeekToTimestampMs(1270); |
| 3966 CheckExpectedBuffers("1270K 1300"); | 3936 CheckExpectedBuffers("1270K 1300"); |
| 3967 } | 3937 } |
| 3968 | 3938 |
| 3969 TEST_F(SourceBufferStreamTest, | 3939 TEST_F(SourceBufferStreamTest, |
| 3970 Remove_PreviousAppendDestroyedAndOverwriteExistingRange) { | 3940 Remove_PreviousAppendDestroyedAndOverwriteExistingRange) { |
| 3971 SeekToTimestampMs(90); | 3941 SeekToTimestampMs(90); |
| 3972 | 3942 |
| 3973 NewSegmentAppend("90K 120 150"); | 3943 NewCodedFrameGroupAppend("90K 120 150"); |
| 3974 CheckExpectedRangesByTimestamp("{ [90,180) }"); | 3944 CheckExpectedRangesByTimestamp("{ [90,180) }"); |
| 3975 | 3945 |
| 3976 // Append a segment before the previously appended data. | 3946 // Append a coded frame group before the previously appended data. |
| 3977 NewSegmentAppend("0K 30 60"); | 3947 NewCodedFrameGroupAppend("0K 30 60"); |
| 3978 | 3948 |
| 3979 // Verify that the ranges get merged. | 3949 // Verify that the ranges get merged. |
| 3980 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 3950 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 3981 | 3951 |
| 3982 // Remove the data from the last append. | 3952 // Remove the data from the last append. |
| 3983 RemoveInMs(0, 90, 360); | 3953 RemoveInMs(0, 90, 360); |
| 3984 CheckExpectedRangesByTimestamp("{ [90,180) }"); | 3954 CheckExpectedRangesByTimestamp("{ [90,180) }"); |
| 3985 | 3955 |
| 3986 // Append a new segment that follows the removed segment and | 3956 // Append a new coded frame group that follows the removed group and |
| 3987 // starts at the beginning of the range left over from the | 3957 // starts at the beginning of the range left over from the |
| 3988 // remove. | 3958 // remove. |
| 3989 NewSegmentAppend("90K 121 151"); | 3959 NewCodedFrameGroupAppend("90K 121 151"); |
| 3990 CheckExpectedBuffers("90K 121 151"); | 3960 CheckExpectedBuffers("90K 121 151"); |
| 3991 } | 3961 } |
| 3992 | 3962 |
| 3993 TEST_F(SourceBufferStreamTest, Remove_GapAtBeginningOfMediaSegment) { | 3963 TEST_F(SourceBufferStreamTest, Remove_GapAtBeginningOfGroup) { |
| 3994 Seek(0); | 3964 Seek(0); |
| 3995 | 3965 |
| 3996 // Append a media segment that has a gap at the beginning of it. | 3966 // Append a coded frame group that has a gap at the beginning of it. |
| 3997 NewSegmentAppend(base::TimeDelta::FromMilliseconds(0), | 3967 NewCodedFrameGroupAppend(base::TimeDelta::FromMilliseconds(0), |
| 3998 "30K 60 90 120K 150"); | 3968 "30K 60 90 120K 150"); |
| 3999 CheckExpectedRangesByTimestamp("{ [0,180) }"); | 3969 CheckExpectedRangesByTimestamp("{ [0,180) }"); |
| 4000 | 3970 |
| 4001 // Remove the gap that doesn't contain any buffers. | 3971 // Remove the gap that doesn't contain any buffers. |
| 4002 RemoveInMs(0, 10, 180); | 3972 RemoveInMs(0, 10, 180); |
| 4003 CheckExpectedRangesByTimestamp("{ [10,180) }"); | 3973 CheckExpectedRangesByTimestamp("{ [10,180) }"); |
| 4004 | 3974 |
| 4005 // Verify we still get the first buffer still since only part of | 3975 // Verify we still get the first buffer still since only part of |
| 4006 // the gap was removed. | 3976 // the gap was removed. |
| 4007 // TODO(acolwell/wolenetz): Consider not returning a buffer at this | 3977 // TODO(acolwell/wolenetz): Consider not returning a buffer at this |
| 4008 // point since the current seek position has been explicitly | 3978 // point since the current seek position has been explicitly |
| 4009 // removed but didn't happen to remove any buffers. | 3979 // removed but didn't happen to remove any buffers. |
| 4010 // http://crbug.com/384016 | 3980 // http://crbug.com/384016 |
| 4011 CheckExpectedBuffers("30K"); | 3981 CheckExpectedBuffers("30K"); |
| 4012 | 3982 |
| 4013 // Remove a range that includes the first GOP. | 3983 // Remove a range that includes the first GOP. |
| 4014 RemoveInMs(0, 60, 180); | 3984 RemoveInMs(0, 60, 180); |
| 4015 | 3985 |
| 4016 // Verify that no buffer is returned because the current buffer | 3986 // Verify that no buffer is returned because the current buffer |
| 4017 // position has been removed. | 3987 // position has been removed. |
| 4018 CheckNoNextBuffer(); | 3988 CheckNoNextBuffer(); |
| 4019 | 3989 |
| 4020 CheckExpectedRangesByTimestamp("{ [120,180) }"); | 3990 CheckExpectedRangesByTimestamp("{ [120,180) }"); |
| 4021 } | 3991 } |
| 4022 | 3992 |
| 4023 TEST_F(SourceBufferStreamTest, Text_Append_SingleRange) { | 3993 TEST_F(SourceBufferStreamTest, Text_Append_SingleRange) { |
| 4024 SetTextStream(); | 3994 SetTextStream(); |
| 4025 NewSegmentAppend("0K 500K 1000K"); | 3995 NewCodedFrameGroupAppend("0K 500K 1000K"); |
| 4026 CheckExpectedRangesByTimestamp("{ [0,1500) }"); | 3996 CheckExpectedRangesByTimestamp("{ [0,1500) }"); |
| 4027 | 3997 |
| 4028 Seek(0); | 3998 Seek(0); |
| 4029 CheckExpectedBuffers("0K 500K 1000K"); | 3999 CheckExpectedBuffers("0K 500K 1000K"); |
| 4030 } | 4000 } |
| 4031 | 4001 |
| 4032 TEST_F(SourceBufferStreamTest, Text_Append_DisjointAfter) { | 4002 TEST_F(SourceBufferStreamTest, Text_Append_DisjointAfter) { |
| 4033 SetTextStream(); | 4003 SetTextStream(); |
| 4034 NewSegmentAppend("0K 500K 1000K"); | 4004 NewCodedFrameGroupAppend("0K 500K 1000K"); |
| 4035 CheckExpectedRangesByTimestamp("{ [0,1500) }"); | 4005 CheckExpectedRangesByTimestamp("{ [0,1500) }"); |
| 4036 NewSegmentAppend("3000K 3500K 4000K"); | 4006 NewCodedFrameGroupAppend("3000K 3500K 4000K"); |
| 4037 CheckExpectedRangesByTimestamp("{ [0,4500) }"); | 4007 CheckExpectedRangesByTimestamp("{ [0,4500) }"); |
| 4038 | 4008 |
| 4039 Seek(0); | 4009 Seek(0); |
| 4040 CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K"); | 4010 CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K"); |
| 4041 } | 4011 } |
| 4042 | 4012 |
| 4043 TEST_F(SourceBufferStreamTest, Text_Append_DisjointBefore) { | 4013 TEST_F(SourceBufferStreamTest, Text_Append_DisjointBefore) { |
| 4044 SetTextStream(); | 4014 SetTextStream(); |
| 4045 NewSegmentAppend("3000K 3500K 4000K"); | 4015 NewCodedFrameGroupAppend("3000K 3500K 4000K"); |
| 4046 CheckExpectedRangesByTimestamp("{ [3000,4500) }"); | 4016 CheckExpectedRangesByTimestamp("{ [3000,4500) }"); |
| 4047 NewSegmentAppend("0K 500K 1000K"); | 4017 NewCodedFrameGroupAppend("0K 500K 1000K"); |
| 4048 CheckExpectedRangesByTimestamp("{ [0,4500) }"); | 4018 CheckExpectedRangesByTimestamp("{ [0,4500) }"); |
| 4049 | 4019 |
| 4050 Seek(0); | 4020 Seek(0); |
| 4051 CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K"); | 4021 CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K"); |
| 4052 } | 4022 } |
| 4053 | 4023 |
| 4054 TEST_F(SourceBufferStreamTest, Text_CompleteOverlap) { | 4024 TEST_F(SourceBufferStreamTest, Text_CompleteOverlap) { |
| 4055 SetTextStream(); | 4025 SetTextStream(); |
| 4056 NewSegmentAppend("3000K 3500K 4000K"); | 4026 NewCodedFrameGroupAppend("3000K 3500K 4000K"); |
| 4057 CheckExpectedRangesByTimestamp("{ [3000,4500) }"); | 4027 CheckExpectedRangesByTimestamp("{ [3000,4500) }"); |
| 4058 NewSegmentAppend("0K 501K 1001K 1501K 2001K 2501K " | 4028 NewCodedFrameGroupAppend( |
| 4059 "3001K 3501K 4001K 4501K 5001K"); | 4029 "0K 501K 1001K 1501K 2001K 2501K " |
| 4030 "3001K 3501K 4001K 4501K 5001K"); | |
| 4060 CheckExpectedRangesByTimestamp("{ [0,5501) }"); | 4031 CheckExpectedRangesByTimestamp("{ [0,5501) }"); |
| 4061 | 4032 |
| 4062 Seek(0); | 4033 Seek(0); |
| 4063 CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 2501K " | 4034 CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 2501K " |
| 4064 "3001K 3501K 4001K 4501K 5001K"); | 4035 "3001K 3501K 4001K 4501K 5001K"); |
| 4065 } | 4036 } |
| 4066 | 4037 |
| 4067 TEST_F(SourceBufferStreamTest, Text_OverlapAfter) { | 4038 TEST_F(SourceBufferStreamTest, Text_OverlapAfter) { |
| 4068 SetTextStream(); | 4039 SetTextStream(); |
| 4069 NewSegmentAppend("0K 500K 1000K 1500K 2000K"); | 4040 NewCodedFrameGroupAppend("0K 500K 1000K 1500K 2000K"); |
| 4070 CheckExpectedRangesByTimestamp("{ [0,2500) }"); | 4041 CheckExpectedRangesByTimestamp("{ [0,2500) }"); |
| 4071 NewSegmentAppend("1499K 2001K 2501K 3001K"); | 4042 NewCodedFrameGroupAppend("1499K 2001K 2501K 3001K"); |
| 4072 CheckExpectedRangesByTimestamp("{ [0,3501) }"); | 4043 CheckExpectedRangesByTimestamp("{ [0,3501) }"); |
| 4073 | 4044 |
| 4074 Seek(0); | 4045 Seek(0); |
| 4075 CheckExpectedBuffers("0K 500K 1000K 1499K 2001K 2501K 3001K"); | 4046 CheckExpectedBuffers("0K 500K 1000K 1499K 2001K 2501K 3001K"); |
| 4076 } | 4047 } |
| 4077 | 4048 |
| 4078 TEST_F(SourceBufferStreamTest, Text_OverlapBefore) { | 4049 TEST_F(SourceBufferStreamTest, Text_OverlapBefore) { |
| 4079 SetTextStream(); | 4050 SetTextStream(); |
| 4080 NewSegmentAppend("1500K 2000K 2500K 3000K 3500K"); | 4051 NewCodedFrameGroupAppend("1500K 2000K 2500K 3000K 3500K"); |
| 4081 CheckExpectedRangesByTimestamp("{ [1500,4000) }"); | 4052 CheckExpectedRangesByTimestamp("{ [1500,4000) }"); |
| 4082 NewSegmentAppend("0K 501K 1001K 1501K 2001K"); | 4053 NewCodedFrameGroupAppend("0K 501K 1001K 1501K 2001K"); |
| 4083 CheckExpectedRangesByTimestamp("{ [0,4000) }"); | 4054 CheckExpectedRangesByTimestamp("{ [0,4000) }"); |
| 4084 | 4055 |
| 4085 Seek(0); | 4056 Seek(0); |
| 4086 CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 3000K 3500K"); | 4057 CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 3000K 3500K"); |
| 4087 } | 4058 } |
| 4088 | 4059 |
| 4089 TEST_F(SourceBufferStreamTest, SpliceFrame_Basic) { | 4060 TEST_F(SourceBufferStreamTest, SpliceFrame_Basic) { |
| 4090 Seek(0); | 4061 Seek(0); |
| 4091 NewSegmentAppend("0K S(3K 6 9D3 10D5) 15 20 S(25K 30D5 35D5) 40"); | 4062 NewCodedFrameGroupAppend("0K S(3K 6 9D3 10D5) 15 20 S(25K 30D5 35D5) 40"); |
| 4092 CheckExpectedBuffers("0K 3K 6 9 C 10 15 20 25K 30 C 35 40"); | 4063 CheckExpectedBuffers("0K 3K 6 9 C 10 15 20 25K 30 C 35 40"); |
| 4093 CheckNoNextBuffer(); | 4064 CheckNoNextBuffer(); |
| 4094 } | 4065 } |
| 4095 | 4066 |
| 4096 TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSplice) { | 4067 TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSplice) { |
| 4097 Seek(0); | 4068 Seek(0); |
| 4098 NewSegmentAppend("0K S(3K 6 9D3 10D5) 15K 20"); | 4069 NewCodedFrameGroupAppend("0K S(3K 6 9D3 10D5) 15K 20"); |
| 4099 CheckExpectedBuffers("0K 3K 6"); | 4070 CheckExpectedBuffers("0K 3K 6"); |
| 4100 | 4071 |
| 4101 SeekToTimestampMs(15); | 4072 SeekToTimestampMs(15); |
| 4102 CheckExpectedBuffers("15K 20"); | 4073 CheckExpectedBuffers("15K 20"); |
| 4103 CheckNoNextBuffer(); | 4074 CheckNoNextBuffer(); |
| 4104 } | 4075 } |
| 4105 | 4076 |
| 4106 TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSpliceFromTrackBuffer) { | 4077 TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSpliceFromTrackBuffer) { |
| 4107 Seek(0); | 4078 Seek(0); |
| 4108 NewSegmentAppend("0K 2K S(3K 6 9D3 10D5) 15K 20"); | 4079 NewCodedFrameGroupAppend("0K 2K S(3K 6 9D3 10D5) 15K 20"); |
| 4109 CheckExpectedBuffers("0K 2K"); | 4080 CheckExpectedBuffers("0K 2K"); |
| 4110 | 4081 |
| 4111 // Overlap the existing segment. | 4082 // Overlap the existing coded frame group. |
| 4112 NewSegmentAppend("5K 15K 20"); | 4083 NewCodedFrameGroupAppend("5K 15K 20"); |
| 4113 CheckExpectedBuffers("3K 6"); | 4084 CheckExpectedBuffers("3K 6"); |
| 4114 | 4085 |
| 4115 SeekToTimestampMs(15); | 4086 SeekToTimestampMs(15); |
| 4116 CheckExpectedBuffers("15K 20"); | 4087 CheckExpectedBuffers("15K 20"); |
| 4117 CheckNoNextBuffer(); | 4088 CheckNoNextBuffer(); |
| 4118 } | 4089 } |
| 4119 | 4090 |
| 4120 TEST_F(SourceBufferStreamTest, SpliceFrame_ConfigChangeWithinSplice) { | 4091 TEST_F(SourceBufferStreamTest, SpliceFrame_ConfigChangeWithinSplice) { |
| 4121 VideoDecoderConfig new_config = TestVideoConfig::Large(); | 4092 VideoDecoderConfig new_config = TestVideoConfig::Large(); |
| 4122 ASSERT_FALSE(new_config.Matches(video_config_)); | 4093 ASSERT_FALSE(new_config.Matches(video_config_)); |
| 4123 | 4094 |
| 4124 // Add a new video config, then reset the config index back to the original. | 4095 // Add a new video config, then reset the config index back to the original. |
| 4125 stream_->UpdateVideoConfig(new_config); | 4096 stream_->UpdateVideoConfig(new_config); |
| 4126 stream_->UpdateVideoConfig(video_config_); | 4097 stream_->UpdateVideoConfig(video_config_); |
| 4127 | 4098 |
| 4128 Seek(0); | 4099 Seek(0); |
| 4129 CheckVideoConfig(video_config_); | 4100 CheckVideoConfig(video_config_); |
| 4130 NewSegmentAppend("0K S(3K 6C 9D3 10D5) 15"); | 4101 NewCodedFrameGroupAppend("0K S(3K 6C 9D3 10D5) 15"); |
| 4131 | 4102 |
| 4132 CheckExpectedBuffers("0K 3K C"); | 4103 CheckExpectedBuffers("0K 3K C"); |
| 4133 CheckVideoConfig(new_config); | 4104 CheckVideoConfig(new_config); |
| 4134 CheckExpectedBuffers("6 9 C"); | 4105 CheckExpectedBuffers("6 9 C"); |
| 4135 CheckExpectedBuffers("10 C"); | 4106 CheckExpectedBuffers("10 C"); |
| 4136 CheckVideoConfig(video_config_); | 4107 CheckVideoConfig(video_config_); |
| 4137 CheckExpectedBuffers("15"); | 4108 CheckExpectedBuffers("15"); |
| 4138 CheckNoNextBuffer(); | 4109 CheckNoNextBuffer(); |
| 4139 } | 4110 } |
| 4140 | 4111 |
| 4141 TEST_F(SourceBufferStreamTest, SpliceFrame_BasicFromTrackBuffer) { | 4112 TEST_F(SourceBufferStreamTest, SpliceFrame_BasicFromTrackBuffer) { |
| 4142 Seek(0); | 4113 Seek(0); |
| 4143 NewSegmentAppend("0K 5K S(8K 9D1 10D10) 20"); | 4114 NewCodedFrameGroupAppend("0K 5K S(8K 9D1 10D10) 20"); |
| 4144 CheckExpectedBuffers("0K 5K"); | 4115 CheckExpectedBuffers("0K 5K"); |
| 4145 | 4116 |
| 4146 // Overlap the existing segment. | 4117 // Overlap the existing coded frame group. |
| 4147 NewSegmentAppend("5K 20"); | 4118 NewCodedFrameGroupAppend("5K 20"); |
| 4148 CheckExpectedBuffers("8K 9 C 10 20"); | 4119 CheckExpectedBuffers("8K 9 C 10 20"); |
| 4149 CheckNoNextBuffer(); | 4120 CheckNoNextBuffer(); |
| 4150 } | 4121 } |
| 4151 | 4122 |
| 4152 TEST_F(SourceBufferStreamTest, | 4123 TEST_F(SourceBufferStreamTest, |
| 4153 SpliceFrame_ConfigChangeWithinSpliceFromTrackBuffer) { | 4124 SpliceFrame_ConfigChangeWithinSpliceFromTrackBuffer) { |
| 4154 VideoDecoderConfig new_config = TestVideoConfig::Large(); | 4125 VideoDecoderConfig new_config = TestVideoConfig::Large(); |
| 4155 ASSERT_FALSE(new_config.Matches(video_config_)); | 4126 ASSERT_FALSE(new_config.Matches(video_config_)); |
| 4156 | 4127 |
| 4157 // Add a new video config, then reset the config index back to the original. | 4128 // Add a new video config, then reset the config index back to the original. |
| 4158 stream_->UpdateVideoConfig(new_config); | 4129 stream_->UpdateVideoConfig(new_config); |
| 4159 stream_->UpdateVideoConfig(video_config_); | 4130 stream_->UpdateVideoConfig(video_config_); |
| 4160 | 4131 |
| 4161 Seek(0); | 4132 Seek(0); |
| 4162 CheckVideoConfig(video_config_); | 4133 CheckVideoConfig(video_config_); |
| 4163 NewSegmentAppend("0K 5K S(7K 8C 9D1 10D10) 20"); | 4134 NewCodedFrameGroupAppend("0K 5K S(7K 8C 9D1 10D10) 20"); |
| 4164 CheckExpectedBuffers("0K 5K"); | 4135 CheckExpectedBuffers("0K 5K"); |
| 4165 | 4136 |
| 4166 // Overlap the existing segment. | 4137 // Overlap the existing coded frame group. |
| 4167 NewSegmentAppend("5K 20"); | 4138 NewCodedFrameGroupAppend("5K 20"); |
| 4168 CheckExpectedBuffers("7K C"); | 4139 CheckExpectedBuffers("7K C"); |
| 4169 CheckVideoConfig(new_config); | 4140 CheckVideoConfig(new_config); |
| 4170 CheckExpectedBuffers("8 9 C"); | 4141 CheckExpectedBuffers("8 9 C"); |
| 4171 CheckExpectedBuffers("10 C"); | 4142 CheckExpectedBuffers("10 C"); |
| 4172 CheckVideoConfig(video_config_); | 4143 CheckVideoConfig(video_config_); |
| 4173 CheckExpectedBuffers("20"); | 4144 CheckExpectedBuffers("20"); |
| 4174 CheckNoNextBuffer(); | 4145 CheckNoNextBuffer(); |
| 4175 } | 4146 } |
| 4176 | 4147 |
| 4177 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) { | 4148 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) { |
| 4178 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); | 4149 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); |
| 4179 | 4150 |
| 4180 SetAudioStream(); | 4151 SetAudioStream(); |
| 4181 Seek(0); | 4152 Seek(0); |
| 4182 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); | 4153 NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K"); |
| 4183 NewSegmentAppend("11K 13K 15K 17K"); | 4154 NewCodedFrameGroupAppend("11K 13K 15K 17K"); |
| 4184 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); | 4155 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); |
| 4185 CheckNoNextBuffer(); | 4156 CheckNoNextBuffer(); |
| 4186 } | 4157 } |
| 4187 | 4158 |
| 4188 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) { | 4159 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) { |
| 4189 EXPECT_MEDIA_LOG( | 4160 EXPECT_MEDIA_LOG( |
| 4190 HasSubstr("Skipping splice frame generation: first new buffer at 10000us " | 4161 HasSubstr("Skipping splice frame generation: first new buffer at 10000us " |
| 4191 "begins at or before existing buffer at 10000us.")); | 4162 "begins at or before existing buffer at 10000us.")); |
| 4192 | 4163 |
| 4193 SetAudioStream(); | 4164 SetAudioStream(); |
| 4194 Seek(0); | 4165 Seek(0); |
| 4195 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); | 4166 NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K"); |
| 4196 NewSegmentAppend("10K 14K"); | 4167 NewCodedFrameGroupAppend("10K 14K"); |
| 4197 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K"); | 4168 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K"); |
| 4198 CheckNoNextBuffer(); | 4169 CheckNoNextBuffer(); |
| 4199 } | 4170 } |
| 4200 | 4171 |
| 4201 // Do not allow splices on top of splices. | 4172 // Do not allow splices on top of splices. |
| 4202 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) { | 4173 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) { |
| 4203 InSequence s; | 4174 InSequence s; |
| 4204 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); | 4175 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); |
| 4205 EXPECT_MEDIA_LOG( | 4176 EXPECT_MEDIA_LOG( |
| 4206 HasSubstr("Skipping splice frame generation: overlapped buffers at " | 4177 HasSubstr("Skipping splice frame generation: overlapped buffers at " |
| 4207 "10000us are in a previously buffered splice.")); | 4178 "10000us are in a previously buffered splice.")); |
| 4208 | 4179 |
| 4209 SetAudioStream(); | 4180 SetAudioStream(); |
| 4210 Seek(0); | 4181 Seek(0); |
| 4211 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); | 4182 NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K"); |
| 4212 NewSegmentAppend("11K 13K 15K 17K"); | 4183 NewCodedFrameGroupAppend("11K 13K 15K 17K"); |
| 4213 | 4184 |
| 4214 // Verify the splice was created. | 4185 // Verify the splice was created. |
| 4215 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); | 4186 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K"); |
| 4216 CheckNoNextBuffer(); | 4187 CheckNoNextBuffer(); |
| 4217 Seek(0); | 4188 Seek(0); |
| 4218 | 4189 |
| 4219 // Create a splice before the first splice which would include it. | 4190 // Create a splice before the first splice which would include it. |
| 4220 NewSegmentAppend("9D2K"); | 4191 NewCodedFrameGroupAppend("9D2K"); |
| 4221 | 4192 |
| 4222 // A splice on top of a splice should result in a discard of the original | 4193 // A splice on top of a splice should result in a discard of the original |
| 4223 // splice and no new splice frame being generated. | 4194 // splice and no new splice frame being generated. |
| 4224 CheckExpectedBuffers("0K 2K 4K 6K 8K 9K 13K 15K 17K"); | 4195 CheckExpectedBuffers("0K 2K 4K 6K 8K 9K 13K 15K 17K"); |
| 4225 CheckNoNextBuffer(); | 4196 CheckNoNextBuffer(); |
| 4226 } | 4197 } |
| 4227 | 4198 |
| 4228 // Test that a splice is not created if an end timestamp and start timestamp | 4199 // Test that a splice is not created if an end timestamp and start timestamp |
| 4229 // overlap. | 4200 // overlap. |
| 4230 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) { | 4201 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) { |
| 4231 SetAudioStream(); | 4202 SetAudioStream(); |
| 4232 Seek(0); | 4203 Seek(0); |
| 4233 NewSegmentAppend("0K 2K 4K 6K 8K 10K"); | 4204 NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K"); |
| 4234 NewSegmentAppend("12K 14K 16K 18K"); | 4205 NewCodedFrameGroupAppend("12K 14K 16K 18K"); |
| 4235 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K"); | 4206 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K"); |
| 4236 CheckNoNextBuffer(); | 4207 CheckNoNextBuffer(); |
| 4237 } | 4208 } |
| 4238 | 4209 |
| 4239 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) { | 4210 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectGroupStartTime) { |
| 4240 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(5000, 1000)); | 4211 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(5000, 1000)); |
| 4241 | 4212 |
| 4242 SetAudioStream(); | 4213 SetAudioStream(); |
| 4243 Seek(0); | 4214 Seek(0); |
| 4244 NewSegmentAppend("0K 2K 4K"); | 4215 NewCodedFrameGroupAppend("0K 2K 4K"); |
| 4245 CheckExpectedRangesByTimestamp("{ [0,6) }"); | 4216 CheckExpectedRangesByTimestamp("{ [0,6) }"); |
| 4246 NewSegmentAppend("6K 8K 10K"); | 4217 NewCodedFrameGroupAppend("6K 8K 10K"); |
| 4247 CheckExpectedRangesByTimestamp("{ [0,12) }"); | 4218 CheckExpectedRangesByTimestamp("{ [0,12) }"); |
| 4248 NewSegmentAppend("1K 4D2K"); | 4219 NewCodedFrameGroupAppend("1K 4D2K"); |
| 4249 CheckExpectedRangesByTimestamp("{ [0,12) }"); | 4220 CheckExpectedRangesByTimestamp("{ [0,12) }"); |
| 4250 CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K"); | 4221 CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K"); |
| 4251 CheckNoNextBuffer(); | 4222 CheckNoNextBuffer(); |
| 4252 } | 4223 } |
| 4253 | 4224 |
| 4254 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) { | 4225 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) { |
| 4255 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 5000)); | 4226 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 5000)); |
| 4256 | 4227 |
| 4257 SetAudioStream(); | 4228 SetAudioStream(); |
| 4258 | 4229 |
| 4259 AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarF32, | 4230 AudioDecoderConfig new_config(kCodecVorbis, kSampleFormatPlanarF32, |
| 4260 CHANNEL_LAYOUT_MONO, 1000, EmptyExtraData(), | 4231 CHANNEL_LAYOUT_MONO, 1000, EmptyExtraData(), |
| 4261 false); | 4232 false); |
| 4262 ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout()); | 4233 ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout()); |
| 4263 | 4234 |
| 4264 Seek(0); | 4235 Seek(0); |
| 4265 CheckAudioConfig(audio_config_); | 4236 CheckAudioConfig(audio_config_); |
| 4266 NewSegmentAppend("0K 2K 4K 6K"); | 4237 NewCodedFrameGroupAppend("0K 2K 4K 6K"); |
| 4267 stream_->UpdateAudioConfig(new_config); | 4238 stream_->UpdateAudioConfig(new_config); |
| 4268 NewSegmentAppend("5K 8K 12K"); | 4239 NewCodedFrameGroupAppend("5K 8K 12K"); |
| 4269 CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K"); | 4240 CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K"); |
| 4270 CheckAudioConfig(new_config); | 4241 CheckAudioConfig(new_config); |
| 4271 CheckNoNextBuffer(); | 4242 CheckNoNextBuffer(); |
| 4272 } | 4243 } |
| 4273 | 4244 |
| 4274 // Ensure splices are not created if there are not enough frames to crossfade. | 4245 // Ensure splices are not created if there are not enough frames to crossfade. |
| 4275 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) { | 4246 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) { |
| 4276 EXPECT_MEDIA_LOG(HasSubstr( | 4247 EXPECT_MEDIA_LOG(HasSubstr( |
| 4277 "Skipping splice frame generation: not enough samples for splicing new " | 4248 "Skipping splice frame generation: not enough samples for splicing new " |
| 4278 "buffer at 1000us. Have 1000us, but need 2000us.")); | 4249 "buffer at 1000us. Have 1000us, but need 2000us.")); |
| 4279 | 4250 |
| 4280 SetAudioStream(); | 4251 SetAudioStream(); |
| 4281 Seek(0); | 4252 Seek(0); |
| 4282 | 4253 |
| 4283 // Overlap the range [0, 2) with [1, 3). Since each frame has a duration of | 4254 // Overlap the range [0, 2) with [1, 3). Since each frame has a duration of |
| 4284 // 2ms this results in an overlap of 1ms between the ranges. A splice frame | 4255 // 2ms this results in an overlap of 1ms between the ranges. A splice frame |
| 4285 // should not be generated since it requires at least 2 frames, or 2ms in this | 4256 // should not be generated since it requires at least 2 frames, or 2ms in this |
| 4286 // case, of data to crossfade. | 4257 // case, of data to crossfade. |
| 4287 NewSegmentAppend("0D2K"); | 4258 NewCodedFrameGroupAppend("0D2K"); |
| 4288 CheckExpectedRangesByTimestamp("{ [0,2) }"); | 4259 CheckExpectedRangesByTimestamp("{ [0,2) }"); |
| 4289 NewSegmentAppend("1D2K"); | 4260 NewCodedFrameGroupAppend("1D2K"); |
| 4290 CheckExpectedRangesByTimestamp("{ [0,3) }"); | 4261 CheckExpectedRangesByTimestamp("{ [0,3) }"); |
| 4291 CheckExpectedBuffers("0K 1K"); | 4262 CheckExpectedBuffers("0K 1K"); |
| 4292 CheckNoNextBuffer(); | 4263 CheckNoNextBuffer(); |
| 4293 } | 4264 } |
| 4294 | 4265 |
| 4295 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) { | 4266 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoMillisecondSplices) { |
| 4296 EXPECT_MEDIA_LOG( | 4267 EXPECT_MEDIA_LOG( |
| 4297 HasSubstr("Skipping splice frame generation: not enough samples for " | 4268 HasSubstr("Skipping splice frame generation: not enough samples for " |
| 4298 "splicing new buffer at 1250us. Have 750us, but need 1000us.")); | 4269 "splicing new buffer at 1250us. Have 750us, but need 1000us.")); |
| 4299 | 4270 |
| 4300 video_config_ = TestVideoConfig::Invalid(); | 4271 video_config_ = TestVideoConfig::Invalid(); |
| 4301 audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32, | 4272 audio_config_.Initialize(kCodecVorbis, kSampleFormatPlanarF32, |
| 4302 CHANNEL_LAYOUT_STEREO, 4000, EmptyExtraData(), false, | 4273 CHANNEL_LAYOUT_STEREO, 4000, EmptyExtraData(), false, |
| 4303 base::TimeDelta(), 0); | 4274 base::TimeDelta(), 0); |
| 4304 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true)); | 4275 stream_.reset(new SourceBufferStream(audio_config_, media_log_, true)); |
| 4305 // Equivalent to 0.5ms per frame. | 4276 // Equivalent to 0.5ms per frame. |
| 4306 SetStreamInfo(2000, 2000); | 4277 SetStreamInfo(2000, 2000); |
| 4307 Seek(0); | 4278 Seek(0); |
| 4308 | 4279 |
| 4309 // Append four buffers with a 0.5ms duration each. | 4280 // Append four buffers with a 0.5ms duration each. |
| 4310 NewSegmentAppend(0, 4); | 4281 NewCodedFrameGroupAppend(0, 4); |
| 4311 CheckExpectedRangesByTimestamp("{ [0,2) }"); | 4282 CheckExpectedRangesByTimestamp("{ [0,2) }"); |
| 4312 | 4283 |
| 4313 // Overlap the range [0, 2) with [1.25, 2); this results in an overlap of | 4284 // Overlap the range [0, 2) with [1.25, 2); this results in an overlap of |
| 4314 // 0.75ms between the ranges. | 4285 // 0.75ms between the ranges. |
| 4315 NewSegmentAppend_OffsetFirstBuffer(2, 2, | 4286 NewCodedFrameGroupAppend_OffsetFirstBuffer( |
| 4316 base::TimeDelta::FromMillisecondsD(0.25)); | 4287 2, 2, base::TimeDelta::FromMillisecondsD(0.25)); |
| 4317 CheckExpectedRangesByTimestamp("{ [0,2) }"); | 4288 CheckExpectedRangesByTimestamp("{ [0,2) }"); |
| 4318 | 4289 |
| 4319 // A splice frame should not be generated (indicated by the lack of a config | 4290 // A splice frame should not be generated (indicated by the lack of a config |
| 4320 // change in the expected buffer string) since it requires at least 1ms of | 4291 // change in the expected buffer string) since it requires at least 1ms of |
| 4321 // data to crossfade. | 4292 // data to crossfade. |
| 4322 CheckExpectedBuffers("0K 0K 1K 1K 1K"); | 4293 CheckExpectedBuffers("0K 0K 1K 1K"); |
| 4323 CheckNoNextBuffer(); | 4294 CheckNoNextBuffer(); |
| 4324 } | 4295 } |
| 4325 | 4296 |
| 4326 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) { | 4297 TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) { |
| 4327 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); | 4298 EXPECT_MEDIA_LOG(ContainsGeneratedSpliceLog(3000, 11000)); |
| 4328 | 4299 |
| 4329 SetAudioStream(); | 4300 SetAudioStream(); |
| 4330 Seek(0); | 4301 Seek(0); |
| 4331 NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K"); | 4302 NewCodedFrameGroupAppend("0K 2K 4K 6K 8K 10K 12K"); |
| 4332 NewSegmentAppend("11P 13K 15K 17K"); | 4303 NewCodedFrameGroupAppend("11P 13K 15K 17K"); |
| 4333 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K"); | 4304 CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K"); |
| 4334 CheckNoNextBuffer(); | 4305 CheckNoNextBuffer(); |
| 4335 } | 4306 } |
| 4336 | 4307 |
| 4337 TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) { | 4308 TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) { |
| 4338 Seek(0); | 4309 Seek(0); |
| 4339 NewSegmentAppend("0K 3P 6K"); | 4310 NewCodedFrameGroupAppend("0K 3P 6K"); |
| 4340 CheckExpectedBuffers("0K 3P 6K"); | 4311 CheckExpectedBuffers("0K 3P 6K"); |
| 4341 CheckNoNextBuffer(); | 4312 CheckNoNextBuffer(); |
| 4342 } | 4313 } |
| 4343 | 4314 |
| 4344 TEST_F(SourceBufferStreamTest, BFrames) { | 4315 TEST_F(SourceBufferStreamTest, BFrames) { |
| 4345 Seek(0); | 4316 Seek(0); |
| 4346 NewSegmentAppend("0K 120|30 30|60 60|90 90|120"); | 4317 NewCodedFrameGroupAppend("0K 120|30 30|60 60|90 90|120"); |
| 4347 CheckExpectedRangesByTimestamp("{ [0,150) }"); | 4318 CheckExpectedRangesByTimestamp("{ [0,150) }"); |
| 4348 | 4319 |
| 4349 CheckExpectedBuffers("0K 120|30 30|60 60|90 90|120"); | 4320 CheckExpectedBuffers("0K 120|30 30|60 60|90 90|120"); |
| 4350 CheckNoNextBuffer(); | 4321 CheckNoNextBuffer(); |
| 4351 } | 4322 } |
| 4352 | 4323 |
| 4353 TEST_F(SourceBufferStreamTest, RemoveShouldAlwaysExcludeEnd) { | 4324 TEST_F(SourceBufferStreamTest, RemoveShouldAlwaysExcludeEnd) { |
| 4354 NewSegmentAppend("10D2K 12D2 14D2"); | 4325 NewCodedFrameGroupAppend("10D2K 12D2 14D2"); |
| 4355 CheckExpectedRangesByTimestamp("{ [10,16) }"); | 4326 CheckExpectedRangesByTimestamp("{ [10,16) }"); |
| 4356 | 4327 |
| 4357 // Start new segment, appending KF to abut the start of previous segment. | 4328 // Start new coded frame group, appending KF to abut the start of previous |
| 4358 NewSegmentAppend("0D10K"); | 4329 // group. |
| 4330 NewCodedFrameGroupAppend("0D10K"); | |
| 4359 Seek(0); | 4331 Seek(0); |
| 4360 CheckExpectedRangesByTimestamp("{ [0,16) }"); | 4332 CheckExpectedRangesByTimestamp("{ [0,16) }"); |
| 4361 CheckExpectedBuffers("0K 10K 12 14"); | 4333 CheckExpectedBuffers("0K 10K 12 14"); |
| 4362 CheckNoNextBuffer(); | 4334 CheckNoNextBuffer(); |
| 4363 | 4335 |
| 4364 // Append another buffer with the same timestamp as the last KF. This triggers | 4336 // Append another buffer with the same timestamp as the last KF. This triggers |
| 4365 // special logic that allows two buffers to have the same timestamp. When | 4337 // special logic that allows two buffers to have the same timestamp. When |
| 4366 // preparing for this new append, there is no reason to remove the later GOP | 4338 // preparing for this new append, there is no reason to remove the later GOP |
| 4367 // starting at timestamp 10. This verifies the fix for http://crbug.com/469325 | 4339 // starting at timestamp 10. This verifies the fix for http://crbug.com/469325 |
| 4368 // where the decision *not* to remove the start of the overlapped range was | 4340 // where the decision *not* to remove the start of the overlapped range was |
| 4369 // erroneously triggering buffers with a timestamp matching the end | 4341 // erroneously triggering buffers with a timestamp matching the end |
| 4370 // of the append (and any later dependent frames) to be removed. | 4342 // of the append (and any later dependent frames) to be removed. |
|
wolenetz
2016/02/24 01:14:02
FrameProcessor will never emit a non-keyframe at t
wolenetz
2016/02/24 18:57:46
I was incorrect. Coded frame processing algorithm
| |
| 4371 AppendBuffers("0D10"); | 4343 AppendBuffers("0D10"); |
| 4372 Seek(0); | 4344 Seek(0); |
| 4373 CheckExpectedRangesByTimestamp("{ [0,16) }"); | 4345 CheckExpectedRangesByTimestamp("{ [0,16) }"); |
| 4374 CheckExpectedBuffers("0K 0 10K 12 14"); | 4346 CheckExpectedBuffers("0K 0 10K 12 14"); |
| 4375 CheckNoNextBuffer(); | 4347 CheckNoNextBuffer(); |
| 4376 } | 4348 } |
| 4377 | 4349 |
| 4378 TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_BackOverlap) { | 4350 TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_BackOverlap) { |
| 4379 // Append a few buffers, the last one having estimated duration. | 4351 // Append a few buffers, the last one having estimated duration. |
| 4380 NewSegmentAppend("0K 5 10 20D10E"); | 4352 NewCodedFrameGroupAppend("0K 5 10 20D10E"); |
| 4381 CheckExpectedRangesByTimestamp("{ [0,30) }"); | 4353 CheckExpectedRangesByTimestamp("{ [0,30) }"); |
| 4382 Seek(0); | 4354 Seek(0); |
| 4383 CheckExpectedBuffers("0K 5 10 20D10E"); | 4355 CheckExpectedBuffers("0K 5 10 20D10E"); |
| 4384 CheckNoNextBuffer(); | 4356 CheckNoNextBuffer(); |
| 4385 | 4357 |
| 4386 // Append a buffer to the end that overlaps the *back* of the existing range. | 4358 // Append a buffer to the end that overlaps the *back* of the existing range. |
| 4387 // This should trigger the estimated duration to be recomputed as a timestamp | 4359 // This should trigger the estimated duration to be recomputed as a timestamp |
| 4388 // delta. | 4360 // delta. |
| 4389 AppendBuffers("25D10"); | 4361 AppendBuffers("25D10"); |
| 4390 CheckExpectedRangesByTimestamp("{ [0,35) }"); | 4362 CheckExpectedRangesByTimestamp("{ [0,35) }"); |
| 4391 Seek(0); | 4363 Seek(0); |
| 4392 // The duration of the buffer at time 20 has changed from 10ms to 5ms. | 4364 // The duration of the buffer at time 20 has changed from 10ms to 5ms. |
| 4393 CheckExpectedBuffers("0K 5 10 20D5E 25"); | 4365 CheckExpectedBuffers("0K 5 10 20D5E 25"); |
| 4394 CheckNoNextBuffer(); | 4366 CheckNoNextBuffer(); |
| 4395 | 4367 |
| 4396 // If the last buffer is removed, the adjusted duration should remain at 5ms. | 4368 // If the last buffer is removed, the adjusted duration should remain at 5ms. |
| 4397 RemoveInMs(25, 35, 35); | 4369 RemoveInMs(25, 35, 35); |
| 4398 CheckExpectedRangesByTimestamp("{ [0,25) }"); | 4370 CheckExpectedRangesByTimestamp("{ [0,25) }"); |
| 4399 Seek(0); | 4371 Seek(0); |
| 4400 CheckExpectedBuffers("0K 5 10 20D5E"); | 4372 CheckExpectedBuffers("0K 5 10 20D5E"); |
| 4401 CheckNoNextBuffer(); | 4373 CheckNoNextBuffer(); |
| 4402 } | 4374 } |
| 4403 | 4375 |
| 4404 TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_FrontOverlap) { | 4376 TEST_F(SourceBufferStreamTest, RefinedDurationEstimates_FrontOverlap) { |
| 4405 // Append a few buffers. | 4377 // Append a few buffers. |
| 4406 NewSegmentAppend("10K 15 20D5"); | 4378 NewCodedFrameGroupAppend("10K 15 20D5"); |
| 4407 CheckExpectedRangesByTimestamp("{ [10,25) }"); | 4379 CheckExpectedRangesByTimestamp("{ [10,25) }"); |
| 4408 SeekToTimestampMs(10); | 4380 SeekToTimestampMs(10); |
| 4409 CheckExpectedBuffers("10K 15 20"); | 4381 CheckExpectedBuffers("10K 15 20"); |
| 4410 CheckNoNextBuffer(); | 4382 CheckNoNextBuffer(); |
| 4411 | 4383 |
| 4412 // Append new buffers, where the last has estimated duration that overlaps the | 4384 // Append new buffers, where the last has estimated duration that overlaps the |
| 4413 // *front* of the existing range. The overlap should trigger refinement of the | 4385 // *front* of the existing range. The overlap should trigger refinement of the |
| 4414 // estimated duration from 7ms to 5ms. | 4386 // estimated duration from 7ms to 5ms. |
| 4415 NewSegmentAppend("0K 5D7E"); | 4387 NewCodedFrameGroupAppend("0K 5D7E"); |
| 4416 CheckExpectedRangesByTimestamp("{ [0,25) }"); | 4388 CheckExpectedRangesByTimestamp("{ [0,25) }"); |
| 4417 Seek(0); | 4389 Seek(0); |
| 4418 CheckExpectedBuffers("0K 5D5E 10K 15 20"); | 4390 CheckExpectedBuffers("0K 5D5E 10K 15 20"); |
| 4419 CheckNoNextBuffer(); | 4391 CheckNoNextBuffer(); |
| 4420 | 4392 |
| 4421 // If the overlapped buffer at timestamp 10 is removed, the adjusted duration | 4393 // If the overlapped buffer at timestamp 10 is removed, the adjusted duration |
| 4422 // should remain adjusted. | 4394 // should remain adjusted. |
| 4423 RemoveInMs(10, 20, 25); | 4395 RemoveInMs(10, 20, 25); |
| 4424 CheckExpectedRangesByTimestamp("{ [0,10) }"); | 4396 CheckExpectedRangesByTimestamp("{ [0,10) }"); |
| 4425 Seek(0); | 4397 Seek(0); |
| 4426 CheckExpectedBuffers("0K 5D5E"); | 4398 CheckExpectedBuffers("0K 5D5E"); |
| 4427 CheckNoNextBuffer(); | 4399 CheckNoNextBuffer(); |
| 4428 } | 4400 } |
| 4429 | 4401 |
| 4430 TEST_F(SourceBufferStreamTest, SeekToStartSatisfiedUpToThreshold) { | 4402 TEST_F(SourceBufferStreamTest, SeekToStartSatisfiedUpToThreshold) { |
| 4431 NewSegmentAppend("999K 1010 1020D10"); | 4403 NewCodedFrameGroupAppend("999K 1010 1020D10"); |
| 4432 CheckExpectedRangesByTimestamp("{ [999,1030) }"); | 4404 CheckExpectedRangesByTimestamp("{ [999,1030) }"); |
| 4433 | 4405 |
| 4434 SeekToTimestampMs(0); | 4406 SeekToTimestampMs(0); |
| 4435 CheckExpectedBuffers("999K 1010 1020D10"); | 4407 CheckExpectedBuffers("999K 1010 1020D10"); |
| 4436 CheckNoNextBuffer(); | 4408 CheckNoNextBuffer(); |
| 4437 } | 4409 } |
| 4438 | 4410 |
| 4439 TEST_F(SourceBufferStreamTest, SeekToStartUnsatisfiedBeyondThreshold) { | 4411 TEST_F(SourceBufferStreamTest, SeekToStartUnsatisfiedBeyondThreshold) { |
| 4440 NewSegmentAppend("1000K 1010 1020D10"); | 4412 NewCodedFrameGroupAppend("1000K 1010 1020D10"); |
| 4441 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); | 4413 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); |
| 4442 | 4414 |
| 4443 SeekToTimestampMs(0); | 4415 SeekToTimestampMs(0); |
| 4444 CheckNoNextBuffer(); | 4416 CheckNoNextBuffer(); |
| 4445 } | 4417 } |
| 4446 | 4418 |
| 4447 TEST_F(SourceBufferStreamTest, | 4419 TEST_F(SourceBufferStreamTest, |
| 4448 ReSeekToStartSatisfiedUpToThreshold_SameTimestamps) { | 4420 ReSeekToStartSatisfiedUpToThreshold_SameTimestamps) { |
| 4449 // Append a few buffers. | 4421 // Append a few buffers. |
| 4450 NewSegmentAppend("999K 1010 1020D10"); | 4422 NewCodedFrameGroupAppend("999K 1010 1020D10"); |
| 4451 CheckExpectedRangesByTimestamp("{ [999,1030) }"); | 4423 CheckExpectedRangesByTimestamp("{ [999,1030) }"); |
| 4452 | 4424 |
| 4453 // Don't read any buffers between Seek and Remove. | 4425 // Don't read any buffers between Seek and Remove. |
| 4454 SeekToTimestampMs(0); | 4426 SeekToTimestampMs(0); |
| 4455 RemoveInMs(999, 1030, 1030); | 4427 RemoveInMs(999, 1030, 1030); |
| 4456 CheckExpectedRangesByTimestamp("{ }"); | 4428 CheckExpectedRangesByTimestamp("{ }"); |
| 4457 CheckNoNextBuffer(); | 4429 CheckNoNextBuffer(); |
| 4458 | 4430 |
| 4459 // Append buffers at the original timestamps and verify no stall. | 4431 // Append buffers at the original timestamps and verify no stall. |
| 4460 NewSegmentAppend("999K 1010 1020D10"); | 4432 NewCodedFrameGroupAppend("999K 1010 1020D10"); |
| 4461 CheckExpectedRangesByTimestamp("{ [999,1030) }"); | 4433 CheckExpectedRangesByTimestamp("{ [999,1030) }"); |
| 4462 CheckExpectedBuffers("999K 1010 1020D10"); | 4434 CheckExpectedBuffers("999K 1010 1020D10"); |
| 4463 CheckNoNextBuffer(); | 4435 CheckNoNextBuffer(); |
| 4464 } | 4436 } |
| 4465 | 4437 |
| 4466 TEST_F(SourceBufferStreamTest, | 4438 TEST_F(SourceBufferStreamTest, |
| 4467 ReSeekToStartSatisfiedUpToThreshold_EarlierTimestamps) { | 4439 ReSeekToStartSatisfiedUpToThreshold_EarlierTimestamps) { |
| 4468 // Append a few buffers. | 4440 // Append a few buffers. |
| 4469 NewSegmentAppend("999K 1010 1020D10"); | 4441 NewCodedFrameGroupAppend("999K 1010 1020D10"); |
| 4470 CheckExpectedRangesByTimestamp("{ [999,1030) }"); | 4442 CheckExpectedRangesByTimestamp("{ [999,1030) }"); |
| 4471 | 4443 |
| 4472 // Don't read any buffers between Seek and Remove. | 4444 // Don't read any buffers between Seek and Remove. |
| 4473 SeekToTimestampMs(0); | 4445 SeekToTimestampMs(0); |
| 4474 RemoveInMs(999, 1030, 1030); | 4446 RemoveInMs(999, 1030, 1030); |
| 4475 CheckExpectedRangesByTimestamp("{ }"); | 4447 CheckExpectedRangesByTimestamp("{ }"); |
| 4476 CheckNoNextBuffer(); | 4448 CheckNoNextBuffer(); |
| 4477 | 4449 |
| 4478 // Append buffers before the original timestamps and verify no stall (the | 4450 // Append buffers before the original timestamps and verify no stall (the |
| 4479 // re-seek to time 0 should still be satisfied with the new buffers). | 4451 // re-seek to time 0 should still be satisfied with the new buffers). |
| 4480 NewSegmentAppend("500K 510 520D10"); | 4452 NewCodedFrameGroupAppend("500K 510 520D10"); |
| 4481 CheckExpectedRangesByTimestamp("{ [500,530) }"); | 4453 CheckExpectedRangesByTimestamp("{ [500,530) }"); |
| 4482 CheckExpectedBuffers("500K 510 520D10"); | 4454 CheckExpectedBuffers("500K 510 520D10"); |
| 4483 CheckNoNextBuffer(); | 4455 CheckNoNextBuffer(); |
| 4484 } | 4456 } |
| 4485 | 4457 |
| 4486 TEST_F(SourceBufferStreamTest, | 4458 TEST_F(SourceBufferStreamTest, |
| 4487 ReSeekToStartSatisfiedUpToThreshold_LaterTimestamps) { | 4459 ReSeekToStartSatisfiedUpToThreshold_LaterTimestamps) { |
| 4488 // Append a few buffers. | 4460 // Append a few buffers. |
| 4489 NewSegmentAppend("500K 510 520D10"); | 4461 NewCodedFrameGroupAppend("500K 510 520D10"); |
| 4490 CheckExpectedRangesByTimestamp("{ [500,530) }"); | 4462 CheckExpectedRangesByTimestamp("{ [500,530) }"); |
| 4491 | 4463 |
| 4492 // Don't read any buffers between Seek and Remove. | 4464 // Don't read any buffers between Seek and Remove. |
| 4493 SeekToTimestampMs(0); | 4465 SeekToTimestampMs(0); |
| 4494 RemoveInMs(500, 530, 530); | 4466 RemoveInMs(500, 530, 530); |
| 4495 CheckExpectedRangesByTimestamp("{ }"); | 4467 CheckExpectedRangesByTimestamp("{ }"); |
| 4496 CheckNoNextBuffer(); | 4468 CheckNoNextBuffer(); |
| 4497 | 4469 |
| 4498 // Append buffers beginning after original timestamps, but still below the | 4470 // Append buffers beginning after original timestamps, but still below the |
| 4499 // start threshold, and verify no stall (the re-seek to time 0 should still be | 4471 // start threshold, and verify no stall (the re-seek to time 0 should still be |
| 4500 // satisfied with the new buffers). | 4472 // satisfied with the new buffers). |
| 4501 NewSegmentAppend("999K 1010 1020D10"); | 4473 NewCodedFrameGroupAppend("999K 1010 1020D10"); |
| 4502 CheckExpectedRangesByTimestamp("{ [999,1030) }"); | 4474 CheckExpectedRangesByTimestamp("{ [999,1030) }"); |
| 4503 CheckExpectedBuffers("999K 1010 1020D10"); | 4475 CheckExpectedBuffers("999K 1010 1020D10"); |
| 4504 CheckNoNextBuffer(); | 4476 CheckNoNextBuffer(); |
| 4505 } | 4477 } |
| 4506 | 4478 |
| 4507 TEST_F(SourceBufferStreamTest, ReSeekBeyondStartThreshold_SameTimestamps) { | 4479 TEST_F(SourceBufferStreamTest, ReSeekBeyondStartThreshold_SameTimestamps) { |
| 4508 // Append a few buffers. | 4480 // Append a few buffers. |
| 4509 NewSegmentAppend("1000K 1010 1020D10"); | 4481 NewCodedFrameGroupAppend("1000K 1010 1020D10"); |
| 4510 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); | 4482 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); |
| 4511 | 4483 |
| 4512 // Don't read any buffers between Seek and Remove. | 4484 // Don't read any buffers between Seek and Remove. |
| 4513 SeekToTimestampMs(1000); | 4485 SeekToTimestampMs(1000); |
| 4514 RemoveInMs(1000, 1030, 1030); | 4486 RemoveInMs(1000, 1030, 1030); |
| 4515 CheckExpectedRangesByTimestamp("{ }"); | 4487 CheckExpectedRangesByTimestamp("{ }"); |
| 4516 CheckNoNextBuffer(); | 4488 CheckNoNextBuffer(); |
| 4517 | 4489 |
| 4518 // Append buffers at the original timestamps and verify no stall. | 4490 // Append buffers at the original timestamps and verify no stall. |
| 4519 NewSegmentAppend("1000K 1010 1020D10"); | 4491 NewCodedFrameGroupAppend("1000K 1010 1020D10"); |
| 4520 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); | 4492 CheckExpectedRangesByTimestamp("{ [1000,1030) }"); |
| 4521 CheckExpectedBuffers("1000K 1010 1020D10"); | 4493 CheckExpectedBuffers("1000K 1010 1020D10"); |
| 4522 CheckNoNextBuffer(); | 4494 CheckNoNextBuffer(); |
| 4523 } | 4495 } |
| 4524 | 4496 |
| 4525 TEST_F(SourceBufferStreamTest, ReSeekBeyondThreshold_EarlierTimestamps) { | 4497 TEST_F(SourceBufferStreamTest, ReSeekBeyondThreshold_EarlierTimestamps) { |
| 4526 // Append a few buffers. | 4498 // Append a few buffers. |
| 4527 NewSegmentAppend("2000K 2010 2020D10"); | 4499 NewCodedFrameGroupAppend("2000K 2010 2020D10"); |
| 4528 CheckExpectedRangesByTimestamp("{ [2000,2030) }"); | 4500 CheckExpectedRangesByTimestamp("{ [2000,2030) }"); |
| 4529 | 4501 |
| 4530 // Don't read any buffers between Seek and Remove. | 4502 // Don't read any buffers between Seek and Remove. |
| 4531 SeekToTimestampMs(2000); | 4503 SeekToTimestampMs(2000); |
| 4532 RemoveInMs(2000, 2030, 2030); | 4504 RemoveInMs(2000, 2030, 2030); |
| 4533 CheckExpectedRangesByTimestamp("{ }"); | 4505 CheckExpectedRangesByTimestamp("{ }"); |
| 4534 CheckNoNextBuffer(); | 4506 CheckNoNextBuffer(); |
| 4535 | 4507 |
| 4536 // Append buffers before the original timestamps and verify no stall (the | 4508 // Append buffers before the original timestamps and verify no stall (the |
| 4537 // re-seek to time 2 seconds should still be satisfied with the new buffers | 4509 // re-seek to time 2 seconds should still be satisfied with the new buffers |
| 4538 // and should emit preroll from last keyframe). | 4510 // and should emit preroll from last keyframe). |
| 4539 NewSegmentAppend("1080K 1090 2000D10"); | 4511 NewCodedFrameGroupAppend("1080K 1090 2000D10"); |
| 4540 CheckExpectedRangesByTimestamp("{ [1080,2010) }"); | 4512 CheckExpectedRangesByTimestamp("{ [1080,2010) }"); |
| 4541 CheckExpectedBuffers("1080K 1090 2000D10"); | 4513 CheckExpectedBuffers("1080K 1090 2000D10"); |
| 4542 CheckNoNextBuffer(); | 4514 CheckNoNextBuffer(); |
| 4543 } | 4515 } |
| 4544 | 4516 |
| 4545 TEST_F(SourceBufferStreamTest, ConfigChange_ReSeek) { | 4517 TEST_F(SourceBufferStreamTest, ConfigChange_ReSeek) { |
| 4546 // Append a few buffers, with a config change in the middle. | 4518 // Append a few buffers, with a config change in the middle. |
| 4547 VideoDecoderConfig new_config = TestVideoConfig::Large(); | 4519 VideoDecoderConfig new_config = TestVideoConfig::Large(); |
| 4548 NewSegmentAppend("2000K 2010 2020D10"); | 4520 NewCodedFrameGroupAppend("2000K 2010 2020D10"); |
| 4549 stream_->UpdateVideoConfig(new_config); | 4521 stream_->UpdateVideoConfig(new_config); |
| 4550 NewSegmentAppend("2030K 2040 2050D10"); | 4522 NewCodedFrameGroupAppend("2030K 2040 2050D10"); |
| 4551 CheckExpectedRangesByTimestamp("{ [2000,2060) }"); | 4523 CheckExpectedRangesByTimestamp("{ [2000,2060) }"); |
| 4552 | 4524 |
| 4553 // Read the config change, but don't read any non-config-change buffer between | 4525 // Read the config change, but don't read any non-config-change buffer between |
| 4554 // Seek and Remove. | 4526 // Seek and Remove. |
| 4555 scoped_refptr<StreamParserBuffer> buffer; | 4527 scoped_refptr<StreamParserBuffer> buffer; |
| 4556 CheckVideoConfig(video_config_); | 4528 CheckVideoConfig(video_config_); |
| 4557 SeekToTimestampMs(2030); | 4529 SeekToTimestampMs(2030); |
| 4558 CheckVideoConfig(video_config_); | 4530 CheckVideoConfig(video_config_); |
| 4559 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 4531 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 4560 CheckVideoConfig(new_config); | 4532 CheckVideoConfig(new_config); |
| 4561 | 4533 |
| 4562 // Trigger the re-seek. | 4534 // Trigger the re-seek. |
| 4563 RemoveInMs(2030, 2060, 2060); | 4535 RemoveInMs(2030, 2060, 2060); |
| 4564 CheckExpectedRangesByTimestamp("{ [2000,2030) }"); | 4536 CheckExpectedRangesByTimestamp("{ [2000,2030) }"); |
| 4565 CheckNoNextBuffer(); | 4537 CheckNoNextBuffer(); |
| 4566 | 4538 |
| 4567 // Append buffers at the original timestamps and verify no stall or redundant | 4539 // Append buffers at the original timestamps and verify no stall or redundant |
| 4568 // signalling of config change. | 4540 // signalling of config change. |
| 4569 NewSegmentAppend("2030K 2040 2050D10"); | 4541 NewCodedFrameGroupAppend("2030K 2040 2050D10"); |
| 4570 CheckVideoConfig(new_config); | 4542 CheckVideoConfig(new_config); |
| 4571 CheckExpectedRangesByTimestamp("{ [2000,2060) }"); | 4543 CheckExpectedRangesByTimestamp("{ [2000,2060) }"); |
| 4572 CheckExpectedBuffers("2030K 2040 2050D10"); | 4544 CheckExpectedBuffers("2030K 2040 2050D10"); |
| 4573 CheckNoNextBuffer(); | 4545 CheckNoNextBuffer(); |
| 4574 CheckVideoConfig(new_config); | 4546 CheckVideoConfig(new_config); |
| 4575 | 4547 |
| 4576 // Seek to the start of buffered and verify config changes and buffers. | 4548 // Seek to the start of buffered and verify config changes and buffers. |
| 4577 SeekToTimestampMs(2000); | 4549 SeekToTimestampMs(2000); |
| 4578 CheckVideoConfig(new_config); | 4550 CheckVideoConfig(new_config); |
| 4579 ASSERT_FALSE(new_config.Matches(video_config_)); | 4551 ASSERT_FALSE(new_config.Matches(video_config_)); |
| 4580 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 4552 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 4581 CheckVideoConfig(video_config_); | 4553 CheckVideoConfig(video_config_); |
| 4582 CheckExpectedBuffers("2000K 2010 2020D10"); | 4554 CheckExpectedBuffers("2000K 2010 2020D10"); |
| 4583 CheckVideoConfig(video_config_); | 4555 CheckVideoConfig(video_config_); |
| 4584 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); | 4556 EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange); |
| 4585 CheckVideoConfig(new_config); | 4557 CheckVideoConfig(new_config); |
| 4586 CheckExpectedBuffers("2030K 2040 2050D10"); | 4558 CheckExpectedBuffers("2030K 2040 2050D10"); |
| 4587 CheckNoNextBuffer(); | 4559 CheckNoNextBuffer(); |
| 4588 CheckVideoConfig(new_config); | 4560 CheckVideoConfig(new_config); |
| 4589 } | 4561 } |
| 4590 | 4562 |
| 4591 TEST_F(SourceBufferStreamTest, TrackBuffer_ExhaustionWithSkipForward) { | 4563 TEST_F(SourceBufferStreamTest, TrackBuffer_ExhaustionWithSkipForward) { |
| 4592 NewSegmentAppend("0K 10 20 30 40"); | 4564 NewCodedFrameGroupAppend("0K 10 20 30 40"); |
| 4593 | 4565 |
| 4594 // Read the first 4 buffers, so next buffer is at time 40. | 4566 // Read the first 4 buffers, so next buffer is at time 40. |
| 4595 Seek(0); | 4567 Seek(0); |
| 4596 CheckExpectedRangesByTimestamp("{ [0,50) }"); | 4568 CheckExpectedRangesByTimestamp("{ [0,50) }"); |
| 4597 CheckExpectedBuffers("0K 10 20 30"); | 4569 CheckExpectedBuffers("0K 10 20 30"); |
| 4598 | 4570 |
| 4599 // Overlap-append, populating track buffer with timestamp 40 from original | 4571 // Overlap-append, populating track buffer with timestamp 40 from original |
| 4600 // append. Confirm there could be a large jump in time until the next key | 4572 // append. Confirm there could be a large jump in time until the next key |
| 4601 // frame after exhausting the track buffer. | 4573 // frame after exhausting the track buffer. |
| 4602 NewSegmentAppend( | 4574 NewCodedFrameGroupAppend( |
| 4603 "31K 41 51 61 71 81 91 101 111 121 " | 4575 "31K 41 51 61 71 81 91 101 111 121 " |
| 4604 "131K 141"); | 4576 "131K 141"); |
| 4605 CheckExpectedRangesByTimestamp("{ [0,151) }"); | 4577 CheckExpectedRangesByTimestamp("{ [0,151) }"); |
| 4606 | 4578 |
| 4607 // Confirm the large jump occurs and warning log is generated. | 4579 // Confirm the large jump occurs and warning log is generated. |
| 4608 // If this test is changed, update | 4580 // If this test is changed, update |
| 4609 // TrackBufferExhaustion_ImmediateNewTrackBuffer accordingly. | 4581 // TrackBufferExhaustion_ImmediateNewTrackBuffer accordingly. |
| 4610 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91)); | 4582 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91)); |
| 4611 | 4583 |
| 4612 CheckExpectedBuffers("40 131K 141"); | 4584 CheckExpectedBuffers("40 131K 141"); |
| 4613 CheckNoNextBuffer(); | 4585 CheckNoNextBuffer(); |
| 4614 } | 4586 } |
| 4615 | 4587 |
| 4616 TEST_F(SourceBufferStreamTest, | 4588 TEST_F(SourceBufferStreamTest, |
| 4617 TrackBuffer_ExhaustionAndImmediateNewTrackBuffer) { | 4589 TrackBuffer_ExhaustionAndImmediateNewTrackBuffer) { |
| 4618 NewSegmentAppend("0K 10 20 30 40"); | 4590 NewCodedFrameGroupAppend("0K 10 20 30 40"); |
| 4619 | 4591 |
| 4620 // Read the first 4 buffers, so next buffer is at time 40. | 4592 // Read the first 4 buffers, so next buffer is at time 40. |
| 4621 Seek(0); | 4593 Seek(0); |
| 4622 CheckExpectedRangesByTimestamp("{ [0,50) }"); | 4594 CheckExpectedRangesByTimestamp("{ [0,50) }"); |
| 4623 CheckExpectedBuffers("0K 10 20 30"); | 4595 CheckExpectedBuffers("0K 10 20 30"); |
| 4624 | 4596 |
| 4625 // Overlap-append | 4597 // Overlap-append |
| 4626 NewSegmentAppend( | 4598 NewCodedFrameGroupAppend( |
| 4627 "31K 41 51 61 71 81 91 101 111 121 " | 4599 "31K 41 51 61 71 81 91 101 111 121 " |
| 4628 "131K 141"); | 4600 "131K 141"); |
| 4629 CheckExpectedRangesByTimestamp("{ [0,151) }"); | 4601 CheckExpectedRangesByTimestamp("{ [0,151) }"); |
| 4630 | 4602 |
| 4631 // Exhaust the track buffer, but don't read any of the overlapping append yet. | 4603 // Exhaust the track buffer, but don't read any of the overlapping append yet. |
| 4632 CheckExpectedBuffers("40"); | 4604 CheckExpectedBuffers("40"); |
| 4633 | 4605 |
| 4634 // Selected range's next buffer is now the 131K buffer from the overlapping | 4606 // Selected range's next buffer is now the 131K buffer from the overlapping |
| 4635 // append. (See TrackBuffer_ExhaustionWithSkipForward for that verification.) | 4607 // append. (See TrackBuffer_ExhaustionWithSkipForward for that verification.) |
| 4636 // Do another overlap-append to immediately create another track buffer and | 4608 // Do another overlap-append to immediately create another track buffer and |
| 4637 // verify both track buffer exhaustions skip forward and emit log warnings. | 4609 // verify both track buffer exhaustions skip forward and emit log warnings. |
| 4638 NewSegmentAppend("22K 32 42 52 62 72 82 92 102 112 122K 132 142 152K 162"); | 4610 NewCodedFrameGroupAppend( |
| 4611 "22K 32 42 52 62 72 82 92 102 112 122K 132 142 152K 162"); | |
| 4639 CheckExpectedRangesByTimestamp("{ [0,172) }"); | 4612 CheckExpectedRangesByTimestamp("{ [0,172) }"); |
| 4640 | 4613 |
| 4641 InSequence s; | 4614 InSequence s; |
| 4642 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91)); | 4615 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(91)); |
| 4643 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(11)); | 4616 EXPECT_MEDIA_LOG(ContainsTrackBufferExhaustionSkipLog(11)); |
| 4644 | 4617 |
| 4645 CheckExpectedBuffers("131K 141 152K 162"); | 4618 CheckExpectedBuffers("131K 141 152K 162"); |
| 4646 CheckNoNextBuffer(); | 4619 CheckNoNextBuffer(); |
| 4647 } | 4620 } |
| 4648 | 4621 |
| 4622 TEST_F( | |
| 4623 SourceBufferStreamTest, | |
| 4624 AdjacentCodedFrameGroupContinuation_NoGapCreatedByTinyGapInGroupContinuation ) { | |
| 4625 NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10"); | |
| 4626 CheckExpectedRangesByTimestamp("{ [0,60) }"); | |
| 4627 | |
| 4628 // Continue appending to the previously started coded frame group, albeit with | |
| 4629 // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap. | |
| 4630 AppendBuffers("61K 71D10"); | |
| 4631 CheckExpectedRangesByTimestamp("{ [0,81) }"); | |
| 4632 } | |
| 4633 | |
| 4634 TEST_F(SourceBufferStreamTest, | |
| 4635 AdjacentCodedFrameGroupContinuation_NoGapCreatedPrefixRemoved) { | |
| 4636 NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10"); | |
| 4637 CheckExpectedRangesByTimestamp("{ [0,60) }"); | |
| 4638 | |
| 4639 RemoveInMs(0, 35, 60); | |
| 4640 CheckExpectedRangesByTimestamp("{ [40,60) }"); | |
| 4641 | |
| 4642 // Continue appending to the previously started coded frame group, albeit with | |
| 4643 // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap. | |
| 4644 AppendBuffers("61K 71D10"); | |
| 4645 CheckExpectedRangesByTimestamp("{ [40,81) }"); | |
| 4646 } | |
| 4647 | |
| 4648 TEST_F(SourceBufferStreamTest, | |
| 4649 AdjacentNewCodedFrameGroupContinuation_NoGapCreatedPrefixRemoved) { | |
| 4650 NewCodedFrameGroupAppend("0K 10 20K 30 40K 50D10"); | |
| 4651 CheckExpectedRangesByTimestamp("{ [0,60) }"); | |
| 4652 | |
| 4653 RemoveInMs(0, 35, 60); | |
| 4654 CheckExpectedRangesByTimestamp("{ [40,60) }"); | |
| 4655 | |
| 4656 // Continue appending, with a new coded frame group, albeit with | |
| 4657 // a tiny (1ms) gap. This gap should *NOT* produce a buffered range gap. | |
| 4658 // This test demonstrates the "pre-relaxation" behavior, where a new "media | |
| 4659 // segment" (now a new "coded frame group") was signaled at every media | |
| 4660 // segment boundary. | |
| 4661 NewCodedFrameGroupAppend("61K 71D10"); | |
| 4662 CheckExpectedRangesByTimestamp("{ [40,81) }"); | |
| 4663 } | |
| 4664 | |
| 4665 TEST_F(SourceBufferStreamTest, | |
| 4666 StartCodedFrameGroup_RemoveThenAppendMoreMuchLater) { | |
| 4667 NewCodedFrameGroupAppend("1000K 1010 1020 1030K 1040 1050 1060K 1070 1080"); | |
| 4668 NewCodedFrameGroupAppend("0K 10 20"); | |
| 4669 CheckExpectedRangesByTimestamp("{ [0,30) [1000,1090) }"); | |
| 4670 | |
| 4671 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(1070)); | |
| 4672 CheckExpectedRangesByTimestamp("{ [0,30) [1000,1090) }"); | |
| 4673 | |
| 4674 RemoveInMs(1030, 1050, 1090); | |
| 4675 CheckExpectedRangesByTimestamp("{ [0,30) [1000,1030) [1060,1090) }"); | |
| 4676 | |
| 4677 // We've signalled that we're about to do some appends to a coded frame group | |
| 4678 // which starts at time 1070ms. Note that the first frame, if any ever, | |
| 4679 // appended to this SourceBufferStream for that coded frame group must have a | |
| 4680 // decode timestamp >= 1070ms (it can be significantly in the future). | |
| 4681 // Regardless, that appended frame must be buffered into the same existing | |
| 4682 // range as current [1060,1090), since the new coded frame group's start of | |
| 4683 // 1070ms is within that range. | |
| 4684 AppendBuffers("2000K 2010"); | |
| 4685 CheckExpectedRangesByTimestamp("{ [0,30) [1000,1030) [1060,2020) }"); | |
| 4686 SeekToTimestampMs(1060); | |
| 4687 CheckExpectedBuffers("1060K 2000K 2010"); | |
| 4688 CheckNoNextBuffer(); | |
| 4689 } | |
| 4690 | |
| 4691 TEST_F(SourceBufferStreamTest, | |
| 4692 StartCodedFrameGroup_InExisting_AppendMuchLater) { | |
| 4693 NewCodedFrameGroupAppend("0K 10 20 30K 40 50"); | |
| 4694 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45)); | |
| 4695 CheckExpectedRangesByTimestamp("{ [0,60) }"); | |
| 4696 | |
| 4697 AppendBuffers("2000K 2010"); | |
| 4698 CheckExpectedRangesByTimestamp("{ [0,2020) }"); | |
| 4699 Seek(0); | |
| 4700 CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010"); | |
| 4701 CheckNoNextBuffer(); | |
| 4702 } | |
| 4703 | |
| 4704 TEST_F(SourceBufferStreamTest, | |
| 4705 StartCodedFrameGroup_InExisting_RemoveGOP_ThenAppend_1) { | |
| 4706 NewCodedFrameGroupAppend("0K 10 20 30K 40 50"); | |
| 4707 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(30)); | |
| 4708 RemoveInMs(30, 60, 60); | |
| 4709 CheckExpectedRangesByTimestamp("{ [0,30) }"); | |
| 4710 | |
| 4711 AppendBuffers("2000K 2010"); | |
| 4712 CheckExpectedRangesByTimestamp("{ [0,2020) }"); | |
| 4713 Seek(0); | |
| 4714 CheckExpectedBuffers("0K 10 20 2000K 2010"); | |
| 4715 CheckNoNextBuffer(); | |
| 4716 } | |
| 4717 | |
| 4718 TEST_F(SourceBufferStreamTest, | |
| 4719 StartCodedFrameGroup_InExisting_RemoveGOP_ThenAppend_2) { | |
| 4720 NewCodedFrameGroupAppend("0K 10 20 30K 40 50"); | |
| 4721 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45)); | |
| 4722 RemoveInMs(30, 60, 60); | |
| 4723 CheckExpectedRangesByTimestamp("{ [0,30) }"); | |
| 4724 | |
| 4725 AppendBuffers("2000K 2010"); | |
| 4726 CheckExpectedRangesByTimestamp("{ [0,30) [45,2020) }"); | |
| 4727 Seek(0); | |
| 4728 CheckExpectedBuffers("0K 10 20"); | |
| 4729 CheckNoNextBuffer(); | |
| 4730 SeekToTimestampMs(45); | |
| 4731 CheckExpectedBuffers("2000K 2010"); | |
| 4732 CheckNoNextBuffer(); | |
| 4733 SeekToTimestampMs(1000); | |
| 4734 CheckExpectedBuffers("2000K 2010"); | |
| 4735 CheckNoNextBuffer(); | |
| 4736 } | |
| 4737 | |
| 4738 TEST_F(SourceBufferStreamTest, | |
| 4739 StartCodedFrameGroup_InExisting_RemoveMostRecentAppend_ThenAppend_1) { | |
| 4740 NewCodedFrameGroupAppend("0K 10 20 30K 40 50"); | |
| 4741 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(45)); | |
| 4742 RemoveInMs(50, 60, 60); | |
| 4743 CheckExpectedRangesByTimestamp("{ [0,50) }"); | |
| 4744 | |
| 4745 AppendBuffers("2000K 2010"); | |
| 4746 CheckExpectedRangesByTimestamp("{ [0,2020) }"); | |
| 4747 Seek(0); | |
| 4748 CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010"); | |
| 4749 CheckNoNextBuffer(); | |
| 4750 } | |
| 4751 | |
| 4752 TEST_F(SourceBufferStreamTest, | |
| 4753 StartCodedFrameGroup_InExisting_RemoveMostRecentAppend_ThenAppend_2) { | |
| 4754 NewCodedFrameGroupAppend("0K 10 20 30K 40 50"); | |
| 4755 SignalStartOfCodedFrameGroup(base::TimeDelta::FromMilliseconds(50)); | |
| 4756 RemoveInMs(50, 60, 60); | |
| 4757 CheckExpectedRangesByTimestamp("{ [0,50) }"); | |
| 4758 | |
| 4759 AppendBuffers("2000K 2010"); | |
| 4760 CheckExpectedRangesByTimestamp("{ [0,2020) }"); | |
| 4761 Seek(0); | |
| 4762 CheckExpectedBuffers("0K 10 20 30K 40 2000K 2010"); | |
| 4763 CheckNoNextBuffer(); | |
| 4764 } | |
| 4765 | |
| 4649 // TODO(vrk): Add unit tests where keyframes are unaligned between streams. | 4766 // TODO(vrk): Add unit tests where keyframes are unaligned between streams. |
| 4650 // (crbug.com/133557) | 4767 // (crbug.com/133557) |
| 4651 | 4768 |
| 4652 // TODO(vrk): Add unit tests with end of stream being called at interesting | 4769 // TODO(vrk): Add unit tests with end of stream being called at interesting |
| 4653 // times. | 4770 // times. |
| 4654 | 4771 |
| 4655 } // namespace media | 4772 } // namespace media |
| OLD | NEW |