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

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

Issue 447963003: Introduce DecodeTimestamp class to make it easier to distiguish presentation and decode timestamps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/source_buffer_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 // stream. Used to estimate the duration of a buffer if its duration is not 50 // stream. Used to estimate the duration of a buffer if its duration is not
51 // known. 51 // known.
52 typedef base::Callback<base::TimeDelta()> InterbufferDistanceCB; 52 typedef base::Callback<base::TimeDelta()> InterbufferDistanceCB;
53 53
54 // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be 54 // Creates a source buffer range with |new_buffers|. |new_buffers| cannot be
55 // empty and the front of |new_buffers| must be a keyframe. 55 // empty and the front of |new_buffers| must be a keyframe.
56 // |media_segment_start_time| refers to the starting timestamp for the media 56 // |media_segment_start_time| refers to the starting timestamp for the media
57 // segment to which these buffers belong. 57 // segment to which these buffers belong.
58 SourceBufferRange(SourceBufferStream::Type type, 58 SourceBufferRange(SourceBufferStream::Type type,
59 const BufferQueue& new_buffers, 59 const BufferQueue& new_buffers,
60 base::TimeDelta media_segment_start_time, 60 DecodeTimestamp media_segment_start_time,
61 const InterbufferDistanceCB& interbuffer_distance_cb); 61 const InterbufferDistanceCB& interbuffer_distance_cb);
62 62
63 // Appends |buffers| to the end of the range and updates |keyframe_map_| as 63 // Appends |buffers| to the end of the range and updates |keyframe_map_| as
64 // it encounters new keyframes. Assumes |buffers| belongs at the end of the 64 // it encounters new keyframes. Assumes |buffers| belongs at the end of the
65 // range. 65 // range.
66 void AppendBuffersToEnd(const BufferQueue& buffers); 66 void AppendBuffersToEnd(const BufferQueue& buffers);
67 bool CanAppendBuffersToEnd(const BufferQueue& buffers) const; 67 bool CanAppendBuffersToEnd(const BufferQueue& buffers) const;
68 68
69 // Appends the buffers from |range| into this range. 69 // Appends the buffers from |range| into this range.
70 // The first buffer in |range| must come directly after the last buffer 70 // The first buffer in |range| must come directly after the last buffer
71 // in this range. 71 // in this range.
72 // If |transfer_current_position| is true, |range|'s |next_buffer_index_| 72 // If |transfer_current_position| is true, |range|'s |next_buffer_index_|
73 // is transfered to this SourceBufferRange. 73 // is transfered to this SourceBufferRange.
74 void AppendRangeToEnd(const SourceBufferRange& range, 74 void AppendRangeToEnd(const SourceBufferRange& range,
75 bool transfer_current_position); 75 bool transfer_current_position);
76 bool CanAppendRangeToEnd(const SourceBufferRange& range) const; 76 bool CanAppendRangeToEnd(const SourceBufferRange& range) const;
77 77
78 // Updates |next_buffer_index_| to point to the Buffer containing |timestamp|. 78 // Updates |next_buffer_index_| to point to the Buffer containing |timestamp|.
79 // Assumes |timestamp| is valid and in this range. 79 // Assumes |timestamp| is valid and in this range.
80 void Seek(base::TimeDelta timestamp); 80 void Seek(DecodeTimestamp timestamp);
wolenetz 2014/08/08 21:30:05 Ditto of .h: If eventual intent is to use PTS, use
acolwell GONE FROM CHROMIUM 2014/08/11 17:05:06 Ditto. These changes document current flow of DTS
wolenetz 2014/08/12 00:09:00 Acknowledged.
81 81
82 // Updates |next_buffer_index_| to point to next keyframe after or equal to 82 // Updates |next_buffer_index_| to point to next keyframe after or equal to
83 // |timestamp|. 83 // |timestamp|.
84 void SeekAheadTo(base::TimeDelta timestamp); 84 void SeekAheadTo(DecodeTimestamp timestamp);
85 85
86 // Updates |next_buffer_index_| to point to next keyframe strictly after 86 // Updates |next_buffer_index_| to point to next keyframe strictly after
87 // |timestamp|. 87 // |timestamp|.
88 void SeekAheadPast(base::TimeDelta timestamp); 88 void SeekAheadPast(DecodeTimestamp timestamp);
89 89
90 // Seeks to the beginning of the range. 90 // Seeks to the beginning of the range.
91 void SeekToStart(); 91 void SeekToStart();
92 92
93 // Finds the next keyframe from |buffers_| after |timestamp| (or at 93 // Finds the next keyframe from |buffers_| after |timestamp| (or at
94 // |timestamp| if |is_exclusive| is false) and creates and returns a new 94 // |timestamp| if |is_exclusive| is false) and creates and returns a new
95 // SourceBufferRange with the buffers from that keyframe onward. 95 // SourceBufferRange with the buffers from that keyframe onward.
96 // The buffers in the new SourceBufferRange are moved out of this range. If 96 // The buffers in the new SourceBufferRange are moved out of this range. If
97 // there is no keyframe after |timestamp|, SplitRange() returns null and this 97 // there is no keyframe after |timestamp|, SplitRange() returns null and this
98 // range is unmodified. 98 // range is unmodified.
99 SourceBufferRange* SplitRange(base::TimeDelta timestamp, bool is_exclusive); 99 SourceBufferRange* SplitRange(DecodeTimestamp timestamp, bool is_exclusive);
100 100
101 // Deletes the buffers from this range starting at |timestamp|, exclusive if 101 // Deletes the buffers from this range starting at |timestamp|, exclusive if
102 // |is_exclusive| is true, inclusive otherwise. 102 // |is_exclusive| is true, inclusive otherwise.
103 // Resets |next_buffer_index_| if the buffer at |next_buffer_index_| was 103 // Resets |next_buffer_index_| if the buffer at |next_buffer_index_| was
104 // deleted, and deletes the |keyframe_map_| entries for the buffers that 104 // deleted, and deletes the |keyframe_map_| entries for the buffers that
105 // were removed. 105 // were removed.
106 // |deleted_buffers| contains the buffers that were deleted from this range, 106 // |deleted_buffers| contains the buffers that were deleted from this range,
107 // starting at the buffer that had been at |next_buffer_index_|. 107 // starting at the buffer that had been at |next_buffer_index_|.
108 // Returns true if everything in the range was deleted. Otherwise 108 // Returns true if everything in the range was deleted. Otherwise
109 // returns false. 109 // returns false.
110 bool TruncateAt(base::TimeDelta timestamp, 110 bool TruncateAt(DecodeTimestamp timestamp,
111 BufferQueue* deleted_buffers, bool is_exclusive); 111 BufferQueue* deleted_buffers, bool is_exclusive);
112 // Deletes all buffers in range. 112 // Deletes all buffers in range.
113 void DeleteAll(BufferQueue* deleted_buffers); 113 void DeleteAll(BufferQueue* deleted_buffers);
114 114
115 // Deletes a GOP from the front or back of the range and moves these 115 // Deletes a GOP from the front or back of the range and moves these
116 // buffers into |deleted_buffers|. Returns the number of bytes deleted from 116 // buffers into |deleted_buffers|. Returns the number of bytes deleted from
117 // the range (i.e. the size in bytes of |deleted_buffers|). 117 // the range (i.e. the size in bytes of |deleted_buffers|).
118 int DeleteGOPFromFront(BufferQueue* deleted_buffers); 118 int DeleteGOPFromFront(BufferQueue* deleted_buffers);
119 int DeleteGOPFromBack(BufferQueue* deleted_buffers); 119 int DeleteGOPFromBack(BufferQueue* deleted_buffers);
120 120
121 // Gets the range of GOP to secure at least |bytes_to_free| from 121 // Gets the range of GOP to secure at least |bytes_to_free| from
122 // [|start_timestamp|, |end_timestamp|). 122 // [|start_timestamp|, |end_timestamp|).
123 // Returns the size of the buffers to secure if the buffers of 123 // Returns the size of the buffers to secure if the buffers of
124 // [|start_timestamp|, |end_removal_timestamp|) is removed. 124 // [|start_timestamp|, |end_removal_timestamp|) is removed.
125 // Will not update |end_removal_timestamp| if the returned size is 0. 125 // Will not update |end_removal_timestamp| if the returned size is 0.
126 int GetRemovalGOP( 126 int GetRemovalGOP(
127 base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, 127 DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
128 int bytes_to_free, base::TimeDelta* end_removal_timestamp); 128 int bytes_to_free, DecodeTimestamp* end_removal_timestamp);
129 129
130 // Indicates whether the GOP at the beginning or end of the range contains the 130 // Indicates whether the GOP at the beginning or end of the range contains the
131 // next buffer position. 131 // next buffer position.
132 bool FirstGOPContainsNextBufferPosition() const; 132 bool FirstGOPContainsNextBufferPosition() const;
133 bool LastGOPContainsNextBufferPosition() const; 133 bool LastGOPContainsNextBufferPosition() const;
134 134
135 // Updates |out_buffer| with the next buffer in presentation order. Seek() 135 // Updates |out_buffer| with the next buffer in presentation order. Seek()
136 // must be called before calls to GetNextBuffer(), and buffers are returned 136 // must be called before calls to GetNextBuffer(), and buffers are returned
137 // in order from the last call to Seek(). Returns true if |out_buffer| is 137 // in order from the last call to Seek(). Returns true if |out_buffer| is
138 // filled with a valid buffer, false if there is not enough data to fulfill 138 // filled with a valid buffer, false if there is not enough data to fulfill
139 // the request. 139 // the request.
140 bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer); 140 bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
141 bool HasNextBuffer() const; 141 bool HasNextBuffer() const;
142 142
143 // Returns the config ID for the buffer that will be returned by 143 // Returns the config ID for the buffer that will be returned by
144 // GetNextBuffer(). 144 // GetNextBuffer().
145 int GetNextConfigId() const; 145 int GetNextConfigId() const;
146 146
147 // Returns true if the range knows the position of the next buffer it should 147 // Returns true if the range knows the position of the next buffer it should
148 // return, i.e. it has been Seek()ed. This does not necessarily mean that it 148 // return, i.e. it has been Seek()ed. This does not necessarily mean that it
149 // has the next buffer yet. 149 // has the next buffer yet.
150 bool HasNextBufferPosition() const; 150 bool HasNextBufferPosition() const;
151 151
152 // Resets this range to an "unseeked" state. 152 // Resets this range to an "unseeked" state.
153 void ResetNextBufferPosition(); 153 void ResetNextBufferPosition();
154 154
155 // Returns the timestamp of the next buffer that will be returned from 155 // Returns the timestamp of the next buffer that will be returned from
156 // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown. 156 // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown.
157 base::TimeDelta GetNextTimestamp() const; 157 DecodeTimestamp GetNextTimestamp() const;
158 158
159 // Returns the start timestamp of the range. 159 // Returns the start timestamp of the range.
160 base::TimeDelta GetStartTimestamp() const; 160 DecodeTimestamp GetStartTimestamp() const;
161 161
162 // Returns the timestamp of the last buffer in the range. 162 // Returns the timestamp of the last buffer in the range.
163 base::TimeDelta GetEndTimestamp() const; 163 DecodeTimestamp GetEndTimestamp() const;
164 164
165 // Returns the timestamp for the end of the buffered region in this range. 165 // Returns the timestamp for the end of the buffered region in this range.
166 // This is an approximation if the duration for the last buffer in the range 166 // This is an approximation if the duration for the last buffer in the range
167 // is unset. 167 // is unset.
168 base::TimeDelta GetBufferedEndTimestamp() const; 168 DecodeTimestamp GetBufferedEndTimestamp() const;
169 169
170 // Gets the timestamp for the keyframe that is after |timestamp|. If 170 // Gets the timestamp for the keyframe that is after |timestamp|. If
171 // there isn't a keyframe in the range after |timestamp| then kNoTimestamp() 171 // there isn't a keyframe in the range after |timestamp| then kNoTimestamp()
172 // is returned. If |timestamp| is in the "gap" between the value returned by 172 // is returned. If |timestamp| is in the "gap" between the value returned by
173 // GetStartTimestamp() and the timestamp on the first buffer in |buffers_|, 173 // GetStartTimestamp() and the timestamp on the first buffer in |buffers_|,
174 // then |timestamp| is returned. 174 // then |timestamp| is returned.
175 base::TimeDelta NextKeyframeTimestamp(base::TimeDelta timestamp); 175 DecodeTimestamp NextKeyframeTimestamp(DecodeTimestamp timestamp);
176 176
177 // Gets the timestamp for the closest keyframe that is <= |timestamp|. If 177 // Gets the timestamp for the closest keyframe that is <= |timestamp|. If
178 // there isn't a keyframe before |timestamp| or |timestamp| is outside 178 // there isn't a keyframe before |timestamp| or |timestamp| is outside
179 // this range, then kNoTimestamp() is returned. 179 // this range, then kNoTimestamp() is returned.
180 base::TimeDelta KeyframeBeforeTimestamp(base::TimeDelta timestamp); 180 DecodeTimestamp KeyframeBeforeTimestamp(DecodeTimestamp timestamp);
181 181
182 // Returns whether a buffer with a starting timestamp of |timestamp| would 182 // Returns whether a buffer with a starting timestamp of |timestamp| would
183 // belong in this range. This includes a buffer that would be appended to 183 // belong in this range. This includes a buffer that would be appended to
184 // the end of the range. 184 // the end of the range.
185 bool BelongsToRange(base::TimeDelta timestamp) const; 185 bool BelongsToRange(DecodeTimestamp timestamp) const;
186 186
187 // Returns true if the range has enough data to seek to the specified 187 // Returns true if the range has enough data to seek to the specified
188 // |timestamp|, false otherwise. 188 // |timestamp|, false otherwise.
189 bool CanSeekTo(base::TimeDelta timestamp) const; 189 bool CanSeekTo(DecodeTimestamp timestamp) const;
190 190
191 // Returns true if this range's buffered timespan completely overlaps the 191 // Returns true if this range's buffered timespan completely overlaps the
192 // buffered timespan of |range|. 192 // buffered timespan of |range|.
193 bool CompletelyOverlaps(const SourceBufferRange& range) const; 193 bool CompletelyOverlaps(const SourceBufferRange& range) const;
194 194
195 // Returns true if the end of this range contains buffers that overlaps with 195 // Returns true if the end of this range contains buffers that overlaps with
196 // the beginning of |range|. 196 // the beginning of |range|.
197 bool EndOverlaps(const SourceBufferRange& range) const; 197 bool EndOverlaps(const SourceBufferRange& range) const;
198 198
199 // Returns true if |timestamp| is the timestamp of the next buffer in 199 // Returns true if |timestamp| is the timestamp of the next buffer in
200 // sequence after |buffers_.back()|, false otherwise. 200 // sequence after |buffers_.back()|, false otherwise.
201 bool IsNextInSequence(base::TimeDelta timestamp, bool is_keyframe) const; 201 bool IsNextInSequence(DecodeTimestamp timestamp, bool is_keyframe) const;
202 202
203 // Adds all buffers which overlap [start, end) to the end of |buffers|. If 203 // Adds all buffers which overlap [start, end) to the end of |buffers|. If
204 // no buffers exist in the range returns false, true otherwise. 204 // no buffers exist in the range returns false, true otherwise.
205 bool GetBuffersInRange(base::TimeDelta start, base::TimeDelta end, 205 bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end,
206 BufferQueue* buffers); 206 BufferQueue* buffers);
207 207
208 int size_in_bytes() const { return size_in_bytes_; } 208 int size_in_bytes() const { return size_in_bytes_; }
209 209
210 private: 210 private:
211 typedef std::map<base::TimeDelta, int> KeyframeMap; 211 typedef std::map<DecodeTimestamp, int> KeyframeMap;
212 212
213 // Seeks the range to the next keyframe after |timestamp|. If 213 // Seeks the range to the next keyframe after |timestamp|. If
214 // |skip_given_timestamp| is true, the seek will go to a keyframe with a 214 // |skip_given_timestamp| is true, the seek will go to a keyframe with a
215 // timestamp strictly greater than |timestamp|. 215 // timestamp strictly greater than |timestamp|.
216 void SeekAhead(base::TimeDelta timestamp, bool skip_given_timestamp); 216 void SeekAhead(DecodeTimestamp timestamp, bool skip_given_timestamp);
217 217
218 // Returns an iterator in |buffers_| pointing to the buffer at |timestamp|. 218 // Returns an iterator in |buffers_| pointing to the buffer at |timestamp|.
219 // If |skip_given_timestamp| is true, this returns the first buffer with 219 // If |skip_given_timestamp| is true, this returns the first buffer with
220 // timestamp greater than |timestamp|. 220 // timestamp greater than |timestamp|.
221 BufferQueue::iterator GetBufferItrAt( 221 BufferQueue::iterator GetBufferItrAt(
222 base::TimeDelta timestamp, bool skip_given_timestamp); 222 DecodeTimestamp timestamp, bool skip_given_timestamp);
223 223
224 // Returns an iterator in |keyframe_map_| pointing to the next keyframe after 224 // Returns an iterator in |keyframe_map_| pointing to the next keyframe after
225 // |timestamp|. If |skip_given_timestamp| is true, this returns the first 225 // |timestamp|. If |skip_given_timestamp| is true, this returns the first
226 // keyframe with a timestamp strictly greater than |timestamp|. 226 // keyframe with a timestamp strictly greater than |timestamp|.
227 KeyframeMap::iterator GetFirstKeyframeAt( 227 KeyframeMap::iterator GetFirstKeyframeAt(
228 base::TimeDelta timestamp, bool skip_given_timestamp); 228 DecodeTimestamp timestamp, bool skip_given_timestamp);
229 229
230 // Returns an iterator in |keyframe_map_| pointing to the first keyframe 230 // Returns an iterator in |keyframe_map_| pointing to the first keyframe
231 // before or at |timestamp|. 231 // before or at |timestamp|.
232 KeyframeMap::iterator GetFirstKeyframeBefore(base::TimeDelta timestamp); 232 KeyframeMap::iterator GetFirstKeyframeBefore(DecodeTimestamp timestamp);
233 233
234 // Helper method to delete buffers in |buffers_| starting at 234 // Helper method to delete buffers in |buffers_| starting at
235 // |starting_point|, an iterator in |buffers_|. 235 // |starting_point|, an iterator in |buffers_|.
236 // Returns true if everything in the range was removed. Returns 236 // Returns true if everything in the range was removed. Returns
237 // false if the range still contains buffers. 237 // false if the range still contains buffers.
238 bool TruncateAt(const BufferQueue::iterator& starting_point, 238 bool TruncateAt(const BufferQueue::iterator& starting_point,
239 BufferQueue* deleted_buffers); 239 BufferQueue* deleted_buffers);
240 240
241 // Frees the buffers in |buffers_| from [|start_point|,|ending_point|) and 241 // Frees the buffers in |buffers_| from [|start_point|,|ending_point|) and
242 // updates the |size_in_bytes_| accordingly. Does not update |keyframe_map_|. 242 // updates the |size_in_bytes_| accordingly. Does not update |keyframe_map_|.
(...skipping 26 matching lines...) Expand all
269 int next_buffer_index_; 269 int next_buffer_index_;
270 270
271 // If the first buffer in this range is the beginning of a media segment, 271 // If the first buffer in this range is the beginning of a media segment,
272 // |media_segment_start_time_| is the time when the media segment begins. 272 // |media_segment_start_time_| is the time when the media segment begins.
273 // |media_segment_start_time_| may be <= the timestamp of the first buffer in 273 // |media_segment_start_time_| may be <= the timestamp of the first buffer in
274 // |buffers_|. |media_segment_start_time_| is kNoTimestamp() if this range 274 // |buffers_|. |media_segment_start_time_| is kNoTimestamp() if this range
275 // does not start at the beginning of a media segment, which can only happen 275 // does not start at the beginning of a media segment, which can only happen
276 // garbage collection or after an end overlap that results in a split range 276 // garbage collection or after an end overlap that results in a split range
277 // (we don't have a way of knowing the media segment timestamp for the new 277 // (we don't have a way of knowing the media segment timestamp for the new
278 // range). 278 // range).
279 base::TimeDelta media_segment_start_time_; 279 DecodeTimestamp media_segment_start_time_;
280 280
281 // Called to get the largest interbuffer distance seen so far in the stream. 281 // Called to get the largest interbuffer distance seen so far in the stream.
282 InterbufferDistanceCB interbuffer_distance_cb_; 282 InterbufferDistanceCB interbuffer_distance_cb_;
283 283
284 // Stores the amount of memory taken up by the data in |buffers_|. 284 // Stores the amount of memory taken up by the data in |buffers_|.
285 int size_in_bytes_; 285 int size_in_bytes_;
286 286
287 DISALLOW_COPY_AND_ASSIGN(SourceBufferRange); 287 DISALLOW_COPY_AND_ASSIGN(SourceBufferRange);
288 }; 288 };
289 289
290 } // namespace media
291
292 // Helper method that returns true if |ranges| is sorted in increasing order, 290 // Helper method that returns true if |ranges| is sorted in increasing order,
293 // false otherwise. 291 // false otherwise.
294 static bool IsRangeListSorted( 292 static bool IsRangeListSorted(
295 const std::list<media::SourceBufferRange*>& ranges) { 293 const std::list<media::SourceBufferRange*>& ranges) {
296 base::TimeDelta prev = media::kNoTimestamp(); 294 DecodeTimestamp prev = kNoDecodeTimestamp();
297 for (std::list<media::SourceBufferRange*>::const_iterator itr = 295 for (std::list<SourceBufferRange*>::const_iterator itr =
298 ranges.begin(); itr != ranges.end(); ++itr) { 296 ranges.begin(); itr != ranges.end(); ++itr) {
299 if (prev != media::kNoTimestamp() && prev >= (*itr)->GetStartTimestamp()) 297 if (prev != kNoDecodeTimestamp() && prev >= (*itr)->GetStartTimestamp())
300 return false; 298 return false;
301 prev = (*itr)->GetEndTimestamp(); 299 prev = (*itr)->GetEndTimestamp();
302 } 300 }
303 return true; 301 return true;
304 } 302 }
305 303
306 // Comparison operators for std::upper_bound() and std::lower_bound(). 304 // Comparison operators for std::upper_bound() and std::lower_bound().
307 static bool CompareTimeDeltaToStreamParserBuffer( 305 static bool CompareTimeDeltaToStreamParserBuffer(
308 const base::TimeDelta& decode_timestamp, 306 const media::DecodeTimestamp& decode_timestamp,
309 const scoped_refptr<media::StreamParserBuffer>& buffer) { 307 const scoped_refptr<StreamParserBuffer>& buffer) {
310 return decode_timestamp < buffer->GetDecodeTimestamp(); 308 return decode_timestamp < buffer->GetDecodeTimestamp();
311 } 309 }
312 static bool CompareStreamParserBufferToTimeDelta( 310 static bool CompareStreamParserBufferToTimeDelta(
313 const scoped_refptr<media::StreamParserBuffer>& buffer, 311 const scoped_refptr<StreamParserBuffer>& buffer,
314 const base::TimeDelta& decode_timestamp) { 312 const DecodeTimestamp& decode_timestamp) {
315 return buffer->GetDecodeTimestamp() < decode_timestamp; 313 return buffer->GetDecodeTimestamp() < decode_timestamp;
316 } 314 }
317 315
318 // Returns an estimate of how far from the beginning or end of a range a buffer 316 // Returns an estimate of how far from the beginning or end of a range a buffer
319 // can be to still be considered in the range, given the |approximate_duration| 317 // can be to still be considered in the range, given the |approximate_duration|
320 // of a buffer in the stream. 318 // of a buffer in the stream.
321 static base::TimeDelta ComputeFudgeRoom(base::TimeDelta approximate_duration) { 319 static base::TimeDelta ComputeFudgeRoom(base::TimeDelta approximate_duration) {
322 // Because we do not know exactly when is the next timestamp, any buffer 320 // Because we do not know exactly when is the next timestamp, any buffer
323 // that starts within 2x the approximate duration of a buffer is considered 321 // that starts within 2x the approximate duration of a buffer is considered
324 // within this range. 322 // within this range.
325 return 2 * approximate_duration; 323 return 2 * approximate_duration;
326 } 324 }
327 325
328 // An arbitrarily-chosen number to estimate the duration of a buffer if none 326 // An arbitrarily-chosen number to estimate the duration of a buffer if none
329 // is set and there's not enough information to get a better estimate. 327 // is set and there's not enough information to get a better estimate.
330 static int kDefaultBufferDurationInMs = 125; 328 static int kDefaultBufferDurationInMs = 125;
331 329
332 // The amount of time the beginning of the buffered data can differ from the 330 // The amount of time the beginning of the buffered data can differ from the
333 // start time in order to still be considered the start of stream. 331 // start time in order to still be considered the start of stream.
334 static base::TimeDelta kSeekToStartFudgeRoom() { 332 static base::TimeDelta kSeekToStartFudgeRoom() {
335 return base::TimeDelta::FromMilliseconds(1000); 333 return base::TimeDelta::FromMilliseconds(1000);
336 } 334 }
337 335
338 namespace media {
339
340 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, 336 SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config,
341 const LogCB& log_cb, 337 const LogCB& log_cb,
342 bool splice_frames_enabled) 338 bool splice_frames_enabled)
343 : log_cb_(log_cb), 339 : log_cb_(log_cb),
344 current_config_index_(0), 340 current_config_index_(0),
345 append_config_index_(0), 341 append_config_index_(0),
346 seek_pending_(false), 342 seek_pending_(false),
347 end_of_stream_(false), 343 end_of_stream_(false),
348 seek_buffer_timestamp_(kNoTimestamp()), 344 seek_buffer_timestamp_(kNoTimestamp()),
349 selected_range_(NULL), 345 selected_range_(NULL),
350 media_segment_start_time_(kNoTimestamp()), 346 media_segment_start_time_(kNoDecodeTimestamp()),
351 range_for_next_append_(ranges_.end()), 347 range_for_next_append_(ranges_.end()),
352 new_media_segment_(false), 348 new_media_segment_(false),
353 last_appended_buffer_timestamp_(kNoTimestamp()), 349 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
354 last_appended_buffer_is_keyframe_(false), 350 last_appended_buffer_is_keyframe_(false),
355 last_output_buffer_timestamp_(kNoTimestamp()), 351 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
356 max_interbuffer_distance_(kNoTimestamp()), 352 max_interbuffer_distance_(kNoTimestamp()),
357 memory_limit_(kSourceBufferAudioMemoryLimit), 353 memory_limit_(kSourceBufferAudioMemoryLimit),
358 config_change_pending_(false), 354 config_change_pending_(false),
359 splice_buffers_index_(0), 355 splice_buffers_index_(0),
360 pending_buffers_complete_(false), 356 pending_buffers_complete_(false),
361 splice_frames_enabled_(splice_frames_enabled) { 357 splice_frames_enabled_(splice_frames_enabled) {
362 DCHECK(audio_config.IsValidConfig()); 358 DCHECK(audio_config.IsValidConfig());
363 audio_configs_.push_back(audio_config); 359 audio_configs_.push_back(audio_config);
364 } 360 }
365 361
366 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, 362 SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config,
367 const LogCB& log_cb, 363 const LogCB& log_cb,
368 bool splice_frames_enabled) 364 bool splice_frames_enabled)
369 : log_cb_(log_cb), 365 : log_cb_(log_cb),
370 current_config_index_(0), 366 current_config_index_(0),
371 append_config_index_(0), 367 append_config_index_(0),
372 seek_pending_(false), 368 seek_pending_(false),
373 end_of_stream_(false), 369 end_of_stream_(false),
374 seek_buffer_timestamp_(kNoTimestamp()), 370 seek_buffer_timestamp_(kNoTimestamp()),
375 selected_range_(NULL), 371 selected_range_(NULL),
376 media_segment_start_time_(kNoTimestamp()), 372 media_segment_start_time_(kNoDecodeTimestamp()),
377 range_for_next_append_(ranges_.end()), 373 range_for_next_append_(ranges_.end()),
378 new_media_segment_(false), 374 new_media_segment_(false),
379 last_appended_buffer_timestamp_(kNoTimestamp()), 375 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
380 last_appended_buffer_is_keyframe_(false), 376 last_appended_buffer_is_keyframe_(false),
381 last_output_buffer_timestamp_(kNoTimestamp()), 377 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
382 max_interbuffer_distance_(kNoTimestamp()), 378 max_interbuffer_distance_(kNoTimestamp()),
383 memory_limit_(kSourceBufferVideoMemoryLimit), 379 memory_limit_(kSourceBufferVideoMemoryLimit),
384 config_change_pending_(false), 380 config_change_pending_(false),
385 splice_buffers_index_(0), 381 splice_buffers_index_(0),
386 pending_buffers_complete_(false), 382 pending_buffers_complete_(false),
387 splice_frames_enabled_(splice_frames_enabled) { 383 splice_frames_enabled_(splice_frames_enabled) {
388 DCHECK(video_config.IsValidConfig()); 384 DCHECK(video_config.IsValidConfig());
389 video_configs_.push_back(video_config); 385 video_configs_.push_back(video_config);
390 } 386 }
391 387
392 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, 388 SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config,
393 const LogCB& log_cb, 389 const LogCB& log_cb,
394 bool splice_frames_enabled) 390 bool splice_frames_enabled)
395 : log_cb_(log_cb), 391 : log_cb_(log_cb),
396 current_config_index_(0), 392 current_config_index_(0),
397 append_config_index_(0), 393 append_config_index_(0),
398 text_track_config_(text_config), 394 text_track_config_(text_config),
399 seek_pending_(false), 395 seek_pending_(false),
400 end_of_stream_(false), 396 end_of_stream_(false),
401 seek_buffer_timestamp_(kNoTimestamp()), 397 seek_buffer_timestamp_(kNoTimestamp()),
402 selected_range_(NULL), 398 selected_range_(NULL),
403 media_segment_start_time_(kNoTimestamp()), 399 media_segment_start_time_(kNoDecodeTimestamp()),
404 range_for_next_append_(ranges_.end()), 400 range_for_next_append_(ranges_.end()),
405 new_media_segment_(false), 401 new_media_segment_(false),
406 last_appended_buffer_timestamp_(kNoTimestamp()), 402 last_appended_buffer_timestamp_(kNoDecodeTimestamp()),
407 last_appended_buffer_is_keyframe_(false), 403 last_appended_buffer_is_keyframe_(false),
408 last_output_buffer_timestamp_(kNoTimestamp()), 404 last_output_buffer_timestamp_(kNoDecodeTimestamp()),
409 max_interbuffer_distance_(kNoTimestamp()), 405 max_interbuffer_distance_(kNoTimestamp()),
410 memory_limit_(kSourceBufferAudioMemoryLimit), 406 memory_limit_(kSourceBufferAudioMemoryLimit),
411 config_change_pending_(false), 407 config_change_pending_(false),
412 splice_buffers_index_(0), 408 splice_buffers_index_(0),
413 pending_buffers_complete_(false), 409 pending_buffers_complete_(false),
414 splice_frames_enabled_(splice_frames_enabled) {} 410 splice_frames_enabled_(splice_frames_enabled) {}
415 411
416 SourceBufferStream::~SourceBufferStream() { 412 SourceBufferStream::~SourceBufferStream() {
417 while (!ranges_.empty()) { 413 while (!ranges_.empty()) {
418 delete ranges_.front(); 414 delete ranges_.front();
419 ranges_.pop_front(); 415 ranges_.pop_front();
420 } 416 }
421 } 417 }
422 418
423 void SourceBufferStream::OnNewMediaSegment( 419 void SourceBufferStream::OnNewMediaSegment(
424 base::TimeDelta media_segment_start_time) { 420 DecodeTimestamp media_segment_start_time) {
425 DCHECK(!end_of_stream_); 421 DCHECK(!end_of_stream_);
426 media_segment_start_time_ = media_segment_start_time; 422 media_segment_start_time_ = media_segment_start_time;
427 new_media_segment_ = true; 423 new_media_segment_ = true;
428 424
429 RangeList::iterator last_range = range_for_next_append_; 425 RangeList::iterator last_range = range_for_next_append_;
430 range_for_next_append_ = FindExistingRangeFor(media_segment_start_time); 426 range_for_next_append_ = FindExistingRangeFor(media_segment_start_time);
431 427
432 // Only reset |last_appended_buffer_timestamp_| if this new media segment is 428 // Only reset |last_appended_buffer_timestamp_| if this new media segment is
433 // not adjacent to the previous media segment appended to the stream. 429 // not adjacent to the previous media segment appended to the stream.
434 if (range_for_next_append_ == ranges_.end() || 430 if (range_for_next_append_ == ranges_.end() ||
435 !AreAdjacentInSequence(last_appended_buffer_timestamp_, 431 !AreAdjacentInSequence(last_appended_buffer_timestamp_,
436 media_segment_start_time)) { 432 media_segment_start_time)) {
437 last_appended_buffer_timestamp_ = kNoTimestamp(); 433 last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
438 last_appended_buffer_is_keyframe_ = false; 434 last_appended_buffer_is_keyframe_ = false;
439 } else if (last_range != ranges_.end()) { 435 } else if (last_range != ranges_.end()) {
440 DCHECK(last_range == range_for_next_append_); 436 DCHECK(last_range == range_for_next_append_);
441 } 437 }
442 } 438 }
443 439
444 bool SourceBufferStream::Append(const BufferQueue& buffers) { 440 bool SourceBufferStream::Append(const BufferQueue& buffers) {
445 TRACE_EVENT2("media", "SourceBufferStream::Append", 441 TRACE_EVENT2("media", "SourceBufferStream::Append",
446 "stream type", GetStreamTypeName(), 442 "stream type", GetStreamTypeName(),
447 "buffers to append", buffers.size()); 443 "buffers to append", buffers.size());
448 444
449 DCHECK(!buffers.empty()); 445 DCHECK(!buffers.empty());
450 DCHECK(media_segment_start_time_ != kNoTimestamp()); 446 DCHECK(media_segment_start_time_ != kNoDecodeTimestamp());
451 DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); 447 DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp());
452 DCHECK(!end_of_stream_); 448 DCHECK(!end_of_stream_);
453 449
454 // New media segments must begin with a keyframe. 450 // New media segments must begin with a keyframe.
455 if (new_media_segment_ && !buffers.front()->IsKeyframe()) { 451 if (new_media_segment_ && !buffers.front()->IsKeyframe()) {
456 MEDIA_LOG(log_cb_) << "Media segment did not begin with keyframe."; 452 MEDIA_LOG(log_cb_) << "Media segment did not begin with keyframe.";
457 return false; 453 return false;
458 } 454 }
459 455
460 // Buffers within a media segment should be monotonically increasing. 456 // Buffers within a media segment should be monotonically increasing.
461 if (!IsMonotonicallyIncreasing(buffers)) 457 if (!IsMonotonicallyIncreasing(buffers))
462 return false; 458 return false;
463 459
464 if (media_segment_start_time_ < base::TimeDelta() || 460 if (media_segment_start_time_ < DecodeTimestamp() ||
465 buffers.front()->GetDecodeTimestamp() < base::TimeDelta()) { 461 buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) {
466 MEDIA_LOG(log_cb_) 462 MEDIA_LOG(log_cb_)
467 << "Cannot append a media segment with negative timestamps."; 463 << "Cannot append a media segment with negative timestamps.";
468 return false; 464 return false;
469 } 465 }
470 466
471 if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(), 467 if (!IsNextTimestampValid(buffers.front()->GetDecodeTimestamp(),
472 buffers.front()->IsKeyframe())) { 468 buffers.front()->IsKeyframe())) {
473 MEDIA_LOG(log_cb_) << "Invalid same timestamp construct detected at time " 469 MEDIA_LOG(log_cb_) << "Invalid same timestamp construct detected at time "
474 << buffers.front()->GetDecodeTimestamp().InSecondsF(); 470 << buffers.front()->GetDecodeTimestamp().InSecondsF();
475 471
476 return false; 472 return false;
477 } 473 }
478 474
479 UpdateMaxInterbufferDistance(buffers); 475 UpdateMaxInterbufferDistance(buffers);
480 SetConfigIds(buffers); 476 SetConfigIds(buffers);
481 477
482 // Save a snapshot of stream state before range modifications are made. 478 // Save a snapshot of stream state before range modifications are made.
483 base::TimeDelta next_buffer_timestamp = GetNextBufferTimestamp(); 479 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
484 BufferQueue deleted_buffers; 480 BufferQueue deleted_buffers;
485 481
486 PrepareRangesForNextAppend(buffers, &deleted_buffers); 482 PrepareRangesForNextAppend(buffers, &deleted_buffers);
487 483
488 // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise, 484 // If there's a range for |buffers|, insert |buffers| accordingly. Otherwise,
489 // create a new range with |buffers|. 485 // create a new range with |buffers|.
490 if (range_for_next_append_ != ranges_.end()) { 486 if (range_for_next_append_ != ranges_.end()) {
491 (*range_for_next_append_)->AppendBuffersToEnd(buffers); 487 (*range_for_next_append_)->AppendBuffersToEnd(buffers);
492 last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); 488 last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp();
493 last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe(); 489 last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe();
494 } else { 490 } else {
495 base::TimeDelta new_range_start_time = std::min( 491 DecodeTimestamp new_range_start_time = std::min(
496 media_segment_start_time_, buffers.front()->GetDecodeTimestamp()); 492 media_segment_start_time_, buffers.front()->GetDecodeTimestamp());
497 const BufferQueue* buffers_for_new_range = &buffers; 493 const BufferQueue* buffers_for_new_range = &buffers;
498 BufferQueue trimmed_buffers; 494 BufferQueue trimmed_buffers;
499 495
500 // If the new range is not being created because of a new media 496 // If the new range is not being created because of a new media
501 // segment, then we must make sure that we start with a keyframe. 497 // segment, then we must make sure that we start with a keyframe.
502 // This can happen if the GOP in the previous append gets destroyed 498 // This can happen if the GOP in the previous append gets destroyed
503 // by a Remove() call. 499 // by a Remove() call.
504 if (!new_media_segment_) { 500 if (!new_media_segment_) {
505 BufferQueue::const_iterator itr = buffers.begin(); 501 BufferQueue::const_iterator itr = buffers.begin();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 MergeWithAdjacentRangeIfNecessary(range_for_next_append_); 538 MergeWithAdjacentRangeIfNecessary(range_for_next_append_);
543 539
544 // Seek to try to fulfill a previous call to Seek(). 540 // Seek to try to fulfill a previous call to Seek().
545 if (seek_pending_) { 541 if (seek_pending_) {
546 DCHECK(!selected_range_); 542 DCHECK(!selected_range_);
547 DCHECK(deleted_buffers.empty()); 543 DCHECK(deleted_buffers.empty());
548 Seek(seek_buffer_timestamp_); 544 Seek(seek_buffer_timestamp_);
549 } 545 }
550 546
551 if (!deleted_buffers.empty()) { 547 if (!deleted_buffers.empty()) {
552 base::TimeDelta start_of_deleted = 548 DecodeTimestamp start_of_deleted =
553 deleted_buffers.front()->GetDecodeTimestamp(); 549 deleted_buffers.front()->GetDecodeTimestamp();
554 550
555 DCHECK(track_buffer_.empty() || 551 DCHECK(track_buffer_.empty() ||
556 track_buffer_.back()->GetDecodeTimestamp() < start_of_deleted) 552 track_buffer_.back()->GetDecodeTimestamp() < start_of_deleted)
557 << "decode timestamp " 553 << "decode timestamp "
558 << track_buffer_.back()->GetDecodeTimestamp().InSecondsF() << " sec" 554 << track_buffer_.back()->GetDecodeTimestamp().InSecondsF() << " sec"
559 << ", start_of_deleted " << start_of_deleted.InSecondsF()<< " sec"; 555 << ", start_of_deleted " << start_of_deleted.InSecondsF()<< " sec";
560 556
561 track_buffer_.insert(track_buffer_.end(), deleted_buffers.begin(), 557 track_buffer_.insert(track_buffer_.end(), deleted_buffers.begin(),
562 deleted_buffers.end()); 558 deleted_buffers.end());
563 } 559 }
564 560
565 // Prune any extra buffers in |track_buffer_| if new keyframes 561 // Prune any extra buffers in |track_buffer_| if new keyframes
566 // are appended to the range covered by |track_buffer_|. 562 // are appended to the range covered by |track_buffer_|.
567 if (!track_buffer_.empty()) { 563 if (!track_buffer_.empty()) {
568 base::TimeDelta keyframe_timestamp = 564 DecodeTimestamp keyframe_timestamp =
569 FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp()); 565 FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp());
570 if (keyframe_timestamp != kNoTimestamp()) 566 if (keyframe_timestamp != kNoDecodeTimestamp())
571 PruneTrackBuffer(keyframe_timestamp); 567 PruneTrackBuffer(keyframe_timestamp);
572 } 568 }
573 569
574 SetSelectedRangeIfNeeded(next_buffer_timestamp); 570 SetSelectedRangeIfNeeded(next_buffer_timestamp);
575 571
576 GarbageCollectIfNeeded(); 572 GarbageCollectIfNeeded();
577 573
578 DCHECK(IsRangeListSorted(ranges_)); 574 DCHECK(IsRangeListSorted(ranges_));
579 DCHECK(OnlySelectedRangeIsSeeked()); 575 DCHECK(OnlySelectedRangeIsSeeked());
580 return true; 576 return true;
581 } 577 }
582 578
583 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, 579 void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end,
584 base::TimeDelta duration) { 580 base::TimeDelta duration) {
585 DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() 581 DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF()
586 << ", " << end.InSecondsF() 582 << ", " << end.InSecondsF()
587 << ", " << duration.InSecondsF() << ")"; 583 << ", " << duration.InSecondsF() << ")";
588 DCHECK(start >= base::TimeDelta()) << start.InSecondsF(); 584 DCHECK(start >= base::TimeDelta()) << start.InSecondsF();
589 DCHECK(start < end) << "start " << start.InSecondsF() 585 DCHECK(start < end) << "start " << start.InSecondsF()
590 << " end " << end.InSecondsF(); 586 << " end " << end.InSecondsF();
591 DCHECK(duration != kNoTimestamp()); 587 DCHECK(duration != kNoTimestamp());
592 588
593 base::TimeDelta remove_end_timestamp = duration; 589 DecodeTimestamp start_dts = DecodeTimestamp::FromPresentationTime(start);
594 base::TimeDelta keyframe_timestamp = FindKeyframeAfterTimestamp(end); 590 DecodeTimestamp end_dts = DecodeTimestamp::FromPresentationTime(end);
595 if (keyframe_timestamp != kNoTimestamp()) { 591 DecodeTimestamp remove_end_timestamp =
592 DecodeTimestamp::FromPresentationTime(duration);
593 DecodeTimestamp keyframe_timestamp = FindKeyframeAfterTimestamp(end_dts);
594 if (keyframe_timestamp != kNoDecodeTimestamp()) {
596 remove_end_timestamp = keyframe_timestamp; 595 remove_end_timestamp = keyframe_timestamp;
597 } else if (end < remove_end_timestamp) { 596 } else if (end_dts < remove_end_timestamp) {
598 remove_end_timestamp = end; 597 remove_end_timestamp = end_dts;
599 } 598 }
600 599
601 BufferQueue deleted_buffers; 600 BufferQueue deleted_buffers;
602 RemoveInternal(start, remove_end_timestamp, false, &deleted_buffers); 601 RemoveInternal(start_dts, remove_end_timestamp, false, &deleted_buffers);
603 602
604 if (!deleted_buffers.empty()) 603 if (!deleted_buffers.empty())
605 SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp()); 604 SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp());
606 } 605 }
607 606
608 void SourceBufferStream::RemoveInternal( 607 void SourceBufferStream::RemoveInternal(
609 base::TimeDelta start, base::TimeDelta end, bool is_exclusive, 608 DecodeTimestamp start, DecodeTimestamp end, bool is_exclusive,
610 BufferQueue* deleted_buffers) { 609 BufferQueue* deleted_buffers) {
611 DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() 610 DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF()
612 << ", " << end.InSecondsF() 611 << ", " << end.InSecondsF()
613 << ", " << is_exclusive << ")"; 612 << ", " << is_exclusive << ")";
614 613
615 DCHECK(start >= base::TimeDelta()); 614 DCHECK(start >= DecodeTimestamp());
616 DCHECK(start < end) << "start " << start.InSecondsF() 615 DCHECK(start < end) << "start " << start.InSecondsF()
617 << " end " << end.InSecondsF(); 616 << " end " << end.InSecondsF();
618 DCHECK(deleted_buffers); 617 DCHECK(deleted_buffers);
619 618
620 RangeList::iterator itr = ranges_.begin(); 619 RangeList::iterator itr = ranges_.begin();
621 620
622 while (itr != ranges_.end()) { 621 while (itr != ranges_.end()) {
623 SourceBufferRange* range = *itr; 622 SourceBufferRange* range = *itr;
624 if (range->GetStartTimestamp() >= end) 623 if (range->GetStartTimestamp() >= end)
625 break; 624 break;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
658 if (delete_range) { 657 if (delete_range) {
659 DeleteAndRemoveRange(&itr); 658 DeleteAndRemoveRange(&itr);
660 continue; 659 continue;
661 } 660 }
662 661
663 // Clear |range_for_next_append_| if we determine that the removal 662 // Clear |range_for_next_append_| if we determine that the removal
664 // operation makes it impossible for the next append to be added 663 // operation makes it impossible for the next append to be added
665 // to the current range. 664 // to the current range.
666 if (range_for_next_append_ != ranges_.end() && 665 if (range_for_next_append_ != ranges_.end() &&
667 *range_for_next_append_ == range && 666 *range_for_next_append_ == range &&
668 last_appended_buffer_timestamp_ != kNoTimestamp()) { 667 last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) {
669 base::TimeDelta potential_next_append_timestamp = 668 DecodeTimestamp potential_next_append_timestamp =
670 last_appended_buffer_timestamp_ + 669 last_appended_buffer_timestamp_ +
671 base::TimeDelta::FromInternalValue(1); 670 base::TimeDelta::FromInternalValue(1);
672 671
673 if (!range->BelongsToRange(potential_next_append_timestamp)) { 672 if (!range->BelongsToRange(potential_next_append_timestamp)) {
674 DVLOG(1) << "Resetting range_for_next_append_ since the next append" 673 DVLOG(1) << "Resetting range_for_next_append_ since the next append"
675 << " can't add to the current range."; 674 << " can't add to the current range.";
676 range_for_next_append_ = 675 range_for_next_append_ =
677 FindExistingRangeFor(potential_next_append_timestamp); 676 FindExistingRangeFor(potential_next_append_timestamp);
678 } 677 }
679 } 678 }
680 679
681 // Move on to the next range. 680 // Move on to the next range.
682 ++itr; 681 ++itr;
683 } 682 }
684 683
685 DCHECK(IsRangeListSorted(ranges_)); 684 DCHECK(IsRangeListSorted(ranges_));
686 DCHECK(OnlySelectedRangeIsSeeked()); 685 DCHECK(OnlySelectedRangeIsSeeked());
687 DVLOG(1) << __FUNCTION__ << " : done"; 686 DVLOG(1) << __FUNCTION__ << " : done";
688 } 687 }
689 688
690 void SourceBufferStream::ResetSeekState() { 689 void SourceBufferStream::ResetSeekState() {
691 SetSelectedRange(NULL); 690 SetSelectedRange(NULL);
692 track_buffer_.clear(); 691 track_buffer_.clear();
693 config_change_pending_ = false; 692 config_change_pending_ = false;
694 last_output_buffer_timestamp_ = kNoTimestamp(); 693 last_output_buffer_timestamp_ = kNoDecodeTimestamp();
695 splice_buffers_index_ = 0; 694 splice_buffers_index_ = 0;
696 pending_buffer_ = NULL; 695 pending_buffer_ = NULL;
697 pending_buffers_complete_ = false; 696 pending_buffers_complete_ = false;
698 } 697 }
699 698
700 bool SourceBufferStream::ShouldSeekToStartOfBuffered( 699 bool SourceBufferStream::ShouldSeekToStartOfBuffered(
701 base::TimeDelta seek_timestamp) const { 700 base::TimeDelta seek_timestamp) const {
702 if (ranges_.empty()) 701 if (ranges_.empty())
703 return false; 702 return false;
704 base::TimeDelta beginning_of_buffered = 703 base::TimeDelta beginning_of_buffered =
705 ranges_.front()->GetStartTimestamp(); 704 ranges_.front()->GetStartTimestamp().ToPresentationTime();
706 return (seek_timestamp <= beginning_of_buffered && 705 return (seek_timestamp <= beginning_of_buffered &&
707 beginning_of_buffered < kSeekToStartFudgeRoom()); 706 beginning_of_buffered < kSeekToStartFudgeRoom());
708 } 707 }
709 708
710 bool SourceBufferStream::IsMonotonicallyIncreasing( 709 bool SourceBufferStream::IsMonotonicallyIncreasing(
711 const BufferQueue& buffers) const { 710 const BufferQueue& buffers) const {
712 DCHECK(!buffers.empty()); 711 DCHECK(!buffers.empty());
713 base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; 712 DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
714 bool prev_is_keyframe = last_appended_buffer_is_keyframe_; 713 bool prev_is_keyframe = last_appended_buffer_is_keyframe_;
715 for (BufferQueue::const_iterator itr = buffers.begin(); 714 for (BufferQueue::const_iterator itr = buffers.begin();
716 itr != buffers.end(); ++itr) { 715 itr != buffers.end(); ++itr) {
717 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); 716 DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
718 bool current_is_keyframe = (*itr)->IsKeyframe(); 717 bool current_is_keyframe = (*itr)->IsKeyframe();
719 DCHECK(current_timestamp != kNoTimestamp()); 718 DCHECK(current_timestamp != kNoDecodeTimestamp());
720 DCHECK((*itr)->duration() >= base::TimeDelta()) 719 DCHECK((*itr)->duration() >= base::TimeDelta())
721 << "Packet with invalid duration." 720 << "Packet with invalid duration."
722 << " pts " << (*itr)->timestamp().InSecondsF() 721 << " pts " << (*itr)->timestamp().InSecondsF()
723 << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF() 722 << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF()
724 << " dur " << (*itr)->duration().InSecondsF(); 723 << " dur " << (*itr)->duration().InSecondsF();
725 724
726 if (prev_timestamp != kNoTimestamp()) { 725 if (prev_timestamp != kNoDecodeTimestamp()) {
727 if (current_timestamp < prev_timestamp) { 726 if (current_timestamp < prev_timestamp) {
728 MEDIA_LOG(log_cb_) << "Buffers were not monotonically increasing."; 727 MEDIA_LOG(log_cb_) << "Buffers were not monotonically increasing.";
729 return false; 728 return false;
730 } 729 }
731 730
732 if (current_timestamp == prev_timestamp && 731 if (current_timestamp == prev_timestamp &&
733 !AllowSameTimestamp(prev_is_keyframe, current_is_keyframe, 732 !AllowSameTimestamp(prev_is_keyframe, current_is_keyframe,
734 GetType())) { 733 GetType())) {
735 MEDIA_LOG(log_cb_) << "Unexpected combination of buffers with the" 734 MEDIA_LOG(log_cb_) << "Unexpected combination of buffers with the"
736 << " same timestamp detected at " 735 << " same timestamp detected at "
737 << current_timestamp.InSecondsF(); 736 << current_timestamp.InSecondsF();
738 return false; 737 return false;
739 } 738 }
740 } 739 }
741 740
742 prev_timestamp = current_timestamp; 741 prev_timestamp = current_timestamp;
743 prev_is_keyframe = current_is_keyframe; 742 prev_is_keyframe = current_is_keyframe;
744 } 743 }
745 return true; 744 return true;
746 } 745 }
747 746
748 bool SourceBufferStream::IsNextTimestampValid( 747 bool SourceBufferStream::IsNextTimestampValid(
749 base::TimeDelta next_timestamp, bool next_is_keyframe) const { 748 DecodeTimestamp next_timestamp, bool next_is_keyframe) const {
750 return (last_appended_buffer_timestamp_ != next_timestamp) || 749 return (last_appended_buffer_timestamp_ != next_timestamp) ||
751 new_media_segment_ || 750 new_media_segment_ ||
752 AllowSameTimestamp(last_appended_buffer_is_keyframe_, next_is_keyframe, 751 AllowSameTimestamp(last_appended_buffer_is_keyframe_, next_is_keyframe,
753 GetType()); 752 GetType());
754 } 753 }
755 754
756 755
757 bool SourceBufferStream::OnlySelectedRangeIsSeeked() const { 756 bool SourceBufferStream::OnlySelectedRangeIsSeeked() const {
758 for (RangeList::const_iterator itr = ranges_.begin(); 757 for (RangeList::const_iterator itr = ranges_.begin();
759 itr != ranges_.end(); ++itr) { 758 itr != ranges_.end(); ++itr) {
760 if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_) 759 if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_)
761 return false; 760 return false;
762 } 761 }
763 return !selected_range_ || selected_range_->HasNextBufferPosition(); 762 return !selected_range_ || selected_range_->HasNextBufferPosition();
764 } 763 }
765 764
766 void SourceBufferStream::UpdateMaxInterbufferDistance( 765 void SourceBufferStream::UpdateMaxInterbufferDistance(
767 const BufferQueue& buffers) { 766 const BufferQueue& buffers) {
768 DCHECK(!buffers.empty()); 767 DCHECK(!buffers.empty());
769 base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; 768 DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
770 for (BufferQueue::const_iterator itr = buffers.begin(); 769 for (BufferQueue::const_iterator itr = buffers.begin();
771 itr != buffers.end(); ++itr) { 770 itr != buffers.end(); ++itr) {
772 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); 771 DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp();
773 DCHECK(current_timestamp != kNoTimestamp()); 772 DCHECK(current_timestamp != kNoDecodeTimestamp());
774 773
775 if (prev_timestamp != kNoTimestamp()) { 774 if (prev_timestamp != kNoDecodeTimestamp()) {
776 base::TimeDelta interbuffer_distance = current_timestamp - prev_timestamp; 775 base::TimeDelta interbuffer_distance = current_timestamp - prev_timestamp;
777 if (max_interbuffer_distance_ == kNoTimestamp()) { 776 if (max_interbuffer_distance_ == kNoTimestamp()) {
778 max_interbuffer_distance_ = interbuffer_distance; 777 max_interbuffer_distance_ = interbuffer_distance;
779 } else { 778 } else {
780 max_interbuffer_distance_ = 779 max_interbuffer_distance_ =
781 std::max(max_interbuffer_distance_, interbuffer_distance); 780 std::max(max_interbuffer_distance_, interbuffer_distance);
782 } 781 }
783 } 782 }
784 prev_timestamp = current_timestamp; 783 prev_timestamp = current_timestamp;
785 } 784 }
(...skipping 24 matching lines...) Expand all
810 // Begin deleting from the front. 809 // Begin deleting from the front.
811 if (bytes_to_free - bytes_freed > 0) 810 if (bytes_to_free - bytes_freed > 0)
812 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false); 811 bytes_freed += FreeBuffers(bytes_to_free - bytes_freed, false);
813 812
814 // Begin deleting from the back. 813 // Begin deleting from the back.
815 if (bytes_to_free - bytes_freed > 0) 814 if (bytes_to_free - bytes_freed > 0)
816 FreeBuffers(bytes_to_free - bytes_freed, true); 815 FreeBuffers(bytes_to_free - bytes_freed, true);
817 } 816 }
818 817
819 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { 818 int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) {
820 base::TimeDelta next_buffer_timestamp = GetNextBufferTimestamp(); 819 DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp();
821 if (last_appended_buffer_timestamp_ == kNoTimestamp() || 820 if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() ||
822 next_buffer_timestamp == kNoTimestamp() || 821 next_buffer_timestamp == kNoDecodeTimestamp() ||
823 last_appended_buffer_timestamp_ >= next_buffer_timestamp) { 822 last_appended_buffer_timestamp_ >= next_buffer_timestamp) {
824 return 0; 823 return 0;
825 } 824 }
826 825
827 base::TimeDelta remove_range_start = last_appended_buffer_timestamp_; 826 DecodeTimestamp remove_range_start = last_appended_buffer_timestamp_;
828 if (last_appended_buffer_is_keyframe_) 827 if (last_appended_buffer_is_keyframe_)
829 remove_range_start += GetMaxInterbufferDistance(); 828 remove_range_start += GetMaxInterbufferDistance();
830 829
831 base::TimeDelta remove_range_start_keyframe = FindKeyframeAfterTimestamp( 830 DecodeTimestamp remove_range_start_keyframe = FindKeyframeAfterTimestamp(
832 remove_range_start); 831 remove_range_start);
833 if (remove_range_start_keyframe != kNoTimestamp()) 832 if (remove_range_start_keyframe != kNoDecodeTimestamp())
834 remove_range_start = remove_range_start_keyframe; 833 remove_range_start = remove_range_start_keyframe;
835 if (remove_range_start >= next_buffer_timestamp) 834 if (remove_range_start >= next_buffer_timestamp)
836 return 0; 835 return 0;
837 836
838 base::TimeDelta remove_range_end; 837 DecodeTimestamp remove_range_end;
839 int bytes_freed = GetRemovalRange( 838 int bytes_freed = GetRemovalRange(
840 remove_range_start, next_buffer_timestamp, total_bytes_to_free, 839 remove_range_start, next_buffer_timestamp, total_bytes_to_free,
841 &remove_range_end); 840 &remove_range_end);
842 if (bytes_freed > 0) 841 if (bytes_freed > 0) {
843 Remove(remove_range_start, remove_range_end, next_buffer_timestamp); 842 Remove(remove_range_start.ToPresentationTime(),
843 remove_range_end.ToPresentationTime(),
844 next_buffer_timestamp.ToPresentationTime());
845 }
846
844 return bytes_freed; 847 return bytes_freed;
845 } 848 }
846 849
847 int SourceBufferStream::GetRemovalRange( 850 int SourceBufferStream::GetRemovalRange(
848 base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, 851 DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
849 int total_bytes_to_free, base::TimeDelta* removal_end_timestamp) { 852 int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
850 DCHECK(start_timestamp >= base::TimeDelta()) << start_timestamp.InSecondsF(); 853 DCHECK(start_timestamp >= DecodeTimestamp()) << start_timestamp.InSecondsF();
851 DCHECK(start_timestamp < end_timestamp) 854 DCHECK(start_timestamp < end_timestamp)
852 << "start " << start_timestamp.InSecondsF() 855 << "start " << start_timestamp.InSecondsF()
853 << ", end " << end_timestamp.InSecondsF(); 856 << ", end " << end_timestamp.InSecondsF();
854 857
855 int bytes_to_free = total_bytes_to_free; 858 int bytes_to_free = total_bytes_to_free;
856 int bytes_freed = 0; 859 int bytes_freed = 0;
857 860
858 for (RangeList::iterator itr = ranges_.begin(); 861 for (RangeList::iterator itr = ranges_.begin();
859 itr != ranges_.end() && bytes_to_free > 0; ++itr) { 862 itr != ranges_.end() && bytes_to_free > 0; ++itr) {
860 SourceBufferRange* range = *itr; 863 SourceBufferRange* range = *itr;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 } else { 903 } else {
901 current_range = ranges_.front(); 904 current_range = ranges_.front();
902 if (current_range->FirstGOPContainsNextBufferPosition()) { 905 if (current_range->FirstGOPContainsNextBufferPosition()) {
903 DCHECK_EQ(current_range, selected_range_); 906 DCHECK_EQ(current_range, selected_range_);
904 break; 907 break;
905 } 908 }
906 bytes_deleted = current_range->DeleteGOPFromFront(&buffers); 909 bytes_deleted = current_range->DeleteGOPFromFront(&buffers);
907 } 910 }
908 911
909 // Check to see if we've just deleted the GOP that was last appended. 912 // Check to see if we've just deleted the GOP that was last appended.
910 base::TimeDelta end_timestamp = buffers.back()->GetDecodeTimestamp(); 913 DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp();
911 if (end_timestamp == last_appended_buffer_timestamp_) { 914 if (end_timestamp == last_appended_buffer_timestamp_) {
912 DCHECK(last_appended_buffer_timestamp_ != kNoTimestamp()); 915 DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp());
913 DCHECK(!new_range_for_append); 916 DCHECK(!new_range_for_append);
914 // Create a new range containing these buffers. 917 // Create a new range containing these buffers.
915 new_range_for_append = new SourceBufferRange( 918 new_range_for_append = new SourceBufferRange(
916 GetType(), buffers, kNoTimestamp(), 919 GetType(), buffers, kNoDecodeTimestamp(),
917 base::Bind(&SourceBufferStream::GetMaxInterbufferDistance, 920 base::Bind(&SourceBufferStream::GetMaxInterbufferDistance,
918 base::Unretained(this))); 921 base::Unretained(this)));
919 range_for_next_append_ = ranges_.end(); 922 range_for_next_append_ = ranges_.end();
920 } else { 923 } else {
921 bytes_to_free -= bytes_deleted; 924 bytes_to_free -= bytes_deleted;
922 bytes_freed += bytes_deleted; 925 bytes_freed += bytes_deleted;
923 } 926 }
924 927
925 if (current_range->size_in_bytes() == 0) { 928 if (current_range->size_in_bytes() == 0) {
926 DCHECK_NE(current_range, selected_range_); 929 DCHECK_NE(current_range, selected_range_);
(...skipping 23 matching lines...) Expand all
950 } 953 }
951 return bytes_freed; 954 return bytes_freed;
952 } 955 }
953 956
954 void SourceBufferStream::PrepareRangesForNextAppend( 957 void SourceBufferStream::PrepareRangesForNextAppend(
955 const BufferQueue& new_buffers, BufferQueue* deleted_buffers) { 958 const BufferQueue& new_buffers, BufferQueue* deleted_buffers) {
956 DCHECK(deleted_buffers); 959 DCHECK(deleted_buffers);
957 960
958 bool temporarily_select_range = false; 961 bool temporarily_select_range = false;
959 if (!track_buffer_.empty()) { 962 if (!track_buffer_.empty()) {
960 base::TimeDelta tb_timestamp = track_buffer_.back()->GetDecodeTimestamp(); 963 DecodeTimestamp tb_timestamp = track_buffer_.back()->GetDecodeTimestamp();
961 base::TimeDelta seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp); 964 DecodeTimestamp seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp);
962 if (seek_timestamp != kNoTimestamp() && 965 if (seek_timestamp != kNoDecodeTimestamp() &&
963 seek_timestamp < new_buffers.front()->GetDecodeTimestamp() && 966 seek_timestamp < new_buffers.front()->GetDecodeTimestamp() &&
964 range_for_next_append_ != ranges_.end() && 967 range_for_next_append_ != ranges_.end() &&
965 (*range_for_next_append_)->BelongsToRange(seek_timestamp)) { 968 (*range_for_next_append_)->BelongsToRange(seek_timestamp)) {
966 DCHECK(tb_timestamp < seek_timestamp); 969 DCHECK(tb_timestamp < seek_timestamp);
967 DCHECK(!selected_range_); 970 DCHECK(!selected_range_);
968 DCHECK(!(*range_for_next_append_)->HasNextBufferPosition()); 971 DCHECK(!(*range_for_next_append_)->HasNextBufferPosition());
969 972
970 // If there are GOPs between the end of the track buffer and the 973 // If there are GOPs between the end of the track buffer and the
971 // beginning of the new buffers, then temporarily seek the range 974 // beginning of the new buffers, then temporarily seek the range
972 // so that the buffers between these two times will be deposited in 975 // so that the buffers between these two times will be deposited in
973 // |deleted_buffers| as if they were part of the current playback 976 // |deleted_buffers| as if they were part of the current playback
974 // position. 977 // position.
975 // TODO(acolwell): Figure out a more elegant way to do this. 978 // TODO(acolwell): Figure out a more elegant way to do this.
976 SeekAndSetSelectedRange(*range_for_next_append_, seek_timestamp); 979 SeekAndSetSelectedRange(*range_for_next_append_, seek_timestamp);
977 temporarily_select_range = true; 980 temporarily_select_range = true;
978 } 981 }
979 } 982 }
980 983
981 // Handle splices between the existing buffers and the new buffers. If a 984 // Handle splices between the existing buffers and the new buffers. If a
982 // splice is generated the timestamp and duration of the first buffer in 985 // splice is generated the timestamp and duration of the first buffer in
983 // |new_buffers| will be modified. 986 // |new_buffers| will be modified.
984 if (splice_frames_enabled_) 987 if (splice_frames_enabled_)
985 GenerateSpliceFrame(new_buffers); 988 GenerateSpliceFrame(new_buffers);
986 989
987 base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; 990 DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_;
988 bool prev_is_keyframe = last_appended_buffer_is_keyframe_; 991 bool prev_is_keyframe = last_appended_buffer_is_keyframe_;
989 base::TimeDelta next_timestamp = new_buffers.front()->GetDecodeTimestamp(); 992 DecodeTimestamp next_timestamp = new_buffers.front()->GetDecodeTimestamp();
990 bool next_is_keyframe = new_buffers.front()->IsKeyframe(); 993 bool next_is_keyframe = new_buffers.front()->IsKeyframe();
991 994
992 if (prev_timestamp != kNoTimestamp() && prev_timestamp != next_timestamp) { 995 if (prev_timestamp != kNoDecodeTimestamp() &&
996 prev_timestamp != next_timestamp) {
993 // Clean up the old buffers between the last appended buffer and the 997 // Clean up the old buffers between the last appended buffer and the
994 // beginning of |new_buffers|. 998 // beginning of |new_buffers|.
995 RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers); 999 RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers);
996 } 1000 }
997 1001
998 // Make the delete range exclusive if we are dealing with an allowed same 1002 // Make the delete range exclusive if we are dealing with an allowed same
999 // timestamp situation. This prevents the first buffer in the current append 1003 // timestamp situation. This prevents the first buffer in the current append
1000 // from deleting the last buffer in the previous append if both buffers 1004 // from deleting the last buffer in the previous append if both buffers
1001 // have the same timestamp. 1005 // have the same timestamp.
1002 // 1006 //
1003 // The delete range should never be exclusive if a splice frame was generated 1007 // The delete range should never be exclusive if a splice frame was generated
1004 // because we don't generate splice frames for same timestamp situations. 1008 // because we don't generate splice frames for same timestamp situations.
1005 DCHECK(new_buffers.front()->splice_timestamp() != 1009 DCHECK(new_buffers.front()->splice_timestamp() !=
1006 new_buffers.front()->timestamp()); 1010 new_buffers.front()->timestamp());
1007 const bool is_exclusive = 1011 const bool is_exclusive =
1008 new_buffers.front()->splice_buffers().empty() && 1012 new_buffers.front()->splice_buffers().empty() &&
1009 prev_timestamp == next_timestamp && 1013 prev_timestamp == next_timestamp &&
1010 AllowSameTimestamp(prev_is_keyframe, next_is_keyframe, GetType()); 1014 AllowSameTimestamp(prev_is_keyframe, next_is_keyframe, GetType());
1011 1015
1012 // Delete the buffers that |new_buffers| overlaps. 1016 // Delete the buffers that |new_buffers| overlaps.
1013 base::TimeDelta start = new_buffers.front()->GetDecodeTimestamp(); 1017 DecodeTimestamp start = new_buffers.front()->GetDecodeTimestamp();
1014 base::TimeDelta end = new_buffers.back()->GetDecodeTimestamp(); 1018 DecodeTimestamp end = new_buffers.back()->GetDecodeTimestamp();
1015 base::TimeDelta duration = new_buffers.back()->duration(); 1019 base::TimeDelta duration = new_buffers.back()->duration();
1016 1020
1017 if (duration != kNoTimestamp() && duration > base::TimeDelta()) { 1021 if (duration != kNoTimestamp() && duration > base::TimeDelta()) {
1018 end += duration; 1022 end += duration;
1019 } else { 1023 } else {
1020 // TODO(acolwell): Ensure all buffers actually have proper 1024 // TODO(acolwell): Ensure all buffers actually have proper
1021 // duration info so that this hack isn't needed. 1025 // duration info so that this hack isn't needed.
1022 // http://crbug.com/312836 1026 // http://crbug.com/312836
1023 end += base::TimeDelta::FromInternalValue(1); 1027 end += base::TimeDelta::FromInternalValue(1);
1024 } 1028 }
1025 1029
1026 RemoveInternal(start, end, is_exclusive, deleted_buffers); 1030 RemoveInternal(start, end, is_exclusive, deleted_buffers);
1027 1031
1028 // Restore the range seek state if necessary. 1032 // Restore the range seek state if necessary.
1029 if (temporarily_select_range) 1033 if (temporarily_select_range)
1030 SetSelectedRange(NULL); 1034 SetSelectedRange(NULL);
1031 } 1035 }
1032 1036
1033 bool SourceBufferStream::AreAdjacentInSequence( 1037 bool SourceBufferStream::AreAdjacentInSequence(
1034 base::TimeDelta first_timestamp, base::TimeDelta second_timestamp) const { 1038 DecodeTimestamp first_timestamp, DecodeTimestamp second_timestamp) const {
1035 return first_timestamp < second_timestamp && 1039 return first_timestamp < second_timestamp &&
1036 second_timestamp <= 1040 second_timestamp <=
1037 first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); 1041 first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
1038 } 1042 }
1039 1043
1040 void SourceBufferStream::PruneTrackBuffer(const base::TimeDelta timestamp) { 1044 void SourceBufferStream::PruneTrackBuffer(const DecodeTimestamp timestamp) {
1041 // If we don't have the next timestamp, we don't have anything to delete. 1045 // If we don't have the next timestamp, we don't have anything to delete.
1042 if (timestamp == kNoTimestamp()) 1046 if (timestamp == kNoDecodeTimestamp())
1043 return; 1047 return;
1044 1048
1045 while (!track_buffer_.empty() && 1049 while (!track_buffer_.empty() &&
1046 track_buffer_.back()->GetDecodeTimestamp() >= timestamp) { 1050 track_buffer_.back()->GetDecodeTimestamp() >= timestamp) {
1047 track_buffer_.pop_back(); 1051 track_buffer_.pop_back();
1048 } 1052 }
1049 } 1053 }
1050 1054
1051 void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( 1055 void SourceBufferStream::MergeWithAdjacentRangeIfNecessary(
1052 const RangeList::iterator& range_with_new_buffers_itr) { 1056 const RangeList::iterator& range_with_new_buffers_itr) {
(...skipping 29 matching lines...) Expand all
1082 if (ShouldSeekToStartOfBuffered(timestamp)) { 1086 if (ShouldSeekToStartOfBuffered(timestamp)) {
1083 ranges_.front()->SeekToStart(); 1087 ranges_.front()->SeekToStart();
1084 SetSelectedRange(ranges_.front()); 1088 SetSelectedRange(ranges_.front());
1085 seek_pending_ = false; 1089 seek_pending_ = false;
1086 return; 1090 return;
1087 } 1091 }
1088 1092
1089 seek_buffer_timestamp_ = timestamp; 1093 seek_buffer_timestamp_ = timestamp;
1090 seek_pending_ = true; 1094 seek_pending_ = true;
1091 1095
1096 DecodeTimestamp seek_dts = DecodeTimestamp::FromPresentationTime(timestamp);
1097
1092 RangeList::iterator itr = ranges_.end(); 1098 RangeList::iterator itr = ranges_.end();
1093 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 1099 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
1094 if ((*itr)->CanSeekTo(timestamp)) 1100 if ((*itr)->CanSeekTo(seek_dts))
1095 break; 1101 break;
1096 } 1102 }
1097 1103
1098 if (itr == ranges_.end()) 1104 if (itr == ranges_.end())
1099 return; 1105 return;
1100 1106
1101 SeekAndSetSelectedRange(*itr, timestamp); 1107 SeekAndSetSelectedRange(*itr, seek_dts);
1102 seek_pending_ = false; 1108 seek_pending_ = false;
1103 } 1109 }
1104 1110
1105 bool SourceBufferStream::IsSeekPending() const { 1111 bool SourceBufferStream::IsSeekPending() const {
1106 return !(end_of_stream_ && IsEndSelected()) && seek_pending_; 1112 return !(end_of_stream_ && IsEndSelected()) && seek_pending_;
1107 } 1113 }
1108 1114
1109 void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { 1115 void SourceBufferStream::OnSetDuration(base::TimeDelta duration) {
1116 DecodeTimestamp duration_dts =
1117 DecodeTimestamp::FromPresentationTime(duration);
1118
1110 RangeList::iterator itr = ranges_.end(); 1119 RangeList::iterator itr = ranges_.end();
1111 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 1120 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
1112 if ((*itr)->GetEndTimestamp() > duration) 1121 if ((*itr)->GetEndTimestamp() > duration_dts)
1113 break; 1122 break;
1114 } 1123 }
1115 if (itr == ranges_.end()) 1124 if (itr == ranges_.end())
1116 return; 1125 return;
1117 1126
1118 // Need to partially truncate this range. 1127 // Need to partially truncate this range.
1119 if ((*itr)->GetStartTimestamp() < duration) { 1128 if ((*itr)->GetStartTimestamp() < duration_dts) {
1120 bool delete_range = (*itr)->TruncateAt(duration, NULL, false); 1129 bool delete_range = (*itr)->TruncateAt(duration_dts, NULL, false);
1121 if ((*itr == selected_range_) && !selected_range_->HasNextBufferPosition()) 1130 if ((*itr == selected_range_) && !selected_range_->HasNextBufferPosition())
1122 SetSelectedRange(NULL); 1131 SetSelectedRange(NULL);
1123 1132
1124 if (delete_range) { 1133 if (delete_range) {
1125 DeleteAndRemoveRange(&itr); 1134 DeleteAndRemoveRange(&itr);
1126 } else { 1135 } else {
1127 ++itr; 1136 ++itr;
1128 } 1137 }
1129 } 1138 }
1130 1139
1131 // Delete all ranges that begin after |duration|. 1140 // Delete all ranges that begin after |duration|.
1132 while (itr != ranges_.end()) { 1141 while (itr != ranges_.end()) {
1133 // If we're about to delete the selected range, also reset the seek state. 1142 // If we're about to delete the selected range, also reset the seek state.
1134 DCHECK((*itr)->GetStartTimestamp() >= duration); 1143 DCHECK((*itr)->GetStartTimestamp() >= duration_dts);
1135 if (*itr == selected_range_) 1144 if (*itr == selected_range_)
1136 ResetSeekState(); 1145 ResetSeekState();
1137 DeleteAndRemoveRange(&itr); 1146 DeleteAndRemoveRange(&itr);
1138 } 1147 }
1139 } 1148 }
1140 1149
1141 SourceBufferStream::Status SourceBufferStream::GetNextBuffer( 1150 SourceBufferStream::Status SourceBufferStream::GetNextBuffer(
1142 scoped_refptr<StreamParserBuffer>* out_buffer) { 1151 scoped_refptr<StreamParserBuffer>* out_buffer) {
1143 if (!pending_buffer_) { 1152 if (!pending_buffer_) {
1144 const SourceBufferStream::Status status = GetNextBufferInternal(out_buffer); 1153 const SourceBufferStream::Status status = GetNextBufferInternal(out_buffer);
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1260 config_change_pending_ = true; 1269 config_change_pending_ = true;
1261 DVLOG(1) << "Config change (selected range config ID does not match)."; 1270 DVLOG(1) << "Config change (selected range config ID does not match).";
1262 return kConfigChange; 1271 return kConfigChange;
1263 } 1272 }
1264 1273
1265 CHECK(selected_range_->GetNextBuffer(out_buffer)); 1274 CHECK(selected_range_->GetNextBuffer(out_buffer));
1266 last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp(); 1275 last_output_buffer_timestamp_ = (*out_buffer)->GetDecodeTimestamp();
1267 return kSuccess; 1276 return kSuccess;
1268 } 1277 }
1269 1278
1270 base::TimeDelta SourceBufferStream::GetNextBufferTimestamp() { 1279 DecodeTimestamp SourceBufferStream::GetNextBufferTimestamp() {
1271 if (!track_buffer_.empty()) 1280 if (!track_buffer_.empty())
1272 return track_buffer_.front()->GetDecodeTimestamp(); 1281 return track_buffer_.front()->GetDecodeTimestamp();
1273 1282
1274 if (!selected_range_) 1283 if (!selected_range_)
1275 return kNoTimestamp(); 1284 return kNoDecodeTimestamp();
1276 1285
1277 DCHECK(selected_range_->HasNextBufferPosition()); 1286 DCHECK(selected_range_->HasNextBufferPosition());
1278 return selected_range_->GetNextTimestamp(); 1287 return selected_range_->GetNextTimestamp();
1279 } 1288 }
1280 1289
1281 base::TimeDelta SourceBufferStream::GetEndBufferTimestamp() {
1282 if (!selected_range_)
1283 return kNoTimestamp();
1284 return selected_range_->GetEndTimestamp();
1285 }
1286
1287 SourceBufferStream::RangeList::iterator 1290 SourceBufferStream::RangeList::iterator
1288 SourceBufferStream::FindExistingRangeFor(base::TimeDelta start_timestamp) { 1291 SourceBufferStream::FindExistingRangeFor(DecodeTimestamp start_timestamp) {
1289 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 1292 for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
1290 if ((*itr)->BelongsToRange(start_timestamp)) 1293 if ((*itr)->BelongsToRange(start_timestamp))
1291 return itr; 1294 return itr;
1292 } 1295 }
1293 return ranges_.end(); 1296 return ranges_.end();
1294 } 1297 }
1295 1298
1296 SourceBufferStream::RangeList::iterator 1299 SourceBufferStream::RangeList::iterator
1297 SourceBufferStream::AddToRanges(SourceBufferRange* new_range) { 1300 SourceBufferStream::AddToRanges(SourceBufferRange* new_range) {
1298 base::TimeDelta start_timestamp = new_range->GetStartTimestamp(); 1301 DecodeTimestamp start_timestamp = new_range->GetStartTimestamp();
1299 RangeList::iterator itr = ranges_.end(); 1302 RangeList::iterator itr = ranges_.end();
1300 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 1303 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
1301 if ((*itr)->GetStartTimestamp() > start_timestamp) 1304 if ((*itr)->GetStartTimestamp() > start_timestamp)
1302 break; 1305 break;
1303 } 1306 }
1304 return ranges_.insert(itr, new_range); 1307 return ranges_.insert(itr, new_range);
1305 } 1308 }
1306 1309
1307 SourceBufferStream::RangeList::iterator 1310 SourceBufferStream::RangeList::iterator
1308 SourceBufferStream::GetSelectedRangeItr() { 1311 SourceBufferStream::GetSelectedRangeItr() {
1309 DCHECK(selected_range_); 1312 DCHECK(selected_range_);
1310 RangeList::iterator itr = ranges_.end(); 1313 RangeList::iterator itr = ranges_.end();
1311 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { 1314 for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) {
1312 if (*itr == selected_range_) 1315 if (*itr == selected_range_)
1313 break; 1316 break;
1314 } 1317 }
1315 DCHECK(itr != ranges_.end()); 1318 DCHECK(itr != ranges_.end());
1316 return itr; 1319 return itr;
1317 } 1320 }
1318 1321
1319 void SourceBufferStream::SeekAndSetSelectedRange( 1322 void SourceBufferStream::SeekAndSetSelectedRange(
1320 SourceBufferRange* range, base::TimeDelta seek_timestamp) { 1323 SourceBufferRange* range, DecodeTimestamp seek_timestamp) {
1321 if (range) 1324 if (range)
1322 range->Seek(seek_timestamp); 1325 range->Seek(seek_timestamp);
1323 SetSelectedRange(range); 1326 SetSelectedRange(range);
1324 } 1327 }
1325 1328
1326 void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) { 1329 void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) {
1327 DVLOG(1) << __FUNCTION__ << " : " << selected_range_ << " -> " << range; 1330 DVLOG(1) << __FUNCTION__ << " : " << selected_range_ << " -> " << range;
1328 if (selected_range_) 1331 if (selected_range_)
1329 selected_range_->ResetNextBufferPosition(); 1332 selected_range_->ResetNextBufferPosition();
1330 DCHECK(!range || range->HasNextBufferPosition()); 1333 DCHECK(!range || range->HasNextBufferPosition());
1331 selected_range_ = range; 1334 selected_range_ = range;
1332 } 1335 }
1333 1336
1334 Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const { 1337 Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const {
1335 Ranges<base::TimeDelta> ranges; 1338 Ranges<base::TimeDelta> ranges;
1336 for (RangeList::const_iterator itr = ranges_.begin(); 1339 for (RangeList::const_iterator itr = ranges_.begin();
1337 itr != ranges_.end(); ++itr) { 1340 itr != ranges_.end(); ++itr) {
1338 ranges.Add((*itr)->GetStartTimestamp(), (*itr)->GetBufferedEndTimestamp()); 1341 ranges.Add((*itr)->GetStartTimestamp().ToPresentationTime(),
1342 (*itr)->GetBufferedEndTimestamp().ToPresentationTime());
1339 } 1343 }
1340 return ranges; 1344 return ranges;
1341 } 1345 }
1342 1346
1343 base::TimeDelta SourceBufferStream::GetBufferedDuration() const { 1347 base::TimeDelta SourceBufferStream::GetBufferedDuration() const {
1344 if (ranges_.empty()) 1348 if (ranges_.empty())
1345 return base::TimeDelta(); 1349 return base::TimeDelta();
1346 1350
1347 return ranges_.back()->GetBufferedEndTimestamp(); 1351 return ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();
1348 } 1352 }
1349 1353
1350 void SourceBufferStream::MarkEndOfStream() { 1354 void SourceBufferStream::MarkEndOfStream() {
1351 DCHECK(!end_of_stream_); 1355 DCHECK(!end_of_stream_);
1352 end_of_stream_ = true; 1356 end_of_stream_ = true;
1353 } 1357 }
1354 1358
1355 void SourceBufferStream::UnmarkEndOfStream() { 1359 void SourceBufferStream::UnmarkEndOfStream() {
1356 DCHECK(end_of_stream_); 1360 DCHECK(end_of_stream_);
1357 end_of_stream_ = false; 1361 end_of_stream_ = false;
1358 } 1362 }
1359 1363
1360 bool SourceBufferStream::IsEndSelected() const { 1364 bool SourceBufferStream::IsEndSelected() const {
1361 if (ranges_.empty()) 1365 if (ranges_.empty())
1362 return true; 1366 return true;
1363 1367
1364 if (seek_pending_) 1368 if (seek_pending_) {
1365 return seek_buffer_timestamp_ >= ranges_.back()->GetBufferedEndTimestamp(); 1369 base::TimeDelta last_range_end_time =
1370 ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime();;
wolenetz 2014/08/08 21:30:04 lint nit: s/;;/;/
acolwell GONE FROM CHROMIUM 2014/08/11 17:05:05 Done.
1371 return seek_buffer_timestamp_ >= last_range_end_time;
1372 }
1366 1373
1367 return selected_range_ == ranges_.back(); 1374 return selected_range_ == ranges_.back();
1368 } 1375 }
1369 1376
1370 const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() { 1377 const AudioDecoderConfig& SourceBufferStream::GetCurrentAudioDecoderConfig() {
1371 if (config_change_pending_) 1378 if (config_change_pending_)
1372 CompleteConfigChange(); 1379 CompleteConfigChange();
1373 return audio_configs_[current_config_index_]; 1380 return audio_configs_[current_config_index_];
1374 } 1381 }
1375 1382
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 if (!track_buffer_.empty()) { 1470 if (!track_buffer_.empty()) {
1464 current_config_index_ = GetConfigId(track_buffer_.front(), 0); 1471 current_config_index_ = GetConfigId(track_buffer_.front(), 0);
1465 return; 1472 return;
1466 } 1473 }
1467 1474
1468 if (selected_range_ && selected_range_->HasNextBuffer()) 1475 if (selected_range_ && selected_range_->HasNextBuffer())
1469 current_config_index_ = selected_range_->GetNextConfigId(); 1476 current_config_index_ = selected_range_->GetNextConfigId();
1470 } 1477 }
1471 1478
1472 void SourceBufferStream::SetSelectedRangeIfNeeded( 1479 void SourceBufferStream::SetSelectedRangeIfNeeded(
1473 const base::TimeDelta timestamp) { 1480 const DecodeTimestamp timestamp) {
1474 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")"; 1481 DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")";
1475 1482
1476 if (selected_range_) { 1483 if (selected_range_) {
1477 DCHECK(track_buffer_.empty()); 1484 DCHECK(track_buffer_.empty());
1478 return; 1485 return;
1479 } 1486 }
1480 1487
1481 if (!track_buffer_.empty()) { 1488 if (!track_buffer_.empty()) {
1482 DCHECK(!selected_range_); 1489 DCHECK(!selected_range_);
1483 return; 1490 return;
1484 } 1491 }
1485 1492
1486 base::TimeDelta start_timestamp = timestamp; 1493 DecodeTimestamp start_timestamp = timestamp;
1487 1494
1488 // If the next buffer timestamp is not known then use a timestamp just after 1495 // If the next buffer timestamp is not known then use a timestamp just after
1489 // the timestamp on the last buffer returned by GetNextBuffer(). 1496 // the timestamp on the last buffer returned by GetNextBuffer().
1490 if (start_timestamp == kNoTimestamp()) { 1497 if (start_timestamp == kNoDecodeTimestamp()) {
1491 if (last_output_buffer_timestamp_ == kNoTimestamp()) 1498 if (last_output_buffer_timestamp_ == kNoDecodeTimestamp())
1492 return; 1499 return;
1493 1500
1494 start_timestamp = last_output_buffer_timestamp_ + 1501 start_timestamp = last_output_buffer_timestamp_ +
1495 base::TimeDelta::FromInternalValue(1); 1502 base::TimeDelta::FromInternalValue(1);
1496 } 1503 }
1497 1504
1498 base::TimeDelta seek_timestamp = 1505 DecodeTimestamp seek_timestamp =
1499 FindNewSelectedRangeSeekTimestamp(start_timestamp); 1506 FindNewSelectedRangeSeekTimestamp(start_timestamp);
1500 1507
1501 // If we don't have buffered data to seek to, then return. 1508 // If we don't have buffered data to seek to, then return.
1502 if (seek_timestamp == kNoTimestamp()) 1509 if (seek_timestamp == kNoDecodeTimestamp())
1503 return; 1510 return;
1504 1511
1505 DCHECK(track_buffer_.empty()); 1512 DCHECK(track_buffer_.empty());
1506 SeekAndSetSelectedRange(*FindExistingRangeFor(seek_timestamp), 1513 SeekAndSetSelectedRange(*FindExistingRangeFor(seek_timestamp),
1507 seek_timestamp); 1514 seek_timestamp);
1508 } 1515 }
1509 1516
1510 base::TimeDelta SourceBufferStream::FindNewSelectedRangeSeekTimestamp( 1517 DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp(
1511 const base::TimeDelta start_timestamp) { 1518 const DecodeTimestamp start_timestamp) {
1512 DCHECK(start_timestamp != kNoTimestamp()); 1519 DCHECK(start_timestamp != kNoDecodeTimestamp());
1513 DCHECK(start_timestamp >= base::TimeDelta()); 1520 DCHECK(start_timestamp >= DecodeTimestamp());
1514 1521
1515 RangeList::iterator itr = ranges_.begin(); 1522 RangeList::iterator itr = ranges_.begin();
1516 1523
1517 for (; itr != ranges_.end(); ++itr) { 1524 for (; itr != ranges_.end(); ++itr) {
1518 if ((*itr)->GetEndTimestamp() >= start_timestamp) { 1525 if ((*itr)->GetEndTimestamp() >= start_timestamp) {
1519 break; 1526 break;
1520 } 1527 }
1521 } 1528 }
1522 1529
1523 if (itr == ranges_.end()) 1530 if (itr == ranges_.end())
1524 return kNoTimestamp(); 1531 return kNoDecodeTimestamp();
1525 1532
1526 // First check for a keyframe timestamp >= |start_timestamp| 1533 // First check for a keyframe timestamp >= |start_timestamp|
1527 // in the current range. 1534 // in the current range.
1528 base::TimeDelta keyframe_timestamp = 1535 DecodeTimestamp keyframe_timestamp =
1529 (*itr)->NextKeyframeTimestamp(start_timestamp); 1536 (*itr)->NextKeyframeTimestamp(start_timestamp);
1530 1537
1531 if (keyframe_timestamp != kNoTimestamp()) 1538 if (keyframe_timestamp != kNoDecodeTimestamp())
1532 return keyframe_timestamp; 1539 return keyframe_timestamp;
1533 1540
1534 // If a keyframe was not found then look for a keyframe that is 1541 // If a keyframe was not found then look for a keyframe that is
1535 // "close enough" in the current or next range. 1542 // "close enough" in the current or next range.
1536 base::TimeDelta end_timestamp = 1543 DecodeTimestamp end_timestamp =
1537 start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); 1544 start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
1538 DCHECK(start_timestamp < end_timestamp); 1545 DCHECK(start_timestamp < end_timestamp);
1539 1546
1540 // Make sure the current range doesn't start beyond |end_timestamp|. 1547 // Make sure the current range doesn't start beyond |end_timestamp|.
1541 if ((*itr)->GetStartTimestamp() >= end_timestamp) 1548 if ((*itr)->GetStartTimestamp() >= end_timestamp)
1542 return kNoTimestamp(); 1549 return kNoDecodeTimestamp();
1543 1550
1544 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); 1551 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
1545 1552
1546 // Check to see if the keyframe is within the acceptable range 1553 // Check to see if the keyframe is within the acceptable range
1547 // (|start_timestamp|, |end_timestamp|]. 1554 // (|start_timestamp|, |end_timestamp|].
1548 if (keyframe_timestamp != kNoTimestamp() && 1555 if (keyframe_timestamp != kNoDecodeTimestamp() &&
1549 start_timestamp < keyframe_timestamp && 1556 start_timestamp < keyframe_timestamp &&
1550 keyframe_timestamp <= end_timestamp) { 1557 keyframe_timestamp <= end_timestamp) {
1551 return keyframe_timestamp; 1558 return keyframe_timestamp;
1552 } 1559 }
1553 1560
1554 // If |end_timestamp| is within this range, then no other checks are 1561 // If |end_timestamp| is within this range, then no other checks are
1555 // necessary. 1562 // necessary.
1556 if (end_timestamp <= (*itr)->GetEndTimestamp()) 1563 if (end_timestamp <= (*itr)->GetEndTimestamp())
1557 return kNoTimestamp(); 1564 return kNoDecodeTimestamp();
1558 1565
1559 // Move on to the next range. 1566 // Move on to the next range.
1560 ++itr; 1567 ++itr;
1561 1568
1562 // Return early if the next range does not contain |end_timestamp|. 1569 // Return early if the next range does not contain |end_timestamp|.
1563 if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp) 1570 if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp)
1564 return kNoTimestamp(); 1571 return kNoDecodeTimestamp();
1565 1572
1566 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); 1573 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
1567 1574
1568 // Check to see if the keyframe is within the acceptable range 1575 // Check to see if the keyframe is within the acceptable range
1569 // (|start_timestamp|, |end_timestamp|]. 1576 // (|start_timestamp|, |end_timestamp|].
1570 if (keyframe_timestamp != kNoTimestamp() && 1577 if (keyframe_timestamp != kNoDecodeTimestamp() &&
1571 start_timestamp < keyframe_timestamp && 1578 start_timestamp < keyframe_timestamp &&
1572 keyframe_timestamp <= end_timestamp) { 1579 keyframe_timestamp <= end_timestamp) {
1573 return keyframe_timestamp; 1580 return keyframe_timestamp;
1574 } 1581 }
1575 1582
1576 return kNoTimestamp(); 1583 return kNoDecodeTimestamp();
1577 } 1584 }
1578 1585
1579 base::TimeDelta SourceBufferStream::FindKeyframeAfterTimestamp( 1586 DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp(
1580 const base::TimeDelta timestamp) { 1587 const DecodeTimestamp timestamp) {
1581 DCHECK(timestamp != kNoTimestamp()); 1588 DCHECK(timestamp != kNoDecodeTimestamp());
1582 1589
1583 RangeList::iterator itr = FindExistingRangeFor(timestamp); 1590 RangeList::iterator itr = FindExistingRangeFor(timestamp);
1584 1591
1585 if (itr == ranges_.end()) 1592 if (itr == ranges_.end())
1586 return kNoTimestamp(); 1593 return kNoDecodeTimestamp();
1587 1594
1588 // First check for a keyframe timestamp >= |timestamp| 1595 // First check for a keyframe timestamp >= |timestamp|
1589 // in the current range. 1596 // in the current range.
1590 return (*itr)->NextKeyframeTimestamp(timestamp); 1597 return (*itr)->NextKeyframeTimestamp(timestamp);
1591 } 1598 }
1592 1599
1593 std::string SourceBufferStream::GetStreamTypeName() const { 1600 std::string SourceBufferStream::GetStreamTypeName() const {
1594 switch (GetType()) { 1601 switch (GetType()) {
1595 case kAudio: 1602 case kAudio:
1596 return "AUDIO"; 1603 return "AUDIO";
(...skipping 20 matching lines...) Expand all
1617 1624
1618 DCHECK(*itr != ranges_.end()); 1625 DCHECK(*itr != ranges_.end());
1619 if (**itr == selected_range_) { 1626 if (**itr == selected_range_) {
1620 DVLOG(1) << __FUNCTION__ << " deleting selected range."; 1627 DVLOG(1) << __FUNCTION__ << " deleting selected range.";
1621 SetSelectedRange(NULL); 1628 SetSelectedRange(NULL);
1622 } 1629 }
1623 1630
1624 if (*itr == range_for_next_append_) { 1631 if (*itr == range_for_next_append_) {
1625 DVLOG(1) << __FUNCTION__ << " deleting range_for_next_append_."; 1632 DVLOG(1) << __FUNCTION__ << " deleting range_for_next_append_.";
1626 range_for_next_append_ = ranges_.end(); 1633 range_for_next_append_ = ranges_.end();
1627 last_appended_buffer_timestamp_ = kNoTimestamp(); 1634 last_appended_buffer_timestamp_ = kNoDecodeTimestamp();
1628 last_appended_buffer_is_keyframe_ = false; 1635 last_appended_buffer_is_keyframe_ = false;
1629 } 1636 }
1630 1637
1631 delete **itr; 1638 delete **itr;
1632 *itr = ranges_.erase(*itr); 1639 *itr = ranges_.erase(*itr);
1633 } 1640 }
1634 1641
1635 void SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) { 1642 void SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) {
1636 DCHECK(!new_buffers.empty()); 1643 DCHECK(!new_buffers.empty());
1637 1644
1638 // Splice frames are only supported for audio. 1645 // Splice frames are only supported for audio.
1639 if (GetType() != kAudio) 1646 if (GetType() != kAudio)
1640 return; 1647 return;
1641 1648
1642 // Find the overlapped range (if any). 1649 // Find the overlapped range (if any).
1643 const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp(); 1650 const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp();
1644 RangeList::iterator range_itr = FindExistingRangeFor(splice_timestamp); 1651 const DecodeTimestamp splice_dts =
1652 DecodeTimestamp::FromPresentationTime(splice_timestamp);
1653 RangeList::iterator range_itr = FindExistingRangeFor(splice_dts);
1645 if (range_itr == ranges_.end()) 1654 if (range_itr == ranges_.end())
1646 return; 1655 return;
1647 1656
1648 const base::TimeDelta max_splice_end_timestamp = 1657 const DecodeTimestamp max_splice_end_dts =
1649 splice_timestamp + base::TimeDelta::FromMilliseconds( 1658 splice_dts + base::TimeDelta::FromMilliseconds(
1650 AudioSplicer::kCrossfadeDurationInMilliseconds); 1659 AudioSplicer::kCrossfadeDurationInMilliseconds);
1651 1660
1652 // Find all buffers involved before the splice point. 1661 // Find all buffers involved before the splice point.
1653 BufferQueue pre_splice_buffers; 1662 BufferQueue pre_splice_buffers;
1654 if (!(*range_itr)->GetBuffersInRange( 1663 if (!(*range_itr)->GetBuffersInRange(
1655 splice_timestamp, max_splice_end_timestamp, &pre_splice_buffers)) { 1664 splice_dts, max_splice_end_dts, &pre_splice_buffers)) {
1656 return; 1665 return;
1657 } 1666 }
1658 1667
1659 // If there are gaps in the timeline, it's possible that we only find buffers 1668 // If there are gaps in the timeline, it's possible that we only find buffers
1660 // after the splice point but within the splice range. For simplicity, we do 1669 // after the splice point but within the splice range. For simplicity, we do
1661 // not generate splice frames in this case. 1670 // not generate splice frames in this case.
1662 // 1671 //
1663 // We also do not want to generate splices if the first new buffer replaces an 1672 // We also do not want to generate splices if the first new buffer replaces an
1664 // existing buffer exactly. 1673 // existing buffer exactly.
1665 if (pre_splice_buffers.front()->timestamp() >= splice_timestamp) 1674 if (pre_splice_buffers.front()->timestamp() >= splice_timestamp)
(...skipping 29 matching lines...) Expand all
1695 << splice_duration.InMicroseconds() << " us, but need " 1704 << splice_duration.InMicroseconds() << " us, but need "
1696 << minimum_splice_duration.InMicroseconds() << " us."; 1705 << minimum_splice_duration.InMicroseconds() << " us.";
1697 return; 1706 return;
1698 } 1707 }
1699 1708
1700 new_buffers.front()->ConvertToSpliceBuffer(pre_splice_buffers); 1709 new_buffers.front()->ConvertToSpliceBuffer(pre_splice_buffers);
1701 } 1710 }
1702 1711
1703 SourceBufferRange::SourceBufferRange( 1712 SourceBufferRange::SourceBufferRange(
1704 SourceBufferStream::Type type, const BufferQueue& new_buffers, 1713 SourceBufferStream::Type type, const BufferQueue& new_buffers,
1705 base::TimeDelta media_segment_start_time, 1714 DecodeTimestamp media_segment_start_time,
1706 const InterbufferDistanceCB& interbuffer_distance_cb) 1715 const InterbufferDistanceCB& interbuffer_distance_cb)
1707 : type_(type), 1716 : type_(type),
1708 keyframe_map_index_base_(0), 1717 keyframe_map_index_base_(0),
1709 next_buffer_index_(-1), 1718 next_buffer_index_(-1),
1710 media_segment_start_time_(media_segment_start_time), 1719 media_segment_start_time_(media_segment_start_time),
1711 interbuffer_distance_cb_(interbuffer_distance_cb), 1720 interbuffer_distance_cb_(interbuffer_distance_cb),
1712 size_in_bytes_(0) { 1721 size_in_bytes_(0) {
1713 CHECK(!new_buffers.empty()); 1722 CHECK(!new_buffers.empty());
1714 DCHECK(new_buffers.front()->IsKeyframe()); 1723 DCHECK(new_buffers.front()->IsKeyframe());
1715 DCHECK(!interbuffer_distance_cb.is_null()); 1724 DCHECK(!interbuffer_distance_cb.is_null());
1716 AppendBuffersToEnd(new_buffers); 1725 AppendBuffersToEnd(new_buffers);
1717 } 1726 }
1718 1727
1719 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { 1728 void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) {
1720 DCHECK(buffers_.empty() || CanAppendBuffersToEnd(new_buffers)); 1729 DCHECK(buffers_.empty() || CanAppendBuffersToEnd(new_buffers));
1721 DCHECK(media_segment_start_time_ == kNoTimestamp() || 1730 DCHECK(media_segment_start_time_ == kNoDecodeTimestamp() ||
1722 media_segment_start_time_ <= 1731 media_segment_start_time_ <=
1723 new_buffers.front()->GetDecodeTimestamp()); 1732 new_buffers.front()->GetDecodeTimestamp());
1724 for (BufferQueue::const_iterator itr = new_buffers.begin(); 1733 for (BufferQueue::const_iterator itr = new_buffers.begin();
1725 itr != new_buffers.end(); 1734 itr != new_buffers.end();
1726 ++itr) { 1735 ++itr) {
1727 DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp()); 1736 DCHECK((*itr)->GetDecodeTimestamp() != kNoDecodeTimestamp());
1728 buffers_.push_back(*itr); 1737 buffers_.push_back(*itr);
1729 size_in_bytes_ += (*itr)->data_size(); 1738 size_in_bytes_ += (*itr)->data_size();
1730 1739
1731 if ((*itr)->IsKeyframe()) { 1740 if ((*itr)->IsKeyframe()) {
1732 keyframe_map_.insert( 1741 keyframe_map_.insert(
1733 std::make_pair((*itr)->GetDecodeTimestamp(), 1742 std::make_pair((*itr)->GetDecodeTimestamp(),
1734 buffers_.size() - 1 + keyframe_map_index_base_)); 1743 buffers_.size() - 1 + keyframe_map_index_base_));
1735 } 1744 }
1736 } 1745 }
1737 } 1746 }
1738 1747
1739 void SourceBufferRange::Seek(base::TimeDelta timestamp) { 1748 void SourceBufferRange::Seek(DecodeTimestamp timestamp) {
1740 DCHECK(CanSeekTo(timestamp)); 1749 DCHECK(CanSeekTo(timestamp));
1741 DCHECK(!keyframe_map_.empty()); 1750 DCHECK(!keyframe_map_.empty());
1742 1751
1743 KeyframeMap::iterator result = GetFirstKeyframeBefore(timestamp); 1752 KeyframeMap::iterator result = GetFirstKeyframeBefore(timestamp);
1744 next_buffer_index_ = result->second - keyframe_map_index_base_; 1753 next_buffer_index_ = result->second - keyframe_map_index_base_;
1745 DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size())); 1754 DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size()));
1746 } 1755 }
1747 1756
1748 void SourceBufferRange::SeekAheadTo(base::TimeDelta timestamp) { 1757 void SourceBufferRange::SeekAheadTo(DecodeTimestamp timestamp) {
1749 SeekAhead(timestamp, false); 1758 SeekAhead(timestamp, false);
1750 } 1759 }
1751 1760
1752 void SourceBufferRange::SeekAheadPast(base::TimeDelta timestamp) { 1761 void SourceBufferRange::SeekAheadPast(DecodeTimestamp timestamp) {
1753 SeekAhead(timestamp, true); 1762 SeekAhead(timestamp, true);
1754 } 1763 }
1755 1764
1756 void SourceBufferRange::SeekAhead(base::TimeDelta timestamp, 1765 void SourceBufferRange::SeekAhead(DecodeTimestamp timestamp,
1757 bool skip_given_timestamp) { 1766 bool skip_given_timestamp) {
1758 DCHECK(!keyframe_map_.empty()); 1767 DCHECK(!keyframe_map_.empty());
1759 1768
1760 KeyframeMap::iterator result = 1769 KeyframeMap::iterator result =
1761 GetFirstKeyframeAt(timestamp, skip_given_timestamp); 1770 GetFirstKeyframeAt(timestamp, skip_given_timestamp);
1762 1771
1763 // If there isn't a keyframe after |timestamp|, then seek to end and return 1772 // If there isn't a keyframe after |timestamp|, then seek to end and return
1764 // kNoTimestamp to signal such. 1773 // kNoTimestamp to signal such.
1765 if (result == keyframe_map_.end()) { 1774 if (result == keyframe_map_.end()) {
1766 next_buffer_index_ = -1; 1775 next_buffer_index_ = -1;
1767 return; 1776 return;
1768 } 1777 }
1769 next_buffer_index_ = result->second - keyframe_map_index_base_; 1778 next_buffer_index_ = result->second - keyframe_map_index_base_;
1770 DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size())); 1779 DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size()));
1771 } 1780 }
1772 1781
1773 void SourceBufferRange::SeekToStart() { 1782 void SourceBufferRange::SeekToStart() {
1774 DCHECK(!buffers_.empty()); 1783 DCHECK(!buffers_.empty());
1775 next_buffer_index_ = 0; 1784 next_buffer_index_ = 0;
1776 } 1785 }
1777 1786
1778 SourceBufferRange* SourceBufferRange::SplitRange( 1787 SourceBufferRange* SourceBufferRange::SplitRange(
1779 base::TimeDelta timestamp, bool is_exclusive) { 1788 DecodeTimestamp timestamp, bool is_exclusive) {
1780 CHECK(!buffers_.empty()); 1789 CHECK(!buffers_.empty());
1781 1790
1782 // Find the first keyframe after |timestamp|. If |is_exclusive|, do not 1791 // Find the first keyframe after |timestamp|. If |is_exclusive|, do not
1783 // include keyframes at |timestamp|. 1792 // include keyframes at |timestamp|.
1784 KeyframeMap::iterator new_beginning_keyframe = 1793 KeyframeMap::iterator new_beginning_keyframe =
1785 GetFirstKeyframeAt(timestamp, is_exclusive); 1794 GetFirstKeyframeAt(timestamp, is_exclusive);
1786 1795
1787 // If there is no keyframe after |timestamp|, we can't split the range. 1796 // If there is no keyframe after |timestamp|, we can't split the range.
1788 if (new_beginning_keyframe == keyframe_map_.end()) 1797 if (new_beginning_keyframe == keyframe_map_.end())
1789 return NULL; 1798 return NULL;
1790 1799
1791 // Remove the data beginning at |keyframe_index| from |buffers_| and save it 1800 // Remove the data beginning at |keyframe_index| from |buffers_| and save it
1792 // into |removed_buffers|. 1801 // into |removed_buffers|.
1793 int keyframe_index = 1802 int keyframe_index =
1794 new_beginning_keyframe->second - keyframe_map_index_base_; 1803 new_beginning_keyframe->second - keyframe_map_index_base_;
1795 DCHECK_LT(keyframe_index, static_cast<int>(buffers_.size())); 1804 DCHECK_LT(keyframe_index, static_cast<int>(buffers_.size()));
1796 BufferQueue::iterator starting_point = buffers_.begin() + keyframe_index; 1805 BufferQueue::iterator starting_point = buffers_.begin() + keyframe_index;
1797 BufferQueue removed_buffers(starting_point, buffers_.end()); 1806 BufferQueue removed_buffers(starting_point, buffers_.end());
1798 1807
1799 base::TimeDelta new_range_start_timestamp = kNoTimestamp(); 1808 DecodeTimestamp new_range_start_timestamp = kNoDecodeTimestamp();
1800 if (GetStartTimestamp() < buffers_.front()->GetDecodeTimestamp() && 1809 if (GetStartTimestamp() < buffers_.front()->GetDecodeTimestamp() &&
1801 timestamp < removed_buffers.front()->GetDecodeTimestamp()) { 1810 timestamp < removed_buffers.front()->GetDecodeTimestamp()) {
1802 // The split is in the gap between |media_segment_start_time_| and 1811 // The split is in the gap between |media_segment_start_time_| and
1803 // the first buffer of the new range so we should set the start 1812 // the first buffer of the new range so we should set the start
1804 // time of the new range to |timestamp| so we preserve part of the 1813 // time of the new range to |timestamp| so we preserve part of the
1805 // gap in the new range. 1814 // gap in the new range.
1806 new_range_start_timestamp = timestamp; 1815 new_range_start_timestamp = timestamp;
1807 } 1816 }
1808 1817
1809 keyframe_map_.erase(new_beginning_keyframe, keyframe_map_.end()); 1818 keyframe_map_.erase(new_beginning_keyframe, keyframe_map_.end());
1810 FreeBufferRange(starting_point, buffers_.end()); 1819 FreeBufferRange(starting_point, buffers_.end());
1811 1820
1812 // Create a new range with |removed_buffers|. 1821 // Create a new range with |removed_buffers|.
1813 SourceBufferRange* split_range = 1822 SourceBufferRange* split_range =
1814 new SourceBufferRange( 1823 new SourceBufferRange(
1815 type_, removed_buffers, new_range_start_timestamp, 1824 type_, removed_buffers, new_range_start_timestamp,
1816 interbuffer_distance_cb_); 1825 interbuffer_distance_cb_);
1817 1826
1818 // If the next buffer position is now in |split_range|, update the state of 1827 // If the next buffer position is now in |split_range|, update the state of
1819 // this range and |split_range| accordingly. 1828 // this range and |split_range| accordingly.
1820 if (next_buffer_index_ >= static_cast<int>(buffers_.size())) { 1829 if (next_buffer_index_ >= static_cast<int>(buffers_.size())) {
1821 split_range->next_buffer_index_ = next_buffer_index_ - keyframe_index; 1830 split_range->next_buffer_index_ = next_buffer_index_ - keyframe_index;
1822 ResetNextBufferPosition(); 1831 ResetNextBufferPosition();
1823 } 1832 }
1824 1833
1825 return split_range; 1834 return split_range;
1826 } 1835 }
1827 1836
1828 BufferQueue::iterator SourceBufferRange::GetBufferItrAt( 1837 BufferQueue::iterator SourceBufferRange::GetBufferItrAt(
1829 base::TimeDelta timestamp, 1838 DecodeTimestamp timestamp,
1830 bool skip_given_timestamp) { 1839 bool skip_given_timestamp) {
1831 return skip_given_timestamp 1840 return skip_given_timestamp
1832 ? std::upper_bound(buffers_.begin(), 1841 ? std::upper_bound(buffers_.begin(),
1833 buffers_.end(), 1842 buffers_.end(),
1834 timestamp, 1843 timestamp,
1835 CompareTimeDeltaToStreamParserBuffer) 1844 CompareTimeDeltaToStreamParserBuffer)
1836 : std::lower_bound(buffers_.begin(), 1845 : std::lower_bound(buffers_.begin(),
1837 buffers_.end(), 1846 buffers_.end(),
1838 timestamp, 1847 timestamp,
1839 CompareStreamParserBufferToTimeDelta); 1848 CompareStreamParserBufferToTimeDelta);
1840 } 1849 }
1841 1850
1842 SourceBufferRange::KeyframeMap::iterator 1851 SourceBufferRange::KeyframeMap::iterator
1843 SourceBufferRange::GetFirstKeyframeAt(base::TimeDelta timestamp, 1852 SourceBufferRange::GetFirstKeyframeAt(DecodeTimestamp timestamp,
1844 bool skip_given_timestamp) { 1853 bool skip_given_timestamp) {
1845 return skip_given_timestamp ? 1854 return skip_given_timestamp ?
1846 keyframe_map_.upper_bound(timestamp) : 1855 keyframe_map_.upper_bound(timestamp) :
1847 keyframe_map_.lower_bound(timestamp); 1856 keyframe_map_.lower_bound(timestamp);
1848 } 1857 }
1849 1858
1850 SourceBufferRange::KeyframeMap::iterator 1859 SourceBufferRange::KeyframeMap::iterator
1851 SourceBufferRange::GetFirstKeyframeBefore(base::TimeDelta timestamp) { 1860 SourceBufferRange::GetFirstKeyframeBefore(DecodeTimestamp timestamp) {
1852 KeyframeMap::iterator result = keyframe_map_.lower_bound(timestamp); 1861 KeyframeMap::iterator result = keyframe_map_.lower_bound(timestamp);
1853 // lower_bound() returns the first element >= |timestamp|, so we want the 1862 // lower_bound() returns the first element >= |timestamp|, so we want the
1854 // previous element if it did not return the element exactly equal to 1863 // previous element if it did not return the element exactly equal to
1855 // |timestamp|. 1864 // |timestamp|.
1856 if (result != keyframe_map_.begin() && 1865 if (result != keyframe_map_.begin() &&
1857 (result == keyframe_map_.end() || result->first != timestamp)) { 1866 (result == keyframe_map_.end() || result->first != timestamp)) {
1858 --result; 1867 --result;
1859 } 1868 }
1860 return result; 1869 return result;
1861 } 1870 }
1862 1871
1863 void SourceBufferRange::DeleteAll(BufferQueue* removed_buffers) { 1872 void SourceBufferRange::DeleteAll(BufferQueue* removed_buffers) {
1864 TruncateAt(buffers_.begin(), removed_buffers); 1873 TruncateAt(buffers_.begin(), removed_buffers);
1865 } 1874 }
1866 1875
1867 bool SourceBufferRange::TruncateAt( 1876 bool SourceBufferRange::TruncateAt(
1868 base::TimeDelta timestamp, BufferQueue* removed_buffers, 1877 DecodeTimestamp timestamp, BufferQueue* removed_buffers,
1869 bool is_exclusive) { 1878 bool is_exclusive) {
1870 // Find the place in |buffers_| where we will begin deleting data. 1879 // Find the place in |buffers_| where we will begin deleting data.
1871 BufferQueue::iterator starting_point = 1880 BufferQueue::iterator starting_point =
1872 GetBufferItrAt(timestamp, is_exclusive); 1881 GetBufferItrAt(timestamp, is_exclusive);
1873 return TruncateAt(starting_point, removed_buffers); 1882 return TruncateAt(starting_point, removed_buffers);
1874 } 1883 }
1875 1884
1876 int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { 1885 int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) {
1877 DCHECK(!FirstGOPContainsNextBufferPosition()); 1886 DCHECK(!FirstGOPContainsNextBufferPosition());
1878 DCHECK(deleted_buffers); 1887 DCHECK(deleted_buffers);
(...skipping 28 matching lines...) Expand all
1907 keyframe_map_index_base_ += buffers_deleted; 1916 keyframe_map_index_base_ += buffers_deleted;
1908 1917
1909 if (next_buffer_index_ > -1) { 1918 if (next_buffer_index_ > -1) {
1910 next_buffer_index_ -= buffers_deleted; 1919 next_buffer_index_ -= buffers_deleted;
1911 DCHECK_GE(next_buffer_index_, 0); 1920 DCHECK_GE(next_buffer_index_, 0);
1912 } 1921 }
1913 1922
1914 // Invalidate media segment start time if we've deleted the first buffer of 1923 // Invalidate media segment start time if we've deleted the first buffer of
1915 // the range. 1924 // the range.
1916 if (buffers_deleted > 0) 1925 if (buffers_deleted > 0)
1917 media_segment_start_time_ = kNoTimestamp(); 1926 media_segment_start_time_ = kNoDecodeTimestamp();
1918 1927
1919 return total_bytes_deleted; 1928 return total_bytes_deleted;
1920 } 1929 }
1921 1930
1922 int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { 1931 int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) {
1923 DCHECK(!LastGOPContainsNextBufferPosition()); 1932 DCHECK(!LastGOPContainsNextBufferPosition());
1924 DCHECK(deleted_buffers); 1933 DCHECK(deleted_buffers);
1925 1934
1926 // Remove the last GOP's keyframe from the |keyframe_map_|. 1935 // Remove the last GOP's keyframe from the |keyframe_map_|.
1927 KeyframeMap::iterator back = keyframe_map_.end(); 1936 KeyframeMap::iterator back = keyframe_map_.end();
(...skipping 14 matching lines...) Expand all
1942 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing 1951 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing
1943 // order. 1952 // order.
1944 deleted_buffers->push_front(buffers_.back()); 1953 deleted_buffers->push_front(buffers_.back());
1945 buffers_.pop_back(); 1954 buffers_.pop_back();
1946 } 1955 }
1947 1956
1948 return total_bytes_deleted; 1957 return total_bytes_deleted;
1949 } 1958 }
1950 1959
1951 int SourceBufferRange::GetRemovalGOP( 1960 int SourceBufferRange::GetRemovalGOP(
1952 base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, 1961 DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
1953 int total_bytes_to_free, base::TimeDelta* removal_end_timestamp) { 1962 int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
1954 int bytes_to_free = total_bytes_to_free; 1963 int bytes_to_free = total_bytes_to_free;
1955 int bytes_removed = 0; 1964 int bytes_removed = 0;
1956 1965
1957 KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false); 1966 KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false);
1958 if (gop_itr == keyframe_map_.end()) 1967 if (gop_itr == keyframe_map_.end())
1959 return 0; 1968 return 0;
1960 int keyframe_index = gop_itr->second - keyframe_map_index_base_; 1969 int keyframe_index = gop_itr->second - keyframe_map_index_base_;
1961 BufferQueue::iterator buffer_itr = buffers_.begin() + keyframe_index; 1970 BufferQueue::iterator buffer_itr = buffers_.begin() + keyframe_index;
1962 KeyframeMap::iterator gop_end = keyframe_map_.end(); 1971 KeyframeMap::iterator gop_end = keyframe_map_.end();
1963 if (end_timestamp < GetBufferedEndTimestamp()) 1972 if (end_timestamp < GetBufferedEndTimestamp())
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
2030 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) { 2039 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) {
2031 DCHECK(!removed_buffers || removed_buffers->empty()); 2040 DCHECK(!removed_buffers || removed_buffers->empty());
2032 2041
2033 // Return if we're not deleting anything. 2042 // Return if we're not deleting anything.
2034 if (starting_point == buffers_.end()) 2043 if (starting_point == buffers_.end())
2035 return buffers_.empty(); 2044 return buffers_.empty();
2036 2045
2037 // Reset the next buffer index if we will be deleting the buffer that's next 2046 // Reset the next buffer index if we will be deleting the buffer that's next
2038 // in sequence. 2047 // in sequence.
2039 if (HasNextBufferPosition()) { 2048 if (HasNextBufferPosition()) {
2040 base::TimeDelta next_buffer_timestamp = GetNextTimestamp(); 2049 DecodeTimestamp next_buffer_timestamp = GetNextTimestamp();
2041 if (next_buffer_timestamp == kNoTimestamp() || 2050 if (next_buffer_timestamp == kNoDecodeTimestamp() ||
2042 next_buffer_timestamp >= (*starting_point)->GetDecodeTimestamp()) { 2051 next_buffer_timestamp >= (*starting_point)->GetDecodeTimestamp()) {
2043 if (HasNextBuffer() && removed_buffers) { 2052 if (HasNextBuffer() && removed_buffers) {
2044 int starting_offset = starting_point - buffers_.begin(); 2053 int starting_offset = starting_point - buffers_.begin();
2045 int next_buffer_offset = next_buffer_index_ - starting_offset; 2054 int next_buffer_offset = next_buffer_index_ - starting_offset;
2046 DCHECK_GE(next_buffer_offset, 0); 2055 DCHECK_GE(next_buffer_offset, 0);
2047 BufferQueue saved(starting_point + next_buffer_offset, buffers_.end()); 2056 BufferQueue saved(starting_point + next_buffer_offset, buffers_.end());
2048 removed_buffers->swap(saved); 2057 removed_buffers->swap(saved);
2049 } 2058 }
2050 ResetNextBufferPosition(); 2059 ResetNextBufferPosition();
2051 } 2060 }
(...skipping 24 matching lines...) Expand all
2076 next_buffer_index_ < static_cast<int>(buffers_.size()); 2085 next_buffer_index_ < static_cast<int>(buffers_.size());
2077 } 2086 }
2078 2087
2079 int SourceBufferRange::GetNextConfigId() const { 2088 int SourceBufferRange::GetNextConfigId() const {
2080 DCHECK(HasNextBuffer()); 2089 DCHECK(HasNextBuffer());
2081 // If the next buffer is an audio splice frame, the next effective config id 2090 // If the next buffer is an audio splice frame, the next effective config id
2082 // comes from the first fade out preroll buffer. 2091 // comes from the first fade out preroll buffer.
2083 return GetConfigId(buffers_[next_buffer_index_], 0); 2092 return GetConfigId(buffers_[next_buffer_index_], 0);
2084 } 2093 }
2085 2094
2086 base::TimeDelta SourceBufferRange::GetNextTimestamp() const { 2095 DecodeTimestamp SourceBufferRange::GetNextTimestamp() const {
2087 DCHECK(!buffers_.empty()); 2096 DCHECK(!buffers_.empty());
2088 DCHECK(HasNextBufferPosition()); 2097 DCHECK(HasNextBufferPosition());
2089 2098
2090 if (next_buffer_index_ >= static_cast<int>(buffers_.size())) { 2099 if (next_buffer_index_ >= static_cast<int>(buffers_.size())) {
2091 return kNoTimestamp(); 2100 return kNoDecodeTimestamp();
2092 } 2101 }
2093 2102
2094 return buffers_[next_buffer_index_]->GetDecodeTimestamp(); 2103 return buffers_[next_buffer_index_]->GetDecodeTimestamp();
2095 } 2104 }
2096 2105
2097 bool SourceBufferRange::HasNextBufferPosition() const { 2106 bool SourceBufferRange::HasNextBufferPosition() const {
2098 return next_buffer_index_ >= 0; 2107 return next_buffer_index_ >= 0;
2099 } 2108 }
2100 2109
2101 void SourceBufferRange::ResetNextBufferPosition() { 2110 void SourceBufferRange::ResetNextBufferPosition() {
(...skipping 16 matching lines...) Expand all
2118 return CanAppendBuffersToEnd(range.buffers_); 2127 return CanAppendBuffersToEnd(range.buffers_);
2119 } 2128 }
2120 2129
2121 bool SourceBufferRange::CanAppendBuffersToEnd( 2130 bool SourceBufferRange::CanAppendBuffersToEnd(
2122 const BufferQueue& buffers) const { 2131 const BufferQueue& buffers) const {
2123 DCHECK(!buffers_.empty()); 2132 DCHECK(!buffers_.empty());
2124 return IsNextInSequence(buffers.front()->GetDecodeTimestamp(), 2133 return IsNextInSequence(buffers.front()->GetDecodeTimestamp(),
2125 buffers.front()->IsKeyframe()); 2134 buffers.front()->IsKeyframe());
2126 } 2135 }
2127 2136
2128 bool SourceBufferRange::BelongsToRange(base::TimeDelta timestamp) const { 2137 bool SourceBufferRange::BelongsToRange(DecodeTimestamp timestamp) const {
2129 DCHECK(!buffers_.empty()); 2138 DCHECK(!buffers_.empty());
2130 2139
2131 return (IsNextInSequence(timestamp, false) || 2140 return (IsNextInSequence(timestamp, false) ||
2132 (GetStartTimestamp() <= timestamp && timestamp <= GetEndTimestamp())); 2141 (GetStartTimestamp() <= timestamp && timestamp <= GetEndTimestamp()));
2133 } 2142 }
2134 2143
2135 bool SourceBufferRange::CanSeekTo(base::TimeDelta timestamp) const { 2144 bool SourceBufferRange::CanSeekTo(DecodeTimestamp timestamp) const {
2136 base::TimeDelta start_timestamp = 2145 DecodeTimestamp start_timestamp =
2137 std::max(base::TimeDelta(), GetStartTimestamp() - GetFudgeRoom()); 2146 std::max(DecodeTimestamp(), GetStartTimestamp() - GetFudgeRoom());
2138 return !keyframe_map_.empty() && start_timestamp <= timestamp && 2147 return !keyframe_map_.empty() && start_timestamp <= timestamp &&
2139 timestamp < GetBufferedEndTimestamp(); 2148 timestamp < GetBufferedEndTimestamp();
2140 } 2149 }
2141 2150
2142 bool SourceBufferRange::CompletelyOverlaps( 2151 bool SourceBufferRange::CompletelyOverlaps(
2143 const SourceBufferRange& range) const { 2152 const SourceBufferRange& range) const {
2144 return GetStartTimestamp() <= range.GetStartTimestamp() && 2153 return GetStartTimestamp() <= range.GetStartTimestamp() &&
2145 GetEndTimestamp() >= range.GetEndTimestamp(); 2154 GetEndTimestamp() >= range.GetEndTimestamp();
2146 } 2155 }
2147 2156
2148 bool SourceBufferRange::EndOverlaps(const SourceBufferRange& range) const { 2157 bool SourceBufferRange::EndOverlaps(const SourceBufferRange& range) const {
2149 return range.GetStartTimestamp() <= GetEndTimestamp() && 2158 return range.GetStartTimestamp() <= GetEndTimestamp() &&
2150 GetEndTimestamp() < range.GetEndTimestamp(); 2159 GetEndTimestamp() < range.GetEndTimestamp();
2151 } 2160 }
2152 2161
2153 base::TimeDelta SourceBufferRange::GetStartTimestamp() const { 2162 DecodeTimestamp SourceBufferRange::GetStartTimestamp() const {
2154 DCHECK(!buffers_.empty()); 2163 DCHECK(!buffers_.empty());
2155 base::TimeDelta start_timestamp = media_segment_start_time_; 2164 DecodeTimestamp start_timestamp = media_segment_start_time_;
2156 if (start_timestamp == kNoTimestamp()) 2165 if (start_timestamp == kNoDecodeTimestamp())
2157 start_timestamp = buffers_.front()->GetDecodeTimestamp(); 2166 start_timestamp = buffers_.front()->GetDecodeTimestamp();
2158 return start_timestamp; 2167 return start_timestamp;
2159 } 2168 }
2160 2169
2161 base::TimeDelta SourceBufferRange::GetEndTimestamp() const { 2170 DecodeTimestamp SourceBufferRange::GetEndTimestamp() const {
2162 DCHECK(!buffers_.empty()); 2171 DCHECK(!buffers_.empty());
2163 return buffers_.back()->GetDecodeTimestamp(); 2172 return buffers_.back()->GetDecodeTimestamp();
2164 } 2173 }
2165 2174
2166 base::TimeDelta SourceBufferRange::GetBufferedEndTimestamp() const { 2175 DecodeTimestamp SourceBufferRange::GetBufferedEndTimestamp() const {
2167 DCHECK(!buffers_.empty()); 2176 DCHECK(!buffers_.empty());
2168 base::TimeDelta duration = buffers_.back()->duration(); 2177 base::TimeDelta duration = buffers_.back()->duration();
2169 if (duration == kNoTimestamp() || duration == base::TimeDelta()) 2178 if (duration == kNoTimestamp() || duration == base::TimeDelta())
2170 duration = GetApproximateDuration(); 2179 duration = GetApproximateDuration();
2171 return GetEndTimestamp() + duration; 2180 return GetEndTimestamp() + duration;
2172 } 2181 }
2173 2182
2174 base::TimeDelta SourceBufferRange::NextKeyframeTimestamp( 2183 DecodeTimestamp SourceBufferRange::NextKeyframeTimestamp(
2175 base::TimeDelta timestamp) { 2184 DecodeTimestamp timestamp) {
2176 DCHECK(!keyframe_map_.empty()); 2185 DCHECK(!keyframe_map_.empty());
2177 2186
2178 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) 2187 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp())
2179 return kNoTimestamp(); 2188 return kNoDecodeTimestamp();
2180 2189
2181 KeyframeMap::iterator itr = GetFirstKeyframeAt(timestamp, false); 2190 KeyframeMap::iterator itr = GetFirstKeyframeAt(timestamp, false);
2182 if (itr == keyframe_map_.end()) 2191 if (itr == keyframe_map_.end())
2183 return kNoTimestamp(); 2192 return kNoDecodeTimestamp();
2184 2193
2185 // If the timestamp is inside the gap between the start of the media 2194 // If the timestamp is inside the gap between the start of the media
2186 // segment and the first buffer, then just pretend there is a 2195 // segment and the first buffer, then just pretend there is a
2187 // keyframe at the specified timestamp. 2196 // keyframe at the specified timestamp.
2188 if (itr == keyframe_map_.begin() && 2197 if (itr == keyframe_map_.begin() &&
2189 timestamp > media_segment_start_time_ && 2198 timestamp > media_segment_start_time_ &&
2190 timestamp < itr->first) { 2199 timestamp < itr->first) {
2191 return timestamp; 2200 return timestamp;
2192 } 2201 }
2193 2202
2194 return itr->first; 2203 return itr->first;
2195 } 2204 }
2196 2205
2197 base::TimeDelta SourceBufferRange::KeyframeBeforeTimestamp( 2206 DecodeTimestamp SourceBufferRange::KeyframeBeforeTimestamp(
2198 base::TimeDelta timestamp) { 2207 DecodeTimestamp timestamp) {
2199 DCHECK(!keyframe_map_.empty()); 2208 DCHECK(!keyframe_map_.empty());
2200 2209
2201 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) 2210 if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp())
2202 return kNoTimestamp(); 2211 return kNoDecodeTimestamp();
2203 2212
2204 return GetFirstKeyframeBefore(timestamp)->first; 2213 return GetFirstKeyframeBefore(timestamp)->first;
2205 } 2214 }
2206 2215
2207 bool SourceBufferRange::IsNextInSequence( 2216 bool SourceBufferRange::IsNextInSequence(
2208 base::TimeDelta timestamp, bool is_keyframe) const { 2217 DecodeTimestamp timestamp, bool is_keyframe) const {
2209 base::TimeDelta end = buffers_.back()->GetDecodeTimestamp(); 2218 DecodeTimestamp end = buffers_.back()->GetDecodeTimestamp();
2210 if (end < timestamp && 2219 if (end < timestamp &&
2211 (type_ == SourceBufferStream::kText || 2220 (type_ == SourceBufferStream::kText ||
2212 timestamp <= end + GetFudgeRoom())) { 2221 timestamp <= end + GetFudgeRoom())) {
2213 return true; 2222 return true;
2214 } 2223 }
2215 2224
2216 return timestamp == end && AllowSameTimestamp( 2225 return timestamp == end && AllowSameTimestamp(
2217 buffers_.back()->IsKeyframe(), is_keyframe, type_); 2226 buffers_.back()->IsKeyframe(), is_keyframe, type_);
2218 } 2227 }
2219 2228
2220 base::TimeDelta SourceBufferRange::GetFudgeRoom() const { 2229 base::TimeDelta SourceBufferRange::GetFudgeRoom() const {
2221 return ComputeFudgeRoom(GetApproximateDuration()); 2230 return ComputeFudgeRoom(GetApproximateDuration());
2222 } 2231 }
2223 2232
2224 base::TimeDelta SourceBufferRange::GetApproximateDuration() const { 2233 base::TimeDelta SourceBufferRange::GetApproximateDuration() const {
2225 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run(); 2234 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run();
2226 DCHECK(max_interbuffer_distance != kNoTimestamp()); 2235 DCHECK(max_interbuffer_distance != kNoTimestamp());
2227 return max_interbuffer_distance; 2236 return max_interbuffer_distance;
2228 } 2237 }
2229 2238
2230 bool SourceBufferRange::GetBuffersInRange(base::TimeDelta start, 2239 bool SourceBufferRange::GetBuffersInRange(DecodeTimestamp start,
2231 base::TimeDelta end, 2240 DecodeTimestamp end,
2232 BufferQueue* buffers) { 2241 BufferQueue* buffers) {
2233 // Find the nearest buffer with a decode timestamp <= start. 2242 // Find the nearest buffer with a decode timestamp <= start.
2234 const base::TimeDelta first_timestamp = KeyframeBeforeTimestamp(start); 2243 const DecodeTimestamp first_timestamp = KeyframeBeforeTimestamp(start);
2235 if (first_timestamp == kNoTimestamp()) 2244 if (first_timestamp == kNoDecodeTimestamp())
2236 return false; 2245 return false;
2237 2246
2238 // Find all buffers involved in the range. 2247 // Find all buffers involved in the range.
2239 const size_t previous_size = buffers->size(); 2248 const size_t previous_size = buffers->size();
2240 for (BufferQueue::iterator it = GetBufferItrAt(first_timestamp, false); 2249 for (BufferQueue::iterator it = GetBufferItrAt(first_timestamp, false);
2241 it != buffers_.end(); 2250 it != buffers_.end();
2242 ++it) { 2251 ++it) {
2243 const scoped_refptr<StreamParserBuffer>& buffer = *it; 2252 const scoped_refptr<StreamParserBuffer>& buffer = *it;
2244 // Buffers without duration are not supported, so bail if we encounter any. 2253 // Buffers without duration are not supported, so bail if we encounter any.
2245 if (buffer->duration() == kNoTimestamp() || 2254 if (buffer->duration() == kNoTimestamp() ||
2246 buffer->duration() <= base::TimeDelta()) { 2255 buffer->duration() <= base::TimeDelta()) {
2247 return false; 2256 return false;
2248 } 2257 }
2249 if (buffer->end_of_stream() || buffer->timestamp() >= end) 2258 if (buffer->end_of_stream() ||
2259 buffer->timestamp() >= end.ToPresentationTime()) {
2250 break; 2260 break;
2251 if (buffer->timestamp() + buffer->duration() <= start) 2261 }
2262
2263 if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime())
2252 continue; 2264 continue;
2253 buffers->push_back(buffer); 2265 buffers->push_back(buffer);
2254 } 2266 }
2255 return previous_size < buffers->size(); 2267 return previous_size < buffers->size();
2256 } 2268 }
2257 2269
2258 bool SourceBufferStream::SetPendingBuffer( 2270 bool SourceBufferStream::SetPendingBuffer(
2259 scoped_refptr<StreamParserBuffer>* out_buffer) { 2271 scoped_refptr<StreamParserBuffer>* out_buffer) {
2260 DCHECK(*out_buffer); 2272 DCHECK(*out_buffer);
2261 DCHECK(!pending_buffer_); 2273 DCHECK(!pending_buffer_);
2262 2274
2263 const bool have_splice_buffers = !(*out_buffer)->splice_buffers().empty(); 2275 const bool have_splice_buffers = !(*out_buffer)->splice_buffers().empty();
2264 const bool have_preroll_buffer = !!(*out_buffer)->preroll_buffer(); 2276 const bool have_preroll_buffer = !!(*out_buffer)->preroll_buffer();
2265 2277
2266 if (!have_splice_buffers && !have_preroll_buffer) 2278 if (!have_splice_buffers && !have_preroll_buffer)
2267 return false; 2279 return false;
2268 2280
2269 DCHECK_NE(have_splice_buffers, have_preroll_buffer); 2281 DCHECK_NE(have_splice_buffers, have_preroll_buffer);
2270 splice_buffers_index_ = 0; 2282 splice_buffers_index_ = 0;
2271 pending_buffer_.swap(*out_buffer); 2283 pending_buffer_.swap(*out_buffer);
2272 pending_buffers_complete_ = false; 2284 pending_buffers_complete_ = false;
2273 return true; 2285 return true;
2274 } 2286 }
2275 2287
2276 } // namespace media 2288 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698