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