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
3// found in the LICENSE file.
4
5#include "media/filters/source_buffer_stream.h"
6
7#include <string>
8
9#include "base/bind.h"
10#include "base/bind_helpers.h"
11#include "base/logging.h"
12#include "base/strings/string_number_conversions.h"
13#include "base/strings/string_split.h"
14#include "base/strings/string_util.h"
15#include "media/base/data_buffer.h"
16#include "media/base/media_log.h"
17#include "media/base/test_helpers.h"
18#include "media/base/text_track_config.h"
19#include "media/filters/webvtt_util.h"
20#include "testing/gtest/include/gtest/gtest.h"
21
22namespace media {
23
24typedef StreamParser::BufferQueue BufferQueue;
25
26static const int kDefaultFramesPerSecond = 30;
27static const int kDefaultKeyframesPerSecond = 6;
28static const uint8 kDataA = 0x11;
29static const uint8 kDataB = 0x33;
30static const int kDataSize = 1;
31
32class SourceBufferStreamTest : public testing::Test {
33 protected:
34  SourceBufferStreamTest() {
35    video_config_ = TestVideoConfig::Normal();
36    SetStreamInfo(kDefaultFramesPerSecond, kDefaultKeyframesPerSecond);
37    stream_.reset(new SourceBufferStream(video_config_, log_cb(), true));
38  }
39
40  void SetMemoryLimit(int buffers_of_data) {
41    stream_->set_memory_limit(buffers_of_data * kDataSize);
42  }
43
44  void SetStreamInfo(int frames_per_second, int keyframes_per_second) {
45    frames_per_second_ = frames_per_second;
46    keyframes_per_second_ = keyframes_per_second;
47    frame_duration_ = ConvertToFrameDuration(frames_per_second);
48  }
49
50  void SetTextStream() {
51    video_config_ = TestVideoConfig::Invalid();
52    TextTrackConfig config(kTextSubtitles, "", "", "");
53    stream_.reset(new SourceBufferStream(config, LogCB(), true));
54    SetStreamInfo(2, 2);
55  }
56
57  void SetAudioStream() {
58    video_config_ = TestVideoConfig::Invalid();
59    audio_config_.Initialize(kCodecVorbis,
60                             kSampleFormatPlanarF32,
61                             CHANNEL_LAYOUT_STEREO,
62                             1000,
63                             NULL,
64                             0,
65                             false,
66                             false,
67                             base::TimeDelta(),
68                             0);
69    stream_.reset(new SourceBufferStream(audio_config_, LogCB(), true));
70
71    // Equivalent to 2ms per frame.
72    SetStreamInfo(500, 500);
73  }
74
75  void NewSegmentAppend(int starting_position, int number_of_buffers) {
76    AppendBuffers(starting_position, number_of_buffers, true,
77                  base::TimeDelta(), true, &kDataA, kDataSize);
78  }
79
80  void NewSegmentAppend(int starting_position, int number_of_buffers,
81                        const uint8* data) {
82    AppendBuffers(starting_position, number_of_buffers, true,
83                  base::TimeDelta(), true, data, kDataSize);
84  }
85
86  void NewSegmentAppend_OffsetFirstBuffer(
87      int starting_position, int number_of_buffers,
88      base::TimeDelta first_buffer_offset) {
89    AppendBuffers(starting_position, number_of_buffers, true,
90                  first_buffer_offset, true, &kDataA, kDataSize);
91  }
92
93  void NewSegmentAppend_ExpectFailure(
94      int starting_position, int number_of_buffers) {
95    AppendBuffers(starting_position, number_of_buffers, true,
96                  base::TimeDelta(), false, &kDataA, kDataSize);
97  }
98
99  void AppendBuffers(int starting_position, int number_of_buffers) {
100    AppendBuffers(starting_position, number_of_buffers, false,
101                  base::TimeDelta(), true, &kDataA, kDataSize);
102  }
103
104  void AppendBuffers(int starting_position, int number_of_buffers,
105                     const uint8* data) {
106    AppendBuffers(starting_position, number_of_buffers, false,
107                  base::TimeDelta(), true, data, kDataSize);
108  }
109
110  void NewSegmentAppend(const std::string& buffers_to_append) {
111    AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, true);
112  }
113
114  void NewSegmentAppend(base::TimeDelta start_timestamp,
115                        const std::string& buffers_to_append) {
116    AppendBuffers(buffers_to_append, true, start_timestamp, false, true);
117  }
118
119  void AppendBuffers(const std::string& buffers_to_append) {
120    AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, true);
121  }
122
123  void NewSegmentAppendOneByOne(const std::string& buffers_to_append) {
124    AppendBuffers(buffers_to_append, true, kNoTimestamp(), true, true);
125  }
126
127  void AppendBuffersOneByOne(const std::string& buffers_to_append) {
128    AppendBuffers(buffers_to_append, false, kNoTimestamp(), true, true);
129  }
130
131  void NewSegmentAppend_ExpectFailure(const std::string& buffers_to_append) {
132    AppendBuffers(buffers_to_append, true, kNoTimestamp(), false, false);
133  }
134
135  void AppendBuffers_ExpectFailure(const std::string& buffers_to_append) {
136    AppendBuffers(buffers_to_append, false, kNoTimestamp(), false, false);
137  }
138
139  void Seek(int position) {
140    stream_->Seek(position * frame_duration_);
141  }
142
143  void SeekToTimestamp(base::TimeDelta timestamp) {
144    stream_->Seek(timestamp);
145  }
146
147  void RemoveInMs(int start, int end, int duration) {
148    Remove(base::TimeDelta::FromMilliseconds(start),
149           base::TimeDelta::FromMilliseconds(end),
150           base::TimeDelta::FromMilliseconds(duration));
151  }
152
153  void Remove(base::TimeDelta start, base::TimeDelta end,
154              base::TimeDelta duration) {
155    stream_->Remove(start, end, duration);
156  }
157
158  int GetRemovalRangeInMs(int start, int end, int bytes_to_free,
159                          int* removal_end) {
160    DecodeTimestamp removal_end_timestamp =
161        DecodeTimestamp::FromMilliseconds(*removal_end);
162    int bytes_removed = stream_->GetRemovalRange(
163        DecodeTimestamp::FromMilliseconds(start),
164        DecodeTimestamp::FromMilliseconds(end), bytes_to_free,
165        &removal_end_timestamp);
166    *removal_end = removal_end_timestamp.InMilliseconds();
167    return bytes_removed;
168  }
169
170  void CheckExpectedRanges(const std::string& expected) {
171    Ranges<base::TimeDelta> r = stream_->GetBufferedTime();
172
173    std::stringstream ss;
174    ss << "{ ";
175    for (size_t i = 0; i < r.size(); ++i) {
176      int64 start = (r.start(i) / frame_duration_);
177      int64 end = (r.end(i) / frame_duration_) - 1;
178      ss << "[" << start << "," << end << ") ";
179    }
180    ss << "}";
181    EXPECT_EQ(expected, ss.str());
182  }
183
184  void CheckExpectedRangesByTimestamp(const std::string& expected) {
185    Ranges<base::TimeDelta> r = stream_->GetBufferedTime();
186
187    std::stringstream ss;
188    ss << "{ ";
189    for (size_t i = 0; i < r.size(); ++i) {
190      int64 start = r.start(i).InMilliseconds();
191      int64 end = r.end(i).InMilliseconds();
192      ss << "[" << start << "," << end << ") ";
193    }
194    ss << "}";
195    EXPECT_EQ(expected, ss.str());
196  }
197
198  void CheckExpectedBuffers(
199      int starting_position, int ending_position) {
200    CheckExpectedBuffers(starting_position, ending_position, false, NULL, 0);
201  }
202
203  void CheckExpectedBuffers(
204      int starting_position, int ending_position, bool expect_keyframe) {
205    CheckExpectedBuffers(starting_position, ending_position, expect_keyframe,
206                         NULL, 0);
207  }
208
209  void CheckExpectedBuffers(
210      int starting_position, int ending_position, const uint8* data) {
211    CheckExpectedBuffers(starting_position, ending_position, false, data,
212                         kDataSize);
213  }
214
215  void CheckExpectedBuffers(
216      int starting_position, int ending_position, const uint8* data,
217      bool expect_keyframe) {
218    CheckExpectedBuffers(starting_position, ending_position, expect_keyframe,
219                         data, kDataSize);
220  }
221
222  void CheckExpectedBuffers(
223      int starting_position, int ending_position, bool expect_keyframe,
224      const uint8* expected_data, int expected_size) {
225    int current_position = starting_position;
226    for (; current_position <= ending_position; current_position++) {
227      scoped_refptr<StreamParserBuffer> buffer;
228      SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer);
229
230      EXPECT_NE(status, SourceBufferStream::kConfigChange);
231      if (status != SourceBufferStream::kSuccess)
232        break;
233
234      if (expect_keyframe && current_position == starting_position)
235        EXPECT_TRUE(buffer->IsKeyframe());
236
237      if (expected_data) {
238        const uint8* actual_data = buffer->data();
239        const int actual_size = buffer->data_size();
240        EXPECT_EQ(expected_size, actual_size);
241        for (int i = 0; i < std::min(actual_size, expected_size); i++) {
242          EXPECT_EQ(expected_data[i], actual_data[i]);
243        }
244      }
245
246      EXPECT_EQ(buffer->GetDecodeTimestamp() / frame_duration_,
247                current_position);
248    }
249
250    EXPECT_EQ(ending_position + 1, current_position);
251  }
252
253  void CheckExpectedBuffers(const std::string& expected) {
254    std::vector<std::string> timestamps;
255    base::SplitString(expected, ' ', &timestamps);
256    std::stringstream ss;
257    const SourceBufferStream::Type type = stream_->GetType();
258    base::TimeDelta active_splice_timestamp = kNoTimestamp();
259    for (size_t i = 0; i < timestamps.size(); i++) {
260      scoped_refptr<StreamParserBuffer> buffer;
261      SourceBufferStream::Status status = stream_->GetNextBuffer(&buffer);
262
263      if (i > 0)
264        ss << " ";
265
266      if (status == SourceBufferStream::kConfigChange) {
267        switch (type) {
268          case SourceBufferStream::kVideo:
269            stream_->GetCurrentVideoDecoderConfig();
270            break;
271          case SourceBufferStream::kAudio:
272            stream_->GetCurrentAudioDecoderConfig();
273            break;
274          case SourceBufferStream::kText:
275            stream_->GetCurrentTextTrackConfig();
276            break;
277        }
278
279        EXPECT_EQ("C", timestamps[i]);
280
281        ss << "C";
282        continue;
283      }
284
285      EXPECT_EQ(SourceBufferStream::kSuccess, status);
286      if (status != SourceBufferStream::kSuccess)
287        break;
288
289      ss << buffer->timestamp().InMilliseconds();
290
291      if (buffer->GetDecodeTimestamp() !=
292          DecodeTimestamp::FromPresentationTime(buffer->timestamp())) {
293        ss << "|" << buffer->GetDecodeTimestamp().InMilliseconds();
294      }
295
296      // Handle preroll buffers.
297      if (EndsWith(timestamps[i], "P", true)) {
298        ASSERT_TRUE(buffer->IsKeyframe());
299        scoped_refptr<StreamParserBuffer> preroll_buffer;
300        preroll_buffer.swap(buffer);
301
302        // When a preroll buffer is encountered we should be able to request one
303        // more buffer.  The first buffer should match the timestamp and config
304        // of the second buffer, except that its discard_padding() should be its
305        // duration.
306        ASSERT_EQ(SourceBufferStream::kSuccess,
307                  stream_->GetNextBuffer(&buffer));
308        ASSERT_EQ(buffer->GetConfigId(), preroll_buffer->GetConfigId());
309        ASSERT_EQ(buffer->track_id(), preroll_buffer->track_id());
310        ASSERT_EQ(buffer->timestamp(), preroll_buffer->timestamp());
311        ASSERT_EQ(buffer->GetDecodeTimestamp(),
312                  preroll_buffer->GetDecodeTimestamp());
313        ASSERT_EQ(kInfiniteDuration(), preroll_buffer->discard_padding().first);
314        ASSERT_EQ(base::TimeDelta(), preroll_buffer->discard_padding().second);
315        ASSERT_TRUE(buffer->IsKeyframe());
316
317        ss << "P";
318      } else if (buffer->IsKeyframe()) {
319        ss << "K";
320      }
321
322      // Until the last splice frame is seen, indicated by a matching timestamp,
323      // all buffers must have the same splice_timestamp().
324      if (buffer->timestamp() == active_splice_timestamp) {
325        ASSERT_EQ(buffer->splice_timestamp(), kNoTimestamp());
326      } else {
327        ASSERT_TRUE(active_splice_timestamp == kNoTimestamp() ||
328                    active_splice_timestamp == buffer->splice_timestamp());
329      }
330
331      active_splice_timestamp = buffer->splice_timestamp();
332    }
333    EXPECT_EQ(expected, ss.str());
334  }
335
336  void CheckNoNextBuffer() {
337    scoped_refptr<StreamParserBuffer> buffer;
338    EXPECT_EQ(SourceBufferStream::kNeedBuffer, stream_->GetNextBuffer(&buffer));
339  }
340
341  void CheckVideoConfig(const VideoDecoderConfig& config) {
342    const VideoDecoderConfig& actual = stream_->GetCurrentVideoDecoderConfig();
343    EXPECT_TRUE(actual.Matches(config))
344        << "Expected: " << config.AsHumanReadableString()
345        << "\nActual: " << actual.AsHumanReadableString();
346  }
347
348  void CheckAudioConfig(const AudioDecoderConfig& config) {
349    const AudioDecoderConfig& actual = stream_->GetCurrentAudioDecoderConfig();
350    EXPECT_TRUE(actual.Matches(config))
351        << "Expected: " << config.AsHumanReadableString()
352        << "\nActual: " << actual.AsHumanReadableString();
353  }
354
355  const LogCB log_cb() {
356    return base::Bind(&SourceBufferStreamTest::DebugMediaLog,
357                      base::Unretained(this));
358  }
359
360  base::TimeDelta frame_duration() const { return frame_duration_; }
361
362  scoped_ptr<SourceBufferStream> stream_;
363  VideoDecoderConfig video_config_;
364  AudioDecoderConfig audio_config_;
365
366 private:
367  base::TimeDelta ConvertToFrameDuration(int frames_per_second) {
368    return base::TimeDelta::FromMicroseconds(
369        base::Time::kMicrosecondsPerSecond / frames_per_second);
370  }
371
372  void AppendBuffers(int starting_position,
373                     int number_of_buffers,
374                     bool begin_media_segment,
375                     base::TimeDelta first_buffer_offset,
376                     bool expect_success,
377                     const uint8* data,
378                     int size) {
379    if (begin_media_segment)
380      stream_->OnNewMediaSegment(DecodeTimestamp::FromPresentationTime(
381          starting_position * frame_duration_));
382
383    int keyframe_interval = frames_per_second_ / keyframes_per_second_;
384
385    BufferQueue queue;
386    for (int i = 0; i < number_of_buffers; i++) {
387      int position = starting_position + i;
388      bool is_keyframe = position % keyframe_interval == 0;
389      // Buffer type and track ID are meaningless to these tests.
390      scoped_refptr<StreamParserBuffer> buffer =
391          StreamParserBuffer::CopyFrom(data, size, is_keyframe,
392                                       DemuxerStream::AUDIO, 0);
393      base::TimeDelta timestamp = frame_duration_ * position;
394
395      if (i == 0)
396        timestamp += first_buffer_offset;
397      buffer->SetDecodeTimestamp(
398          DecodeTimestamp::FromPresentationTime(timestamp));
399
400      // Simulate an IBB...BBP pattern in which all B-frames reference both
401      // the I- and P-frames. For a GOP with playback order 12345, this would
402      // result in a decode timestamp order of 15234.
403      base::TimeDelta presentation_timestamp;
404      if (is_keyframe) {
405        presentation_timestamp = timestamp;
406      } else if ((position - 1) % keyframe_interval == 0) {
407        // This is the P-frame (first frame following the I-frame)
408        presentation_timestamp =
409            (timestamp + frame_duration_ * (keyframe_interval - 2));
410      } else {
411        presentation_timestamp = timestamp - frame_duration_;
412      }
413      buffer->set_timestamp(presentation_timestamp);
414      buffer->set_duration(frame_duration_);
415
416      queue.push_back(buffer);
417    }
418    if (!queue.empty())
419      EXPECT_EQ(expect_success, stream_->Append(queue));
420  }
421
422  void UpdateLastBufferDuration(DecodeTimestamp current_dts,
423                                BufferQueue* buffers) {
424    if (buffers->empty() || buffers->back()->duration() > base::TimeDelta())
425      return;
426
427    DecodeTimestamp last_dts = buffers->back()->GetDecodeTimestamp();
428    DCHECK(current_dts >= last_dts);
429    buffers->back()->set_duration(current_dts - last_dts);
430  }
431
432  // StringToBufferQueue() allows for the generation of StreamParserBuffers from
433  // coded strings of timestamps separated by spaces.  Supported syntax:
434  //
435  // xx:
436  // Generates a StreamParserBuffer with decode and presentation timestamp xx.
437  // E.g., "0 1 2 3".
438  //
439  // pp|dd:
440  // Generates a StreamParserBuffer with presentation timestamp pp and decode
441  // timestamp dd. E.g., "0|0 3|1 1|2 2|3".
442  //
443  // ##Dzz
444  // Specifies the duration for a buffer. ## represents one of the 2 timestamp
445  // formats above. zz specifies the duration of the buffer in milliseconds.
446  // If the duration isn't specified with this syntax then the buffer duration
447  // is determined by the difference between the decode timestamp in ## and
448  // the decode timestamp of the previous buffer in the string. If the string
449  // only contains 1 buffer then the duration must be explicitly specified with
450  // this format.
451  //
452  // ##K:
453  // Indicates the buffer with timestamp ## reflects a keyframe. ##
454  // can be any of the 3 timestamp formats above.
455  // E.g., "0K 1|2K 2|4D2K".
456  //
457  // S(a# ... y# z#)
458  // Indicates a splice frame buffer should be created with timestamp z#.  The
459  // preceding timestamps a# ... y# will be treated as the fade out preroll for
460  // the splice frame.  If a timestamp within the preroll ends with C the config
461  // id to use for that and subsequent preroll appends is incremented by one.
462  // The config id for non-splice frame appends will not be affected.
463  BufferQueue StringToBufferQueue(const std::string& buffers_to_append) {
464    std::vector<std::string> timestamps;
465    base::SplitString(buffers_to_append, ' ', &timestamps);
466
467    CHECK_GT(timestamps.size(), 0u);
468
469    bool splice_frame = false;
470    size_t splice_config_id = stream_->append_config_index_;
471    BufferQueue pre_splice_buffers;
472    BufferQueue buffers;
473    for (size_t i = 0; i < timestamps.size(); i++) {
474      bool is_keyframe = false;
475      bool has_preroll = false;
476      bool last_splice_frame = false;
477      // Handle splice frame starts.
478      if (StartsWithASCII(timestamps[i], "S(", true)) {
479        CHECK(!splice_frame);
480        splice_frame = true;
481        // Remove the "S(" off of the token.
482        timestamps[i] = timestamps[i].substr(2, timestamps[i].length());
483      }
484      if (splice_frame && EndsWith(timestamps[i], ")", true)) {
485        splice_frame = false;
486        last_splice_frame = true;
487        // Remove the ")" off of the token.
488        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
489      }
490      // Handle config changes within the splice frame.
491      if (splice_frame && EndsWith(timestamps[i], "C", true)) {
492        splice_config_id++;
493        CHECK(splice_config_id < stream_->audio_configs_.size() ||
494              splice_config_id < stream_->video_configs_.size());
495        // Remove the "C" off of the token.
496        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
497      }
498      if (EndsWith(timestamps[i], "K", true)) {
499        is_keyframe = true;
500        // Remove the "K" off of the token.
501        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
502      }
503      // Handle preroll buffers.
504      if (EndsWith(timestamps[i], "P", true)) {
505        is_keyframe = true;
506        has_preroll = true;
507        // Remove the "P" off of the token.
508        timestamps[i] = timestamps[i].substr(0, timestamps[i].length() - 1);
509      }
510
511      int duration_in_ms = 0;
512      size_t duration_pos = timestamps[i].find('D');
513      if (duration_pos != std::string::npos) {
514        CHECK(base::StringToInt(timestamps[i].substr(duration_pos + 1),
515                                &duration_in_ms));
516        timestamps[i] = timestamps[i].substr(0, duration_pos);
517      }
518
519      std::vector<std::string> buffer_timestamps;
520      base::SplitString(timestamps[i], '|', &buffer_timestamps);
521
522      if (buffer_timestamps.size() == 1)
523        buffer_timestamps.push_back(buffer_timestamps[0]);
524
525      CHECK_EQ(2u, buffer_timestamps.size());
526
527      int pts_in_ms = 0;
528      int dts_in_ms = 0;
529      CHECK(base::StringToInt(buffer_timestamps[0], &pts_in_ms));
530      CHECK(base::StringToInt(buffer_timestamps[1], &dts_in_ms));
531
532      // Create buffer. Buffer type and track ID are meaningless to these tests.
533      scoped_refptr<StreamParserBuffer> buffer =
534          StreamParserBuffer::CopyFrom(&kDataA, kDataSize, is_keyframe,
535                                       DemuxerStream::AUDIO, 0);
536      buffer->set_timestamp(base::TimeDelta::FromMilliseconds(pts_in_ms));
537
538      if (dts_in_ms != pts_in_ms) {
539        buffer->SetDecodeTimestamp(
540            DecodeTimestamp::FromMilliseconds(dts_in_ms));
541      }
542
543      if (duration_in_ms)
544        buffer->set_duration(base::TimeDelta::FromMilliseconds(duration_in_ms));
545
546      // Simulate preroll buffers by just generating another buffer and sticking
547      // it as the preroll.
548      if (has_preroll) {
549        scoped_refptr<StreamParserBuffer> preroll_buffer =
550            StreamParserBuffer::CopyFrom(
551                &kDataA, kDataSize, is_keyframe, DemuxerStream::AUDIO, 0);
552        preroll_buffer->set_duration(frame_duration_);
553        buffer->SetPrerollBuffer(preroll_buffer);
554      }
555
556      if (splice_frame) {
557        // Make sure that splice frames aren't used with content where decode
558        // and presentation timestamps can differ. (i.e., B-frames)
559        CHECK_EQ(buffer->GetDecodeTimestamp().InMicroseconds(),
560                 buffer->timestamp().InMicroseconds());
561        if (!pre_splice_buffers.empty()) {
562          // Enforce strictly monotonically increasing timestamps.
563          CHECK_GT(
564              buffer->timestamp().InMicroseconds(),
565              pre_splice_buffers.back()->timestamp().InMicroseconds());
566          CHECK_GT(
567              buffer->GetDecodeTimestamp().InMicroseconds(),
568              pre_splice_buffers.back()->GetDecodeTimestamp().InMicroseconds());
569        }
570        buffer->SetConfigId(splice_config_id);
571        UpdateLastBufferDuration(buffer->GetDecodeTimestamp(),
572                                 &pre_splice_buffers);
573        pre_splice_buffers.push_back(buffer);
574        continue;
575      }
576
577      if (last_splice_frame) {
578        // Require at least one additional buffer for a splice.
579        CHECK(!pre_splice_buffers.empty());
580        buffer->SetConfigId(splice_config_id);
581        buffer->ConvertToSpliceBuffer(pre_splice_buffers);
582        pre_splice_buffers.clear();
583      }
584
585      UpdateLastBufferDuration(buffer->GetDecodeTimestamp(), &buffers);
586      buffers.push_back(buffer);
587    }
588
589    // If the last buffer doesn't have a duration, assume it is the
590    // same as the second to last buffer.
591    if (buffers.size() >= 2 &&
592        buffers.back()->duration() <= base::TimeDelta()) {
593      buffers.back()->set_duration(
594          buffers[buffers.size() - 2]->duration());
595    }
596
597    return buffers;
598  }
599
600  void AppendBuffers(const std::string& buffers_to_append,
601                     bool start_new_segment,
602                     base::TimeDelta segment_start_timestamp,
603                     bool one_by_one,
604                     bool expect_success) {
605    BufferQueue buffers = StringToBufferQueue(buffers_to_append);
606
607    if (start_new_segment) {
608      base::TimeDelta start_timestamp = segment_start_timestamp;
609      if (start_timestamp == kNoTimestamp())
610        start_timestamp = buffers[0]->timestamp();
611
612      ASSERT_TRUE(start_timestamp <= buffers[0]->timestamp());
613
614      stream_->OnNewMediaSegment(
615          DecodeTimestamp::FromPresentationTime(start_timestamp));
616    }
617
618    if (!one_by_one) {
619      EXPECT_EQ(expect_success, stream_->Append(buffers));
620      return;
621    }
622
623    // Append each buffer one by one.
624    for (size_t i = 0; i < buffers.size(); i++) {
625      BufferQueue wrapper;
626      wrapper.push_back(buffers[i]);
627      EXPECT_TRUE(stream_->Append(wrapper));
628    }
629  }
630
631  void DebugMediaLog(const std::string& log) {
632    DVLOG(1) << log;
633  }
634
635  int frames_per_second_;
636  int keyframes_per_second_;
637  base::TimeDelta frame_duration_;
638  DISALLOW_COPY_AND_ASSIGN(SourceBufferStreamTest);
639};
640
641TEST_F(SourceBufferStreamTest, Append_SingleRange) {
642  // Append 15 buffers at positions 0 through 14.
643  NewSegmentAppend(0, 15);
644
645  // Check expected range.
646  CheckExpectedRanges("{ [0,14) }");
647  // Check buffers in range.
648  Seek(0);
649  CheckExpectedBuffers(0, 14);
650}
651
652TEST_F(SourceBufferStreamTest, Append_SingleRange_OneBufferAtATime) {
653  // Append 15 buffers starting at position 0, one buffer at a time.
654  NewSegmentAppend(0, 1);
655  for (int i = 1; i < 15; i++)
656    AppendBuffers(i, 1);
657
658  // Check expected range.
659  CheckExpectedRanges("{ [0,14) }");
660  // Check buffers in range.
661  Seek(0);
662  CheckExpectedBuffers(0, 14);
663}
664
665TEST_F(SourceBufferStreamTest, Append_DisjointRanges) {
666  // Append 5 buffers at positions 0 through 4.
667  NewSegmentAppend(0, 5);
668
669  // Append 10 buffers at positions 15 through 24.
670  NewSegmentAppend(15, 10);
671
672  // Check expected ranges.
673  CheckExpectedRanges("{ [0,4) [15,24) }");
674  // Check buffers in ranges.
675  Seek(0);
676  CheckExpectedBuffers(0, 4);
677  Seek(15);
678  CheckExpectedBuffers(15, 24);
679}
680
681TEST_F(SourceBufferStreamTest, Append_AdjacentRanges) {
682  // Append 10 buffers at positions 0 through 9.
683  NewSegmentAppend(0, 10);
684
685  // Append 11 buffers at positions 15 through 25.
686  NewSegmentAppend(15, 11);
687
688  // Append 5 buffers at positions 10 through 14 to bridge the gap.
689  NewSegmentAppend(10, 5);
690
691  // Check expected range.
692  CheckExpectedRanges("{ [0,25) }");
693  // Check buffers in range.
694  Seek(0);
695  CheckExpectedBuffers(0, 25);
696}
697
698TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe) {
699  // Append fails because the range doesn't begin with a keyframe.
700  NewSegmentAppend_ExpectFailure(3, 2);
701
702  // Append 10 buffers at positions 5 through 14.
703  NewSegmentAppend(5, 10);
704
705  // Check expected range.
706  CheckExpectedRanges("{ [5,14) }");
707  // Check buffers in range.
708  Seek(5);
709  CheckExpectedBuffers(5, 14);
710
711  // Append fails because the range doesn't begin with a keyframe.
712  NewSegmentAppend_ExpectFailure(17, 3);
713
714  CheckExpectedRanges("{ [5,14) }");
715  Seek(5);
716  CheckExpectedBuffers(5, 14);
717}
718
719TEST_F(SourceBufferStreamTest, Append_DoesNotBeginWithKeyframe_Adjacent) {
720  // Append 8 buffers at positions 0 through 7.
721  NewSegmentAppend(0, 8);
722
723  // Now start a new media segment at position 8. Append should fail because
724  // the media segment does not begin with a keyframe.
725  NewSegmentAppend_ExpectFailure(8, 2);
726
727  // Check expected range.
728  CheckExpectedRanges("{ [0,7) }");
729  // Check buffers in range.
730  Seek(0);
731  CheckExpectedBuffers(0, 7);
732}
733
734TEST_F(SourceBufferStreamTest, Complete_Overlap) {
735  // Append 5 buffers at positions 5 through 9.
736  NewSegmentAppend(5, 5);
737
738  // Append 15 buffers at positions 0 through 14.
739  NewSegmentAppend(0, 15);
740
741  // Check expected range.
742  CheckExpectedRanges("{ [0,14) }");
743  // Check buffers in range.
744  Seek(0);
745  CheckExpectedBuffers(0, 14);
746}
747
748TEST_F(SourceBufferStreamTest,
749       Complete_Overlap_AfterSegmentTimestampAndBeforeFirstBufferTimestamp) {
750  // Append a segment with a start timestamp of 0, but the first
751  // buffer starts at 30ms. This can happen in muxed content where the
752  // audio starts before the first frame.
753  NewSegmentAppend(base::TimeDelta::FromMilliseconds(0), "30K 60K 90K 120K");
754
755  CheckExpectedRangesByTimestamp("{ [0,150) }");
756
757  // Completely overlap the old buffers, with a segment that starts
758  // after the old segment start timestamp, but before the timestamp
759  // of the first buffer in the segment.
760  NewSegmentAppend("20K 50K 80K 110D10K");
761
762  // Verify that the buffered ranges are updated properly and we don't crash.
763  CheckExpectedRangesByTimestamp("{ [20,150) }");
764
765  SeekToTimestamp(base::TimeDelta::FromMilliseconds(20));
766  CheckExpectedBuffers("20K 50K 80K 110K 120K");
767}
768
769TEST_F(SourceBufferStreamTest, Complete_Overlap_EdgeCase) {
770  // Make each frame a keyframe so that it's okay to overlap frames at any point
771  // (instead of needing to respect keyframe boundaries).
772  SetStreamInfo(30, 30);
773
774  // Append 6 buffers at positions 6 through 11.
775  NewSegmentAppend(6, 6);
776
777  // Append 8 buffers at positions 5 through 12.
778  NewSegmentAppend(5, 8);
779
780  // Check expected range.
781  CheckExpectedRanges("{ [5,12) }");
782  // Check buffers in range.
783  Seek(5);
784  CheckExpectedBuffers(5, 12);
785}
786
787TEST_F(SourceBufferStreamTest, Start_Overlap) {
788  // Append 10 buffers at positions 5 through 14.
789  NewSegmentAppend(5, 5);
790
791  // Append 6 buffers at positions 10 through 15.
792  NewSegmentAppend(10, 6);
793
794  // Check expected range.
795  CheckExpectedRanges("{ [5,15) }");
796  // Check buffers in range.
797  Seek(5);
798  CheckExpectedBuffers(5, 15);
799}
800
801TEST_F(SourceBufferStreamTest, End_Overlap) {
802  // Append 10 buffers at positions 10 through 19.
803  NewSegmentAppend(10, 10);
804
805  // Append 10 buffers at positions 5 through 14.
806  NewSegmentAppend(5, 10);
807
808  // Check expected range.
809  CheckExpectedRanges("{ [5,19) }");
810  // Check buffers in range.
811  Seek(5);
812  CheckExpectedBuffers(5, 19);
813}
814
815TEST_F(SourceBufferStreamTest, End_Overlap_Several) {
816  // Append 10 buffers at positions 10 through 19.
817  NewSegmentAppend(10, 10);
818
819  // Append 8 buffers at positions 5 through 12.
820  NewSegmentAppend(5, 8);
821
822  // Check expected ranges: stream should not have kept buffers 13 and 14
823  // because the keyframe on which they depended was overwritten.
824  CheckExpectedRanges("{ [5,12) [15,19) }");
825
826  // Check buffers in range.
827  Seek(5);
828  CheckExpectedBuffers(5, 12);
829  CheckNoNextBuffer();
830
831  Seek(19);
832  CheckExpectedBuffers(15, 19);
833}
834
835// Test an end overlap edge case where a single buffer overlaps the
836// beginning of a range.
837// old  : *0K*   30   60   90   120K  150
838// new  : *0K*
839// after: *0K*                 *120K* 150K
840// track:
841TEST_F(SourceBufferStreamTest, End_Overlap_SingleBuffer) {
842  // Seek to start of stream.
843  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
844
845  NewSegmentAppend("0K 30 60 90 120K 150");
846  CheckExpectedRangesByTimestamp("{ [0,180) }");
847
848  NewSegmentAppend("0D30K");
849  CheckExpectedRangesByTimestamp("{ [0,30) [120,180) }");
850
851  CheckExpectedBuffers("0K");
852  CheckNoNextBuffer();
853}
854
855TEST_F(SourceBufferStreamTest, Complete_Overlap_Several) {
856  // Append 2 buffers at positions 5 through 6.
857  NewSegmentAppend(5, 2);
858
859  // Append 2 buffers at positions 10 through 11.
860  NewSegmentAppend(10, 2);
861
862  // Append 2 buffers at positions 15 through 16.
863  NewSegmentAppend(15, 2);
864
865  // Check expected ranges.
866  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
867
868  // Append buffers at positions 0 through 19.
869  NewSegmentAppend(0, 20);
870
871  // Check expected range.
872  CheckExpectedRanges("{ [0,19) }");
873  // Check buffers in range.
874  Seek(0);
875  CheckExpectedBuffers(0, 19);
876}
877
878TEST_F(SourceBufferStreamTest, Complete_Overlap_Several_Then_Merge) {
879  // Append 2 buffers at positions 5 through 6.
880  NewSegmentAppend(5, 2);
881
882  // Append 2 buffers at positions 10 through 11.
883  NewSegmentAppend(10, 2);
884
885  // Append 2 buffers at positions 15 through 16.
886  NewSegmentAppend(15, 2);
887
888  // Append 2 buffers at positions 20 through 21.
889  NewSegmentAppend(20, 2);
890
891  // Append buffers at positions 0 through 19.
892  NewSegmentAppend(0, 20);
893
894  // Check expected ranges.
895  CheckExpectedRanges("{ [0,21) }");
896  // Check buffers in range.
897  Seek(0);
898  CheckExpectedBuffers(0, 21);
899}
900
901TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected) {
902  // Append 10 buffers at positions 5 through 14.
903  NewSegmentAppend(5, 10, &kDataA);
904
905  // Seek to buffer at position 5.
906  Seek(5);
907
908  // Replace old data with new data.
909  NewSegmentAppend(5, 10, &kDataB);
910
911  // Check ranges are correct.
912  CheckExpectedRanges("{ [5,14) }");
913
914  // Check that data has been replaced with new data.
915  CheckExpectedBuffers(5, 14, &kDataB);
916}
917
918// This test is testing that a client can append data to SourceBufferStream that
919// overlaps the range from which the client is currently grabbing buffers. We
920// would expect that the SourceBufferStream would return old data until it hits
921// the keyframe of the new data, after which it will return the new data.
922TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_TrackBuffer) {
923  // Append 10 buffers at positions 5 through 14.
924  NewSegmentAppend(5, 10, &kDataA);
925
926  // Seek to buffer at position 5 and get next buffer.
927  Seek(5);
928  CheckExpectedBuffers(5, 5, &kDataA);
929
930  // Do a complete overlap by appending 20 buffers at positions 0 through 19.
931  NewSegmentAppend(0, 20, &kDataB);
932
933  // Check range is correct.
934  CheckExpectedRanges("{ [0,19) }");
935
936  // Expect old data up until next keyframe in new data.
937  CheckExpectedBuffers(6, 9, &kDataA);
938  CheckExpectedBuffers(10, 10, &kDataB, true);
939
940  // Expect rest of data to be new.
941  CheckExpectedBuffers(11, 19, &kDataB);
942
943  // Seek back to beginning; all data should be new.
944  Seek(0);
945  CheckExpectedBuffers(0, 19, &kDataB);
946
947  // Check range continues to be correct.
948  CheckExpectedRanges("{ [0,19) }");
949}
950
951TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_EdgeCase) {
952  // Append 10 buffers at positions 5 through 14.
953  NewSegmentAppend(5, 10, &kDataA);
954
955  // Seek to buffer at position 5 and get next buffer.
956  Seek(5);
957  CheckExpectedBuffers(5, 5, &kDataA);
958
959  // Replace existing data with new data.
960  NewSegmentAppend(5, 10, &kDataB);
961
962  // Check ranges are correct.
963  CheckExpectedRanges("{ [5,14) }");
964
965  // Expect old data up until next keyframe in new data.
966  CheckExpectedBuffers(6, 9, &kDataA);
967  CheckExpectedBuffers(10, 10, &kDataB, true);
968
969  // Expect rest of data to be new.
970  CheckExpectedBuffers(11, 14, &kDataB);
971
972  // Seek back to beginning; all data should be new.
973  Seek(5);
974  CheckExpectedBuffers(5, 14, &kDataB);
975
976  // Check range continues to be correct.
977  CheckExpectedRanges("{ [5,14) }");
978}
979
980TEST_F(SourceBufferStreamTest, Complete_Overlap_Selected_Multiple) {
981  static const uint8 kDataC = 0x55;
982  static const uint8 kDataD = 0x77;
983
984  // Append 5 buffers at positions 5 through 9.
985  NewSegmentAppend(5, 5, &kDataA);
986
987  // Seek to buffer at position 5 and get next buffer.
988  Seek(5);
989  CheckExpectedBuffers(5, 5, &kDataA);
990
991  // Replace existing data with new data.
992  NewSegmentAppend(5, 5, &kDataB);
993
994  // Then replace it again with different data.
995  NewSegmentAppend(5, 5, &kDataC);
996
997  // Now append 5 new buffers at positions 10 through 14.
998  NewSegmentAppend(10, 5, &kDataC);
999
1000  // Now replace all the data entirely.
1001  NewSegmentAppend(5, 10, &kDataD);
1002
1003  // Expect buffers 6 through 9 to be DataA, and the remaining
1004  // buffers to be kDataD.
1005  CheckExpectedBuffers(6, 9, &kDataA);
1006  CheckExpectedBuffers(10, 14, &kDataD);
1007
1008  // At this point we cannot fulfill request.
1009  CheckNoNextBuffer();
1010
1011  // Seek back to beginning; all data should be new.
1012  Seek(5);
1013  CheckExpectedBuffers(5, 14, &kDataD);
1014}
1015
1016TEST_F(SourceBufferStreamTest, Start_Overlap_Selected) {
1017  // Append 10 buffers at positions 0 through 9.
1018  NewSegmentAppend(0, 10, &kDataA);
1019
1020  // Seek to position 5, then add buffers to overlap data at that position.
1021  Seek(5);
1022  NewSegmentAppend(5, 10, &kDataB);
1023
1024  // Check expected range.
1025  CheckExpectedRanges("{ [0,14) }");
1026
1027  // Because we seeked to a keyframe, the next buffers should all be new data.
1028  CheckExpectedBuffers(5, 14, &kDataB);
1029
1030  // Make sure all data is correct.
1031  Seek(0);
1032  CheckExpectedBuffers(0, 4, &kDataA);
1033  CheckExpectedBuffers(5, 14, &kDataB);
1034}
1035
1036TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_TrackBuffer) {
1037  // Append 15 buffers at positions 0 through 14.
1038  NewSegmentAppend(0, 15, &kDataA);
1039
1040  // Seek to 10 and get buffer.
1041  Seek(10);
1042  CheckExpectedBuffers(10, 10, &kDataA);
1043
1044  // Now append 10 buffers of new data at positions 10 through 19.
1045  NewSegmentAppend(10, 10, &kDataB);
1046
1047  // Check expected range.
1048  CheckExpectedRanges("{ [0,19) }");
1049
1050  // The next 4 buffers should be a from the old buffer, followed by a keyframe
1051  // from the new data.
1052  CheckExpectedBuffers(11, 14, &kDataA);
1053  CheckExpectedBuffers(15, 15, &kDataB, true);
1054
1055  // The rest of the buffers should be new data.
1056  CheckExpectedBuffers(16, 19, &kDataB);
1057
1058  // Now seek to the beginning; positions 0 through 9 should be the original
1059  // data, positions 10 through 19 should be the new data.
1060  Seek(0);
1061  CheckExpectedBuffers(0, 9, &kDataA);
1062  CheckExpectedBuffers(10, 19, &kDataB);
1063
1064  // Make sure range is still correct.
1065  CheckExpectedRanges("{ [0,19) }");
1066}
1067
1068TEST_F(SourceBufferStreamTest, Start_Overlap_Selected_EdgeCase) {
1069  // Append 10 buffers at positions 5 through 14.
1070  NewSegmentAppend(5, 10, &kDataA);
1071
1072  Seek(10);
1073  CheckExpectedBuffers(10, 10, &kDataA);
1074
1075  // Now replace the last 5 buffers with new data.
1076  NewSegmentAppend(10, 5, &kDataB);
1077
1078  // The next 4 buffers should be the origial data, held in the track buffer.
1079  CheckExpectedBuffers(11, 14, &kDataA);
1080
1081  // The next buffer is at position 15, so we should fail to fulfill the
1082  // request.
1083  CheckNoNextBuffer();
1084
1085  // Now append data at 15 through 19 and check to make sure it's correct.
1086  NewSegmentAppend(15, 5, &kDataB);
1087  CheckExpectedBuffers(15, 19, &kDataB);
1088
1089  // Seek to beginning of buffered range and check buffers.
1090  Seek(5);
1091  CheckExpectedBuffers(5, 9, &kDataA);
1092  CheckExpectedBuffers(10, 19, &kDataB);
1093
1094  // Check expected range.
1095  CheckExpectedRanges("{ [5,19) }");
1096}
1097
1098// This test covers the case where new buffers end-overlap an existing, selected
1099// range, and the next buffer is a keyframe that's being overlapped by new
1100// buffers.
1101// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1102// old  :           *A*a a a a A a a a a
1103// new  :  B b b b b B b b b b
1104// after:  B b b b b*B*b b b b A a a a a
1105TEST_F(SourceBufferStreamTest, End_Overlap_Selected) {
1106  // Append 10 buffers at positions 5 through 14.
1107  NewSegmentAppend(5, 10, &kDataA);
1108
1109  // Seek to position 5.
1110  Seek(5);
1111
1112  // Now append 10 buffers at positions 0 through 9.
1113  NewSegmentAppend(0, 10, &kDataB);
1114
1115  // Check expected range.
1116  CheckExpectedRanges("{ [0,14) }");
1117
1118  // Because we seeked to a keyframe, the next buffers should be new.
1119  CheckExpectedBuffers(5, 9, &kDataB);
1120
1121  // Make sure all data is correct.
1122  Seek(0);
1123  CheckExpectedBuffers(0, 9, &kDataB);
1124  CheckExpectedBuffers(10, 14, &kDataA);
1125}
1126
1127// This test covers the case where new buffers end-overlap an existing, selected
1128// range, and the next buffer in the range is after the newly appended buffers.
1129// In this particular case, the end overlap does not require a split.
1130//
1131// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1132// old  :           |A a a a a A a a*a*a|
1133// new  :  B b b b b B b b b b
1134// after: |B b b b b B b b b b A a a*a*a|
1135TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_1) {
1136  // Append 10 buffers at positions 5 through 14.
1137  NewSegmentAppend(5, 10, &kDataA);
1138
1139  // Seek to position 10, then move to position 13.
1140  Seek(10);
1141  CheckExpectedBuffers(10, 12, &kDataA);
1142
1143  // Now append 10 buffers at positions 0 through 9.
1144  NewSegmentAppend(0, 10, &kDataB);
1145
1146  // Check expected range.
1147  CheckExpectedRanges("{ [0,14) }");
1148
1149  // Make sure rest of data is as expected.
1150  CheckExpectedBuffers(13, 14, &kDataA);
1151
1152  // Make sure all data is correct.
1153  Seek(0);
1154  CheckExpectedBuffers(0, 9, &kDataB);
1155  CheckExpectedBuffers(10, 14, &kDataA);
1156}
1157
1158// This test covers the case where new buffers end-overlap an existing, selected
1159// range, and the next buffer in the range is after the newly appended buffers.
1160// In this particular case, the end overlap requires a split, and the next
1161// buffer is in the split range.
1162//
1163// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1164// old  :           |A a a a a A a a*a*a|
1165// new  :  B b b b b B b b
1166// after: |B b b b b B b b|   |A a a*a*a|
1167TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_2) {
1168  // Append 10 buffers at positions 5 through 14.
1169  NewSegmentAppend(5, 10, &kDataA);
1170
1171  // Seek to position 10, then move to position 13.
1172  Seek(10);
1173  CheckExpectedBuffers(10, 12, &kDataA);
1174
1175  // Now append 8 buffers at positions 0 through 7.
1176  NewSegmentAppend(0, 8, &kDataB);
1177
1178  // Check expected ranges.
1179  CheckExpectedRanges("{ [0,7) [10,14) }");
1180
1181  // Make sure rest of data is as expected.
1182  CheckExpectedBuffers(13, 14, &kDataA);
1183
1184  // Make sure all data is correct.
1185  Seek(0);
1186  CheckExpectedBuffers(0, 7, &kDataB);
1187  CheckNoNextBuffer();
1188
1189  Seek(10);
1190  CheckExpectedBuffers(10, 14, &kDataA);
1191}
1192
1193// This test covers the case where new buffers end-overlap an existing, selected
1194// range, and the next buffer in the range is after the newly appended buffers.
1195// In this particular case, the end overlap requires a split, and the next
1196// buffer was in between the end of the new data and the split range.
1197//
1198// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1199// old  :           |A a a*a*a A a a a a|
1200// new  :  B b b b b B b b
1201// after: |B b b b b B b b|   |A a a a a|
1202// track:                 |a a|
1203TEST_F(SourceBufferStreamTest, End_Overlap_Selected_AfterEndOfNew_3) {
1204  // Append 10 buffers at positions 5 through 14.
1205  NewSegmentAppend(5, 10, &kDataA);
1206
1207  // Seek to position 5, then move to position 8.
1208  Seek(5);
1209  CheckExpectedBuffers(5, 7, &kDataA);
1210
1211  // Now append 8 buffers at positions 0 through 7.
1212  NewSegmentAppend(0, 8, &kDataB);
1213
1214  // Check expected ranges.
1215  CheckExpectedRanges("{ [0,7) [10,14) }");
1216
1217  // Check for data in the track buffer.
1218  CheckExpectedBuffers(8, 9, &kDataA);
1219  // The buffer immediately after the track buffer should be a keyframe.
1220  CheckExpectedBuffers(10, 10, &kDataA, true);
1221
1222  // Make sure all data is correct.
1223  Seek(0);
1224  CheckExpectedBuffers(0, 7, &kDataB);
1225  Seek(10);
1226  CheckExpectedBuffers(10, 14, &kDataA);
1227}
1228
1229// This test covers the case where new buffers end-overlap an existing, selected
1230// range, and the next buffer in the range is overlapped by the new buffers.
1231// In this particular case, the end overlap does not require a split.
1232//
1233// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1234// old  :           |A a a*a*a A a a a a|
1235// new  :  B b b b b B b b b b
1236// after: |B b b b b B b b b b A a a a a|
1237// track:                 |a a|
1238TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_1) {
1239  // Append 10 buffers at positions 5 through 14.
1240  NewSegmentAppend(5, 10, &kDataA);
1241
1242  // Seek to position 5, then move to position 8.
1243  Seek(5);
1244  CheckExpectedBuffers(5, 7, &kDataA);
1245
1246  // Now append 10 buffers at positions 0 through 9.
1247  NewSegmentAppend(0, 10, &kDataB);
1248
1249  // Check expected range.
1250  CheckExpectedRanges("{ [0,14) }");
1251
1252  // Check for data in the track buffer.
1253  CheckExpectedBuffers(8, 9, &kDataA);
1254  // The buffer immediately after the track buffer should be a keyframe.
1255  CheckExpectedBuffers(10, 10, &kDataA, true);
1256
1257  // Make sure all data is correct.
1258  Seek(0);
1259  CheckExpectedBuffers(0, 9, &kDataB);
1260  CheckExpectedBuffers(10, 14, &kDataA);
1261}
1262
1263// This test covers the case where new buffers end-overlap an existing, selected
1264// range, and the next buffer in the range is overlapped by the new buffers.
1265// In this particular case, the end overlap requires a split, and the next
1266// keyframe after the track buffer is in the split range.
1267//
1268// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1269// old  :           |A*a*a a a A a a a a|
1270// new  :  B b b b b B b
1271// after: |B b b b b B b|     |A a a a a|
1272// track:             |a a a a|
1273TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_2) {
1274  // Append 10 buffers at positions 5 through 14.
1275  NewSegmentAppend(5, 10, &kDataA);
1276
1277  // Seek to position 5, then move to position 6.
1278  Seek(5);
1279  CheckExpectedBuffers(5, 5, &kDataA);
1280
1281  // Now append 7 buffers at positions 0 through 6.
1282  NewSegmentAppend(0, 7, &kDataB);
1283
1284  // Check expected ranges.
1285  CheckExpectedRanges("{ [0,6) [10,14) }");
1286
1287  // Check for data in the track buffer.
1288  CheckExpectedBuffers(6, 9, &kDataA);
1289  // The buffer immediately after the track buffer should be a keyframe.
1290  CheckExpectedBuffers(10, 10, &kDataA, true);
1291
1292  // Make sure all data is correct.
1293  Seek(0);
1294  CheckExpectedBuffers(0, 6, &kDataB);
1295  CheckNoNextBuffer();
1296
1297  Seek(10);
1298  CheckExpectedBuffers(10, 14, &kDataA);
1299}
1300
1301// This test covers the case where new buffers end-overlap an existing, selected
1302// range, and the next buffer in the range is overlapped by the new buffers.
1303// In this particular case, the end overlap requires a split, and the next
1304// keyframe after the track buffer is in the range with the new buffers.
1305//
1306// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1307// old  :           |A*a*a a a A a a a a A a a a a|
1308// new  :  B b b b b B b b b b B b b
1309// after: |B b b b b B b b b b B b b|   |A a a a a|
1310// track:             |a a a a|
1311TEST_F(SourceBufferStreamTest, End_Overlap_Selected_OverlappedByNew_3) {
1312  // Append 15 buffers at positions 5 through 19.
1313  NewSegmentAppend(5, 15, &kDataA);
1314
1315  // Seek to position 5, then move to position 6.
1316  Seek(5);
1317  CheckExpectedBuffers(5, 5, &kDataA);
1318
1319  // Now append 13 buffers at positions 0 through 12.
1320  NewSegmentAppend(0, 13, &kDataB);
1321
1322  // Check expected ranges.
1323  CheckExpectedRanges("{ [0,12) [15,19) }");
1324
1325  // Check for data in the track buffer.
1326  CheckExpectedBuffers(6, 9, &kDataA);
1327  // The buffer immediately after the track buffer should be a keyframe
1328  // from the new data.
1329  CheckExpectedBuffers(10, 10, &kDataB, true);
1330
1331  // Make sure all data is correct.
1332  Seek(0);
1333  CheckExpectedBuffers(0, 12, &kDataB);
1334  CheckNoNextBuffer();
1335
1336  Seek(15);
1337  CheckExpectedBuffers(15, 19, &kDataA);
1338}
1339
1340// This test covers the case where new buffers end-overlap an existing, selected
1341// range, and there is no keyframe after the end of the new buffers.
1342// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1343// old  :           |A*a*a a a|
1344// new  :  B b b b b B
1345// after: |B b b b b B|
1346// track:             |a a a a|
1347TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew) {
1348  // Append 5 buffers at positions 5 through 9.
1349  NewSegmentAppend(5, 5, &kDataA);
1350
1351  // Seek to position 5, then move to position 6.
1352  Seek(5);
1353  CheckExpectedBuffers(5, 5, &kDataA);
1354
1355  // Now append 6 buffers at positions 0 through 5.
1356  NewSegmentAppend(0, 6, &kDataB);
1357
1358  // Check expected range.
1359  CheckExpectedRanges("{ [0,5) }");
1360
1361  // Check for data in the track buffer.
1362  CheckExpectedBuffers(6, 9, &kDataA);
1363
1364  // Now there's no data to fulfill the request.
1365  CheckNoNextBuffer();
1366
1367  // Let's fill in the gap, buffers 6 through 10.
1368  AppendBuffers(6, 5, &kDataB);
1369
1370  // We should be able to get the next buffer.
1371  CheckExpectedBuffers(10, 10, &kDataB);
1372}
1373
1374// This test covers the case where new buffers end-overlap an existing, selected
1375// range, and there is no keyframe after the end of the new buffers, then the
1376// range gets split.
1377// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1378// old  :                     |A a a a a A*a*|
1379// new  :            B b b b b B b b b b B
1380// after:           |B b b b b B b b b b B|
1381// new  :  A a a a a A
1382// after: |A a a a a A|       |B b b b b B|
1383// track:                                 |a|
1384TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew2) {
1385  // Append 7 buffers at positions 10 through 16.
1386  NewSegmentAppend(10, 7, &kDataA);
1387
1388  // Seek to position 15, then move to position 16.
1389  Seek(15);
1390  CheckExpectedBuffers(15, 15, &kDataA);
1391
1392  // Now append 11 buffers at positions 5 through 15.
1393  NewSegmentAppend(5, 11, &kDataB);
1394  CheckExpectedRanges("{ [5,15) }");
1395
1396  // Now do another end-overlap to split the range into two parts, where the
1397  // 2nd range should have the next buffer position.
1398  NewSegmentAppend(0, 6, &kDataA);
1399  CheckExpectedRanges("{ [0,5) [10,15) }");
1400
1401  // Check for data in the track buffer.
1402  CheckExpectedBuffers(16, 16, &kDataA);
1403
1404  // Now there's no data to fulfill the request.
1405  CheckNoNextBuffer();
1406
1407  // Add data to the 2nd range, should not be able to fulfill the next read
1408  // until we've added a keyframe.
1409  NewSegmentAppend(15, 1, &kDataB);
1410  CheckNoNextBuffer();
1411  for (int i = 16; i <= 19; i++) {
1412    AppendBuffers(i, 1, &kDataB);
1413    CheckNoNextBuffer();
1414  }
1415
1416  // Now append a keyframe.
1417  AppendBuffers(20, 1, &kDataB);
1418
1419  // We should be able to get the next buffer.
1420  CheckExpectedBuffers(20, 20, &kDataB, true);
1421}
1422
1423// This test covers the case where new buffers end-overlap an existing, selected
1424// range, and the next keyframe in a separate range.
1425// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1426// old  :           |A*a*a a a|          |A a a a a|
1427// new  :  B b b b b B
1428// after: |B b b b b B|                  |A a a a a|
1429// track:             |a a a a|
1430TEST_F(SourceBufferStreamTest, End_Overlap_Selected_NoKeyframeAfterNew3) {
1431  // Append 5 buffers at positions 5 through 9.
1432  NewSegmentAppend(5, 5, &kDataA);
1433
1434  // Append 5 buffers at positions 15 through 19.
1435  NewSegmentAppend(15, 5, &kDataA);
1436
1437  // Check expected range.
1438  CheckExpectedRanges("{ [5,9) [15,19) }");
1439
1440  // Seek to position 5, then move to position 6.
1441  Seek(5);
1442  CheckExpectedBuffers(5, 5, &kDataA);
1443
1444  // Now append 6 buffers at positions 0 through 5.
1445  NewSegmentAppend(0, 6, &kDataB);
1446
1447  // Check expected range.
1448  CheckExpectedRanges("{ [0,5) [15,19) }");
1449
1450  // Check for data in the track buffer.
1451  CheckExpectedBuffers(6, 9, &kDataA);
1452
1453  // Now there's no data to fulfill the request.
1454  CheckNoNextBuffer();
1455
1456  // Let's fill in the gap, buffers 6 through 14.
1457  AppendBuffers(6, 9, &kDataB);
1458
1459  // Check expected range.
1460  CheckExpectedRanges("{ [0,19) }");
1461
1462  // We should be able to get the next buffer.
1463  CheckExpectedBuffers(10, 14, &kDataB);
1464
1465  // We should be able to get the next buffer.
1466  CheckExpectedBuffers(15, 19, &kDataA);
1467}
1468
1469// This test covers the case when new buffers overlap the middle of a selected
1470// range. This tests the case when there is no split and the next buffer is a
1471// keyframe.
1472// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1473// old  :  A a a a a*A*a a a a A a a a a
1474// new  :            B b b b b
1475// after:  A a a a a*B*b b b b A a a a a
1476TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_1) {
1477  // Append 15 buffers at positions 0 through 14.
1478  NewSegmentAppend(0, 15, &kDataA);
1479
1480  // Seek to position 5.
1481  Seek(5);
1482
1483  // Now append 5 buffers at positions 5 through 9.
1484  NewSegmentAppend(5, 5, &kDataB);
1485
1486  // Check expected range.
1487  CheckExpectedRanges("{ [0,14) }");
1488
1489  // Check for next data; should be new data.
1490  CheckExpectedBuffers(5, 9, &kDataB);
1491
1492  // Make sure all data is correct.
1493  Seek(0);
1494  CheckExpectedBuffers(0, 4, &kDataA);
1495  CheckExpectedBuffers(5, 9, &kDataB);
1496  CheckExpectedBuffers(10, 14, &kDataA);
1497}
1498
1499// This test covers the case when new buffers overlap the middle of a selected
1500// range. This tests the case when there is no split and the next buffer is
1501// after the new buffers.
1502// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1503// old  :  A a a a a A a a a a A*a*a a a
1504// new  :            B b b b b
1505// after:  A a a a a B b b b b A*a*a a a
1506TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_2) {
1507  // Append 15 buffers at positions 0 through 14.
1508  NewSegmentAppend(0, 15, &kDataA);
1509
1510  // Seek to 10 then move to position 11.
1511  Seek(10);
1512  CheckExpectedBuffers(10, 10, &kDataA);
1513
1514  // Now append 5 buffers at positions 5 through 9.
1515  NewSegmentAppend(5, 5, &kDataB);
1516
1517  // Check expected range.
1518  CheckExpectedRanges("{ [0,14) }");
1519
1520  // Make sure data is correct.
1521  CheckExpectedBuffers(11, 14, &kDataA);
1522  Seek(0);
1523  CheckExpectedBuffers(0, 4, &kDataA);
1524  CheckExpectedBuffers(5, 9, &kDataB);
1525  CheckExpectedBuffers(10, 14, &kDataA);
1526}
1527
1528// This test covers the case when new buffers overlap the middle of a selected
1529// range. This tests the case when there is a split and the next buffer is
1530// before the new buffers.
1531// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1532// old  :  A a*a*a a A a a a a A a a a a
1533// new  :            B b b
1534// after:  A a*a*a a B b b|   |A a a a a
1535TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_3) {
1536  // Append 15 buffers at positions 0 through 14.
1537  NewSegmentAppend(0, 15, &kDataA);
1538
1539  // Seek to beginning then move to position 2.
1540  Seek(0);
1541  CheckExpectedBuffers(0, 1, &kDataA);
1542
1543  // Now append 3 buffers at positions 5 through 7.
1544  NewSegmentAppend(5, 3, &kDataB);
1545
1546  // Check expected range.
1547  CheckExpectedRanges("{ [0,7) [10,14) }");
1548
1549  // Make sure data is correct.
1550  CheckExpectedBuffers(2, 4, &kDataA);
1551  CheckExpectedBuffers(5, 7, &kDataB);
1552  Seek(10);
1553  CheckExpectedBuffers(10, 14, &kDataA);
1554}
1555
1556// This test covers the case when new buffers overlap the middle of a selected
1557// range. This tests the case when there is a split and the next buffer is after
1558// the new buffers but before the split range.
1559// index:  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
1560// old  :  A a a a a A a a*a*a A a a a a
1561// new  :            B b b
1562// after: |A a a a a B b b|   |A a a a a|
1563// track:                 |a a|
1564TEST_F(SourceBufferStreamTest, Middle_Overlap_Selected_4) {
1565  // Append 15 buffers at positions 0 through 14.
1566  NewSegmentAppend(0, 15, &kDataA);
1567
1568  // Seek to 5 then move to position 8.
1569  Seek(5);
1570  CheckExpectedBuffers(5, 7, &kDataA);
1571
1572  // Now append 3 buffers at positions 5 through 7.
1573  NewSegmentAppend(5, 3, &kDataB);
1574
1575  // Check expected range.
1576  CheckExpectedRanges("{ [0,7) [10,14) }");
1577
1578  // Buffers 8 and 9 should be in the track buffer.
1579  CheckExpectedBuffers(8, 9, &kDataA);
1580  // The buffer immediately after the track buffer should be a keyframe.
1581  CheckExpectedBuffers(10, 10, &kDataA, true);
1582
1583  // Make sure all data is correct.
1584  Seek(0);
1585  CheckExpectedBuffers(0, 4, &kDataA);
1586  CheckExpectedBuffers(5, 7, &kDataB);
1587  Seek(10);
1588  CheckExpectedBuffers(10, 14, &kDataA);
1589}
1590
1591TEST_F(SourceBufferStreamTest, Overlap_OneByOne) {
1592  // Append 5 buffers starting at 10ms, 30ms apart.
1593  NewSegmentAppendOneByOne("10K 40 70 100 130");
1594
1595  // The range ends at 160, accounting for the last buffer's duration.
1596  CheckExpectedRangesByTimestamp("{ [10,160) }");
1597
1598  // Overlap with 10 buffers starting at the beginning, appended one at a
1599  // time.
1600  NewSegmentAppend(0, 1, &kDataB);
1601  for (int i = 1; i < 10; i++)
1602    AppendBuffers(i, 1, &kDataB);
1603
1604  // All data should be replaced.
1605  Seek(0);
1606  CheckExpectedRanges("{ [0,9) }");
1607  CheckExpectedBuffers(0, 9, &kDataB);
1608}
1609
1610TEST_F(SourceBufferStreamTest, Overlap_OneByOne_DeleteGroup) {
1611  NewSegmentAppendOneByOne("10K 40 70 100 130K");
1612  CheckExpectedRangesByTimestamp("{ [10,160) }");
1613
1614  // Seek to 130ms.
1615  SeekToTimestamp(base::TimeDelta::FromMilliseconds(130));
1616
1617  // Overlap with a new segment from 0 to 130ms.
1618  NewSegmentAppendOneByOne("0K 120D10");
1619
1620  // Next buffer should still be 130ms.
1621  CheckExpectedBuffers("130K");
1622
1623  // Check the final buffers is correct.
1624  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
1625  CheckExpectedBuffers("0K 120 130K");
1626}
1627
1628TEST_F(SourceBufferStreamTest, Overlap_OneByOne_BetweenMediaSegments) {
1629  // Append 5 buffers starting at 110ms, 30ms apart.
1630  NewSegmentAppendOneByOne("110K 140 170 200 230");
1631  CheckExpectedRangesByTimestamp("{ [110,260) }");
1632
1633  // Now append 2 media segments from 0ms to 210ms, 30ms apart. Note that the
1634  // old keyframe 110ms falls in between these two segments.
1635  NewSegmentAppendOneByOne("0K 30 60 90");
1636  NewSegmentAppendOneByOne("120K 150 180 210");
1637  CheckExpectedRangesByTimestamp("{ [0,240) }");
1638
1639  // Check the final buffers is correct; the keyframe at 110ms should be
1640  // deleted.
1641  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
1642  CheckExpectedBuffers("0K 30 60 90 120K 150 180 210");
1643}
1644
1645// old  :   10K  40  *70*  100K  125  130K
1646// new  : 0K   30   60   90   120K
1647// after: 0K   30   60   90  *120K*   130K
1648TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer) {
1649  NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1650  CheckExpectedRangesByTimestamp("{ [10,160) }");
1651
1652  // Seek to 70ms.
1653  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1654  CheckExpectedBuffers("10K 40");
1655
1656  // Overlap with a new segment from 0 to 130ms.
1657  NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1658  CheckExpectedRangesByTimestamp("{ [0,160) }");
1659
1660  // Should return frame 70ms from the track buffer, then switch
1661  // to the new data at 120K, then switch back to the old data at 130K. The
1662  // frame at 125ms that depended on keyframe 100ms should have been deleted.
1663  CheckExpectedBuffers("70 120K 130K");
1664
1665  // Check the final result: should not include data from the track buffer.
1666  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
1667  CheckExpectedBuffers("0K 30 60 90 120K 130K");
1668}
1669
1670// Overlap the next keyframe after the end of the track buffer with a new
1671// keyframe.
1672// old  :   10K  40  *70*  100K  125  130K
1673// new  : 0K   30   60   90   120K
1674// after: 0K   30   60   90  *120K*   130K
1675// track:             70
1676// new  :                     110K    130
1677// after: 0K   30   60   90  *110K*   130
1678TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer2) {
1679  NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1680  CheckExpectedRangesByTimestamp("{ [10,160) }");
1681
1682  // Seek to 70ms.
1683  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1684  CheckExpectedBuffers("10K 40");
1685
1686  // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track
1687  // buffer.
1688  NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1689  CheckExpectedRangesByTimestamp("{ [0,160) }");
1690
1691  // Now overlap the keyframe at 120ms.
1692  NewSegmentAppendOneByOne("110K 130");
1693
1694  // Should return frame 70ms from the track buffer. Then it should
1695  // return the keyframe after the track buffer, which is at 110ms.
1696  CheckExpectedBuffers("70 110K 130");
1697}
1698
1699// Overlap the next keyframe after the end of the track buffer without a
1700// new keyframe.
1701// old  :   10K  40  *70*  100K  125  130K
1702// new  : 0K   30   60   90   120K
1703// after: 0K   30   60   90  *120K*   130K
1704// track:             70
1705// new  :        50K   80   110          140
1706// after: 0K   30   50K   80   110   140 * (waiting for keyframe)
1707// track:             70
1708TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer3) {
1709  NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1710  CheckExpectedRangesByTimestamp("{ [10,160) }");
1711
1712  // Seek to 70ms.
1713  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1714  CheckExpectedBuffers("10K 40");
1715
1716  // Overlap with a new segment from 0 to 120ms; 70ms goes in track buffer.
1717  NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1718  CheckExpectedRangesByTimestamp("{ [0,160) }");
1719
1720  // Now overlap the keyframe at 120ms and 130ms.
1721  NewSegmentAppendOneByOne("50K 80 110 140");
1722  CheckExpectedRangesByTimestamp("{ [0,170) }");
1723
1724  // Should have all the buffers from the track buffer, then stall.
1725  CheckExpectedBuffers("70");
1726  CheckNoNextBuffer();
1727
1728  // Appending a keyframe should fulfill the read.
1729  AppendBuffersOneByOne("150D30K");
1730  CheckExpectedBuffers("150K");
1731  CheckNoNextBuffer();
1732}
1733
1734// Overlap the next keyframe after the end of the track buffer with a keyframe
1735// that comes before the end of the track buffer.
1736// old  :   10K  40  *70*  100K  125  130K
1737// new  : 0K   30   60   90   120K
1738// after: 0K   30   60   90  *120K*   130K
1739// track:             70
1740// new  :              80K  110          140
1741// after: 0K   30   60   *80K*  110   140
1742// track:               70
1743TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer4) {
1744  NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1745  CheckExpectedRangesByTimestamp("{ [10,160) }");
1746
1747  // Seek to 70ms.
1748  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1749  CheckExpectedBuffers("10K 40");
1750
1751  // Overlap with a new segment from 0 to 120ms; 70ms and 100ms go in track
1752  // buffer.
1753  NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1754  CheckExpectedRangesByTimestamp("{ [0,160) }");
1755
1756  // Now append a keyframe at 80ms.
1757  NewSegmentAppendOneByOne("80K 110 140");
1758
1759  CheckExpectedBuffers("70 80K 110 140");
1760  CheckNoNextBuffer();
1761}
1762
1763// Overlap the next keyframe after the end of the track buffer with a keyframe
1764// that comes before the end of the track buffer, when the selected stream was
1765// waiting for the next keyframe.
1766// old  :   10K  40  *70*  100K
1767// new  : 0K   30   60   90   120
1768// after: 0K   30   60   90   120 * (waiting for keyframe)
1769// track:             70
1770// new  :              80K  110          140
1771// after: 0K   30   60   *80K*  110   140
1772// track:               70
1773TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer5) {
1774  NewSegmentAppendOneByOne("10K 40 70 100K");
1775  CheckExpectedRangesByTimestamp("{ [10,130) }");
1776
1777  // Seek to 70ms.
1778  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1779  CheckExpectedBuffers("10K 40");
1780
1781  // Overlap with a new segment from 0 to 120ms; 70ms goes in track
1782  // buffer.
1783  NewSegmentAppendOneByOne("0K 30 60 90 120");
1784  CheckExpectedRangesByTimestamp("{ [0,150) }");
1785
1786  // Now append a keyframe at 80ms.
1787  NewSegmentAppendOneByOne("80K 110 140");
1788
1789  CheckExpectedBuffers("70 80K 110 140");
1790  CheckNoNextBuffer();
1791}
1792
1793// Test that appending to a different range while there is data in
1794// the track buffer doesn't affect the selected range or track buffer state.
1795// old  :   10K  40  *70*  100K  125  130K ... 200K 230
1796// new  : 0K   30   60   90   120K
1797// after: 0K   30   60   90  *120K*   130K ... 200K 230
1798// track:             70
1799// old  : 0K   30   60   90  *120K*   130K ... 200K 230
1800// new  :                                               260K 290
1801// after: 0K   30   60   90  *120K*   130K ... 200K 230 260K 290
1802// track:             70
1803TEST_F(SourceBufferStreamTest, Overlap_OneByOne_TrackBuffer6) {
1804  NewSegmentAppendOneByOne("10K 40 70 100K 125 130D30K");
1805  NewSegmentAppendOneByOne("200K 230");
1806  CheckExpectedRangesByTimestamp("{ [10,160) [200,260) }");
1807
1808  // Seek to 70ms.
1809  SeekToTimestamp(base::TimeDelta::FromMilliseconds(70));
1810  CheckExpectedBuffers("10K 40");
1811
1812  // Overlap with a new segment from 0 to 120ms.
1813  NewSegmentAppendOneByOne("0K 30 60 90 120D10K");
1814  CheckExpectedRangesByTimestamp("{ [0,160) [200,260) }");
1815
1816  // Verify that 70 gets read out of the track buffer.
1817  CheckExpectedBuffers("70");
1818
1819  // Append more data to the unselected range.
1820  NewSegmentAppendOneByOne("260K 290");
1821  CheckExpectedRangesByTimestamp("{ [0,160) [200,320) }");
1822
1823  CheckExpectedBuffers("120K 130K");
1824  CheckNoNextBuffer();
1825
1826  // Check the final result: should not include data from the track buffer.
1827  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
1828  CheckExpectedBuffers("0K 30 60 90 120K 130K");
1829  CheckNoNextBuffer();
1830}
1831
1832TEST_F(SourceBufferStreamTest, Seek_Keyframe) {
1833  // Append 6 buffers at positions 0 through 5.
1834  NewSegmentAppend(0, 6);
1835
1836  // Seek to beginning.
1837  Seek(0);
1838  CheckExpectedBuffers(0, 5, true);
1839}
1840
1841TEST_F(SourceBufferStreamTest, Seek_NonKeyframe) {
1842  // Append 15 buffers at positions 0 through 14.
1843  NewSegmentAppend(0, 15);
1844
1845  // Seek to buffer at position 13.
1846  Seek(13);
1847
1848  // Expect seeking back to the nearest keyframe.
1849  CheckExpectedBuffers(10, 14, true);
1850
1851  // Seek to buffer at position 3.
1852  Seek(3);
1853
1854  // Expect seeking back to the nearest keyframe.
1855  CheckExpectedBuffers(0, 3, true);
1856}
1857
1858TEST_F(SourceBufferStreamTest, Seek_NotBuffered) {
1859  // Seek to beginning.
1860  Seek(0);
1861
1862  // Try to get buffer; nothing's appended.
1863  CheckNoNextBuffer();
1864
1865  // Append 2 buffers at positions 0.
1866  NewSegmentAppend(0, 2);
1867  Seek(0);
1868  CheckExpectedBuffers(0, 1);
1869
1870  // Try to get buffer out of range.
1871  Seek(2);
1872  CheckNoNextBuffer();
1873}
1874
1875TEST_F(SourceBufferStreamTest, Seek_InBetweenTimestamps) {
1876  // Append 10 buffers at positions 0 through 9.
1877  NewSegmentAppend(0, 10);
1878
1879  base::TimeDelta bump = frame_duration() / 4;
1880  CHECK(bump > base::TimeDelta());
1881
1882  // Seek to buffer a little after position 5.
1883  stream_->Seek(5 * frame_duration() + bump);
1884  CheckExpectedBuffers(5, 5, true);
1885
1886  // Seek to buffer a little before position 5.
1887  stream_->Seek(5 * frame_duration() - bump);
1888  CheckExpectedBuffers(0, 0, true);
1889}
1890
1891// This test will do a complete overlap of an existing range in order to add
1892// buffers to the track buffers. Then the test does a seek to another part of
1893// the stream. The SourceBufferStream should clear its internal track buffer in
1894// response to the Seek().
1895TEST_F(SourceBufferStreamTest, Seek_After_TrackBuffer_Filled) {
1896  // Append 10 buffers at positions 5 through 14.
1897  NewSegmentAppend(5, 10, &kDataA);
1898
1899  // Seek to buffer at position 5 and get next buffer.
1900  Seek(5);
1901  CheckExpectedBuffers(5, 5, &kDataA);
1902
1903  // Do a complete overlap by appending 20 buffers at positions 0 through 19.
1904  NewSegmentAppend(0, 20, &kDataB);
1905
1906  // Check range is correct.
1907  CheckExpectedRanges("{ [0,19) }");
1908
1909  // Seek to beginning; all data should be new.
1910  Seek(0);
1911  CheckExpectedBuffers(0, 19, &kDataB);
1912
1913  // Check range continues to be correct.
1914  CheckExpectedRanges("{ [0,19) }");
1915}
1916
1917TEST_F(SourceBufferStreamTest, Seek_StartOfSegment) {
1918  base::TimeDelta bump = frame_duration() / 4;
1919  CHECK(bump > base::TimeDelta());
1920
1921  // Append 5 buffers at position (5 + |bump|) through 9, where the media
1922  // segment begins at position 5.
1923  Seek(5);
1924  NewSegmentAppend_OffsetFirstBuffer(5, 5, bump);
1925  scoped_refptr<StreamParserBuffer> buffer;
1926
1927  // GetNextBuffer() should return the next buffer at position (5 + |bump|).
1928  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
1929  EXPECT_EQ(buffer->GetDecodeTimestamp(),
1930            DecodeTimestamp::FromPresentationTime(5 * frame_duration() + bump));
1931
1932  // Check rest of buffers.
1933  CheckExpectedBuffers(6, 9);
1934
1935  // Seek to position 15.
1936  Seek(15);
1937
1938  // Append 5 buffers at positions (15 + |bump|) through 19, where the media
1939  // segment begins at 15.
1940  NewSegmentAppend_OffsetFirstBuffer(15, 5, bump);
1941
1942  // GetNextBuffer() should return the next buffer at position (15 + |bump|).
1943  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
1944  EXPECT_EQ(buffer->GetDecodeTimestamp(), DecodeTimestamp::FromPresentationTime(
1945      15 * frame_duration() + bump));
1946
1947  // Check rest of buffers.
1948  CheckExpectedBuffers(16, 19);
1949}
1950
1951TEST_F(SourceBufferStreamTest, Seek_BeforeStartOfSegment) {
1952  // Append 10 buffers at positions 5 through 14.
1953  NewSegmentAppend(5, 10);
1954
1955  // Seek to a time before the first buffer in the range.
1956  Seek(0);
1957
1958  // Should return buffers from the beginning of the range.
1959  CheckExpectedBuffers(5, 14);
1960}
1961
1962TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap) {
1963  // Append 5 buffers at positions 0 through 4.
1964  NewSegmentAppend(0, 4);
1965
1966  // Append 5 buffers at positions 10 through 14, and seek to the beginning of
1967  // this range.
1968  NewSegmentAppend(10, 5);
1969  Seek(10);
1970
1971  // Now seek to the beginning of the first range.
1972  Seek(0);
1973
1974  // Completely overlap the old seek point.
1975  NewSegmentAppend(5, 15);
1976
1977  // The GetNextBuffer() call should respect the 2nd seek point.
1978  CheckExpectedBuffers(0, 0);
1979}
1980
1981TEST_F(SourceBufferStreamTest, OldSeekPoint_CompleteOverlap_Pending) {
1982  // Append 2 buffers at positions 0 through 1.
1983  NewSegmentAppend(0, 2);
1984
1985  // Append 5 buffers at positions 15 through 19 and seek to beginning of the
1986  // range.
1987  NewSegmentAppend(15, 5);
1988  Seek(15);
1989
1990  // Now seek position 5.
1991  Seek(5);
1992
1993  // Completely overlap the old seek point.
1994  NewSegmentAppend(10, 15);
1995
1996  // The seek at position 5 should still be pending.
1997  CheckNoNextBuffer();
1998}
1999
2000TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap) {
2001  // Append 2 buffers at positions 0 through 1.
2002  NewSegmentAppend(0, 2);
2003
2004  // Append 15 buffers at positions 5 through 19 and seek to position 15.
2005  NewSegmentAppend(5, 15);
2006  Seek(15);
2007
2008  // Now seek to the beginning of the stream.
2009  Seek(0);
2010
2011  // Overlap the middle of the range such that there are now three ranges.
2012  NewSegmentAppend(10, 3);
2013  CheckExpectedRanges("{ [0,1) [5,12) [15,19) }");
2014
2015  // The GetNextBuffer() call should respect the 2nd seek point.
2016  CheckExpectedBuffers(0, 0);
2017}
2018
2019TEST_F(SourceBufferStreamTest, OldSeekPoint_MiddleOverlap_Pending) {
2020  // Append 2 buffers at positions 0 through 1.
2021  NewSegmentAppend(0, 2);
2022
2023  // Append 15 buffers at positions 10 through 24 and seek to position 20.
2024  NewSegmentAppend(10, 15);
2025  Seek(20);
2026
2027  // Now seek to position 5.
2028  Seek(5);
2029
2030  // Overlap the middle of the range such that it is now split into two ranges.
2031  NewSegmentAppend(15, 3);
2032  CheckExpectedRanges("{ [0,1) [10,17) [20,24) }");
2033
2034  // The seek at position 5 should still be pending.
2035  CheckNoNextBuffer();
2036}
2037
2038TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap) {
2039  // Append 2 buffers at positions 0 through 1.
2040  NewSegmentAppend(0, 2);
2041
2042  // Append 15 buffers at positions 5 through 19 and seek to position 15.
2043  NewSegmentAppend(5, 15);
2044  Seek(15);
2045
2046  // Now seek to the beginning of the stream.
2047  Seek(0);
2048
2049  // Start overlap the old seek point.
2050  NewSegmentAppend(10, 10);
2051
2052  // The GetNextBuffer() call should respect the 2nd seek point.
2053  CheckExpectedBuffers(0, 0);
2054}
2055
2056TEST_F(SourceBufferStreamTest, OldSeekPoint_StartOverlap_Pending) {
2057  // Append 2 buffers at positions 0 through 1.
2058  NewSegmentAppend(0, 2);
2059
2060  // Append 15 buffers at positions 10 through 24 and seek to position 20.
2061  NewSegmentAppend(10, 15);
2062  Seek(20);
2063
2064  // Now seek to position 5.
2065  Seek(5);
2066
2067  // Start overlap the old seek point.
2068  NewSegmentAppend(15, 10);
2069
2070  // The seek at time 0 should still be pending.
2071  CheckNoNextBuffer();
2072}
2073
2074TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap) {
2075  // Append 5 buffers at positions 0 through 4.
2076  NewSegmentAppend(0, 4);
2077
2078  // Append 15 buffers at positions 10 through 24 and seek to start of range.
2079  NewSegmentAppend(10, 15);
2080  Seek(10);
2081
2082  // Now seek to the beginning of the stream.
2083  Seek(0);
2084
2085  // End overlap the old seek point.
2086  NewSegmentAppend(5, 10);
2087
2088  // The GetNextBuffer() call should respect the 2nd seek point.
2089  CheckExpectedBuffers(0, 0);
2090}
2091
2092TEST_F(SourceBufferStreamTest, OldSeekPoint_EndOverlap_Pending) {
2093  // Append 2 buffers at positions 0 through 1.
2094  NewSegmentAppend(0, 2);
2095
2096  // Append 15 buffers at positions 15 through 29 and seek to start of range.
2097  NewSegmentAppend(15, 15);
2098  Seek(15);
2099
2100  // Now seek to position 5
2101  Seek(5);
2102
2103  // End overlap the old seek point.
2104  NewSegmentAppend(10, 10);
2105
2106  // The seek at time 0 should still be pending.
2107  CheckNoNextBuffer();
2108}
2109
2110TEST_F(SourceBufferStreamTest, GetNextBuffer_AfterMerges) {
2111  // Append 5 buffers at positions 10 through 14.
2112  NewSegmentAppend(10, 5);
2113
2114  // Seek to buffer at position 12.
2115  Seek(12);
2116
2117  // Append 5 buffers at positions 5 through 9.
2118  NewSegmentAppend(5, 5);
2119
2120  // Make sure ranges are merged.
2121  CheckExpectedRanges("{ [5,14) }");
2122
2123  // Make sure the next buffer is correct.
2124  CheckExpectedBuffers(10, 10);
2125
2126  // Append 5 buffers at positions 15 through 19.
2127  NewSegmentAppend(15, 5);
2128  CheckExpectedRanges("{ [5,19) }");
2129
2130  // Make sure the remaining next buffers are correct.
2131  CheckExpectedBuffers(11, 14);
2132}
2133
2134TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenAppend) {
2135  // Append 4 buffers at positions 0 through 3.
2136  NewSegmentAppend(0, 4);
2137
2138  // Seek to buffer at position 0 and get all buffers.
2139  Seek(0);
2140  CheckExpectedBuffers(0, 3);
2141
2142  // Next buffer is at position 4, so should not be able to fulfill request.
2143  CheckNoNextBuffer();
2144
2145  // Append 2 buffers at positions 4 through 5.
2146  AppendBuffers(4, 2);
2147  CheckExpectedBuffers(4, 5);
2148}
2149
2150// This test covers the case where new buffers start-overlap a range whose next
2151// buffer is not buffered.
2152TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap) {
2153  // Append 10 buffers at positions 0 through 9 and exhaust the buffers.
2154  NewSegmentAppend(0, 10, &kDataA);
2155  Seek(0);
2156  CheckExpectedBuffers(0, 9, &kDataA);
2157
2158  // Next buffer is at position 10, so should not be able to fulfill request.
2159  CheckNoNextBuffer();
2160
2161  // Append 6 buffers at positons 5 through 10. This is to test that doing a
2162  // start-overlap successfully fulfills the read at position 10, even though
2163  // position 10 was unbuffered.
2164  NewSegmentAppend(5, 6, &kDataB);
2165  CheckExpectedBuffers(10, 10, &kDataB);
2166
2167  // Then add 5 buffers from positions 11 though 15.
2168  AppendBuffers(11, 5, &kDataB);
2169
2170  // Check the next 4 buffers are correct, which also effectively seeks to
2171  // position 15.
2172  CheckExpectedBuffers(11, 14, &kDataB);
2173
2174  // Replace the next buffer at position 15 with another start overlap.
2175  NewSegmentAppend(15, 2, &kDataA);
2176  CheckExpectedBuffers(15, 16, &kDataA);
2177}
2178
2179// Tests a start overlap that occurs right at the timestamp of the last output
2180// buffer that was returned by GetNextBuffer(). This test verifies that
2181// GetNextBuffer() skips to second GOP in the newly appended data instead
2182// of returning two buffers with the same timestamp.
2183TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenStartOverlap2) {
2184  NewSegmentAppend("0K 30 60 90 120");
2185
2186  Seek(0);
2187  CheckExpectedBuffers("0K 30 60 90 120");
2188  CheckNoNextBuffer();
2189
2190  // Append a keyframe with the same timestamp as the last buffer output.
2191  NewSegmentAppend("120D30K");
2192  CheckNoNextBuffer();
2193
2194  // Append the rest of the segment and make sure that buffers are returned
2195  // from the first GOP after 120.
2196  AppendBuffers("150 180 210K 240");
2197  CheckExpectedBuffers("210K 240");
2198
2199  // Seek to the beginning and verify the contents of the source buffer.
2200  Seek(0);
2201  CheckExpectedBuffers("0K 30 60 90 120K 150 180 210K 240");
2202  CheckNoNextBuffer();
2203}
2204
2205// This test covers the case where new buffers completely overlap a range
2206// whose next buffer is not buffered.
2207TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenCompleteOverlap) {
2208  // Append 5 buffers at positions 10 through 14 and exhaust the buffers.
2209  NewSegmentAppend(10, 5, &kDataA);
2210  Seek(10);
2211  CheckExpectedBuffers(10, 14, &kDataA);
2212
2213  // Next buffer is at position 15, so should not be able to fulfill request.
2214  CheckNoNextBuffer();
2215
2216  // Do a complete overlap and test that this successfully fulfills the read
2217  // at position 15.
2218  NewSegmentAppend(5, 11, &kDataB);
2219  CheckExpectedBuffers(15, 15, &kDataB);
2220
2221  // Then add 5 buffers from positions 16 though 20.
2222  AppendBuffers(16, 5, &kDataB);
2223
2224  // Check the next 4 buffers are correct, which also effectively seeks to
2225  // position 20.
2226  CheckExpectedBuffers(16, 19, &kDataB);
2227
2228  // Do a complete overlap and replace the buffer at position 20.
2229  NewSegmentAppend(0, 21, &kDataA);
2230  CheckExpectedBuffers(20, 20, &kDataA);
2231}
2232
2233// This test covers the case where a range is stalled waiting for its next
2234// buffer, then an end-overlap causes the end of the range to be deleted.
2235TEST_F(SourceBufferStreamTest, GetNextBuffer_ExhaustThenEndOverlap) {
2236  // Append 5 buffers at positions 10 through 14 and exhaust the buffers.
2237  NewSegmentAppend(10, 5, &kDataA);
2238  Seek(10);
2239  CheckExpectedBuffers(10, 14, &kDataA);
2240  CheckExpectedRanges("{ [10,14) }");
2241
2242  // Next buffer is at position 15, so should not be able to fulfill request.
2243  CheckNoNextBuffer();
2244
2245  // Do an end overlap that causes the latter half of the range to be deleted.
2246  NewSegmentAppend(5, 6, &kDataB);
2247  CheckNoNextBuffer();
2248  CheckExpectedRanges("{ [5,10) }");
2249
2250  // Fill in the gap. Getting the next buffer should still stall at position 15.
2251  for (int i = 11; i <= 14; i++) {
2252    AppendBuffers(i, 1, &kDataB);
2253    CheckNoNextBuffer();
2254  }
2255
2256  // Append the buffer at position 15 and check to make sure all is correct.
2257  AppendBuffers(15, 1);
2258  CheckExpectedBuffers(15, 15);
2259  CheckExpectedRanges("{ [5,15) }");
2260}
2261
2262// This test is testing the "next buffer" logic after a complete overlap. In
2263// this scenario, when the track buffer is exhausted, there is no buffered data
2264// to fulfill the request. The SourceBufferStream should be able to fulfill the
2265// request when the data is later appended, and should not lose track of the
2266// "next buffer" position.
2267TEST_F(SourceBufferStreamTest, GetNextBuffer_Overlap_Selected_Complete) {
2268  // Append 5 buffers at positions 5 through 9.
2269  NewSegmentAppend(5, 5, &kDataA);
2270
2271  // Seek to buffer at position 5 and get next buffer.
2272  Seek(5);
2273  CheckExpectedBuffers(5, 5, &kDataA);
2274
2275  // Replace existing data with new data.
2276  NewSegmentAppend(5, 5, &kDataB);
2277
2278  // Expect old data up until next keyframe in new data.
2279  CheckExpectedBuffers(6, 9, &kDataA);
2280
2281  // Next buffer is at position 10, so should not be able to fulfill the
2282  // request.
2283  CheckNoNextBuffer();
2284
2285  // Now add 5 new buffers at positions 10 through 14.
2286  AppendBuffers(10, 5, &kDataB);
2287  CheckExpectedBuffers(10, 14, &kDataB);
2288}
2289
2290TEST_F(SourceBufferStreamTest, PresentationTimestampIndependence) {
2291  // Append 20 buffers at position 0.
2292  NewSegmentAppend(0, 20);
2293  Seek(0);
2294
2295  int last_keyframe_idx = -1;
2296  base::TimeDelta last_keyframe_presentation_timestamp;
2297  base::TimeDelta last_p_frame_presentation_timestamp;
2298
2299  // Check for IBB...BBP pattern.
2300  for (int i = 0; i < 20; i++) {
2301    scoped_refptr<StreamParserBuffer> buffer;
2302    ASSERT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
2303
2304    if (buffer->IsKeyframe()) {
2305      EXPECT_EQ(DecodeTimestamp::FromPresentationTime(buffer->timestamp()),
2306                buffer->GetDecodeTimestamp());
2307      last_keyframe_idx = i;
2308      last_keyframe_presentation_timestamp = buffer->timestamp();
2309    } else if (i == last_keyframe_idx + 1) {
2310      ASSERT_NE(last_keyframe_idx, -1);
2311      last_p_frame_presentation_timestamp = buffer->timestamp();
2312      EXPECT_LT(last_keyframe_presentation_timestamp,
2313                last_p_frame_presentation_timestamp);
2314    } else {
2315      EXPECT_GT(buffer->timestamp(), last_keyframe_presentation_timestamp);
2316      EXPECT_LT(buffer->timestamp(), last_p_frame_presentation_timestamp);
2317      EXPECT_LT(DecodeTimestamp::FromPresentationTime(buffer->timestamp()),
2318                buffer->GetDecodeTimestamp());
2319    }
2320  }
2321}
2322
2323TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFront) {
2324  // Set memory limit to 20 buffers.
2325  SetMemoryLimit(20);
2326
2327  // Append 20 buffers at positions 0 through 19.
2328  NewSegmentAppend(0, 1, &kDataA);
2329  for (int i = 1; i < 20; i++)
2330    AppendBuffers(i, 1, &kDataA);
2331
2332  // None of the buffers should trigger garbage collection, so all data should
2333  // be there as expected.
2334  CheckExpectedRanges("{ [0,19) }");
2335  Seek(0);
2336  CheckExpectedBuffers(0, 19, &kDataA);
2337
2338  // Seek to the middle of the stream.
2339  Seek(10);
2340
2341  // Append 5 buffers to the end of the stream.
2342  AppendBuffers(20, 5, &kDataA);
2343
2344  // GC should have deleted the first 5 buffers.
2345  CheckExpectedRanges("{ [5,24) }");
2346  CheckExpectedBuffers(10, 24, &kDataA);
2347  Seek(5);
2348  CheckExpectedBuffers(5, 9, &kDataA);
2349}
2350
2351TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontGOPsAtATime) {
2352  // Set memory limit to 20 buffers.
2353  SetMemoryLimit(20);
2354
2355  // Append 20 buffers at positions 0 through 19.
2356  NewSegmentAppend(0, 20, &kDataA);
2357
2358  // Seek to position 10.
2359  Seek(10);
2360
2361  // Add one buffer to put the memory over the cap.
2362  AppendBuffers(20, 1, &kDataA);
2363
2364  // GC should have deleted the first 5 buffers so that the range still begins
2365  // with a keyframe.
2366  CheckExpectedRanges("{ [5,20) }");
2367  CheckExpectedBuffers(10, 20, &kDataA);
2368  Seek(5);
2369  CheckExpectedBuffers(5, 9, &kDataA);
2370}
2371
2372TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteBack) {
2373  // Set memory limit to 5 buffers.
2374  SetMemoryLimit(5);
2375
2376  // Seek to position 0.
2377  Seek(0);
2378
2379  // Append 20 buffers at positions 0 through 19.
2380  NewSegmentAppend(0, 20, &kDataA);
2381
2382  // Should leave the first 5 buffers from 0 to 4 and the last GOP appended.
2383  CheckExpectedRanges("{ [0,4) [15,19) }");
2384  CheckExpectedBuffers(0, 4, &kDataA);
2385}
2386
2387TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteFrontAndBack) {
2388  // Set memory limit to 3 buffers.
2389  SetMemoryLimit(3);
2390
2391  // Seek to position 15.
2392  Seek(15);
2393
2394  // Append 40 buffers at positions 0 through 39.
2395  NewSegmentAppend(0, 40, &kDataA);
2396
2397  // Should leave the GOP containing the seek position and the last GOP
2398  // appended.
2399  CheckExpectedRanges("{ [15,19) [35,39) }");
2400  CheckExpectedBuffers(15, 19, &kDataA);
2401  CheckNoNextBuffer();
2402}
2403
2404TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteSeveralRanges) {
2405  // Append 5 buffers at positions 0 through 4.
2406  NewSegmentAppend(0, 5);
2407
2408  // Append 5 buffers at positions 10 through 14.
2409  NewSegmentAppend(10, 5);
2410
2411  // Append 5 buffers at positions 20 through 24.
2412  NewSegmentAppend(20, 5);
2413
2414  // Append 5 buffers at positions 30 through 34.
2415  NewSegmentAppend(30, 5);
2416
2417  CheckExpectedRanges("{ [0,4) [10,14) [20,24) [30,34) }");
2418
2419  // Seek to position 21.
2420  Seek(20);
2421  CheckExpectedBuffers(20, 20);
2422
2423  // Set memory limit to 1 buffer.
2424  SetMemoryLimit(1);
2425
2426  // Append 5 buffers at positions 40 through 44. This will trigger GC.
2427  NewSegmentAppend(40, 5);
2428
2429  // Should delete everything except the GOP containing the current buffer and
2430  // the last GOP appended.
2431  CheckExpectedRanges("{ [20,24) [40,44) }");
2432  CheckExpectedBuffers(21, 24);
2433  CheckNoNextBuffer();
2434
2435  // Continue appending into the last range to make sure it didn't break.
2436  AppendBuffers(45, 10);
2437  // Should only save last GOP appended.
2438  CheckExpectedRanges("{ [20,24) [50,54) }");
2439
2440  // Make sure appending before and after the ranges didn't somehow break.
2441  SetMemoryLimit(100);
2442  NewSegmentAppend(0, 10);
2443  CheckExpectedRanges("{ [0,9) [20,24) [50,54) }");
2444  Seek(0);
2445  CheckExpectedBuffers(0, 9);
2446
2447  NewSegmentAppend(90, 10);
2448  CheckExpectedRanges("{ [0,9) [20,24) [50,54) [90,99) }");
2449  Seek(50);
2450  CheckExpectedBuffers(50, 54);
2451  CheckNoNextBuffer();
2452  Seek(90);
2453  CheckExpectedBuffers(90, 99);
2454  CheckNoNextBuffer();
2455}
2456
2457TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppend) {
2458  // Set memory limit to 10 buffers.
2459  SetMemoryLimit(10);
2460
2461  // Append 1 GOP starting at 310ms, 30ms apart.
2462  NewSegmentAppend("310K 340 370");
2463
2464  // Append 2 GOPs starting at 490ms, 30ms apart.
2465  NewSegmentAppend("490K 520 550 580K 610 640");
2466
2467  CheckExpectedRangesByTimestamp("{ [310,400) [490,670) }");
2468
2469  // Seek to the GOP at 580ms.
2470  SeekToTimestamp(base::TimeDelta::FromMilliseconds(580));
2471
2472  // Append 2 GOPs before the existing ranges.
2473  // So the ranges before GC are "{ [100,280) [310,400) [490,670) }".
2474  NewSegmentAppend("100K 130 160 190K 220 250K");
2475
2476  // Should save the newly appended GOPs.
2477  CheckExpectedRangesByTimestamp("{ [100,280) [580,670) }");
2478}
2479
2480TEST_F(SourceBufferStreamTest, GarbageCollection_DeleteAfterLastAppendMerged) {
2481  // Set memory limit to 10 buffers.
2482  SetMemoryLimit(10);
2483
2484  // Append 3 GOPs starting at 400ms, 30ms apart.
2485  NewSegmentAppend("400K 430 460 490K 520 550 580K 610 640");
2486
2487  // Seek to the GOP at 580ms.
2488  SeekToTimestamp(base::TimeDelta::FromMilliseconds(580));
2489
2490  // Append 2 GOPs starting at 220ms, and they will be merged with the existing
2491  // range.  So the range before GC is "{ [220,670) }".
2492  NewSegmentAppend("220K 250 280 310K 340 370");
2493
2494  // Should save the newly appended GOPs.
2495  CheckExpectedRangesByTimestamp("{ [220,400) [580,670) }");
2496}
2497
2498TEST_F(SourceBufferStreamTest, GarbageCollection_NoSeek) {
2499  // Set memory limit to 20 buffers.
2500  SetMemoryLimit(20);
2501
2502  // Append 25 buffers at positions 0 through 24.
2503  NewSegmentAppend(0, 25, &kDataA);
2504
2505  // GC deletes the first 5 buffers to keep the memory limit within cap.
2506  CheckExpectedRanges("{ [5,24) }");
2507  CheckNoNextBuffer();
2508  Seek(5);
2509  CheckExpectedBuffers(5, 24, &kDataA);
2510}
2511
2512TEST_F(SourceBufferStreamTest, GarbageCollection_PendingSeek) {
2513  // Append 10 buffers at positions 0 through 9.
2514  NewSegmentAppend(0, 10, &kDataA);
2515
2516  // Append 5 buffers at positions 25 through 29.
2517  NewSegmentAppend(25, 5, &kDataA);
2518
2519  // Seek to position 15.
2520  Seek(15);
2521  CheckNoNextBuffer();
2522
2523  CheckExpectedRanges("{ [0,9) [25,29) }");
2524
2525  // Set memory limit to 5 buffers.
2526  SetMemoryLimit(5);
2527
2528  // Append 5 buffers as positions 30 to 34 to trigger GC.
2529  AppendBuffers(30, 5, &kDataA);
2530
2531  // The current algorithm will delete from the beginning until the memory is
2532  // under cap.
2533  CheckExpectedRanges("{ [30,34) }");
2534
2535  // Expand memory limit again so that GC won't be triggered.
2536  SetMemoryLimit(100);
2537
2538  // Append data to fulfill seek.
2539  NewSegmentAppend(15, 5, &kDataA);
2540
2541  // Check to make sure all is well.
2542  CheckExpectedRanges("{ [15,19) [30,34) }");
2543  CheckExpectedBuffers(15, 19, &kDataA);
2544  Seek(30);
2545  CheckExpectedBuffers(30, 34, &kDataA);
2546}
2547
2548TEST_F(SourceBufferStreamTest, GarbageCollection_NeedsMoreData) {
2549  // Set memory limit to 15 buffers.
2550  SetMemoryLimit(15);
2551
2552  // Append 10 buffers at positions 0 through 9.
2553  NewSegmentAppend(0, 10, &kDataA);
2554
2555  // Advance next buffer position to 10.
2556  Seek(0);
2557  CheckExpectedBuffers(0, 9, &kDataA);
2558  CheckNoNextBuffer();
2559
2560  // Append 20 buffers at positions 15 through 34.
2561  NewSegmentAppend(15, 20, &kDataA);
2562
2563  // GC should have saved the keyframe before the current seek position and the
2564  // data closest to the current seek position. It will also save the last GOP
2565  // appended.
2566  CheckExpectedRanges("{ [5,9) [15,19) [30,34) }");
2567
2568  // Now fulfill the seek at position 10. This will make GC delete the data
2569  // before position 10 to keep it within cap.
2570  NewSegmentAppend(10, 5, &kDataA);
2571  CheckExpectedRanges("{ [10,19) [30,34) }");
2572  CheckExpectedBuffers(10, 19, &kDataA);
2573}
2574
2575TEST_F(SourceBufferStreamTest, GarbageCollection_TrackBuffer) {
2576  // Set memory limit to 3 buffers.
2577  SetMemoryLimit(3);
2578
2579  // Seek to position 15.
2580  Seek(15);
2581
2582  // Append 18 buffers at positions 0 through 17.
2583  NewSegmentAppend(0, 18, &kDataA);
2584
2585  // Should leave GOP containing seek position.
2586  CheckExpectedRanges("{ [15,17) }");
2587
2588  // Seek ahead to position 16.
2589  CheckExpectedBuffers(15, 15, &kDataA);
2590
2591  // Completely overlap the existing buffers.
2592  NewSegmentAppend(0, 20, &kDataB);
2593
2594  // Because buffers 16 and 17 are not keyframes, they are moved to the track
2595  // buffer upon overlap. The source buffer (i.e. not the track buffer) is now
2596  // waiting for the next keyframe.
2597  CheckExpectedRanges("{ [15,19) }");
2598  CheckExpectedBuffers(16, 17, &kDataA);
2599  CheckNoNextBuffer();
2600
2601  // Now add a keyframe at position 20.
2602  AppendBuffers(20, 5, &kDataB);
2603
2604  // Should garbage collect such that there are 5 frames remaining, starting at
2605  // the keyframe.
2606  CheckExpectedRanges("{ [20,24) }");
2607  CheckExpectedBuffers(20, 24, &kDataB);
2608  CheckNoNextBuffer();
2609}
2610
2611// Test saving the last GOP appended when this GOP is the only GOP in its range.
2612TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP) {
2613  // Set memory limit to 3 and make sure the 4-byte GOP is not garbage
2614  // collected.
2615  SetMemoryLimit(3);
2616  NewSegmentAppend("0K 30 60 90");
2617  CheckExpectedRangesByTimestamp("{ [0,120) }");
2618
2619  // Make sure you can continue appending data to this GOP; again, GC should not
2620  // wipe out anything.
2621  AppendBuffers("120D30");
2622  CheckExpectedRangesByTimestamp("{ [0,150) }");
2623
2624  // Set memory limit to 100 and append a 2nd range after this without
2625  // triggering GC.
2626  SetMemoryLimit(100);
2627  NewSegmentAppend("200K 230 260 290K 320 350");
2628  CheckExpectedRangesByTimestamp("{ [0,150) [200,380) }");
2629
2630  // Seek to 290ms.
2631  SeekToTimestamp(base::TimeDelta::FromMilliseconds(290));
2632
2633  // Now set memory limit to 3 and append a GOP in a separate range after the
2634  // selected range. Because it is after 290ms, this tests that the GOP is saved
2635  // when deleting from the back.
2636  SetMemoryLimit(3);
2637  NewSegmentAppend("500K 530 560 590");
2638
2639  // Should save GOP with 290ms and last GOP appended.
2640  CheckExpectedRangesByTimestamp("{ [290,380) [500,620) }");
2641
2642  // Continue appending to this GOP after GC.
2643  AppendBuffers("620D30");
2644  CheckExpectedRangesByTimestamp("{ [290,380) [500,650) }");
2645}
2646
2647// Test saving the last GOP appended when this GOP is in the middle of a
2648// non-selected range.
2649TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Middle) {
2650  // Append 3 GOPs starting at 0ms, 30ms apart.
2651  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240");
2652  CheckExpectedRangesByTimestamp("{ [0,270) }");
2653
2654  // Now set the memory limit to 1 and overlap the middle of the range with a
2655  // new GOP.
2656  SetMemoryLimit(1);
2657  NewSegmentAppend("80K 110 140");
2658
2659  // This whole GOP should be saved, and should be able to continue appending
2660  // data to it.
2661  CheckExpectedRangesByTimestamp("{ [80,170) }");
2662  AppendBuffers("170D30");
2663  CheckExpectedRangesByTimestamp("{ [80,200) }");
2664
2665  // Set memory limit to 100 and append a 2nd range after this without
2666  // triggering GC.
2667  SetMemoryLimit(100);
2668  NewSegmentAppend("400K 430 460 490K 520 550 580K 610 640");
2669  CheckExpectedRangesByTimestamp("{ [80,200) [400,670) }");
2670
2671  // Seek to 80ms to make the first range the selected range.
2672  SeekToTimestamp(base::TimeDelta::FromMilliseconds(80));
2673
2674  // Now set memory limit to 3 and append a GOP in the middle of the second
2675  // range. Because it is after the selected range, this tests that the GOP is
2676  // saved when deleting from the back.
2677  SetMemoryLimit(3);
2678  NewSegmentAppend("500K 530 560 590");
2679
2680  // Should save the GOP containing the seek point and GOP that was last
2681  // appended.
2682  CheckExpectedRangesByTimestamp("{ [80,200) [500,620) }");
2683
2684  // Continue appending to this GOP after GC.
2685  AppendBuffers("620D30");
2686  CheckExpectedRangesByTimestamp("{ [80,200) [500,650) }");
2687}
2688
2689// Test saving the last GOP appended when the GOP containing the next buffer is
2690// adjacent to the last GOP appended.
2691TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected1) {
2692  // Append 3 GOPs at 0ms, 90ms, and 180ms.
2693  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240");
2694  CheckExpectedRangesByTimestamp("{ [0,270) }");
2695
2696  // Seek to the GOP at 90ms.
2697  SeekToTimestamp(base::TimeDelta::FromMilliseconds(90));
2698
2699  // Set the memory limit to 1, then overlap the GOP at 0.
2700  SetMemoryLimit(1);
2701  NewSegmentAppend("0K 30 60");
2702
2703  // Should save the GOP at 0ms and 90ms.
2704  CheckExpectedRangesByTimestamp("{ [0,180) }");
2705
2706  // Seek to 0 and check all buffers.
2707  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
2708  CheckExpectedBuffers("0K 30 60 90K 120 150");
2709  CheckNoNextBuffer();
2710
2711  // Now seek back to 90ms and append a GOP at 180ms.
2712  SeekToTimestamp(base::TimeDelta::FromMilliseconds(90));
2713  NewSegmentAppend("180K 210 240");
2714
2715  // Should save the GOP at 90ms and the GOP at 180ms.
2716  CheckExpectedRangesByTimestamp("{ [90,270) }");
2717  CheckExpectedBuffers("90K 120 150 180K 210 240");
2718  CheckNoNextBuffer();
2719}
2720
2721// Test saving the last GOP appended when it is at the beginning or end of the
2722// selected range. This tests when the last GOP appended is before or after the
2723// GOP containing the next buffer, but not directly adjacent to this GOP.
2724TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected2) {
2725  // Append 4 GOPs starting at positions 0ms, 90ms, 180ms, 270ms.
2726  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
2727  CheckExpectedRangesByTimestamp("{ [0,360) }");
2728
2729  // Seek to the last GOP at 270ms.
2730  SeekToTimestamp(base::TimeDelta::FromMilliseconds(270));
2731
2732  // Set the memory limit to 1, then overlap the GOP at 90ms.
2733  SetMemoryLimit(1);
2734  NewSegmentAppend("90K 120 150");
2735
2736  // Should save the GOP at 90ms and the GOP at 270ms.
2737  CheckExpectedRangesByTimestamp("{ [90,180) [270,360) }");
2738
2739  // Set memory limit to 100 and add 3 GOPs to the end of the selected range
2740  // at 360ms, 450ms, and 540ms.
2741  SetMemoryLimit(100);
2742  NewSegmentAppend("360K 390 420 450K 480 510 540K 570 600");
2743  CheckExpectedRangesByTimestamp("{ [90,180) [270,630) }");
2744
2745  // Constrain the memory limit again and overlap the GOP at 450ms to test
2746  // deleting from the back.
2747  SetMemoryLimit(1);
2748  NewSegmentAppend("450K 480 510");
2749
2750  // Should save GOP at 270ms and the GOP at 450ms.
2751  CheckExpectedRangesByTimestamp("{ [270,360) [450,540) }");
2752}
2753
2754// Test saving the last GOP appended when it is the same as the GOP containing
2755// the next buffer.
2756TEST_F(SourceBufferStreamTest, GarbageCollection_SaveAppendGOP_Selected3) {
2757  // Seek to start of stream.
2758  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
2759
2760  // Append 3 GOPs starting at 0ms, 90ms, 180ms.
2761  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240");
2762  CheckExpectedRangesByTimestamp("{ [0,270) }");
2763
2764  // Set the memory limit to 1 then begin appending the start of a GOP starting
2765  // at 0ms.
2766  SetMemoryLimit(1);
2767  NewSegmentAppend("0K 30");
2768
2769  // Should save the newly appended GOP, which is also the next GOP that will be
2770  // returned from the seek request.
2771  CheckExpectedRangesByTimestamp("{ [0,60) }");
2772
2773  // Check the buffers in the range.
2774  CheckExpectedBuffers("0K 30");
2775  CheckNoNextBuffer();
2776
2777  // Continue appending to this buffer.
2778  AppendBuffers("60 90");
2779
2780  // Should still save the rest of this GOP and should be able to fulfill the
2781  // read.
2782  CheckExpectedRangesByTimestamp("{ [0,120) }");
2783  CheckExpectedBuffers("60 90");
2784  CheckNoNextBuffer();
2785}
2786
2787// Currently disabled because of bug: crbug.com/140875.
2788TEST_F(SourceBufferStreamTest, DISABLED_GarbageCollection_WaitingForKeyframe) {
2789  // Set memory limit to 10 buffers.
2790  SetMemoryLimit(10);
2791
2792  // Append 5 buffers at positions 10 through 14 and exhaust the buffers.
2793  NewSegmentAppend(10, 5, &kDataA);
2794  Seek(10);
2795  CheckExpectedBuffers(10, 14, &kDataA);
2796  CheckExpectedRanges("{ [10,14) }");
2797
2798  // We are now stalled at position 15.
2799  CheckNoNextBuffer();
2800
2801  // Do an end overlap that causes the latter half of the range to be deleted.
2802  NewSegmentAppend(5, 6, &kDataA);
2803  CheckNoNextBuffer();
2804  CheckExpectedRanges("{ [5,10) }");
2805
2806  // Append buffers from position 20 to 29. This should trigger GC.
2807  NewSegmentAppend(20, 10, &kDataA);
2808
2809  // GC should keep the keyframe before the seek position 15, and the next 9
2810  // buffers closest to the seek position.
2811  CheckNoNextBuffer();
2812  CheckExpectedRanges("{ [10,10) [20,28) }");
2813
2814  // Fulfill the seek by appending one buffer at 15.
2815  NewSegmentAppend(15, 1, &kDataA);
2816  CheckExpectedBuffers(15, 15, &kDataA);
2817  CheckExpectedRanges("{ [15,15) [20,28) }");
2818}
2819
2820// Test the performance of garbage collection.
2821TEST_F(SourceBufferStreamTest, GarbageCollection_Performance) {
2822  // Force |keyframes_per_second_| to be equal to kDefaultFramesPerSecond.
2823  SetStreamInfo(kDefaultFramesPerSecond, kDefaultFramesPerSecond);
2824
2825  const int kBuffersToKeep = 1000;
2826  SetMemoryLimit(kBuffersToKeep);
2827
2828  int buffers_appended = 0;
2829
2830  NewSegmentAppend(0, kBuffersToKeep);
2831  buffers_appended += kBuffersToKeep;
2832
2833  const int kBuffersToAppend = 1000;
2834  const int kGarbageCollections = 3;
2835  for (int i = 0; i < kGarbageCollections; ++i) {
2836    AppendBuffers(buffers_appended, kBuffersToAppend);
2837    buffers_appended += kBuffersToAppend;
2838  }
2839}
2840
2841TEST_F(SourceBufferStreamTest, GetRemovalRange_BytesToFree) {
2842  // Append 2 GOPs starting at 300ms, 30ms apart.
2843  NewSegmentAppend("300K 330 360 390K 420 450");
2844
2845  // Append 2 GOPs starting at 600ms, 30ms apart.
2846  NewSegmentAppend("600K 630 660 690K 720 750");
2847
2848  // Append 2 GOPs starting at 900ms, 30ms apart.
2849  NewSegmentAppend("900K 930 960 990K 1020 1050");
2850
2851  CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }");
2852
2853  int remove_range_end = -1;
2854  int bytes_removed = -1;
2855
2856  // Size 0.
2857  bytes_removed = GetRemovalRangeInMs(300, 1080, 0, &remove_range_end);
2858  EXPECT_EQ(-1, remove_range_end);
2859  EXPECT_EQ(0, bytes_removed);
2860
2861  // Smaller than the size of GOP.
2862  bytes_removed = GetRemovalRangeInMs(300, 1080, 1, &remove_range_end);
2863  EXPECT_EQ(390, remove_range_end);
2864  // Remove as the size of GOP.
2865  EXPECT_EQ(3, bytes_removed);
2866
2867  // The same size with a GOP.
2868  bytes_removed = GetRemovalRangeInMs(300, 1080, 3, &remove_range_end);
2869  EXPECT_EQ(390, remove_range_end);
2870  EXPECT_EQ(3, bytes_removed);
2871
2872  // The same size with a range.
2873  bytes_removed = GetRemovalRangeInMs(300, 1080, 6, &remove_range_end);
2874  EXPECT_EQ(480, remove_range_end);
2875  EXPECT_EQ(6, bytes_removed);
2876
2877  // A frame larger than a range.
2878  bytes_removed = GetRemovalRangeInMs(300, 1080, 7, &remove_range_end);
2879  EXPECT_EQ(690, remove_range_end);
2880  EXPECT_EQ(9, bytes_removed);
2881
2882  // The same size with two ranges.
2883  bytes_removed = GetRemovalRangeInMs(300, 1080, 12, &remove_range_end);
2884  EXPECT_EQ(780, remove_range_end);
2885  EXPECT_EQ(12, bytes_removed);
2886
2887  // Larger than two ranges.
2888  bytes_removed = GetRemovalRangeInMs(300, 1080, 14, &remove_range_end);
2889  EXPECT_EQ(990, remove_range_end);
2890  EXPECT_EQ(15, bytes_removed);
2891
2892  // The same size with the whole ranges.
2893  bytes_removed = GetRemovalRangeInMs(300, 1080, 18, &remove_range_end);
2894  EXPECT_EQ(1080, remove_range_end);
2895  EXPECT_EQ(18, bytes_removed);
2896
2897  // Larger than the whole ranges.
2898  bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end);
2899  EXPECT_EQ(1080, remove_range_end);
2900  EXPECT_EQ(18, bytes_removed);
2901}
2902
2903TEST_F(SourceBufferStreamTest, GetRemovalRange_Range) {
2904  // Append 2 GOPs starting at 300ms, 30ms apart.
2905  NewSegmentAppend("300K 330 360 390K 420 450");
2906
2907  // Append 2 GOPs starting at 600ms, 30ms apart.
2908  NewSegmentAppend("600K 630 660 690K 720 750");
2909
2910  // Append 2 GOPs starting at 900ms, 30ms apart.
2911  NewSegmentAppend("900K 930 960 990K 1020 1050");
2912
2913  CheckExpectedRangesByTimestamp("{ [300,480) [600,780) [900,1080) }");
2914
2915  int remove_range_end = -1;
2916  int bytes_removed = -1;
2917
2918  // Within a GOP and no keyframe.
2919  bytes_removed = GetRemovalRangeInMs(630, 660, 20, &remove_range_end);
2920  EXPECT_EQ(-1, remove_range_end);
2921  EXPECT_EQ(0, bytes_removed);
2922
2923  // Across a GOP and no keyframe.
2924  bytes_removed = GetRemovalRangeInMs(630, 750, 20, &remove_range_end);
2925  EXPECT_EQ(-1, remove_range_end);
2926  EXPECT_EQ(0, bytes_removed);
2927
2928  // The same size with a range.
2929  bytes_removed = GetRemovalRangeInMs(600, 780, 20, &remove_range_end);
2930  EXPECT_EQ(780, remove_range_end);
2931  EXPECT_EQ(6, bytes_removed);
2932
2933  // One frame larger than a range.
2934  bytes_removed = GetRemovalRangeInMs(570, 810, 20, &remove_range_end);
2935  EXPECT_EQ(780, remove_range_end);
2936  EXPECT_EQ(6, bytes_removed);
2937
2938  // Facing the other ranges.
2939  bytes_removed = GetRemovalRangeInMs(480, 900, 20, &remove_range_end);
2940  EXPECT_EQ(780, remove_range_end);
2941  EXPECT_EQ(6, bytes_removed);
2942
2943  // In the midle of the other ranges, but not including any GOP.
2944  bytes_removed = GetRemovalRangeInMs(420, 960, 20, &remove_range_end);
2945  EXPECT_EQ(780, remove_range_end);
2946  EXPECT_EQ(6, bytes_removed);
2947
2948  // In the middle of the other ranges.
2949  bytes_removed = GetRemovalRangeInMs(390, 990, 20, &remove_range_end);
2950  EXPECT_EQ(990, remove_range_end);
2951  EXPECT_EQ(12, bytes_removed);
2952
2953  // A frame smaller than the whole ranges.
2954  bytes_removed = GetRemovalRangeInMs(330, 1050, 20, &remove_range_end);
2955  EXPECT_EQ(990, remove_range_end);
2956  EXPECT_EQ(12, bytes_removed);
2957
2958  // The same with the whole ranges.
2959  bytes_removed = GetRemovalRangeInMs(300, 1080, 20, &remove_range_end);
2960  EXPECT_EQ(1080, remove_range_end);
2961  EXPECT_EQ(18, bytes_removed);
2962
2963  // Larger than the whole ranges.
2964  bytes_removed = GetRemovalRangeInMs(270, 1110, 20, &remove_range_end);
2965  EXPECT_EQ(1080, remove_range_end);
2966  EXPECT_EQ(18, bytes_removed);
2967}
2968
2969TEST_F(SourceBufferStreamTest, ConfigChange_Basic) {
2970  VideoDecoderConfig new_config = TestVideoConfig::Large();
2971  ASSERT_FALSE(new_config.Matches(video_config_));
2972
2973  Seek(0);
2974  CheckVideoConfig(video_config_);
2975
2976  // Append 5 buffers at positions 0 through 4
2977  NewSegmentAppend(0, 5, &kDataA);
2978
2979  CheckVideoConfig(video_config_);
2980
2981  // Signal a config change.
2982  stream_->UpdateVideoConfig(new_config);
2983
2984  // Make sure updating the config doesn't change anything since new_config
2985  // should not be associated with the buffer GetNextBuffer() will return.
2986  CheckVideoConfig(video_config_);
2987
2988  // Append 5 buffers at positions 5 through 9.
2989  NewSegmentAppend(5, 5, &kDataB);
2990
2991  // Consume the buffers associated with the initial config.
2992  scoped_refptr<StreamParserBuffer> buffer;
2993  for (int i = 0; i < 5; i++) {
2994    EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
2995    CheckVideoConfig(video_config_);
2996  }
2997
2998  // Verify the next attempt to get a buffer will signal that a config change
2999  // has happened.
3000  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
3001
3002  // Verify that the new config is now returned.
3003  CheckVideoConfig(new_config);
3004
3005  // Consume the remaining buffers associated with the new config.
3006  for (int i = 0; i < 5; i++) {
3007    CheckVideoConfig(new_config);
3008    EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kSuccess);
3009  }
3010}
3011
3012TEST_F(SourceBufferStreamTest, ConfigChange_Seek) {
3013  scoped_refptr<StreamParserBuffer> buffer;
3014  VideoDecoderConfig new_config = TestVideoConfig::Large();
3015
3016  Seek(0);
3017  NewSegmentAppend(0, 5, &kDataA);
3018  stream_->UpdateVideoConfig(new_config);
3019  NewSegmentAppend(5, 5, &kDataB);
3020
3021  // Seek to the start of the buffers with the new config and make sure a
3022  // config change is signalled.
3023  CheckVideoConfig(video_config_);
3024  Seek(5);
3025  CheckVideoConfig(video_config_);
3026  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
3027  CheckVideoConfig(new_config);
3028  CheckExpectedBuffers(5, 9, &kDataB);
3029
3030
3031  // Seek to the start which has a different config. Don't fetch any buffers and
3032  // seek back to buffers with the current config. Make sure a config change
3033  // isn't signalled in this case.
3034  CheckVideoConfig(new_config);
3035  Seek(0);
3036  Seek(7);
3037  CheckExpectedBuffers(5, 9, &kDataB);
3038
3039
3040  // Seek to the start and make sure a config change is signalled.
3041  CheckVideoConfig(new_config);
3042  Seek(0);
3043  CheckVideoConfig(new_config);
3044  EXPECT_EQ(stream_->GetNextBuffer(&buffer), SourceBufferStream::kConfigChange);
3045  CheckVideoConfig(video_config_);
3046  CheckExpectedBuffers(0, 4, &kDataA);
3047}
3048
3049TEST_F(SourceBufferStreamTest, SetExplicitDuration) {
3050  // Append 2 buffers at positions 5 through 6.
3051  NewSegmentAppend(5, 2);
3052
3053  // Append 2 buffers at positions 10 through 11.
3054  NewSegmentAppend(10, 2);
3055
3056  // Append 2 buffers at positions 15 through 16.
3057  NewSegmentAppend(15, 2);
3058
3059  // Check expected ranges.
3060  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
3061
3062  // Set duration to be between buffers 6 and 10.
3063  stream_->OnSetDuration(frame_duration() * 8);
3064
3065  // Should truncate the data after 6.
3066  CheckExpectedRanges("{ [5,6) }");
3067
3068  // Adding data past the previous duration should still work.
3069  NewSegmentAppend(0, 20);
3070  CheckExpectedRanges("{ [0,19) }");
3071}
3072
3073TEST_F(SourceBufferStreamTest, SetExplicitDuration_EdgeCase) {
3074  // Append 10 buffers at positions 10 through 19.
3075  NewSegmentAppend(10, 10);
3076
3077  // Append 5 buffers at positions 25 through 29.
3078  NewSegmentAppend(25, 5);
3079
3080  // Check expected ranges.
3081  CheckExpectedRanges("{ [10,19) [25,29) }");
3082
3083  // Set duration to be right before buffer 25.
3084  stream_->OnSetDuration(frame_duration() * 25);
3085
3086  // Should truncate the last range.
3087  CheckExpectedRanges("{ [10,19) }");
3088}
3089
3090TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialRange) {
3091  // Append 5 buffers at positions 0 through 4.
3092  NewSegmentAppend(0, 5);
3093
3094  // Append 10 buffers at positions 10 through 19.
3095  NewSegmentAppend(10, 10);
3096
3097  // Append 5 buffers at positions 25 through 29.
3098  NewSegmentAppend(25, 5);
3099
3100  // Check expected ranges.
3101  CheckExpectedRanges("{ [0,4) [10,19) [25,29) }");
3102
3103  // Set duration to be between buffers 13 and 14.
3104  stream_->OnSetDuration(frame_duration() * 14);
3105
3106  // Should truncate the data after 13.
3107  CheckExpectedRanges("{ [0,4) [10,13) }");
3108}
3109
3110TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeleteSelectedRange) {
3111  // Append 2 buffers at positions 5 through 6.
3112  NewSegmentAppend(5, 2);
3113
3114  // Append 2 buffers at positions 10 through 11.
3115  NewSegmentAppend(10, 2);
3116
3117  // Append 2 buffers at positions 15 through 16.
3118  NewSegmentAppend(15, 2);
3119
3120  // Check expected ranges.
3121  CheckExpectedRanges("{ [5,6) [10,11) [15,16) }");
3122
3123  // Seek to 10.
3124  Seek(10);
3125
3126  // Set duration to be after position 3.
3127  stream_->OnSetDuration(frame_duration() * 4);
3128
3129  // Expect everything to be deleted, and should not have next buffer anymore.
3130  CheckNoNextBuffer();
3131  CheckExpectedRanges("{ }");
3132
3133  // Appending data at position 10 should not fulfill the seek.
3134  // (If the duration is set to be something smaller than the current seek
3135  // point, then the seek point is reset and the SourceBufferStream waits
3136  // for a new seek request. Therefore even if the data is re-appended, it
3137  // should not fulfill the old seek.)
3138  NewSegmentAppend(0, 15);
3139  CheckNoNextBuffer();
3140  CheckExpectedRanges("{ [0,14) }");
3141}
3142
3143TEST_F(SourceBufferStreamTest, SetExplicitDuration_DeletePartialSelectedRange) {
3144  // Append 5 buffers at positions 0 through 4.
3145  NewSegmentAppend(0, 5);
3146
3147  // Append 20 buffers at positions 10 through 29.
3148  NewSegmentAppend(10, 20);
3149
3150  // Check expected ranges.
3151  CheckExpectedRanges("{ [0,4) [10,29) }");
3152
3153  // Seek to position 10.
3154  Seek(10);
3155
3156  // Set duration to be between buffers 24 and 25.
3157  stream_->OnSetDuration(frame_duration() * 25);
3158
3159  // Should truncate the data after 24.
3160  CheckExpectedRanges("{ [0,4) [10,24) }");
3161
3162  // The seek position should not be lost.
3163  CheckExpectedBuffers(10, 10);
3164
3165  // Now set the duration immediately after buffer 10.
3166  stream_->OnSetDuration(frame_duration() * 11);
3167
3168  // Seek position should be reset.
3169  CheckNoNextBuffer();
3170  CheckExpectedRanges("{ [0,4) [10,10) }");
3171}
3172
3173// Test the case where duration is set while the stream parser buffers
3174// already start passing the data to decoding pipeline. Selected range,
3175// when invalidated by getting truncated, should be updated to NULL
3176// accordingly so that successive append operations keep working.
3177TEST_F(SourceBufferStreamTest, SetExplicitDuration_UpdateSelectedRange) {
3178  // Seek to start of stream.
3179  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
3180
3181  NewSegmentAppend("0K 30 60 90");
3182
3183  // Read out the first few buffers.
3184  CheckExpectedBuffers("0K 30");
3185
3186  // Set duration to be right before buffer 1.
3187  stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(60));
3188
3189  // Verify that there is no next buffer.
3190  CheckNoNextBuffer();
3191
3192  // We should be able to append new buffers at this point.
3193  NewSegmentAppend("120K 150");
3194
3195  CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }");
3196}
3197
3198TEST_F(SourceBufferStreamTest,
3199       SetExplicitDuration_AfterSegmentTimestampAndBeforeFirstBufferTimestamp) {
3200
3201  NewSegmentAppend("0K 30K 60K");
3202
3203  // Append a segment with a start timestamp of 200, but the first
3204  // buffer starts at 230ms. This can happen in muxed content where the
3205  // audio starts before the first frame.
3206  NewSegmentAppend(base::TimeDelta::FromMilliseconds(200),
3207                   "230K 260K 290K 320K");
3208
3209  NewSegmentAppend("400K 430K 460K");
3210
3211  CheckExpectedRangesByTimestamp("{ [0,90) [200,350) [400,490) }");
3212
3213  stream_->OnSetDuration(base::TimeDelta::FromMilliseconds(120));
3214
3215  // Verify that the buffered ranges are updated properly and we don't crash.
3216  CheckExpectedRangesByTimestamp("{ [0,90) }");
3217}
3218
3219// Test the case were the current playback position is at the end of the
3220// buffered data and several overlaps occur that causes the selected
3221// range to get split and then merged back into a single range.
3222TEST_F(SourceBufferStreamTest, OverlapSplitAndMergeWhileWaitingForMoreData) {
3223  // Seek to start of stream.
3224  SeekToTimestamp(base::TimeDelta::FromMilliseconds(0));
3225
3226  NewSegmentAppend("0K 30 60 90 120K 150");
3227  CheckExpectedRangesByTimestamp("{ [0,180) }");
3228
3229  // Read all the buffered data.
3230  CheckExpectedBuffers("0K 30 60 90 120K 150");
3231  CheckNoNextBuffer();
3232
3233  // Append data over the current GOP so that a keyframe is needed before
3234  // playback can continue from the current position.
3235  NewSegmentAppend("120K 150");
3236  CheckExpectedRangesByTimestamp("{ [0,180) }");
3237
3238  // Append buffers that cause the range to get split.
3239  NewSegmentAppend("0K 30");
3240  CheckExpectedRangesByTimestamp("{ [0,60) [120,180) }");
3241
3242  // Append buffers that cause the ranges to get merged.
3243  AppendBuffers("60 90");
3244
3245  CheckExpectedRangesByTimestamp("{ [0,180) }");
3246
3247  // Verify that we still don't have a next buffer.
3248  CheckNoNextBuffer();
3249
3250  // Add more data to the end and verify that this new data is read correctly.
3251  NewSegmentAppend("180K 210");
3252  CheckExpectedRangesByTimestamp("{ [0,240) }");
3253  CheckExpectedBuffers("180K 210");
3254}
3255
3256// Verify that non-keyframes with the same timestamp in the same
3257// append are handled correctly.
3258TEST_F(SourceBufferStreamTest, SameTimestamp_Video_SingleAppend) {
3259  Seek(0);
3260  NewSegmentAppend("0K 30 30 60 90 120K 150");
3261  CheckExpectedBuffers("0K 30 30 60 90 120K 150");
3262}
3263
3264// Verify that non-keyframes with the same timestamp can occur
3265// in different appends.
3266TEST_F(SourceBufferStreamTest, SameTimestamp_Video_TwoAppends) {
3267  Seek(0);
3268  NewSegmentAppend("0K 30");
3269  AppendBuffers("30 60 90 120K 150");
3270  CheckExpectedBuffers("0K 30 30 60 90 120K 150");
3271}
3272
3273// Verify that a non-keyframe followed by a keyframe with the same timestamp
3274// is not allowed.
3275TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_1) {
3276  Seek(0);
3277  NewSegmentAppend("0K 30");
3278  AppendBuffers_ExpectFailure("30K 60");
3279}
3280
3281TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Invalid_2) {
3282  Seek(0);
3283  NewSegmentAppend_ExpectFailure("0K 30 30K 60");
3284}
3285
3286// Verify that a keyframe followed by a non-keyframe with the same timestamp
3287// is allowed.
3288TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_TwoAppends) {
3289  Seek(0);
3290  NewSegmentAppend("0K 30K");
3291  AppendBuffers("30 60");
3292  CheckExpectedBuffers("0K 30K 30 60");
3293}
3294
3295TEST_F(SourceBufferStreamTest, SameTimestamp_VideoKeyFrame_SingleAppend) {
3296  Seek(0);
3297  NewSegmentAppend("0K 30K 30 60");
3298  CheckExpectedBuffers("0K 30K 30 60");
3299}
3300
3301TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_1) {
3302  Seek(0);
3303  NewSegmentAppend("0K 30 60 60 90 120K 150");
3304
3305  NewSegmentAppend("60K 91 121K 151");
3306  CheckExpectedBuffers("0K 30 60K 91 121K 151");
3307}
3308
3309TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_2) {
3310  Seek(0);
3311  NewSegmentAppend("0K 30 60 60 90 120K 150");
3312  NewSegmentAppend("0K 30 61");
3313  CheckExpectedBuffers("0K 30 61 120K 150");
3314}
3315
3316TEST_F(SourceBufferStreamTest, SameTimestamp_Video_Overlap_3) {
3317  Seek(0);
3318  NewSegmentAppend("0K 20 40 60 80 100K 101 102 103K");
3319  NewSegmentAppend("0K 20 40 60 80 90");
3320  CheckExpectedBuffers("0K 20 40 60 80 90 100K 101 102 103K");
3321  AppendBuffers("90 110K 150");
3322  Seek(0);
3323  CheckExpectedBuffers("0K 20 40 60 80 90 90 110K 150");
3324  CheckNoNextBuffer();
3325  CheckExpectedRangesByTimestamp("{ [0,190) }");
3326}
3327
3328// Test all the valid same timestamp cases for audio.
3329TEST_F(SourceBufferStreamTest, SameTimestamp_Audio) {
3330  AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
3331                            44100, NULL, 0, false);
3332  stream_.reset(new SourceBufferStream(config, log_cb(), true));
3333  Seek(0);
3334  NewSegmentAppend("0K 0K 30K 30 60 60");
3335  CheckExpectedBuffers("0K 0K 30K 30 60 60");
3336}
3337
3338TEST_F(SourceBufferStreamTest, SameTimestamp_Audio_Invalid_1) {
3339  AudioDecoderConfig config(kCodecMP3, kSampleFormatF32, CHANNEL_LAYOUT_STEREO,
3340                            44100, NULL, 0, false);
3341  stream_.reset(new SourceBufferStream(config, log_cb(), true));
3342  Seek(0);
3343  NewSegmentAppend_ExpectFailure("0K 30 30K 60");
3344}
3345
3346// If seeking past any existing range and the seek is pending
3347// because no data has been provided for that position,
3348// the stream position can be considered as the end of stream.
3349TEST_F(SourceBufferStreamTest, EndSelected_During_PendingSeek) {
3350  // Append 15 buffers at positions 0 through 14.
3351  NewSegmentAppend(0, 15);
3352
3353  Seek(20);
3354  EXPECT_TRUE(stream_->IsSeekPending());
3355  stream_->MarkEndOfStream();
3356  EXPECT_FALSE(stream_->IsSeekPending());
3357}
3358
3359// If there is a pending seek between 2 existing ranges,
3360// the end of the stream has not been reached.
3361TEST_F(SourceBufferStreamTest, EndNotSelected_During_PendingSeek) {
3362  // Append:
3363  // - 10 buffers at positions 0 through 9.
3364  // - 10 buffers at positions 30 through 39
3365  NewSegmentAppend(0, 10);
3366  NewSegmentAppend(30, 10);
3367
3368  Seek(20);
3369  EXPECT_TRUE(stream_->IsSeekPending());
3370  stream_->MarkEndOfStream();
3371  EXPECT_TRUE(stream_->IsSeekPending());
3372}
3373
3374
3375// Removing exact start & end of a range.
3376TEST_F(SourceBufferStreamTest, Remove_WholeRange1) {
3377  Seek(0);
3378  NewSegmentAppend("10K 40 70K 100 130K");
3379  CheckExpectedRangesByTimestamp("{ [10,160) }");
3380  RemoveInMs(10, 160, 160);
3381  CheckExpectedRangesByTimestamp("{ }");
3382}
3383
3384// Removal range starts before range and ends exactly at end.
3385TEST_F(SourceBufferStreamTest, Remove_WholeRange2) {
3386  Seek(0);
3387  NewSegmentAppend("10K 40 70K 100 130K");
3388  CheckExpectedRangesByTimestamp("{ [10,160) }");
3389  RemoveInMs(0, 160, 160);
3390  CheckExpectedRangesByTimestamp("{ }");
3391}
3392
3393// Removal range starts at the start of a range and ends beyond the
3394// range end.
3395TEST_F(SourceBufferStreamTest, Remove_WholeRange3) {
3396  Seek(0);
3397  NewSegmentAppend("10K 40 70K 100 130K");
3398  CheckExpectedRangesByTimestamp("{ [10,160) }");
3399  RemoveInMs(10, 200, 200);
3400  CheckExpectedRangesByTimestamp("{ }");
3401}
3402
3403// Removal range starts before range start and ends after the range end.
3404TEST_F(SourceBufferStreamTest, Remove_WholeRange4) {
3405  Seek(0);
3406  NewSegmentAppend("10K 40 70K 100 130K");
3407  CheckExpectedRangesByTimestamp("{ [10,160) }");
3408  RemoveInMs(0, 200, 200);
3409  CheckExpectedRangesByTimestamp("{ }");
3410}
3411
3412// Removes multiple ranges.
3413TEST_F(SourceBufferStreamTest, Remove_WholeRange5) {
3414  Seek(0);
3415  NewSegmentAppend("10K 40 70K 100 130K");
3416  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3417  NewSegmentAppend("2000K 2030 2060K 2090 2120K");
3418  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
3419  RemoveInMs(10, 3000, 3000);
3420  CheckExpectedRangesByTimestamp("{ }");
3421}
3422
3423// Verifies a [0-infinity) range removes everything.
3424TEST_F(SourceBufferStreamTest, Remove_ZeroToInfinity) {
3425  Seek(0);
3426  NewSegmentAppend("10K 40 70K 100 130K");
3427  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3428  NewSegmentAppend("2000K 2030 2060K 2090 2120K");
3429  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
3430  Remove(base::TimeDelta(), kInfiniteDuration(), kInfiniteDuration());
3431  CheckExpectedRangesByTimestamp("{ }");
3432}
3433
3434// Removal range starts at the beginning of the range and ends in the
3435// middle of the range. This test verifies that full GOPs are removed.
3436TEST_F(SourceBufferStreamTest, Remove_Partial1) {
3437  Seek(0);
3438  NewSegmentAppend("10K 40 70K 100 130K");
3439  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3440  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
3441  RemoveInMs(0, 80, 2200);
3442  CheckExpectedRangesByTimestamp("{ [130,160) [1000,1150) }");
3443}
3444
3445// Removal range starts in the middle of a range and ends at the exact
3446// end of the range.
3447TEST_F(SourceBufferStreamTest, Remove_Partial2) {
3448  Seek(0);
3449  NewSegmentAppend("10K 40 70K 100 130K");
3450  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3451  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
3452  RemoveInMs(40, 160, 2200);
3453  CheckExpectedRangesByTimestamp("{ [10,40) [1000,1150) }");
3454}
3455
3456// Removal range starts and ends within a range.
3457TEST_F(SourceBufferStreamTest, Remove_Partial3) {
3458  Seek(0);
3459  NewSegmentAppend("10K 40 70K 100 130K");
3460  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3461  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) }");
3462  RemoveInMs(40, 120, 2200);
3463  CheckExpectedRangesByTimestamp("{ [10,40) [130,160) [1000,1150) }");
3464}
3465
3466// Removal range starts in the middle of one range and ends in the
3467// middle of another range.
3468TEST_F(SourceBufferStreamTest, Remove_Partial4) {
3469  Seek(0);
3470  NewSegmentAppend("10K 40 70K 100 130K");
3471  NewSegmentAppend("1000K 1030 1060K 1090 1120K");
3472  NewSegmentAppend("2000K 2030 2060K 2090 2120K");
3473  CheckExpectedRangesByTimestamp("{ [10,160) [1000,1150) [2000,2150) }");
3474  RemoveInMs(40, 2030, 2200);
3475  CheckExpectedRangesByTimestamp("{ [10,40) [2060,2150) }");
3476}
3477
3478// Test behavior when the current position is removed and new buffers
3479// are appended over the removal range.
3480TEST_F(SourceBufferStreamTest, Remove_CurrentPosition) {
3481  Seek(0);
3482  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
3483  CheckExpectedRangesByTimestamp("{ [0,360) }");
3484  CheckExpectedBuffers("0K 30 60 90K 120");
3485
3486  // Remove a range that includes the next buffer (i.e., 150).
3487  RemoveInMs(150, 210, 360);
3488  CheckExpectedRangesByTimestamp("{ [0,150) [270,360) }");
3489
3490  // Verify that no next buffer is returned.
3491  CheckNoNextBuffer();
3492
3493  // Append some buffers to fill the gap that was created.
3494  NewSegmentAppend("120K 150 180 210K 240");
3495  CheckExpectedRangesByTimestamp("{ [0,360) }");
3496
3497  // Verify that buffers resume at the next keyframe after the
3498  // current position.
3499  CheckExpectedBuffers("210K 240 270K 300 330");
3500}
3501
3502// Test behavior when buffers in the selected range before the current position
3503// are removed.
3504TEST_F(SourceBufferStreamTest, Remove_BeforeCurrentPosition) {
3505  Seek(0);
3506  NewSegmentAppend("0K 30 60 90K 120 150 180K 210 240 270K 300 330");
3507  CheckExpectedRangesByTimestamp("{ [0,360) }");
3508  CheckExpectedBuffers("0K 30 60 90K 120");
3509
3510  // Remove a range that is before the current playback position.
3511  RemoveInMs(0, 90, 360);
3512  CheckExpectedRangesByTimestamp("{ [90,360) }");
3513
3514  CheckExpectedBuffers("150 180K 210 240 270K 300 330");
3515}
3516
3517// Test removing the entire range for the current media segment
3518// being appended.
3519TEST_F(SourceBufferStreamTest, Remove_MidSegment) {
3520  Seek(0);
3521  NewSegmentAppend("0K 30 60 90 120K 150 180 210");
3522  CheckExpectedRangesByTimestamp("{ [0,240) }");
3523
3524  NewSegmentAppend("0K 30");
3525
3526  CheckExpectedBuffers("0K");
3527
3528  CheckExpectedRangesByTimestamp("{ [0,60) [120,240) }");
3529
3530  // Remove the entire range that is being appended to.
3531  RemoveInMs(0, 60, 240);
3532
3533  // Verify that there is no next buffer since it was removed.
3534  CheckNoNextBuffer();
3535
3536  CheckExpectedRangesByTimestamp("{ [120,240) }");
3537
3538  // Continue appending frames for the current GOP.
3539  AppendBuffers("60 90");
3540
3541  // Verify that the non-keyframes are not added.
3542  CheckExpectedRangesByTimestamp("{ [120,240) }");
3543
3544  // Finish the previous GOP and start the next one.
3545  AppendBuffers("120 150K 180");
3546
3547  // Verify that new GOP replaces the existing range.
3548  CheckExpectedRangesByTimestamp("{ [150,210) }");
3549
3550
3551  SeekToTimestamp(base::TimeDelta::FromMilliseconds(150));
3552  CheckExpectedBuffers("150K 180");
3553  CheckNoNextBuffer();
3554}
3555
3556// Test removing the current GOP being appended, while not removing
3557// the entire range the GOP belongs to.
3558TEST_F(SourceBufferStreamTest, Remove_GOPBeingAppended) {
3559  Seek(0);
3560  NewSegmentAppend("0K 30 60 90 120K 150 180");
3561  CheckExpectedRangesByTimestamp("{ [0,210) }");
3562
3563  // Remove the current GOP being appended.
3564  RemoveInMs(120, 150, 240);
3565  CheckExpectedRangesByTimestamp("{ [0,120) }");
3566
3567  // Continue appending the current GOP and the next one.
3568  AppendBuffers("210 240K 270 300");
3569
3570  // Verify that the non-keyframe in the previous GOP does
3571  // not effect any existing ranges and a new range is started at the
3572  // beginning of the next GOP.
3573  CheckExpectedRangesByTimestamp("{ [0,120) [240,330) }");
3574
3575  // Verify the buffers in the ranges.
3576  CheckExpectedBuffers("0K 30 60 90");
3577  CheckNoNextBuffer();
3578  SeekToTimestamp(base::TimeDelta::FromMilliseconds(240));
3579  CheckExpectedBuffers("240K 270 300");
3580}
3581
3582TEST_F(SourceBufferStreamTest, Remove_WholeGOPBeingAppended) {
3583  Seek(0);
3584  NewSegmentAppend("0K 30 60 90");
3585  CheckExpectedRangesByTimestamp("{ [0,120) }");
3586
3587  // Remove the keyframe of the current GOP being appended.
3588  RemoveInMs(0, 30, 120);
3589  CheckExpectedRangesByTimestamp("{ }");
3590
3591  // Continue appending the current GOP.
3592  AppendBuffers("210 240");
3593
3594  CheckExpectedRangesByTimestamp("{ }");
3595
3596  // Append the beginning of the next GOP.
3597  AppendBuffers("270K 300");
3598
3599  // Verify that the new range is started at the
3600  // beginning of the next GOP.
3601  CheckExpectedRangesByTimestamp("{ [270,330) }");
3602
3603  // Verify the buffers in the ranges.
3604  CheckNoNextBuffer();
3605  SeekToTimestamp(base::TimeDelta::FromMilliseconds(270));
3606  CheckExpectedBuffers("270K 300");
3607}
3608
3609TEST_F(SourceBufferStreamTest,
3610       Remove_PreviousAppendDestroyedAndOverwriteExistingRange) {
3611  SeekToTimestamp(base::TimeDelta::FromMilliseconds(90));
3612
3613  NewSegmentAppend("90K 120 150");
3614  CheckExpectedRangesByTimestamp("{ [90,180) }");
3615
3616  // Append a segment before the previously appended data.
3617  NewSegmentAppend("0K 30 60");
3618
3619  // Verify that the ranges get merged.
3620  CheckExpectedRangesByTimestamp("{ [0,180) }");
3621
3622  // Remove the data from the last append.
3623  RemoveInMs(0, 90, 360);
3624  CheckExpectedRangesByTimestamp("{ [90,180) }");
3625
3626  // Append a new segment that follows the removed segment and
3627  // starts at the beginning of the range left over from the
3628  // remove.
3629  NewSegmentAppend("90K 121 151");
3630  CheckExpectedBuffers("90K 121 151");
3631}
3632
3633TEST_F(SourceBufferStreamTest, Remove_GapAtBeginningOfMediaSegment) {
3634  Seek(0);
3635
3636  // Append a media segment that has a gap at the beginning of it.
3637  NewSegmentAppend(base::TimeDelta::FromMilliseconds(0),
3638                   "30K 60 90 120K 150");
3639  CheckExpectedRangesByTimestamp("{ [0,180) }");
3640
3641  // Remove the gap that doesn't contain any buffers.
3642  RemoveInMs(0, 10, 180);
3643  CheckExpectedRangesByTimestamp("{ [10,180) }");
3644
3645  // Verify we still get the first buffer still since only part of
3646  // the gap was removed.
3647  // TODO(acolwell/wolenetz): Consider not returning a buffer at this
3648  // point since the current seek position has been explicitly
3649  // removed but didn't happen to remove any buffers.
3650  // http://crbug.com/384016
3651  CheckExpectedBuffers("30K");
3652
3653  // Remove a range that includes the first GOP.
3654  RemoveInMs(0, 60, 180);
3655
3656  // Verify that no buffer is returned because the current buffer
3657  // position has been removed.
3658  CheckNoNextBuffer();
3659
3660  CheckExpectedRangesByTimestamp("{ [120,180) }");
3661}
3662
3663TEST_F(SourceBufferStreamTest, Text_Append_SingleRange) {
3664  SetTextStream();
3665  NewSegmentAppend("0K 500K 1000K");
3666  CheckExpectedRangesByTimestamp("{ [0,1500) }");
3667
3668  Seek(0);
3669  CheckExpectedBuffers("0K 500K 1000K");
3670}
3671
3672TEST_F(SourceBufferStreamTest, Text_Append_DisjointAfter) {
3673  SetTextStream();
3674  NewSegmentAppend("0K 500K 1000K");
3675  CheckExpectedRangesByTimestamp("{ [0,1500) }");
3676  NewSegmentAppend("3000K 3500K 4000K");
3677  CheckExpectedRangesByTimestamp("{ [0,4500) }");
3678
3679  Seek(0);
3680  CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K");
3681}
3682
3683TEST_F(SourceBufferStreamTest, Text_Append_DisjointBefore) {
3684  SetTextStream();
3685  NewSegmentAppend("3000K 3500K 4000K");
3686  CheckExpectedRangesByTimestamp("{ [3000,4500) }");
3687  NewSegmentAppend("0K 500K 1000K");
3688  CheckExpectedRangesByTimestamp("{ [0,4500) }");
3689
3690  Seek(0);
3691  CheckExpectedBuffers("0K 500K 1000K 3000K 3500K 4000K");
3692}
3693
3694TEST_F(SourceBufferStreamTest, Text_CompleteOverlap) {
3695  SetTextStream();
3696  NewSegmentAppend("3000K 3500K 4000K");
3697  CheckExpectedRangesByTimestamp("{ [3000,4500) }");
3698  NewSegmentAppend("0K 501K 1001K 1501K 2001K 2501K "
3699                   "3001K 3501K 4001K 4501K 5001K");
3700  CheckExpectedRangesByTimestamp("{ [0,5501) }");
3701
3702  Seek(0);
3703  CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 2501K "
3704                       "3001K 3501K 4001K 4501K 5001K");
3705}
3706
3707TEST_F(SourceBufferStreamTest, Text_OverlapAfter) {
3708  SetTextStream();
3709  NewSegmentAppend("0K 500K 1000K 1500K 2000K");
3710  CheckExpectedRangesByTimestamp("{ [0,2500) }");
3711  NewSegmentAppend("1499K 2001K 2501K 3001K");
3712  CheckExpectedRangesByTimestamp("{ [0,3501) }");
3713
3714  Seek(0);
3715  CheckExpectedBuffers("0K 500K 1000K 1499K 2001K 2501K 3001K");
3716}
3717
3718TEST_F(SourceBufferStreamTest, Text_OverlapBefore) {
3719  SetTextStream();
3720  NewSegmentAppend("1500K 2000K 2500K 3000K 3500K");
3721  CheckExpectedRangesByTimestamp("{ [1500,4000) }");
3722  NewSegmentAppend("0K 501K 1001K 1501K 2001K");
3723  CheckExpectedRangesByTimestamp("{ [0,4000) }");
3724
3725  Seek(0);
3726  CheckExpectedBuffers("0K 501K 1001K 1501K 2001K 3000K 3500K");
3727}
3728
3729TEST_F(SourceBufferStreamTest, SpliceFrame_Basic) {
3730  Seek(0);
3731  NewSegmentAppend("0K S(3K 6 9D3 10D5) 15 20 S(25K 30D5 35D5) 40");
3732  CheckExpectedBuffers("0K 3K 6 9 C 10 15 20 25K 30 C 35 40");
3733  CheckNoNextBuffer();
3734}
3735
3736TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSplice) {
3737  Seek(0);
3738  NewSegmentAppend("0K S(3K 6 9D3 10D5) 15K 20");
3739  CheckExpectedBuffers("0K 3K 6");
3740
3741  SeekToTimestamp(base::TimeDelta::FromMilliseconds(15));
3742  CheckExpectedBuffers("15K 20");
3743  CheckNoNextBuffer();
3744}
3745
3746TEST_F(SourceBufferStreamTest, SpliceFrame_SeekClearsSpliceFromTrackBuffer) {
3747  Seek(0);
3748  NewSegmentAppend("0K 2K S(3K 6 9D3 10D5) 15K 20");
3749  CheckExpectedBuffers("0K 2K");
3750
3751  // Overlap the existing segment.
3752  NewSegmentAppend("5K 15K 20");
3753  CheckExpectedBuffers("3K 6");
3754
3755  SeekToTimestamp(base::TimeDelta::FromMilliseconds(15));
3756  CheckExpectedBuffers("15K 20");
3757  CheckNoNextBuffer();
3758}
3759
3760TEST_F(SourceBufferStreamTest, SpliceFrame_ConfigChangeWithinSplice) {
3761  VideoDecoderConfig new_config = TestVideoConfig::Large();
3762  ASSERT_FALSE(new_config.Matches(video_config_));
3763
3764  // Add a new video config, then reset the config index back to the original.
3765  stream_->UpdateVideoConfig(new_config);
3766  stream_->UpdateVideoConfig(video_config_);
3767
3768  Seek(0);
3769  CheckVideoConfig(video_config_);
3770  NewSegmentAppend("0K S(3K 6C 9D3 10D5) 15");
3771
3772  CheckExpectedBuffers("0K 3K C");
3773  CheckVideoConfig(new_config);
3774  CheckExpectedBuffers("6 9 C");
3775  CheckExpectedBuffers("10 C");
3776  CheckVideoConfig(video_config_);
3777  CheckExpectedBuffers("15");
3778  CheckNoNextBuffer();
3779}
3780
3781TEST_F(SourceBufferStreamTest, SpliceFrame_BasicFromTrackBuffer) {
3782  Seek(0);
3783  NewSegmentAppend("0K 5K S(8K 9D1 10D10) 20");
3784  CheckExpectedBuffers("0K 5K");
3785
3786  // Overlap the existing segment.
3787  NewSegmentAppend("5K 20");
3788  CheckExpectedBuffers("8K 9 C 10 20");
3789  CheckNoNextBuffer();
3790}
3791
3792TEST_F(SourceBufferStreamTest,
3793       SpliceFrame_ConfigChangeWithinSpliceFromTrackBuffer) {
3794  VideoDecoderConfig new_config = TestVideoConfig::Large();
3795  ASSERT_FALSE(new_config.Matches(video_config_));
3796
3797  // Add a new video config, then reset the config index back to the original.
3798  stream_->UpdateVideoConfig(new_config);
3799  stream_->UpdateVideoConfig(video_config_);
3800
3801  Seek(0);
3802  CheckVideoConfig(video_config_);
3803  NewSegmentAppend("0K 5K S(7K 8C 9D1 10D10) 20");
3804  CheckExpectedBuffers("0K 5K");
3805
3806  // Overlap the existing segment.
3807  NewSegmentAppend("5K 20");
3808  CheckExpectedBuffers("7K C");
3809  CheckVideoConfig(new_config);
3810  CheckExpectedBuffers("8 9 C");
3811  CheckExpectedBuffers("10 C");
3812  CheckVideoConfig(video_config_);
3813  CheckExpectedBuffers("20");
3814  CheckNoNextBuffer();
3815}
3816
3817TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Basic) {
3818  SetAudioStream();
3819  Seek(0);
3820  NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3821  NewSegmentAppend("11K 13K 15K 17K");
3822  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
3823  CheckNoNextBuffer();
3824}
3825
3826TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoExactSplices) {
3827  SetAudioStream();
3828  Seek(0);
3829  NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3830  NewSegmentAppend("10K 14K");
3831  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 14K");
3832  CheckNoNextBuffer();
3833}
3834
3835// Do not allow splices on top of splices.
3836TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoDoubleSplice) {
3837  SetAudioStream();
3838  Seek(0);
3839  NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3840  NewSegmentAppend("11K 13K 15K 17K");
3841
3842  // Verify the splice was created.
3843  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11K 13K 15K 17K");
3844  CheckNoNextBuffer();
3845  Seek(0);
3846
3847  // Create a splice before the first splice which would include it.
3848  NewSegmentAppend("9D2K");
3849
3850  // A splice on top of a splice should result in a discard of the original
3851  // splice and no new splice frame being generated.
3852  CheckExpectedBuffers("0K 2K 4K 6K 8K 9K 13K 15K 17K");
3853  CheckNoNextBuffer();
3854}
3855
3856// Test that a splice is not created if an end timestamp and start timestamp
3857// overlap.
3858TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoSplice) {
3859  SetAudioStream();
3860  Seek(0);
3861  NewSegmentAppend("0K 2K 4K 6K 8K 10K");
3862  NewSegmentAppend("12K 14K 16K 18K");
3863  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K 14K 16K 18K");
3864  CheckNoNextBuffer();
3865}
3866
3867TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_CorrectMediaSegmentStartTime) {
3868  SetAudioStream();
3869  Seek(0);
3870  NewSegmentAppend("0K 2K 4K");
3871  CheckExpectedRangesByTimestamp("{ [0,6) }");
3872  NewSegmentAppend("6K 8K 10K");
3873  CheckExpectedRangesByTimestamp("{ [0,12) }");
3874  NewSegmentAppend("1K 4D2K");
3875  CheckExpectedRangesByTimestamp("{ [0,12) }");
3876  CheckExpectedBuffers("0K 2K 4K C 1K 4K 6K 8K 10K");
3877  CheckNoNextBuffer();
3878}
3879
3880TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_ConfigChange) {
3881  SetAudioStream();
3882
3883  AudioDecoderConfig new_config(kCodecVorbis,
3884                                kSampleFormatPlanarF32,
3885                                CHANNEL_LAYOUT_MONO,
3886                                1000,
3887                                NULL,
3888                                0,
3889                                false);
3890  ASSERT_NE(new_config.channel_layout(), audio_config_.channel_layout());
3891
3892  Seek(0);
3893  CheckAudioConfig(audio_config_);
3894  NewSegmentAppend("0K 2K 4K 6K");
3895  stream_->UpdateAudioConfig(new_config);
3896  NewSegmentAppend("5K 8K 12K");
3897  CheckExpectedBuffers("0K 2K 4K 6K C 5K 8K 12K");
3898  CheckAudioConfig(new_config);
3899  CheckNoNextBuffer();
3900}
3901
3902// Ensure splices are not created if there are not enough frames to crossfade.
3903TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_NoTinySplices) {
3904  SetAudioStream();
3905  Seek(0);
3906
3907  // Overlap the range [0, 2) with [1, 3).  Since each frame has a duration of
3908  // 2ms this results in an overlap of 1ms between the ranges.  A splice frame
3909  // should not be generated since it requires at least 2 frames, or 2ms in this
3910  // case, of data to crossfade.
3911  NewSegmentAppend("0D2K");
3912  CheckExpectedRangesByTimestamp("{ [0,2) }");
3913  NewSegmentAppend("1D2K");
3914  CheckExpectedRangesByTimestamp("{ [0,3) }");
3915  CheckExpectedBuffers("0K 1K");
3916  CheckNoNextBuffer();
3917}
3918
3919TEST_F(SourceBufferStreamTest, Audio_SpliceFrame_Preroll) {
3920  SetAudioStream();
3921  Seek(0);
3922  NewSegmentAppend("0K 2K 4K 6K 8K 10K 12K");
3923  NewSegmentAppend("11P 13K 15K 17K");
3924  CheckExpectedBuffers("0K 2K 4K 6K 8K 10K 12K C 11P 13K 15K 17K");
3925  CheckNoNextBuffer();
3926}
3927
3928TEST_F(SourceBufferStreamTest, Audio_PrerollFrame) {
3929  Seek(0);
3930  NewSegmentAppend("0K 3P 6K");
3931  CheckExpectedBuffers("0K 3P 6K");
3932  CheckNoNextBuffer();
3933}
3934
3935TEST_F(SourceBufferStreamTest, BFrames) {
3936  Seek(0);
3937  NewSegmentAppend("0K 120|30 30|60 60|90 90|120");
3938  CheckExpectedRangesByTimestamp("{ [0,150) }");
3939
3940  CheckExpectedBuffers("0K 120|30 30|60 60|90 90|120");
3941  CheckNoNextBuffer();
3942}
3943
3944// TODO(vrk): Add unit tests where keyframes are unaligned between streams.
3945// (crbug.com/133557)
3946
3947// TODO(vrk): Add unit tests with end of stream being called at interesting
3948// times.
3949
3950}  // namespace media
3951