15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/source_buffer_stream.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/debug/trace_event.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "media/base/audio_splicer.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/filters/source_buffer_platform.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/filters/source_buffer_range.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper method that returns true if |ranges| is sorted in increasing order,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// false otherwise.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsRangeListSorted(
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::list<media::SourceBufferRange*>& ranges) {
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp prev = kNoDecodeTimestamp();
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  for (std::list<SourceBufferRange*>::const_iterator itr =
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ranges.begin(); itr != ranges.end(); ++itr) {
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (prev != kNoDecodeTimestamp() && prev >= (*itr)->GetStartTimestamp())
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev = (*itr)->GetEndTimestamp();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an estimate of how far from the beginning or end of a range a buffer
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// can be to still be considered in the range, given the |approximate_duration|
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a buffer in the stream.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(wolenetz): Once all stream parsers emit accurate frame durations, use
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// logic like FrameProcessor (2*last_frame_duration + last_decode_timestamp)
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// instead of an overall maximum interbuffer delta for range discontinuity
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// detection, and adjust similarly for splice frame discontinuity detection.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// See http://crbug.com/351489 and http://crbug.com/351166.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::TimeDelta ComputeFudgeRoom(base::TimeDelta approximate_duration) {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Because we do not know exactly when is the next timestamp, any buffer
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that starts within 2x the approximate duration of a buffer is considered
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // within this range.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 2 * approximate_duration;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An arbitrarily-chosen number to estimate the duration of a buffer if none
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is set and there's not enough information to get a better estimate.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int kDefaultBufferDurationInMs = 125;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The amount of time the beginning of the buffered data can differ from the
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// start time in order to still be considered the start of stream.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static base::TimeDelta kSeekToStartFudgeRoom() {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return base::TimeDelta::FromMilliseconds(1000);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccistatic SourceBufferRange::GapPolicy TypeToGapPolicy(
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SourceBufferStream::Type type) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (type) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case SourceBufferStream::kAudio:
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case SourceBufferStream::kVideo:
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return SourceBufferRange::NO_GAPS_ALLOWED;
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case SourceBufferStream::kText:
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return SourceBufferRange::ALLOW_GAPS;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return SourceBufferRange::NO_GAPS_ALLOWED;
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config,
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       const LogCB& log_cb,
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       bool splice_frames_enabled)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : log_cb_(log_cb),
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_config_index_(0),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append_config_index_(0),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seek_pending_(false),
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      end_of_stream_(false),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seek_buffer_timestamp_(kNoTimestamp()),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_range_(NULL),
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      media_segment_start_time_(kNoDecodeTimestamp()),
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      range_for_next_append_(ranges_.end()),
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_media_segment_(false),
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_appended_buffer_is_keyframe_(false),
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_interbuffer_distance_(kNoTimestamp()),
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      memory_limit_(kSourceBufferAudioMemoryLimit),
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      config_change_pending_(false),
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_buffers_index_(0),
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pending_buffers_complete_(false),
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_frames_enabled_(splice_frames_enabled) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(audio_config.IsValidConfig());
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  audio_configs_.push_back(audio_config);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config,
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       const LogCB& log_cb,
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       bool splice_frames_enabled)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : log_cb_(log_cb),
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_config_index_(0),
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append_config_index_(0),
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seek_pending_(false),
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      end_of_stream_(false),
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      seek_buffer_timestamp_(kNoTimestamp()),
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selected_range_(NULL),
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      media_segment_start_time_(kNoDecodeTimestamp()),
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      range_for_next_append_(ranges_.end()),
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_media_segment_(false),
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      last_appended_buffer_is_keyframe_(false),
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      max_interbuffer_distance_(kNoTimestamp()),
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      memory_limit_(kSourceBufferVideoMemoryLimit),
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      config_change_pending_(false),
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_buffers_index_(0),
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pending_buffers_complete_(false),
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_frames_enabled_(splice_frames_enabled) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(video_config.IsValidConfig());
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  video_configs_.push_back(video_config);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config,
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       const LogCB& log_cb,
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                       bool splice_frames_enabled)
127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : log_cb_(log_cb),
128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_config_index_(0),
129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      append_config_index_(0),
130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      text_track_config_(text_config),
131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      seek_pending_(false),
132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      end_of_stream_(false),
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      seek_buffer_timestamp_(kNoTimestamp()),
134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      selected_range_(NULL),
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      media_segment_start_time_(kNoDecodeTimestamp()),
136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      range_for_next_append_(ranges_.end()),
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      new_media_segment_(false),
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      last_appended_buffer_is_keyframe_(false),
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      last_output_buffer_timestamp_(kNoDecodeTimestamp()),
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      max_interbuffer_distance_(kNoTimestamp()),
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      memory_limit_(kSourceBufferAudioMemoryLimit),
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      config_change_pending_(false),
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_buffers_index_(0),
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pending_buffers_complete_(false),
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      splice_frames_enabled_(splice_frames_enabled) {}
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::~SourceBufferStream() {
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!ranges_.empty()) {
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete ranges_.front();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ranges_.pop_front();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::OnNewMediaSegment(
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp media_segment_start_time) {
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DVLOG(1) << __FUNCTION__ << "(" << media_segment_start_time.InSecondsF()
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           << ")";
1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!end_of_stream_);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  media_segment_start_time_ = media_segment_start_time;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_media_segment_ = true;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator last_range = range_for_next_append_;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  range_for_next_append_ = FindExistingRangeFor(media_segment_start_time);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Only reset |last_appended_buffer_timestamp_| if this new media segment is
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not adjacent to the previous media segment appended to the stream.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (range_for_next_append_ == ranges_.end() ||
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !AreAdjacentInSequence(last_appended_buffer_timestamp_,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             media_segment_start_time)) {
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_appended_buffer_is_keyframe_ = false;
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range";
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else if (last_range != ranges_.end()) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(last_range == range_for_next_append_);
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DVLOG(3) << __FUNCTION__ << " next appended buffers will continue range "
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             << "unless intervening remove makes discontinuity";
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochbool SourceBufferStream::Append(const BufferQueue& buffers) {
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TRACE_EVENT2("media", "SourceBufferStream::Append",
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "stream type", GetStreamTypeName(),
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "buffers to append", buffers.size());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!buffers.empty());
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(media_segment_start_time_ != kNoDecodeTimestamp());
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp());
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!end_of_stream_);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // New media segments must begin with a keyframe.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_media_segment_ && !buffers.front()->IsKeyframe()) {
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_) << "Media segment did not begin with keyframe.";
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Buffers within a media segment should be monotonically increasing.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsMonotonicallyIncreasing(buffers))
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (media_segment_start_time_ < DecodeTimestamp() ||
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "Cannot append a media segment with negative timestamps.";
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(),
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                            buffers.front()->IsKeyframe())) {
2101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    MEDIA_LOG(log_cb_) << "Invalid same timestamp construct detected at time "
2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       << buffers.front()->GetDecodeTimestamp().InSecondsF();
2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateMaxInterbufferDistance(buffers);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetConfigIds(buffers);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Save a snapshot of stream state before range modifications are made.
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BufferQueue deleted_buffers;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PrepareRangesForNextAppend(buffers, &deleted_buffers);
2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // create a new range with |buffers|.
2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (range_for_next_append_ != ranges_.end()) {
2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    (*range_for_next_append_)->AppendBuffersToEnd(buffers);
2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp new_range_start_time = std::min(
2330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        media_segment_start_time_, buffers.front()->GetDecodeTimestamp());
2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const BufferQueue* buffers_for_new_range = &buffers;
2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BufferQueue trimmed_buffers;
2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // If the new range is not being created because of a new media
2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // segment, then we must make sure that we start with a keyframe.
2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // This can happen if the GOP in the previous append gets destroyed
2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // by a Remove() call.
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    if (!new_media_segment_) {
2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      BufferQueue::const_iterator itr = buffers.begin();
2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // Scan past all the non-keyframes.
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      while (itr != buffers.end() && !(*itr)->IsKeyframe()) {
2461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        ++itr;
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
2481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // If we didn't find a keyframe, then update the last appended
2501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      // buffer state and return.
2511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (itr == buffers.end()) {
2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe();
2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        return true;
255f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      } else if (itr != buffers.begin()) {
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Copy the first keyframe and everything after it into
257f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // |trimmed_buffers|.
258f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        trimmed_buffers.assign(itr, buffers.end());
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        buffers_for_new_range = &trimmed_buffers;
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
262f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      new_range_start_time =
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)          buffers_for_new_range->front()->GetDecodeTimestamp();
2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    range_for_next_append_ =
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AddToRanges(new SourceBufferRange(
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            TypeToGapPolicy(GetType()),
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            *buffers_for_new_range, new_range_start_time,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&SourceBufferStream::GetMaxInterbufferDistance,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this))));
2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    last_appended_buffer_timestamp_ =
2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        buffers_for_new_range->back()->GetDecodeTimestamp();
2741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    last_appended_buffer_is_keyframe_ =
2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        buffers_for_new_range->back()->IsKeyframe();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new_media_segment_ = false;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  MergeWithAdjacentRangeIfNecessary(range_for_next_append_);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Seek to try to fulfill a previous call to Seek().
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (seek_pending_) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(!selected_range_);
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(deleted_buffers.empty());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Seek(seek_buffer_timestamp_);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!deleted_buffers.empty()) {
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp start_of_deleted =
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        deleted_buffers.front()->GetDecodeTimestamp();
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(track_buffer_.empty() ||
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           track_buffer_.back()->GetDecodeTimestamp() < start_of_deleted)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << "decode timestamp "
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << track_buffer_.back()->GetDecodeTimestamp().InSecondsF() << " sec"
2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << ", start_of_deleted " << start_of_deleted.InSecondsF()<< " sec";
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    track_buffer_.insert(track_buffer_.end(), deleted_buffers.begin(),
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         deleted_buffers.end());
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Prune any extra buffers in |track_buffer_| if new keyframes
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // are appended to the range covered by |track_buffer_|.
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!track_buffer_.empty()) {
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp keyframe_timestamp =
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp());
3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (keyframe_timestamp != kNoDecodeTimestamp())
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PruneTrackBuffer(keyframe_timestamp);
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetSelectedRangeIfNeeded(next_buffer_timestamp);
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GarbageCollectIfNeeded();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(IsRangeListSorted(ranges_));
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(OnlySelectedRangeIsSeeked());
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end,
322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                base::TimeDelta duration) {
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF()
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)           << ", " << end.InSecondsF()
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)           << ", " << duration.InSecondsF() << ")";
326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(start >= base::TimeDelta()) << start.InSecondsF();
327bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(start < end) << "start " << start.InSecondsF()
328bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                      << " end " << end.InSecondsF();
329bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  DCHECK(duration != kNoTimestamp());
330bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp start_dts = DecodeTimestamp::FromPresentationTime(start);
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp end_dts = DecodeTimestamp::FromPresentationTime(end);
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp remove_end_timestamp =
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DecodeTimestamp::FromPresentationTime(duration);
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp keyframe_timestamp = FindKeyframeAfterTimestamp(end_dts);
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (keyframe_timestamp != kNoDecodeTimestamp()) {
337bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    remove_end_timestamp = keyframe_timestamp;
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  } else if (end_dts < remove_end_timestamp) {
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    remove_end_timestamp = end_dts;
340bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
341bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
3421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  BufferQueue deleted_buffers;
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RemoveInternal(start_dts, remove_end_timestamp, false, &deleted_buffers);
3441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!deleted_buffers.empty())
3461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp());
3471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SourceBufferStream::RemoveInternal(
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp start, DecodeTimestamp end, bool is_exclusive,
3511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    BufferQueue* deleted_buffers) {
3521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF()
3531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)           << ", " << end.InSecondsF()
3541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)           << ", " << is_exclusive << ")";
3551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(start >= DecodeTimestamp());
3571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(start < end) << "start " << start.InSecondsF()
3581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                      << " end " << end.InSecondsF();
3591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(deleted_buffers);
3601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
361bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  RangeList::iterator itr = ranges_.begin();
362bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
363bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  while (itr != ranges_.end()) {
364bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    SourceBufferRange* range = *itr;
3651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (range->GetStartTimestamp() >= end)
366bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      break;
367bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
368bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // Split off any remaining end piece and add it to |ranges_|.
3691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    SourceBufferRange* new_range = range->SplitRange(end, is_exclusive);
370bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (new_range) {
371bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      itr = ranges_.insert(++itr, new_range);
372bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      --itr;
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // Update the selected range if the next buffer position was transferred
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      // to |new_range|.
37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      if (new_range->HasNextBufferPosition())
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        SetSelectedRange(new_range);
378bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    }
379bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
380bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // Truncate the current range so that it only contains data before
381bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // the removal range.
382bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    BufferQueue saved_buffers;
3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool delete_range = range->TruncateAt(start, &saved_buffers, is_exclusive);
384bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
385bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // Check to see if the current playback position was removed and
386bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // update the selected range appropriately.
387bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (!saved_buffers.empty()) {
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      DCHECK(!range->HasNextBufferPosition());
3891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DCHECK(deleted_buffers->empty());
3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      *deleted_buffers = saved_buffers;
3921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
3931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (range == selected_range_ && !range->HasNextBufferPosition())
395bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      SetSelectedRange(NULL);
3961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // If the current range now is completely covered by the removal
3981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // range then delete it and move on.
3991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (delete_range) {
4001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DeleteAndRemoveRange(&itr);
4011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      continue;
4021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    }
4031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // Clear |range_for_next_append_| if we determine that the removal
4051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // operation makes it impossible for the next append to be added
4061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // to the current range.
4071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    if (range_for_next_append_ != ranges_.end() &&
4081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        *range_for_next_append_ == range &&
4096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) {
4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DecodeTimestamp potential_next_append_timestamp =
4111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          last_appended_buffer_timestamp_ +
4121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          base::TimeDelta::FromInternalValue(1);
4131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      if (!range->BelongsToRange(potential_next_append_timestamp)) {
4151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        DVLOG(1) << "Resetting range_for_next_append_ since the next append"
4161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 <<  " can't add to the current range.";
4171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        range_for_next_append_ =
4181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)            FindExistingRangeFor(potential_next_append_timestamp);
4191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      }
420bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    }
421bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
422bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    // Move on to the next range.
423bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    ++itr;
424bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(IsRangeListSorted(ranges_));
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DCHECK(OnlySelectedRangeIsSeeked());
4281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << " : done";
429bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
430bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::ResetSeekState() {
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetSelectedRange(NULL);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  track_buffer_.clear();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_change_pending_ = false;
4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  last_output_buffer_timestamp_ = kNoDecodeTimestamp();
436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  splice_buffers_index_ = 0;
43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffer_ = NULL;
43846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffers_complete_ = false;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::ShouldSeekToStartOfBuffered(
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::TimeDelta seek_timestamp) const {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ranges_.empty())
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta beginning_of_buffered =
4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ranges_.front()->GetStartTimestamp().ToPresentationTime();
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (seek_timestamp <= beginning_of_buffered &&
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          beginning_of_buffered < kSeekToStartFudgeRoom());
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsMonotonicallyIncreasing(
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BufferQueue& buffers) const {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!buffers.empty());
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool prev_is_keyframe = last_appended_buffer_is_keyframe_;
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (BufferQueue::const_iterator itr = buffers.begin();
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != buffers.end(); ++itr) {
4586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool current_is_keyframe = (*itr)->IsKeyframe();
4606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK(current_timestamp != kNoDecodeTimestamp());
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    DCHECK((*itr)->duration() >= base::TimeDelta())
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        << "Packet with invalid duration."
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        << " pts " << (*itr)->timestamp().InSecondsF()
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF()
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        << " dur " << (*itr)->duration().InSecondsF();
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (prev_timestamp != kNoDecodeTimestamp()) {
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (current_timestamp < prev_timestamp) {
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        MEDIA_LOG(log_cb_) << "Buffers were not monotonically increasing.";
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (current_timestamp == prev_timestamp &&
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          !SourceBufferRange::AllowSameTimestamp(prev_is_keyframe,
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                 current_is_keyframe)) {
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        MEDIA_LOG(log_cb_) << "Unexpected combination of buffers with the"
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           << " same timestamp detected at "
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           << current_timestamp.InSecondsF();
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return false;
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      }
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_timestamp = current_timestamp;
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    prev_is_keyframe = current_is_keyframe;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)bool SourceBufferStream::IsNextTimestampValid(
4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp next_timestamp, bool next_is_keyframe) const {
4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return (last_appended_buffer_timestamp_ != next_timestamp) ||
4921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      new_media_segment_ ||
4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SourceBufferRange::AllowSameTimestamp(last_appended_buffer_is_keyframe_,
4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                            next_is_keyframe);
4951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
4961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::OnlySelectedRangeIsSeeked() const {
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RangeList::const_iterator itr = ranges_.begin();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != ranges_.end(); ++itr) {
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !selected_range_ || selected_range_->HasNextBufferPosition();
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::UpdateMaxInterbufferDistance(
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const BufferQueue& buffers) {
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!buffers.empty());
5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (BufferQueue::const_iterator itr = buffers.begin();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != buffers.end(); ++itr) {
5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK(current_timestamp != kNoDecodeTimestamp());
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::TimeDelta interbuffer_distance = (*itr)->duration();
5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(interbuffer_distance >= base::TimeDelta());
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (prev_timestamp != kNoDecodeTimestamp()) {
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      interbuffer_distance =
5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          std::max(current_timestamp - prev_timestamp, interbuffer_distance);
5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (interbuffer_distance > base::TimeDelta()) {
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (max_interbuffer_distance_ == kNoTimestamp()) {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_interbuffer_distance_ = interbuffer_distance;
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        max_interbuffer_distance_ =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            std::max(max_interbuffer_distance_, interbuffer_distance);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_timestamp = current_timestamp;
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::SetConfigIds(const BufferQueue& buffers) {
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (BufferQueue::const_iterator itr = buffers.begin();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != buffers.end(); ++itr) {
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (*itr)->SetConfigId(append_config_index_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::GarbageCollectIfNeeded() {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compute size of |ranges_|.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int ranges_size = 0;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ranges_size += (*itr)->size_in_bytes();
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return if we're under or at the memory limit.
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ranges_size <= memory_limit_)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bytes_to_free = ranges_size - memory_limit_;
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Begin deleting after the last appended buffer.
55668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int bytes_freed = FreeBuffersAfterLastAppended(bytes_to_free);
55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begin deleting from the front.
55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (bytes_to_free - bytes_freed > 0)
56068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begin deleting from the back.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bytes_to_free - bytes_freed > 0)
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FreeBuffers(bytes_to_free - bytes_freed, true);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) {
5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() ||
5706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      next_buffer_timestamp == kNoDecodeTimestamp() ||
57168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      last_appended_buffer_timestamp_ >= next_buffer_timestamp) {
57268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
57368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
57468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp remove_range_start = last_appended_buffer_timestamp_;
57668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (last_appended_buffer_is_keyframe_)
57768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    remove_range_start += GetMaxInterbufferDistance();
57868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp remove_range_start_keyframe = FindKeyframeAfterTimestamp(
58068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      remove_range_start);
5816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (remove_range_start_keyframe != kNoDecodeTimestamp())
58268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    remove_range_start = remove_range_start_keyframe;
58368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (remove_range_start >= next_buffer_timestamp)
58468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return 0;
58568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp remove_range_end;
58768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int bytes_freed = GetRemovalRange(
58868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      remove_range_start, next_buffer_timestamp, total_bytes_to_free,
58968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      &remove_range_end);
5906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (bytes_freed > 0) {
5916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    Remove(remove_range_start.ToPresentationTime(),
5926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           remove_range_end.ToPresentationTime(),
5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)           next_buffer_timestamp.ToPresentationTime());
5946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
5956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
59668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return bytes_freed;
59768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
59868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
59968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)int SourceBufferStream::GetRemovalRange(
6006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
6026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(start_timestamp >= DecodeTimestamp()) << start_timestamp.InSecondsF();
60368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(start_timestamp < end_timestamp)
60468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << "start " << start_timestamp.InSecondsF()
60568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << ", end " << end_timestamp.InSecondsF();
60668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
60768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int bytes_to_free = total_bytes_to_free;
60868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int bytes_freed = 0;
60968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
61068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  for (RangeList::iterator itr = ranges_.begin();
61168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)       itr != ranges_.end() && bytes_to_free > 0; ++itr) {
61268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    SourceBufferRange* range = *itr;
61368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (range->GetStartTimestamp() >= end_timestamp)
61468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
61568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (range->GetEndTimestamp() < start_timestamp)
61668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      continue;
61768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
61868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int bytes_removed = range->GetRemovalGOP(
61968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        start_timestamp, end_timestamp, bytes_to_free, removal_end_timestamp);
62068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bytes_to_free -= bytes_removed;
62168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    bytes_freed += bytes_removed;
62268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
62368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return bytes_freed;
62468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
62568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int SourceBufferStream::FreeBuffers(int total_bytes_to_free,
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    bool reverse_direction) {
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  TRACE_EVENT2("media", "SourceBufferStream::FreeBuffers",
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "total bytes to free", total_bytes_to_free,
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)               "reverse direction", reverse_direction);
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(total_bytes_to_free, 0);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bytes_to_free = total_bytes_to_free;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int bytes_freed = 0;
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This range will save the last GOP appended to |range_for_next_append_|
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the buffers surrounding it get deleted during garbage collection.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SourceBufferRange* new_range_for_append = NULL;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!ranges_.empty() && bytes_to_free > 0) {
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SourceBufferRange* current_range = NULL;
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BufferQueue buffers;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int bytes_deleted = 0;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (reverse_direction) {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_range = ranges_.back();
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current_range->LastGOPContainsNextBufferPosition()) {
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(current_range, selected_range_);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_deleted = current_range->DeleteGOPFromBack(&buffers);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_range = ranges_.front();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (current_range->FirstGOPContainsNextBufferPosition()) {
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        DCHECK_EQ(current_range, selected_range_);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_deleted = current_range->DeleteGOPFromFront(&buffers);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check to see if we've just deleted the GOP that was last appended.
6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp();
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (end_timestamp == last_appended_buffer_timestamp_) {
6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp());
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(!new_range_for_append);
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Create a new range containing these buffers.
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new_range_for_append = new SourceBufferRange(
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          TypeToGapPolicy(GetType()),
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          buffers, kNoDecodeTimestamp(),
6701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          base::Bind(&SourceBufferStream::GetMaxInterbufferDistance,
6711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                     base::Unretained(this)));
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      range_for_next_append_ = ranges_.end();
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_to_free -= bytes_deleted;
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bytes_freed += bytes_deleted;
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (current_range->size_in_bytes() == 0) {
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK_NE(current_range, selected_range_);
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DCHECK(range_for_next_append_ == ranges_.end() ||
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             *range_for_next_append_ != current_range);
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete current_range;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      reverse_direction ? ranges_.pop_back() : ranges_.pop_front();
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Insert |new_range_for_append| into |ranges_|, if applicable.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (new_range_for_append) {
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    range_for_next_append_ = AddToRanges(new_range_for_append);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(range_for_next_append_ != ranges_.end());
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check to see if we need to merge |new_range_for_append| with the range
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // before or after it. |new_range_for_append| is created whenever the last
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GOP appended is encountered, regardless of whether any buffers after it
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // are ultimately deleted. Merging is necessary if there were no buffers
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // (or very few buffers) deleted after creating |new_range_for_append|.
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (range_for_next_append_ != ranges_.begin()) {
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      RangeList::iterator range_before_next = range_for_next_append_;
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      --range_before_next;
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MergeWithAdjacentRangeIfNecessary(range_before_next);
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MergeWithAdjacentRangeIfNecessary(range_for_next_append_);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bytes_freed;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void SourceBufferStream::PrepareRangesForNextAppend(
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const BufferQueue& new_buffers, BufferQueue* deleted_buffers) {
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(deleted_buffers);
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool temporarily_select_range = false;
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!track_buffer_.empty()) {
7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp tb_timestamp = track_buffer_.back()->GetDecodeTimestamp();
7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp);
7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (seek_timestamp != kNoDecodeTimestamp() &&
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        seek_timestamp < new_buffers.front()->GetDecodeTimestamp() &&
7171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        range_for_next_append_ != ranges_.end() &&
7181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        (*range_for_next_append_)->BelongsToRange(seek_timestamp)) {
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(tb_timestamp < seek_timestamp);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(!selected_range_);
7211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      DCHECK(!(*range_for_next_append_)->HasNextBufferPosition());
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // If there are GOPs between the end of the track buffer and the
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // beginning of the new buffers, then temporarily seek the range
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // so that the buffers between these two times will be deposited in
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // |deleted_buffers| as if they were part of the current playback
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // position.
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      // TODO(acolwell): Figure out a more elegant way to do this.
7291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      SeekAndSetSelectedRange(*range_for_next_append_, seek_timestamp);
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      temporarily_select_range = true;
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
734effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Handle splices between the existing buffers and the new buffers.  If a
735effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // splice is generated the timestamp and duration of the first buffer in
736effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |new_buffers| will be modified.
737effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (splice_frames_enabled_)
738effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    GenerateSpliceFrame(new_buffers);
739effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
7406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool prev_is_keyframe = last_appended_buffer_is_keyframe_;
7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp next_timestamp = new_buffers.front()->GetDecodeTimestamp();
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool next_is_keyframe = new_buffers.front()->IsKeyframe();
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (prev_timestamp != kNoDecodeTimestamp() &&
7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      prev_timestamp != next_timestamp) {
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Clean up the old buffers between the last appended buffer and the
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // beginning of |new_buffers|.
7491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Make the delete range exclusive if we are dealing with an allowed same
7531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // timestamp situation. This prevents the first buffer in the current append
7541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // from deleting the last buffer in the previous append if both buffers
7551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // have the same timestamp.
7560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  //
7570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // The delete range should never be exclusive if a splice frame was generated
7580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // because we don't generate splice frames for same timestamp situations.
7590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  DCHECK(new_buffers.front()->splice_timestamp() !=
7600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch         new_buffers.front()->timestamp());
7610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  const bool is_exclusive =
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      new_buffers.front()->splice_buffers().empty() &&
7630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      prev_timestamp == next_timestamp &&
7641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      SourceBufferRange::AllowSameTimestamp(prev_is_keyframe, next_is_keyframe);
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Delete the buffers that |new_buffers| overlaps.
7676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp start = new_buffers.front()->GetDecodeTimestamp();
7686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp end = new_buffers.back()->GetDecodeTimestamp();
7691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::TimeDelta duration = new_buffers.back()->duration();
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (duration != kNoTimestamp() && duration > base::TimeDelta()) {
7721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    end += duration;
7731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  } else {
7741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // TODO(acolwell): Ensure all buffers actually have proper
7751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // duration info so that this hack isn't needed.
7761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // http://crbug.com/312836
7771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    end += base::TimeDelta::FromInternalValue(1);
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RemoveInternal(start, end, is_exclusive, deleted_buffers);
7811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Restore the range seek state if necessary.
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (temporarily_select_range)
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetSelectedRange(NULL);
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::AreAdjacentInSequence(
7886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DecodeTimestamp first_timestamp, DecodeTimestamp second_timestamp) const {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return first_timestamp < second_timestamp &&
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      second_timestamp <=
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void SourceBufferStream::PruneTrackBuffer(const DecodeTimestamp timestamp) {
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we don't have the next timestamp, we don't have anything to delete.
7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (timestamp == kNoDecodeTimestamp())
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!track_buffer_.empty() &&
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         track_buffer_.back()->GetDecodeTimestamp() >= timestamp) {
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    track_buffer_.pop_back();
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::MergeWithAdjacentRangeIfNecessary(
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const RangeList::iterator& range_with_new_buffers_itr) {
8078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DCHECK(range_with_new_buffers_itr != ranges_.end());
8088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr;
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator next_range_itr = range_with_new_buffers_itr;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ++next_range_itr;
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (next_range_itr == ranges_.end() ||
8148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      !range_with_new_buffers->CanAppendRangeToEnd(**next_range_itr)) {
8158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
8168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool transfer_current_position = selected_range_ == *next_range_itr;
8198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  range_with_new_buffers->AppendRangeToEnd(**next_range_itr,
8208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                           transfer_current_position);
8218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Update |selected_range_| pointer if |range| has become selected after
8228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // merges.
8238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (transfer_current_position)
8248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    SetSelectedRange(range_with_new_buffers);
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (next_range_itr == range_for_next_append_)
8278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    range_for_next_append_ = range_with_new_buffers_itr;
8288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
8298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DeleteAndRemoveRange(&next_range_itr);
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::Seek(base::TimeDelta timestamp) {
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(timestamp >= base::TimeDelta());
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ResetSeekState();
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ShouldSeekToStartOfBuffered(timestamp)) {
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ranges_.front()->SeekToStart();
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetSelectedRange(ranges_.front());
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    seek_pending_ = false;
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  seek_buffer_timestamp_ = timestamp;
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  seek_pending_ = true;
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp seek_dts = DecodeTimestamp::FromPresentationTime(timestamp);
8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator itr = ranges_.end();
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
8506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if ((*itr)->CanSeekTo(seek_dts))
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (itr == ranges_.end())
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  SeekAndSetSelectedRange(*itr, seek_dts);
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  seek_pending_ = false;
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsSeekPending() const {
8627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return !(end_of_stream_ && IsEndSelected()) && seek_pending_;
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::OnSetDuration(base::TimeDelta duration) {
8666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp duration_dts =
8676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DecodeTimestamp::FromPresentationTime(duration);
8686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator itr = ranges_.end();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
8716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if ((*itr)->GetEndTimestamp() > duration_dts)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (itr == ranges_.end())
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Need to partially truncate this range.
8786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if ((*itr)->GetStartTimestamp() < duration_dts) {
8796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    bool delete_range = (*itr)->TruncateAt(duration_dts, NULL, false);
880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if ((*itr == selected_range_) && !selected_range_->HasNextBufferPosition())
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SetSelectedRange(NULL);
8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (delete_range) {
8845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      DeleteAndRemoveRange(&itr);
8855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else {
8865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ++itr;
8875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Delete all ranges that begin after |duration_dts|.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (itr != ranges_.end()) {
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // If we're about to delete the selected range, also reset the seek state.
8936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    DCHECK((*itr)->GetStartTimestamp() >= duration_dts);
8948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    if (*itr == selected_range_)
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ResetSeekState();
8968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    DeleteAndRemoveRange(&itr);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::Status SourceBufferStream::GetNextBuffer(
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_refptr<StreamParserBuffer>* out_buffer) {
9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!pending_buffer_.get()) {
9035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SourceBufferStream::Status status = GetNextBufferInternal(out_buffer);
90446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (status != SourceBufferStream::kSuccess || !SetPendingBuffer(out_buffer))
9055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return status;
9065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
90846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!pending_buffer_->splice_buffers().empty())
90946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return HandleNextBufferWithSplice(out_buffer);
91046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(pending_buffer_->preroll_buffer().get());
91246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return HandleNextBufferWithPreroll(out_buffer);
91346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
91446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
91546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithSplice(
91646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<StreamParserBuffer>* out_buffer) {
91746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const BufferQueue& splice_buffers = pending_buffer_->splice_buffers();
918effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const size_t last_splice_buffer_index = splice_buffers.size() - 1;
9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
920effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Are there any splice buffers left to hand out?  The last buffer should be
921effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // handed out separately since it represents the first post-splice buffer.
922effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (splice_buffers_index_ < last_splice_buffer_index) {
9235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Account for config changes which occur between fade out buffers.
9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (current_config_index_ !=
925effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        splice_buffers[splice_buffers_index_]->GetConfigId()) {
9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      config_change_pending_ = true;
927effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      DVLOG(1) << "Config change (splice buffer config ID does not match).";
9285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return SourceBufferStream::kConfigChange;
9295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
931a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    // Every pre splice buffer must have the same splice_timestamp().
93246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(pending_buffer_->splice_timestamp() ==
933a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch           splice_buffers[splice_buffers_index_]->splice_timestamp());
934a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
93546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    // No pre splice buffers should have preroll.
9361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    DCHECK(!splice_buffers[splice_buffers_index_]->preroll_buffer().get());
93746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
938effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    *out_buffer = splice_buffers[splice_buffers_index_++];
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return SourceBufferStream::kSuccess;
9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
942effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Did we hand out the last pre-splice buffer on the previous call?
94346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!pending_buffers_complete_) {
9445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    DCHECK_EQ(splice_buffers_index_, last_splice_buffer_index);
94546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pending_buffers_complete_ = true;
9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    config_change_pending_ = true;
9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DVLOG(1) << "Config change (forced for fade in of splice frame).";
9485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return SourceBufferStream::kConfigChange;
9495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
951effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // All pre-splice buffers have been handed out and a config change completed,
952effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // so hand out the final buffer for fade in.  Because a config change is
953effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // always issued prior to handing out this buffer, any changes in config id
954effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // have been inherently handled.
95546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(pending_buffers_complete_);
9565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  DCHECK_EQ(splice_buffers_index_, splice_buffers.size() - 1);
957a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  DCHECK(splice_buffers.back()->splice_timestamp() == kNoTimestamp());
958effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  *out_buffer = splice_buffers.back();
95946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffer_ = NULL;
96046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
96146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If the last splice buffer has preroll, hand off to the preroll handler.
96246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return SetPendingBuffer(out_buffer) ? HandleNextBufferWithPreroll(out_buffer)
96346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                      : SourceBufferStream::kSuccess;
96446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
96546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
96646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)SourceBufferStream::Status SourceBufferStream::HandleNextBufferWithPreroll(
96746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<StreamParserBuffer>* out_buffer) {
96846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Any config change should have already been handled.
96946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_EQ(current_config_index_, pending_buffer_->GetConfigId());
97046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Check if the preroll buffer has already been handed out.
97246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!pending_buffers_complete_) {
97346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    pending_buffers_complete_ = true;
97446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    *out_buffer = pending_buffer_->preroll_buffer();
97546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return SourceBufferStream::kSuccess;
97646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
97746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Preroll complete, hand out the final buffer.
97946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  *out_buffer = pending_buffer_;
98046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffer_ = NULL;
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return SourceBufferStream::kSuccess;
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SourceBufferStream::Status SourceBufferStream::GetNextBufferInternal(
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<StreamParserBuffer>* out_buffer) {
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(!config_change_pending_);
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!track_buffer_.empty()) {
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!selected_range_);
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scoped_refptr<StreamParserBuffer>& next_buffer = track_buffer_.front();
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // If the next buffer is an audio splice frame, the next effective config id
993effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    // comes from the first splice buffer.
9941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (next_buffer->GetSpliceBufferConfigId(0) != current_config_index_) {
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      config_change_pending_ = true;
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DVLOG(1) << "Config change (track buffer config ID does not match).";
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return kConfigChange;
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    *out_buffer = next_buffer;
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    track_buffer_.pop_front();
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp();
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If the track buffer becomes empty, then try to set the selected range
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // based on the timestamp of this buffer being returned.
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (track_buffer_.empty())
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SetSelectedRangeIfNeeded(last_output_buffer_timestamp_);
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kSuccess;
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (!selected_range_ || !selected_range_->HasNextBuffer()) {
10137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    if (end_of_stream_ && IsEndSelected())
10147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return kEndOfStream;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kNeedBuffer;
10167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_range_->GetNextConfigId() != current_config_index_) {
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    config_change_pending_ = true;
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Config change (selected range config ID does not match).";
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return kConfigChange;
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(selected_range_->GetNextBuffer(out_buffer));
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp();
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kSuccess;
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::GetNextBufferTimestamp() {
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!track_buffer_.empty())
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return track_buffer_.front()->GetDecodeTimestamp();
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!selected_range_)
10346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(selected_range_->HasNextBufferPosition());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return selected_range_->GetNextTimestamp();
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator
10416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)SourceBufferStream::FindExistingRangeFor(DecodeTimestamp start_timestamp) {
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*itr)->BelongsToRange(start_timestamp))
10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return itr;
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ranges_.end();
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::AddToRanges(SourceBufferRange* new_range) {
10516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp start_timestamp = new_range->GetStartTimestamp();
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator itr = ranges_.end();
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((*itr)->GetStartTimestamp() > start_timestamp)
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ranges_.insert(itr, new_range);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::RangeList::iterator
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SourceBufferStream::GetSelectedRangeItr() {
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(selected_range_);
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RangeList::iterator itr = ranges_.end();
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (*itr == selected_range_)
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(itr != ranges_.end());
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return itr;
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SourceBufferStream::SeekAndSetSelectedRange(
10736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    SourceBufferRange* range, DecodeTimestamp seek_timestamp) {
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (range)
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    range->Seek(seek_timestamp);
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetSelectedRange(range);
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) {
10801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DVLOG(1) << __FUNCTION__ << " : " << selected_range_ << " -> " << range;
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_range_)
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    selected_range_->ResetNextBufferPosition();
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(!range || range->HasNextBufferPosition());
10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  selected_range_ = range;
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const {
10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Ranges<base::TimeDelta> ranges;
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (RangeList::const_iterator itr = ranges_.begin();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       itr != ranges_.end(); ++itr) {
10916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    ranges.Add((*itr)->GetStartTimestamp().ToPresentationTime(),
10926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)               (*itr)->GetBufferedEndTimestamp().ToPresentationTime());
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ranges;
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::TimeDelta SourceBufferStream::GetBufferedDuration() const {
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (ranges_.empty())
10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return base::TimeDelta();
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();
11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SourceBufferStream::MarkEndOfStream() {
11057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(!end_of_stream_);
11067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  end_of_stream_ = true;
11077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
11087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1109ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid SourceBufferStream::UnmarkEndOfStream() {
11107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DCHECK(end_of_stream_);
11117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  end_of_stream_ = false;
11127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
11137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::IsEndSelected() const {
11157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  if (ranges_.empty())
11167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return true;
11177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (seek_pending_) {
11196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    base::TimeDelta last_range_end_time =
11206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();
11216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return seek_buffer_timestamp_ >= last_range_end_time;
11226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
11237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
11247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return selected_range_ == ranges_.back();
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() {
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (config_change_pending_)
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CompleteConfigChange();
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return audio_configs_[current_config_index_];
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const VideoDecoderConfig& SourceBufferStream::GetCurrentVideoDecoderConfig() {
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (config_change_pending_)
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CompleteConfigChange();
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return video_configs_[current_config_index_];
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const TextTrackConfig& SourceBufferStream::GetCurrentTextTrackConfig() {
1140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return text_track_config_;
1141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
1142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::TimeDelta SourceBufferStream::GetMaxInterbufferDistance() const {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (max_interbuffer_distance_ == kNoTimestamp())
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::TimeDelta::FromMilliseconds(kDefaultBufferDurationInMs);
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return max_interbuffer_distance_;
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::UpdateAudioConfig(const AudioDecoderConfig& config) {
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!audio_configs_.empty());
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(video_configs_.empty());
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(3) << "UpdateAudioConfig.";
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (audio_configs_[0].codec() != config.codec()) {
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_) << "Audio codec changes not allowed.";
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (audio_configs_[0].is_encrypted() != config.is_encrypted()) {
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_) << "Audio encryption changes not allowed.";
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see if the new config matches an existing one.
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < audio_configs_.size(); ++i) {
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (config.Matches(audio_configs_[i])) {
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append_config_index_ = i;
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No matches found so let's add this one to the list.
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  append_config_index_ = audio_configs_.size();
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(2) << "New audio config - index: " << append_config_index_;
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  audio_configs_.resize(audio_configs_.size() + 1);
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  audio_configs_[append_config_index_] = config;
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SourceBufferStream::UpdateVideoConfig(const VideoDecoderConfig& config) {
11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!video_configs_.empty());
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(audio_configs_.empty());
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(3) << "UpdateVideoConfig.";
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (video_configs_[0].codec() != config.codec()) {
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_) << "Video codec changes not allowed.";
11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (video_configs_[0].is_encrypted() != config.is_encrypted()) {
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MEDIA_LOG(log_cb_) << "Video encryption changes not allowed.";
11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check to see if the new config matches an existing one.
11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < video_configs_.size(); ++i) {
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (config.Matches(video_configs_[i])) {
11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      append_config_index_ = i;
11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No matches found so let's add this one to the list.
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  append_config_index_ = video_configs_.size();
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(2) << "New video config - index: " << append_config_index_;
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  video_configs_.resize(video_configs_.size() + 1);
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  video_configs_[append_config_index_] = config;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SourceBufferStream::CompleteConfigChange() {
12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config_change_pending_ = false;
12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (pending_buffer_.get()) {
12155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    current_config_index_ =
12161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        pending_buffer_->GetSpliceBufferConfigId(splice_buffers_index_);
12175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
12185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
12195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!track_buffer_.empty()) {
12211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    current_config_index_ = track_buffer_.front()->GetSpliceBufferConfigId(0);
12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (selected_range_ && selected_range_->HasNextBuffer())
12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_config_index_ = selected_range_->GetNextConfigId();
12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SourceBufferStream::SetSelectedRangeIfNeeded(
12306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const DecodeTimestamp timestamp) {
123158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")";
123258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (selected_range_) {
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(track_buffer_.empty());
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!track_buffer_.empty()) {
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(!selected_range_);
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp start_timestamp = timestamp;
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the next buffer timestamp is not known then use a timestamp just after
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the timestamp on the last buffer returned by GetNextBuffer().
12476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (start_timestamp == kNoDecodeTimestamp()) {
12486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if (last_output_buffer_timestamp_ == kNoDecodeTimestamp())
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    start_timestamp = last_output_buffer_timestamp_ +
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        base::TimeDelta::FromInternalValue(1);
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp seek_timestamp =
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FindNewSelectedRangeSeekTimestamp(start_timestamp);
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If we don't have buffered data to seek to, then return.
12596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (seek_timestamp == kNoDecodeTimestamp())
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(track_buffer_.empty());
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SeekAndSetSelectedRange(*FindExistingRangeFor(seek_timestamp),
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          seek_timestamp);
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp(
12686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const DecodeTimestamp start_timestamp) {
12696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(start_timestamp != kNoDecodeTimestamp());
12706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(start_timestamp >= DecodeTimestamp());
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RangeList::iterator itr = ranges_.begin();
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (; itr != ranges_.end(); ++itr) {
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((*itr)->GetEndTimestamp() >= start_timestamp) {
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (itr == ranges_.end())
12816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First check for a keyframe timestamp >= |start_timestamp|
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in the current range.
12856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp keyframe_timestamp =
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (*itr)->NextKeyframeTimestamp(start_timestamp);
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (keyframe_timestamp != kNoDecodeTimestamp())
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return keyframe_timestamp;
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If a keyframe was not found then look for a keyframe that is
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // "close enough" in the current or next range.
12936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DecodeTimestamp end_timestamp =
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(start_timestamp < end_timestamp);
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the current range doesn't start beyond |end_timestamp|.
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((*itr)->GetStartTimestamp() >= end_timestamp)
12996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check to see if the keyframe is within the acceptable range
13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (|start_timestamp|, |end_timestamp|].
13056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (keyframe_timestamp != kNoDecodeTimestamp() &&
13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_timestamp < keyframe_timestamp  &&
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      keyframe_timestamp <= end_timestamp) {
13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return keyframe_timestamp;
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |end_timestamp| is within this range, then no other checks are
13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // necessary.
13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (end_timestamp <= (*itr)->GetEndTimestamp())
13146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Move on to the next range.
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ++itr;
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Return early if the next range does not contain |end_timestamp|.
13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp)
13216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check to see if the keyframe is within the acceptable range
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (|start_timestamp|, |end_timestamp|].
13276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (keyframe_timestamp != kNoDecodeTimestamp() &&
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      start_timestamp < keyframe_timestamp  &&
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      keyframe_timestamp <= end_timestamp) {
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return keyframe_timestamp;
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return kNoDecodeTimestamp();
13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp(
13376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    const DecodeTimestamp timestamp) {
13386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(timestamp != kNoDecodeTimestamp());
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RangeList::iterator itr = FindExistingRangeFor(timestamp);
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (itr == ranges_.end())
13436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return kNoDecodeTimestamp();
13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // First check for a keyframe timestamp >= |timestamp|
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // in the current range.
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (*itr)->NextKeyframeTimestamp(timestamp);
13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string SourceBufferStream::GetStreamTypeName() const {
13515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  switch (GetType()) {
13525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case kAudio:
13535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return "AUDIO";
13545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case kVideo:
13555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return "VIDEO";
13565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case kText:
13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return "TEXT";
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  NOTREACHED();
13605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return "";
13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SourceBufferStream::Type SourceBufferStream::GetType() const {
13645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!audio_configs_.empty())
13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return kAudio;
13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!video_configs_.empty())
13675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return kVideo;
13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK_NE(text_track_config_.kind(), kTextNone);
13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return kText;
13702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)void SourceBufferStream::DeleteAndRemoveRange(RangeList::iterator* itr) {
13731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DVLOG(1) << __FUNCTION__;
13741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  DCHECK(*itr != ranges_.end());
13761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (**itr == selected_range_) {
13771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DVLOG(1) << __FUNCTION__ << " deleting selected range.";
13788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    SetSelectedRange(NULL);
13791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
13801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
13811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (*itr == range_for_next_append_) {
13821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    DVLOG(1) << __FUNCTION__ << " deleting range_for_next_append_.";
13831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    range_for_next_append_ = ranges_.end();
13846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
1385f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    last_appended_buffer_is_keyframe_ = false;
13861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
13878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
13888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  delete **itr;
13898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  *itr = ranges_.erase(*itr);
13908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
13918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochvoid SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) {
1393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  DCHECK(!new_buffers.empty());
1394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Splice frames are only supported for audio.
1396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (GetType() != kAudio)
1397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Find the overlapped range (if any).
1400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp();
14016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const DecodeTimestamp splice_dts =
14026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      DecodeTimestamp::FromPresentationTime(splice_timestamp);
14036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  RangeList::iterator range_itr = FindExistingRangeFor(splice_dts);
1404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (range_itr == ranges_.end())
1405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1406effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  const DecodeTimestamp max_splice_end_dts =
14086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      splice_dts + base::TimeDelta::FromMilliseconds(
14096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          AudioSplicer::kCrossfadeDurationInMilliseconds);
1410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Find all buffers involved before the splice point.
1412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  BufferQueue pre_splice_buffers;
1413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!(*range_itr)->GetBuffersInRange(
14146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          splice_dts, max_splice_end_dts, &pre_splice_buffers)) {
1415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // If there are gaps in the timeline, it's possible that we only find buffers
1419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // after the splice point but within the splice range.  For simplicity, we do
1420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // not generate splice frames in this case.
1421e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  //
1422e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // We also do not want to generate splices if the first new buffer replaces an
1423e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // existing buffer exactly.
1424e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (pre_splice_buffers.front()->timestamp() >= splice_timestamp)
1425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return;
1426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
142746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // If any |pre_splice_buffers| are already splices or preroll, do not generate
142846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // a splice.
1429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < pre_splice_buffers.size(); ++i) {
1430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const BufferQueue& original_splice_buffers =
1431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        pre_splice_buffers[i]->splice_buffers();
1432010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (!original_splice_buffers.empty()) {
1433010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      DVLOG(1) << "Can't generate splice: overlapped buffers contain a "
1434010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                  "pre-existing splice.";
1435010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return;
1436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
143746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (pre_splice_buffers[i]->preroll_buffer().get()) {
143946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      DVLOG(1) << "Can't generate splice: overlapped buffers contain preroll.";
144046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
144146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
1442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
1443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1444010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Don't generate splice frames which represent less than two frames, since we
1445010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // need at least that much to generate a crossfade.  Per the spec, make this
1446010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // check using the sample rate of the overlapping buffers.
1447010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta splice_duration =
1448010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      pre_splice_buffers.back()->timestamp() +
1449010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      pre_splice_buffers.back()->duration() - splice_timestamp;
1450010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  const base::TimeDelta minimum_splice_duration = base::TimeDelta::FromSecondsD(
1451010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      2.0 / audio_configs_[append_config_index_].samples_per_second());
1452010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (splice_duration < minimum_splice_duration) {
1453010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    DVLOG(1) << "Can't generate splice: not enough samples for crossfade; have "
1454010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             << splice_duration.InMicroseconds() << " us, but need "
1455010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)             << minimum_splice_duration.InMicroseconds() << " us.";
1456010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
1457010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1458010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
1459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  new_buffers.front()->ConvertToSpliceBuffer(pre_splice_buffers);
1460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
1461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
146246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool SourceBufferStream::SetPendingBuffer(
146346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    scoped_refptr<StreamParserBuffer>* out_buffer) {
14641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(out_buffer->get());
14651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!pending_buffer_.get());
146646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
146746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const bool have_splice_buffers = !(*out_buffer)->splice_buffers().empty();
14681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const bool have_preroll_buffer = !!(*out_buffer)->preroll_buffer().get();
146946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
147046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!have_splice_buffers && !have_preroll_buffer)
147146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
147246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
147346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK_NE(have_splice_buffers, have_preroll_buffer);
147446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  splice_buffers_index_ = 0;
147546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffer_.swap(*out_buffer);
147646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pending_buffers_complete_ = false;
147746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return true;
147846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
147946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
1481