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

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

Issue 1670033002: Reland: MSE: Relax the 'media segment must begin with keyframe' requirement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comment responses, rebase, new CHECK_LT in SBR is failing. Investigating still. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/filters/source_buffer_stream.cc ('k') | media/formats/mp2t/mp2t_stream_parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/source_buffer_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « media/filters/source_buffer_stream.cc ('k') | media/formats/mp2t/mp2t_stream_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698