11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <map>
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/callback.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/stream_parser_buffer.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media {
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Helper class representing a range of buffered data. All buffers in a
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// SourceBufferRange are ordered sequentially in decode timestamp order with no
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// gaps.
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SourceBufferRange {
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the maximum distance in time between any buffer seen in this
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // stream. Used to estimate the duration of a buffer if its duration is not
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // known.
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef base::Callback<base::TimeDelta()> InterbufferDistanceCB;
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef StreamParser::BufferQueue BufferQueue;
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Policy for handling large gaps between buffers. Continuous media like
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // audio & video should use NO_GAPS_ALLOWED. Discontinuous media like
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // timed text should use ALLOW_GAPS because large differences in timestamps
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // are common and acceptable.
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  enum GapPolicy {
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    NO_GAPS_ALLOWED,
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ALLOW_GAPS
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Buffers with the same timestamp are only allowed under certain conditions.
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // More precisely, it is allowed in all situations except when the previous
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // frame is not a key frame and the current is a key frame.
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Examples of situations where DTS of two consecutive frames can be equal:
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // - Video: VP8 Alt-Ref frames.
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // - Video: IPBPBP...: DTS for I frame and for P frame can be equal.
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // - Text track cues that start at same time.
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if |prev_is_keyframe| and |current_is_keyframe| indicate a
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // same timestamp situation that is allowed. False is returned otherwise.
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static bool AllowSameTimestamp(bool prev_is_keyframe,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                 bool current_is_keyframe);
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // empty and the front of |new_buffers| must be a keyframe.
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |media_segment_start_time| refers to the starting timestamp for the media
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // segment to which these buffers belong.
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourceBufferRange(GapPolicy gap_policy,
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const BufferQueue& new_buffers,
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    DecodeTimestamp media_segment_start_time,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                    const InterbufferDistanceCB& interbuffer_distance_cb);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ~SourceBufferRange();
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Appends |buffers| to the end of the range and updates |keyframe_map_| as
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // it encounters new keyframes. Assumes |buffers| belongs at the end of the
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // range.
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AppendBuffersToEnd(const BufferQueue& buffers);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool CanAppendBuffersToEnd(const BufferQueue& buffers) const;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Appends the buffers from |range| into this range.
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The first buffer in |range| must come directly after the last buffer
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in this range.
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If |transfer_current_position| is true, |range|'s |next_buffer_index_|
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is transfered to this SourceBufferRange.
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void AppendRangeToEnd(const SourceBufferRange& range,
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        bool transfer_current_position);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool CanAppendRangeToEnd(const SourceBufferRange& range) const;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Updates |next_buffer_index_| to point to the Buffer containing |timestamp|.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Assumes |timestamp| is valid and in this range.
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void Seek(DecodeTimestamp timestamp);
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Updates |next_buffer_index_| to point to next keyframe after or equal to
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |timestamp|.
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SeekAheadTo(DecodeTimestamp timestamp);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Updates |next_buffer_index_| to point to next keyframe strictly after
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |timestamp|.
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SeekAheadPast(DecodeTimestamp timestamp);
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Seeks to the beginning of the range.
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SeekToStart();
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Finds the next keyframe from |buffers_| after |timestamp| (or at
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |timestamp| if |is_exclusive| is false) and creates and returns a new
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // SourceBufferRange with the buffers from that keyframe onward.
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The buffers in the new SourceBufferRange are moved out of this range. If
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // there is no keyframe after |timestamp|, SplitRange() returns null and this
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // range is unmodified.
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourceBufferRange* SplitRange(DecodeTimestamp timestamp, bool is_exclusive);
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Deletes the buffers from this range starting at |timestamp|, exclusive if
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |is_exclusive| is true, inclusive otherwise.
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Resets |next_buffer_index_| if the buffer at |next_buffer_index_| was
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // deleted, and deletes the |keyframe_map_| entries for the buffers that
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // were removed.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |deleted_buffers| contains the buffers that were deleted from this range,
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // starting at the buffer that had been at |next_buffer_index_|.
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if everything in the range was deleted. Otherwise
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // returns false.
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool TruncateAt(DecodeTimestamp timestamp,
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  BufferQueue* deleted_buffers, bool is_exclusive);
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Deletes all buffers in range.
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void DeleteAll(BufferQueue* deleted_buffers);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Deletes a GOP from the front or back of the range and moves these
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // buffers into |deleted_buffers|. Returns the number of bytes deleted from
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the range (i.e. the size in bytes of |deleted_buffers|).
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int DeleteGOPFromFront(BufferQueue* deleted_buffers);
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int DeleteGOPFromBack(BufferQueue* deleted_buffers);
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Gets the range of GOP to secure at least |bytes_to_free| from
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // [|start_timestamp|, |end_timestamp|).
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the size of the buffers to secure if the buffers of
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // [|start_timestamp|, |end_removal_timestamp|) is removed.
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Will not update |end_removal_timestamp| if the returned size is 0.
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int GetRemovalGOP(
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      int bytes_to_free, DecodeTimestamp* end_removal_timestamp);
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Indicates whether the GOP at the beginning or end of the range contains the
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // next buffer position.
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool FirstGOPContainsNextBufferPosition() const;
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool LastGOPContainsNextBufferPosition() const;
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Updates |out_buffer| with the next buffer in presentation order. Seek()
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // must be called before calls to GetNextBuffer(), and buffers are returned
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // in order from the last call to Seek(). Returns true if |out_buffer| is
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // filled with a valid buffer, false if there is not enough data to fulfill
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the request.
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool HasNextBuffer() const;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the config ID for the buffer that will be returned by
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GetNextBuffer().
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int GetNextConfigId() const;
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if the range knows the position of the next buffer it should
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // return, i.e. it has been Seek()ed. This does not necessarily mean that it
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // has the next buffer yet.
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool HasNextBufferPosition() const;
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Resets this range to an "unseeked" state.
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void ResetNextBufferPosition();
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the timestamp of the next buffer that will be returned from
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown.
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp GetNextTimestamp() const;
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the start timestamp of the range.
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp GetStartTimestamp() const;
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the timestamp of the last buffer in the range.
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp GetEndTimestamp() const;
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the timestamp for the end of the buffered region in this range.
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This is an approximation if the duration for the last buffer in the range
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is unset.
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp GetBufferedEndTimestamp() const;
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Gets the timestamp for the keyframe that is after |timestamp|. If
1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // there isn't a keyframe in the range after |timestamp| then kNoTimestamp()
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // is returned. If |timestamp| is in the "gap" between the value  returned by
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GetStartTimestamp() and the timestamp on the first buffer in |buffers_|,
1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // then |timestamp| is returned.
1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp NextKeyframeTimestamp(DecodeTimestamp timestamp);
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Gets the timestamp for the closest keyframe that is <= |timestamp|. If
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // there isn't a keyframe before |timestamp| or |timestamp| is outside
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // this range, then kNoTimestamp() is returned.
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp KeyframeBeforeTimestamp(DecodeTimestamp timestamp);
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns whether a buffer with a starting timestamp of |timestamp| would
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // belong in this range. This includes a buffer that would be appended to
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the end of the range.
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool BelongsToRange(DecodeTimestamp timestamp) const;
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if the range has enough data to seek to the specified
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |timestamp|, false otherwise.
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool CanSeekTo(DecodeTimestamp timestamp) const;
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if this range's buffered timespan completely overlaps the
1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // buffered timespan of |range|.
1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool CompletelyOverlaps(const SourceBufferRange& range) const;
1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if the end of this range contains buffers that overlaps with
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the beginning of |range|.
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool EndOverlaps(const SourceBufferRange& range) const;
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if |timestamp| is the timestamp of the next buffer in
1971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // sequence after |buffers_.back()|, false otherwise.
1981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsNextInSequence(DecodeTimestamp timestamp, bool is_keyframe) const;
1991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Adds all buffers which overlap [start, end) to the end of |buffers|.  If
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // no buffers exist in the range returns false, true otherwise.
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end,
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                         BufferQueue* buffers);
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int size_in_bytes() const { return size_in_bytes_; }
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  typedef std::map<DecodeTimestamp, int> KeyframeMap;
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Seeks the range to the next keyframe after |timestamp|. If
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |skip_given_timestamp| is true, the seek will go to a keyframe with a
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // timestamp strictly greater than |timestamp|.
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SeekAhead(DecodeTimestamp timestamp, bool skip_given_timestamp);
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns an iterator in |buffers_| pointing to the buffer at |timestamp|.
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If |skip_given_timestamp| is true, this returns the first buffer with
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // timestamp greater than |timestamp|.
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BufferQueue::iterator GetBufferItrAt(
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeTimestamp timestamp, bool skip_given_timestamp);
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns an iterator in |keyframe_map_| pointing to the next keyframe after
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |timestamp|. If |skip_given_timestamp| is true, this returns the first
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // keyframe with a timestamp strictly greater than |timestamp|.
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KeyframeMap::iterator GetFirstKeyframeAt(
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      DecodeTimestamp timestamp, bool skip_given_timestamp);
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns an iterator in |keyframe_map_| pointing to the first keyframe
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // before or at |timestamp|.
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KeyframeMap::iterator GetFirstKeyframeBefore(DecodeTimestamp timestamp);
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Helper method to delete buffers in |buffers_| starting at
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |starting_point|, an iterator in |buffers_|.
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns true if everything in the range was removed. Returns
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // false if the range still contains buffers.
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool TruncateAt(const BufferQueue::iterator& starting_point,
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                  BufferQueue* deleted_buffers);
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Frees the buffers in |buffers_| from [|start_point|,|ending_point|) and
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // updates the |size_in_bytes_| accordingly. Does not update |keyframe_map_|.
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void FreeBufferRange(const BufferQueue::iterator& starting_point,
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       const BufferQueue::iterator& ending_point);
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the distance in time estimating how far from the beginning or end
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // of this range a buffer can be to considered in the range.
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta GetFudgeRoom() const;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the approximate duration of a buffer in this range.
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::TimeDelta GetApproximateDuration() const;
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Keeps track of whether gaps are allowed.
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const GapPolicy gap_policy_;
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // An ordered list of buffers in this range.
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  BufferQueue buffers_;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Maps keyframe timestamps to its index position in |buffers_|.
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KeyframeMap keyframe_map_;
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Index base of all positions in |keyframe_map_|. In other words, the
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // real position of entry |k| of |keyframe_map_| in the range is:
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //   keyframe_map_[k] - keyframe_map_index_base_
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int keyframe_map_index_base_;
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Index into |buffers_| for the next buffer to be returned by
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GetNextBuffer(), set to -1 before Seek().
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int next_buffer_index_;
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the first buffer in this range is the beginning of a media segment,
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |media_segment_start_time_| is the time when the media segment begins.
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |media_segment_start_time_| may be <= the timestamp of the first buffer in
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // |buffers_|. |media_segment_start_time_| is kNoTimestamp() if this range
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // does not start at the beginning of a media segment, which can only happen
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // garbage collection or after an end overlap that results in a split range
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // (we don't have a way of knowing the media segment timestamp for the new
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // range).
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DecodeTimestamp media_segment_start_time_;
2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Called to get the largest interbuffer distance seen so far in the stream.
2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  InterbufferDistanceCB interbuffer_distance_cb_;
2801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Stores the amount of memory taken up by the data in |buffers_|.
2821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  int size_in_bytes_;
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(SourceBufferRange);
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
2861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
2881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif  // MEDIA_FILTERS_SOURCE_BUFFER_RANGE_H_
290