Chromium Code Reviews| Index: media/filters/source_buffer_stream.cc |
| diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc |
| index 8bc65854c0d2331b5b5ba39af9768a73540d487c..6097c4d06c3ddcb4782847b53e2230a23416fd0f 100644 |
| --- a/media/filters/source_buffer_stream.cc |
| +++ b/media/filters/source_buffer_stream.cc |
| @@ -57,7 +57,7 @@ class SourceBufferRange { |
| // segment to which these buffers belong. |
| SourceBufferRange(SourceBufferStream::Type type, |
| const BufferQueue& new_buffers, |
| - base::TimeDelta media_segment_start_time, |
| + DecodeTimestamp media_segment_start_time, |
| const InterbufferDistanceCB& interbuffer_distance_cb); |
| // Appends |buffers| to the end of the range and updates |keyframe_map_| as |
| @@ -77,15 +77,15 @@ class SourceBufferRange { |
| // Updates |next_buffer_index_| to point to the Buffer containing |timestamp|. |
| // Assumes |timestamp| is valid and in this range. |
| - void Seek(base::TimeDelta timestamp); |
| + void Seek(DecodeTimestamp timestamp); |
| // Updates |next_buffer_index_| to point to next keyframe after or equal to |
| // |timestamp|. |
| - void SeekAheadTo(base::TimeDelta timestamp); |
| + void SeekAheadTo(DecodeTimestamp timestamp); |
| // Updates |next_buffer_index_| to point to next keyframe strictly after |
| // |timestamp|. |
| - void SeekAheadPast(base::TimeDelta timestamp); |
| + void SeekAheadPast(DecodeTimestamp timestamp); |
| // Seeks to the beginning of the range. |
| void SeekToStart(); |
| @@ -96,7 +96,7 @@ class SourceBufferRange { |
| // The buffers in the new SourceBufferRange are moved out of this range. If |
| // there is no keyframe after |timestamp|, SplitRange() returns null and this |
| // range is unmodified. |
| - SourceBufferRange* SplitRange(base::TimeDelta timestamp, bool is_exclusive); |
| + SourceBufferRange* SplitRange(DecodeTimestamp timestamp, bool is_exclusive); |
| // Deletes the buffers from this range starting at |timestamp|, exclusive if |
| // |is_exclusive| is true, inclusive otherwise. |
| @@ -107,7 +107,7 @@ class SourceBufferRange { |
| // starting at the buffer that had been at |next_buffer_index_|. |
| // Returns true if everything in the range was deleted. Otherwise |
| // returns false. |
| - bool TruncateAt(base::TimeDelta timestamp, |
| + bool TruncateAt(DecodeTimestamp timestamp, |
| BufferQueue* deleted_buffers, bool is_exclusive); |
| // Deletes all buffers in range. |
| void DeleteAll(BufferQueue* deleted_buffers); |
| @@ -124,8 +124,8 @@ class SourceBufferRange { |
| // [|start_timestamp|, |end_removal_timestamp|) is removed. |
| // Will not update |end_removal_timestamp| if the returned size is 0. |
| int GetRemovalGOP( |
| - base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, |
| - int bytes_to_free, base::TimeDelta* end_removal_timestamp); |
| + DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp, |
| + int bytes_to_free, DecodeTimestamp* end_removal_timestamp); |
| // Indicates whether the GOP at the beginning or end of the range contains the |
| // next buffer position. |
| @@ -154,39 +154,39 @@ class SourceBufferRange { |
| // Returns the timestamp of the next buffer that will be returned from |
| // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown. |
| - base::TimeDelta GetNextTimestamp() const; |
| + DecodeTimestamp GetNextTimestamp() const; |
| // Returns the start timestamp of the range. |
| - base::TimeDelta GetStartTimestamp() const; |
| + DecodeTimestamp GetStartTimestamp() const; |
| // Returns the timestamp of the last buffer in the range. |
| - base::TimeDelta GetEndTimestamp() const; |
| + DecodeTimestamp GetEndTimestamp() const; |
| // Returns the timestamp for the end of the buffered region in this range. |
| // This is an approximation if the duration for the last buffer in the range |
| // is unset. |
| - base::TimeDelta GetBufferedEndTimestamp() const; |
| + DecodeTimestamp GetBufferedEndTimestamp() const; |
| // Gets the timestamp for the keyframe that is after |timestamp|. If |
| // there isn't a keyframe in the range after |timestamp| then kNoTimestamp() |
| // is returned. If |timestamp| is in the "gap" between the value returned by |
| // GetStartTimestamp() and the timestamp on the first buffer in |buffers_|, |
| // then |timestamp| is returned. |
| - base::TimeDelta NextKeyframeTimestamp(base::TimeDelta timestamp); |
| + DecodeTimestamp NextKeyframeTimestamp(DecodeTimestamp timestamp); |
| // Gets the timestamp for the closest keyframe that is <= |timestamp|. If |
| // there isn't a keyframe before |timestamp| or |timestamp| is outside |
| // this range, then kNoTimestamp() is returned. |
| - base::TimeDelta KeyframeBeforeTimestamp(base::TimeDelta timestamp); |
| + DecodeTimestamp KeyframeBeforeTimestamp(DecodeTimestamp timestamp); |
| // Returns whether a buffer with a starting timestamp of |timestamp| would |
| // belong in this range. This includes a buffer that would be appended to |
| // the end of the range. |
| - bool BelongsToRange(base::TimeDelta timestamp) const; |
| + bool BelongsToRange(DecodeTimestamp timestamp) const; |
| // Returns true if the range has enough data to seek to the specified |
| // |timestamp|, false otherwise. |
| - bool CanSeekTo(base::TimeDelta timestamp) const; |
| + bool CanSeekTo(DecodeTimestamp timestamp) const; |
| // Returns true if this range's buffered timespan completely overlaps the |
| // buffered timespan of |range|. |
| @@ -198,38 +198,38 @@ class SourceBufferRange { |
| // Returns true if |timestamp| is the timestamp of the next buffer in |
| // sequence after |buffers_.back()|, false otherwise. |
| - bool IsNextInSequence(base::TimeDelta timestamp, bool is_keyframe) const; |
| + bool IsNextInSequence(DecodeTimestamp timestamp, bool is_keyframe) const; |
| // Adds all buffers which overlap [start, end) to the end of |buffers|. If |
| // no buffers exist in the range returns false, true otherwise. |
| - bool GetBuffersInRange(base::TimeDelta start, base::TimeDelta end, |
| + bool GetBuffersInRange(DecodeTimestamp start, DecodeTimestamp end, |
| BufferQueue* buffers); |
| int size_in_bytes() const { return size_in_bytes_; } |
| private: |
| - typedef std::map<base::TimeDelta, int> KeyframeMap; |
| + typedef std::map<DecodeTimestamp, int> KeyframeMap; |
| // Seeks the range to the next keyframe after |timestamp|. If |
| // |skip_given_timestamp| is true, the seek will go to a keyframe with a |
| // timestamp strictly greater than |timestamp|. |
| - void SeekAhead(base::TimeDelta timestamp, bool skip_given_timestamp); |
| + void SeekAhead(DecodeTimestamp timestamp, bool skip_given_timestamp); |
| // Returns an iterator in |buffers_| pointing to the buffer at |timestamp|. |
| // If |skip_given_timestamp| is true, this returns the first buffer with |
| // timestamp greater than |timestamp|. |
| BufferQueue::iterator GetBufferItrAt( |
| - base::TimeDelta timestamp, bool skip_given_timestamp); |
| + DecodeTimestamp timestamp, bool skip_given_timestamp); |
| // Returns an iterator in |keyframe_map_| pointing to the next keyframe after |
| // |timestamp|. If |skip_given_timestamp| is true, this returns the first |
| // keyframe with a timestamp strictly greater than |timestamp|. |
| KeyframeMap::iterator GetFirstKeyframeAt( |
| - base::TimeDelta timestamp, bool skip_given_timestamp); |
| + DecodeTimestamp timestamp, bool skip_given_timestamp); |
| // Returns an iterator in |keyframe_map_| pointing to the first keyframe |
| // before or at |timestamp|. |
| - KeyframeMap::iterator GetFirstKeyframeBefore(base::TimeDelta timestamp); |
| + KeyframeMap::iterator GetFirstKeyframeBefore(DecodeTimestamp timestamp); |
| // Helper method to delete buffers in |buffers_| starting at |
| // |starting_point|, an iterator in |buffers_|. |
| @@ -276,7 +276,7 @@ class SourceBufferRange { |
| // garbage collection or after an end overlap that results in a split range |
| // (we don't have a way of knowing the media segment timestamp for the new |
| // range). |
| - base::TimeDelta media_segment_start_time_; |
| + DecodeTimestamp media_segment_start_time_; |
| // Called to get the largest interbuffer distance seen so far in the stream. |
| InterbufferDistanceCB interbuffer_distance_cb_; |
| @@ -287,16 +287,14 @@ class SourceBufferRange { |
| DISALLOW_COPY_AND_ASSIGN(SourceBufferRange); |
| }; |
| -} // namespace media |
| - |
| // Helper method that returns true if |ranges| is sorted in increasing order, |
| // false otherwise. |
| static bool IsRangeListSorted( |
| const std::list<media::SourceBufferRange*>& ranges) { |
| - base::TimeDelta prev = media::kNoTimestamp(); |
| - for (std::list<media::SourceBufferRange*>::const_iterator itr = |
| + DecodeTimestamp prev = kNoDecodeTimestamp(); |
| + for (std::list<SourceBufferRange*>::const_iterator itr = |
| ranges.begin(); itr != ranges.end(); ++itr) { |
| - if (prev != media::kNoTimestamp() && prev >= (*itr)->GetStartTimestamp()) |
| + if (prev != kNoDecodeTimestamp() && prev >= (*itr)->GetStartTimestamp()) |
| return false; |
| prev = (*itr)->GetEndTimestamp(); |
| } |
| @@ -305,13 +303,13 @@ static bool IsRangeListSorted( |
| // Comparison operators for std::upper_bound() and std::lower_bound(). |
| static bool CompareTimeDeltaToStreamParserBuffer( |
| - const base::TimeDelta& decode_timestamp, |
| - const scoped_refptr<media::StreamParserBuffer>& buffer) { |
| + const media::DecodeTimestamp& decode_timestamp, |
|
wolenetz
2014/08/12 00:09:00
nit: s/media:://
acolwell GONE FROM CHROMIUM
2014/08/12 01:47:10
Done.
|
| + const scoped_refptr<StreamParserBuffer>& buffer) { |
| return decode_timestamp < buffer->GetDecodeTimestamp(); |
| } |
| static bool CompareStreamParserBufferToTimeDelta( |
| - const scoped_refptr<media::StreamParserBuffer>& buffer, |
| - const base::TimeDelta& decode_timestamp) { |
| + const scoped_refptr<StreamParserBuffer>& buffer, |
| + const DecodeTimestamp& decode_timestamp) { |
| return buffer->GetDecodeTimestamp() < decode_timestamp; |
| } |
| @@ -335,8 +333,6 @@ static base::TimeDelta kSeekToStartFudgeRoom() { |
| return base::TimeDelta::FromMilliseconds(1000); |
| } |
| -namespace media { |
| - |
| SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, |
| const LogCB& log_cb, |
| bool splice_frames_enabled) |
| @@ -347,12 +343,12 @@ SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, |
| end_of_stream_(false), |
| seek_buffer_timestamp_(kNoTimestamp()), |
| selected_range_(NULL), |
| - media_segment_start_time_(kNoTimestamp()), |
| + media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| new_media_segment_(false), |
| - last_appended_buffer_timestamp_(kNoTimestamp()), |
| + last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| last_appended_buffer_is_keyframe_(false), |
| - last_output_buffer_timestamp_(kNoTimestamp()), |
| + last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferAudioMemoryLimit), |
| config_change_pending_(false), |
| @@ -373,12 +369,12 @@ SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, |
| end_of_stream_(false), |
| seek_buffer_timestamp_(kNoTimestamp()), |
| selected_range_(NULL), |
| - media_segment_start_time_(kNoTimestamp()), |
| + media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| new_media_segment_(false), |
| - last_appended_buffer_timestamp_(kNoTimestamp()), |
| + last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| last_appended_buffer_is_keyframe_(false), |
| - last_output_buffer_timestamp_(kNoTimestamp()), |
| + last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferVideoMemoryLimit), |
| config_change_pending_(false), |
| @@ -400,12 +396,12 @@ SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, |
| end_of_stream_(false), |
| seek_buffer_timestamp_(kNoTimestamp()), |
| selected_range_(NULL), |
| - media_segment_start_time_(kNoTimestamp()), |
| + media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| new_media_segment_(false), |
| - last_appended_buffer_timestamp_(kNoTimestamp()), |
| + last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| last_appended_buffer_is_keyframe_(false), |
| - last_output_buffer_timestamp_(kNoTimestamp()), |
| + last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferAudioMemoryLimit), |
| config_change_pending_(false), |
| @@ -421,7 +417,7 @@ SourceBufferStream::~SourceBufferStream() { |
| } |
| void SourceBufferStream::OnNewMediaSegment( |
| - base::TimeDelta media_segment_start_time) { |
| + DecodeTimestamp media_segment_start_time) { |
| DCHECK(!end_of_stream_); |
| media_segment_start_time_ = media_segment_start_time; |
| new_media_segment_ = true; |
| @@ -434,7 +430,7 @@ void SourceBufferStream::OnNewMediaSegment( |
| if (range_for_next_append_ == ranges_.end() || |
| !AreAdjacentInSequence(last_appended_buffer_timestamp_, |
| media_segment_start_time)) { |
| - last_appended_buffer_timestamp_ = kNoTimestamp(); |
| + last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); |
| last_appended_buffer_is_keyframe_ = false; |
| } else if (last_range != ranges_.end()) { |
| DCHECK(last_range == range_for_next_append_); |
| @@ -447,7 +443,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| "buffers to append", buffers.size()); |
| DCHECK(!buffers.empty()); |
| - DCHECK(media_segment_start_time_ != kNoTimestamp()); |
| + DCHECK(media_segment_start_time_ != kNoDecodeTimestamp()); |
| DCHECK(media_segment_start_time_ <= buffers.front()->GetDecodeTimestamp()); |
| DCHECK(!end_of_stream_); |
| @@ -461,8 +457,8 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| if (!IsMonotonicallyIncreasing(buffers)) |
| return false; |
| - if (media_segment_start_time_ < base::TimeDelta() || |
| - buffers.front()->GetDecodeTimestamp() < base::TimeDelta()) { |
| + if (media_segment_start_time_ < DecodeTimestamp() || |
| + buffers.front()->GetDecodeTimestamp() < DecodeTimestamp()) { |
| MEDIA_LOG(log_cb_) |
| << "Cannot append a media segment with negative timestamps."; |
| return false; |
| @@ -480,7 +476,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| SetConfigIds(buffers); |
| // Save a snapshot of stream state before range modifications are made. |
| - base::TimeDelta next_buffer_timestamp = GetNextBufferTimestamp(); |
| + DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); |
| BufferQueue deleted_buffers; |
| PrepareRangesForNextAppend(buffers, &deleted_buffers); |
| @@ -492,7 +488,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); |
| last_appended_buffer_is_keyframe_ = buffers.back()->IsKeyframe(); |
| } else { |
| - base::TimeDelta new_range_start_time = std::min( |
| + DecodeTimestamp new_range_start_time = std::min( |
| media_segment_start_time_, buffers.front()->GetDecodeTimestamp()); |
| const BufferQueue* buffers_for_new_range = &buffers; |
| BufferQueue trimmed_buffers; |
| @@ -549,7 +545,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| } |
| if (!deleted_buffers.empty()) { |
| - base::TimeDelta start_of_deleted = |
| + DecodeTimestamp start_of_deleted = |
| deleted_buffers.front()->GetDecodeTimestamp(); |
| DCHECK(track_buffer_.empty() || |
| @@ -565,9 +561,9 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| // Prune any extra buffers in |track_buffer_| if new keyframes |
| // are appended to the range covered by |track_buffer_|. |
| if (!track_buffer_.empty()) { |
| - base::TimeDelta keyframe_timestamp = |
| + DecodeTimestamp keyframe_timestamp = |
| FindKeyframeAfterTimestamp(track_buffer_.front()->GetDecodeTimestamp()); |
| - if (keyframe_timestamp != kNoTimestamp()) |
| + if (keyframe_timestamp != kNoDecodeTimestamp()) |
| PruneTrackBuffer(keyframe_timestamp); |
| } |
| @@ -590,29 +586,32 @@ void SourceBufferStream::Remove(base::TimeDelta start, base::TimeDelta end, |
| << " end " << end.InSecondsF(); |
| DCHECK(duration != kNoTimestamp()); |
| - base::TimeDelta remove_end_timestamp = duration; |
| - base::TimeDelta keyframe_timestamp = FindKeyframeAfterTimestamp(end); |
| - if (keyframe_timestamp != kNoTimestamp()) { |
| + DecodeTimestamp start_dts = DecodeTimestamp::FromPresentationTime(start); |
| + DecodeTimestamp end_dts = DecodeTimestamp::FromPresentationTime(end); |
| + DecodeTimestamp remove_end_timestamp = |
| + DecodeTimestamp::FromPresentationTime(duration); |
| + DecodeTimestamp keyframe_timestamp = FindKeyframeAfterTimestamp(end_dts); |
| + if (keyframe_timestamp != kNoDecodeTimestamp()) { |
| remove_end_timestamp = keyframe_timestamp; |
| - } else if (end < remove_end_timestamp) { |
| - remove_end_timestamp = end; |
| + } else if (end_dts < remove_end_timestamp) { |
| + remove_end_timestamp = end_dts; |
| } |
| BufferQueue deleted_buffers; |
| - RemoveInternal(start, remove_end_timestamp, false, &deleted_buffers); |
| + RemoveInternal(start_dts, remove_end_timestamp, false, &deleted_buffers); |
| if (!deleted_buffers.empty()) |
| SetSelectedRangeIfNeeded(deleted_buffers.front()->GetDecodeTimestamp()); |
| } |
| void SourceBufferStream::RemoveInternal( |
| - base::TimeDelta start, base::TimeDelta end, bool is_exclusive, |
| + DecodeTimestamp start, DecodeTimestamp end, bool is_exclusive, |
| BufferQueue* deleted_buffers) { |
| DVLOG(1) << __FUNCTION__ << "(" << start.InSecondsF() |
| << ", " << end.InSecondsF() |
| << ", " << is_exclusive << ")"; |
| - DCHECK(start >= base::TimeDelta()); |
| + DCHECK(start >= DecodeTimestamp()); |
| DCHECK(start < end) << "start " << start.InSecondsF() |
| << " end " << end.InSecondsF(); |
| DCHECK(deleted_buffers); |
| @@ -665,8 +664,8 @@ void SourceBufferStream::RemoveInternal( |
| // to the current range. |
| if (range_for_next_append_ != ranges_.end() && |
| *range_for_next_append_ == range && |
| - last_appended_buffer_timestamp_ != kNoTimestamp()) { |
| - base::TimeDelta potential_next_append_timestamp = |
| + last_appended_buffer_timestamp_ != kNoDecodeTimestamp()) { |
| + DecodeTimestamp potential_next_append_timestamp = |
| last_appended_buffer_timestamp_ + |
| base::TimeDelta::FromInternalValue(1); |
| @@ -691,7 +690,7 @@ void SourceBufferStream::ResetSeekState() { |
| SetSelectedRange(NULL); |
| track_buffer_.clear(); |
| config_change_pending_ = false; |
| - last_output_buffer_timestamp_ = kNoTimestamp(); |
| + last_output_buffer_timestamp_ = kNoDecodeTimestamp(); |
| splice_buffers_index_ = 0; |
| pending_buffer_ = NULL; |
| pending_buffers_complete_ = false; |
| @@ -702,7 +701,7 @@ bool SourceBufferStream::ShouldSeekToStartOfBuffered( |
| if (ranges_.empty()) |
| return false; |
| base::TimeDelta beginning_of_buffered = |
| - ranges_.front()->GetStartTimestamp(); |
| + ranges_.front()->GetStartTimestamp().ToPresentationTime(); |
| return (seek_timestamp <= beginning_of_buffered && |
| beginning_of_buffered < kSeekToStartFudgeRoom()); |
| } |
| @@ -710,20 +709,20 @@ bool SourceBufferStream::ShouldSeekToStartOfBuffered( |
| bool SourceBufferStream::IsMonotonicallyIncreasing( |
| const BufferQueue& buffers) const { |
| DCHECK(!buffers.empty()); |
| - base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; |
| + DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; |
| bool prev_is_keyframe = last_appended_buffer_is_keyframe_; |
| for (BufferQueue::const_iterator itr = buffers.begin(); |
| itr != buffers.end(); ++itr) { |
| - base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); |
| + DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp(); |
| bool current_is_keyframe = (*itr)->IsKeyframe(); |
| - DCHECK(current_timestamp != kNoTimestamp()); |
| + DCHECK(current_timestamp != kNoDecodeTimestamp()); |
| DCHECK((*itr)->duration() >= base::TimeDelta()) |
| << "Packet with invalid duration." |
| << " pts " << (*itr)->timestamp().InSecondsF() |
| << " dts " << (*itr)->GetDecodeTimestamp().InSecondsF() |
| << " dur " << (*itr)->duration().InSecondsF(); |
| - if (prev_timestamp != kNoTimestamp()) { |
| + if (prev_timestamp != kNoDecodeTimestamp()) { |
| if (current_timestamp < prev_timestamp) { |
| MEDIA_LOG(log_cb_) << "Buffers were not monotonically increasing."; |
| return false; |
| @@ -746,7 +745,7 @@ bool SourceBufferStream::IsMonotonicallyIncreasing( |
| } |
| bool SourceBufferStream::IsNextTimestampValid( |
| - base::TimeDelta next_timestamp, bool next_is_keyframe) const { |
| + DecodeTimestamp next_timestamp, bool next_is_keyframe) const { |
| return (last_appended_buffer_timestamp_ != next_timestamp) || |
| new_media_segment_ || |
| AllowSameTimestamp(last_appended_buffer_is_keyframe_, next_is_keyframe, |
| @@ -766,13 +765,13 @@ bool SourceBufferStream::OnlySelectedRangeIsSeeked() const { |
| void SourceBufferStream::UpdateMaxInterbufferDistance( |
| const BufferQueue& buffers) { |
| DCHECK(!buffers.empty()); |
| - base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; |
| + DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; |
| for (BufferQueue::const_iterator itr = buffers.begin(); |
| itr != buffers.end(); ++itr) { |
| - base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); |
| - DCHECK(current_timestamp != kNoTimestamp()); |
| + DecodeTimestamp current_timestamp = (*itr)->GetDecodeTimestamp(); |
| + DCHECK(current_timestamp != kNoDecodeTimestamp()); |
| - if (prev_timestamp != kNoTimestamp()) { |
| + if (prev_timestamp != kNoDecodeTimestamp()) { |
| base::TimeDelta interbuffer_distance = current_timestamp - prev_timestamp; |
| if (max_interbuffer_distance_ == kNoTimestamp()) { |
| max_interbuffer_distance_ = interbuffer_distance; |
| @@ -817,37 +816,41 @@ void SourceBufferStream::GarbageCollectIfNeeded() { |
| } |
| int SourceBufferStream::FreeBuffersAfterLastAppended(int total_bytes_to_free) { |
| - base::TimeDelta next_buffer_timestamp = GetNextBufferTimestamp(); |
| - if (last_appended_buffer_timestamp_ == kNoTimestamp() || |
| - next_buffer_timestamp == kNoTimestamp() || |
| + DecodeTimestamp next_buffer_timestamp = GetNextBufferTimestamp(); |
| + if (last_appended_buffer_timestamp_ == kNoDecodeTimestamp() || |
| + next_buffer_timestamp == kNoDecodeTimestamp() || |
| last_appended_buffer_timestamp_ >= next_buffer_timestamp) { |
| return 0; |
| } |
| - base::TimeDelta remove_range_start = last_appended_buffer_timestamp_; |
| + DecodeTimestamp remove_range_start = last_appended_buffer_timestamp_; |
| if (last_appended_buffer_is_keyframe_) |
| remove_range_start += GetMaxInterbufferDistance(); |
| - base::TimeDelta remove_range_start_keyframe = FindKeyframeAfterTimestamp( |
| + DecodeTimestamp remove_range_start_keyframe = FindKeyframeAfterTimestamp( |
| remove_range_start); |
| - if (remove_range_start_keyframe != kNoTimestamp()) |
| + if (remove_range_start_keyframe != kNoDecodeTimestamp()) |
| remove_range_start = remove_range_start_keyframe; |
| if (remove_range_start >= next_buffer_timestamp) |
| return 0; |
| - base::TimeDelta remove_range_end; |
| + DecodeTimestamp remove_range_end; |
| int bytes_freed = GetRemovalRange( |
| remove_range_start, next_buffer_timestamp, total_bytes_to_free, |
| &remove_range_end); |
| - if (bytes_freed > 0) |
| - Remove(remove_range_start, remove_range_end, next_buffer_timestamp); |
| + if (bytes_freed > 0) { |
| + Remove(remove_range_start.ToPresentationTime(), |
| + remove_range_end.ToPresentationTime(), |
| + next_buffer_timestamp.ToPresentationTime()); |
| + } |
| + |
| return bytes_freed; |
| } |
| int SourceBufferStream::GetRemovalRange( |
| - base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, |
| - int total_bytes_to_free, base::TimeDelta* removal_end_timestamp) { |
| - DCHECK(start_timestamp >= base::TimeDelta()) << start_timestamp.InSecondsF(); |
| + DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp, |
| + int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) { |
| + DCHECK(start_timestamp >= DecodeTimestamp()) << start_timestamp.InSecondsF(); |
| DCHECK(start_timestamp < end_timestamp) |
| << "start " << start_timestamp.InSecondsF() |
| << ", end " << end_timestamp.InSecondsF(); |
| @@ -907,13 +910,13 @@ int SourceBufferStream::FreeBuffers(int total_bytes_to_free, |
| } |
| // Check to see if we've just deleted the GOP that was last appended. |
| - base::TimeDelta end_timestamp = buffers.back()->GetDecodeTimestamp(); |
| + DecodeTimestamp end_timestamp = buffers.back()->GetDecodeTimestamp(); |
| if (end_timestamp == last_appended_buffer_timestamp_) { |
| - DCHECK(last_appended_buffer_timestamp_ != kNoTimestamp()); |
| + DCHECK(last_appended_buffer_timestamp_ != kNoDecodeTimestamp()); |
| DCHECK(!new_range_for_append); |
| // Create a new range containing these buffers. |
| new_range_for_append = new SourceBufferRange( |
| - GetType(), buffers, kNoTimestamp(), |
| + GetType(), buffers, kNoDecodeTimestamp(), |
| base::Bind(&SourceBufferStream::GetMaxInterbufferDistance, |
| base::Unretained(this))); |
| range_for_next_append_ = ranges_.end(); |
| @@ -957,9 +960,9 @@ void SourceBufferStream::PrepareRangesForNextAppend( |
| bool temporarily_select_range = false; |
| if (!track_buffer_.empty()) { |
| - base::TimeDelta tb_timestamp = track_buffer_.back()->GetDecodeTimestamp(); |
| - base::TimeDelta seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp); |
| - if (seek_timestamp != kNoTimestamp() && |
| + DecodeTimestamp tb_timestamp = track_buffer_.back()->GetDecodeTimestamp(); |
| + DecodeTimestamp seek_timestamp = FindKeyframeAfterTimestamp(tb_timestamp); |
| + if (seek_timestamp != kNoDecodeTimestamp() && |
| seek_timestamp < new_buffers.front()->GetDecodeTimestamp() && |
| range_for_next_append_ != ranges_.end() && |
| (*range_for_next_append_)->BelongsToRange(seek_timestamp)) { |
| @@ -984,12 +987,13 @@ void SourceBufferStream::PrepareRangesForNextAppend( |
| if (splice_frames_enabled_) |
| GenerateSpliceFrame(new_buffers); |
| - base::TimeDelta prev_timestamp = last_appended_buffer_timestamp_; |
| + DecodeTimestamp prev_timestamp = last_appended_buffer_timestamp_; |
| bool prev_is_keyframe = last_appended_buffer_is_keyframe_; |
| - base::TimeDelta next_timestamp = new_buffers.front()->GetDecodeTimestamp(); |
| + DecodeTimestamp next_timestamp = new_buffers.front()->GetDecodeTimestamp(); |
| bool next_is_keyframe = new_buffers.front()->IsKeyframe(); |
| - if (prev_timestamp != kNoTimestamp() && prev_timestamp != next_timestamp) { |
| + if (prev_timestamp != kNoDecodeTimestamp() && |
| + prev_timestamp != next_timestamp) { |
| // Clean up the old buffers between the last appended buffer and the |
| // beginning of |new_buffers|. |
| RemoveInternal(prev_timestamp, next_timestamp, true, deleted_buffers); |
| @@ -1010,8 +1014,8 @@ void SourceBufferStream::PrepareRangesForNextAppend( |
| AllowSameTimestamp(prev_is_keyframe, next_is_keyframe, GetType()); |
| // Delete the buffers that |new_buffers| overlaps. |
| - base::TimeDelta start = new_buffers.front()->GetDecodeTimestamp(); |
| - base::TimeDelta end = new_buffers.back()->GetDecodeTimestamp(); |
| + DecodeTimestamp start = new_buffers.front()->GetDecodeTimestamp(); |
| + DecodeTimestamp end = new_buffers.back()->GetDecodeTimestamp(); |
| base::TimeDelta duration = new_buffers.back()->duration(); |
| if (duration != kNoTimestamp() && duration > base::TimeDelta()) { |
| @@ -1031,15 +1035,15 @@ void SourceBufferStream::PrepareRangesForNextAppend( |
| } |
| bool SourceBufferStream::AreAdjacentInSequence( |
| - base::TimeDelta first_timestamp, base::TimeDelta second_timestamp) const { |
| + DecodeTimestamp first_timestamp, DecodeTimestamp second_timestamp) const { |
| return first_timestamp < second_timestamp && |
| second_timestamp <= |
| first_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); |
| } |
| -void SourceBufferStream::PruneTrackBuffer(const base::TimeDelta timestamp) { |
| +void SourceBufferStream::PruneTrackBuffer(const DecodeTimestamp timestamp) { |
| // If we don't have the next timestamp, we don't have anything to delete. |
| - if (timestamp == kNoTimestamp()) |
| + if (timestamp == kNoDecodeTimestamp()) |
| return; |
| while (!track_buffer_.empty() && |
| @@ -1089,16 +1093,18 @@ void SourceBufferStream::Seek(base::TimeDelta timestamp) { |
| seek_buffer_timestamp_ = timestamp; |
| seek_pending_ = true; |
| + DecodeTimestamp seek_dts = DecodeTimestamp::FromPresentationTime(timestamp); |
| + |
| RangeList::iterator itr = ranges_.end(); |
| for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
| - if ((*itr)->CanSeekTo(timestamp)) |
| + if ((*itr)->CanSeekTo(seek_dts)) |
| break; |
| } |
| if (itr == ranges_.end()) |
| return; |
| - SeekAndSetSelectedRange(*itr, timestamp); |
| + SeekAndSetSelectedRange(*itr, seek_dts); |
| seek_pending_ = false; |
| } |
| @@ -1107,17 +1113,20 @@ bool SourceBufferStream::IsSeekPending() const { |
| } |
| void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { |
| + DecodeTimestamp duration_dts = |
| + DecodeTimestamp::FromPresentationTime(duration); |
| + |
| RangeList::iterator itr = ranges_.end(); |
| for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
| - if ((*itr)->GetEndTimestamp() > duration) |
| + if ((*itr)->GetEndTimestamp() > duration_dts) |
| break; |
| } |
| if (itr == ranges_.end()) |
| return; |
| // Need to partially truncate this range. |
| - if ((*itr)->GetStartTimestamp() < duration) { |
| - bool delete_range = (*itr)->TruncateAt(duration, NULL, false); |
| + if ((*itr)->GetStartTimestamp() < duration_dts) { |
| + bool delete_range = (*itr)->TruncateAt(duration_dts, NULL, false); |
| if ((*itr == selected_range_) && !selected_range_->HasNextBufferPosition()) |
| SetSelectedRange(NULL); |
| @@ -1131,7 +1140,7 @@ void SourceBufferStream::OnSetDuration(base::TimeDelta duration) { |
| // Delete all ranges that begin after |duration|. |
|
wolenetz
2014/08/12 00:09:00
nit: s/duration/duration_dts/ for now at least.
acolwell GONE FROM CHROMIUM
2014/08/12 01:47:10
Done.
|
| while (itr != ranges_.end()) { |
| // If we're about to delete the selected range, also reset the seek state. |
| - DCHECK((*itr)->GetStartTimestamp() >= duration); |
| + DCHECK((*itr)->GetStartTimestamp() >= duration_dts); |
| if (*itr == selected_range_) |
| ResetSeekState(); |
| DeleteAndRemoveRange(&itr); |
| @@ -1267,25 +1276,19 @@ SourceBufferStream::Status SourceBufferStream::GetNextBufferInternal( |
| return kSuccess; |
| } |
| -base::TimeDelta SourceBufferStream::GetNextBufferTimestamp() { |
| +DecodeTimestamp SourceBufferStream::GetNextBufferTimestamp() { |
| if (!track_buffer_.empty()) |
| return track_buffer_.front()->GetDecodeTimestamp(); |
| if (!selected_range_) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| DCHECK(selected_range_->HasNextBufferPosition()); |
| return selected_range_->GetNextTimestamp(); |
| } |
| -base::TimeDelta SourceBufferStream::GetEndBufferTimestamp() { |
| - if (!selected_range_) |
| - return kNoTimestamp(); |
| - return selected_range_->GetEndTimestamp(); |
| -} |
| - |
| SourceBufferStream::RangeList::iterator |
| -SourceBufferStream::FindExistingRangeFor(base::TimeDelta start_timestamp) { |
| +SourceBufferStream::FindExistingRangeFor(DecodeTimestamp start_timestamp) { |
| for (RangeList::iterator itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
| if ((*itr)->BelongsToRange(start_timestamp)) |
| return itr; |
| @@ -1295,7 +1298,7 @@ SourceBufferStream::FindExistingRangeFor(base::TimeDelta start_timestamp) { |
| SourceBufferStream::RangeList::iterator |
| SourceBufferStream::AddToRanges(SourceBufferRange* new_range) { |
| - base::TimeDelta start_timestamp = new_range->GetStartTimestamp(); |
| + DecodeTimestamp start_timestamp = new_range->GetStartTimestamp(); |
| RangeList::iterator itr = ranges_.end(); |
| for (itr = ranges_.begin(); itr != ranges_.end(); ++itr) { |
| if ((*itr)->GetStartTimestamp() > start_timestamp) |
| @@ -1317,7 +1320,7 @@ SourceBufferStream::GetSelectedRangeItr() { |
| } |
| void SourceBufferStream::SeekAndSetSelectedRange( |
| - SourceBufferRange* range, base::TimeDelta seek_timestamp) { |
| + SourceBufferRange* range, DecodeTimestamp seek_timestamp) { |
| if (range) |
| range->Seek(seek_timestamp); |
| SetSelectedRange(range); |
| @@ -1335,7 +1338,8 @@ Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const { |
| Ranges<base::TimeDelta> ranges; |
| for (RangeList::const_iterator itr = ranges_.begin(); |
| itr != ranges_.end(); ++itr) { |
| - ranges.Add((*itr)->GetStartTimestamp(), (*itr)->GetBufferedEndTimestamp()); |
| + ranges.Add((*itr)->GetStartTimestamp().ToPresentationTime(), |
| + (*itr)->GetBufferedEndTimestamp().ToPresentationTime()); |
| } |
| return ranges; |
| } |
| @@ -1344,7 +1348,7 @@ base::TimeDelta SourceBufferStream::GetBufferedDuration() const { |
| if (ranges_.empty()) |
| return base::TimeDelta(); |
| - return ranges_.back()->GetBufferedEndTimestamp(); |
| + return ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); |
| } |
| void SourceBufferStream::MarkEndOfStream() { |
| @@ -1361,8 +1365,11 @@ bool SourceBufferStream::IsEndSelected() const { |
| if (ranges_.empty()) |
| return true; |
| - if (seek_pending_) |
| - return seek_buffer_timestamp_ >= ranges_.back()->GetBufferedEndTimestamp(); |
| + if (seek_pending_) { |
| + base::TimeDelta last_range_end_time = |
| + ranges_.back()->GetBufferedEndTimestamp().ToPresentationTime(); |
| + return seek_buffer_timestamp_ >= last_range_end_time; |
| + } |
| return selected_range_ == ranges_.back(); |
| } |
| @@ -1470,7 +1477,7 @@ void SourceBufferStream::CompleteConfigChange() { |
| } |
| void SourceBufferStream::SetSelectedRangeIfNeeded( |
| - const base::TimeDelta timestamp) { |
| + const DecodeTimestamp timestamp) { |
| DVLOG(1) << __FUNCTION__ << "(" << timestamp.InSecondsF() << ")"; |
| if (selected_range_) { |
| @@ -1483,23 +1490,23 @@ void SourceBufferStream::SetSelectedRangeIfNeeded( |
| return; |
| } |
| - base::TimeDelta start_timestamp = timestamp; |
| + DecodeTimestamp start_timestamp = timestamp; |
| // If the next buffer timestamp is not known then use a timestamp just after |
| // the timestamp on the last buffer returned by GetNextBuffer(). |
| - if (start_timestamp == kNoTimestamp()) { |
| - if (last_output_buffer_timestamp_ == kNoTimestamp()) |
| + if (start_timestamp == kNoDecodeTimestamp()) { |
| + if (last_output_buffer_timestamp_ == kNoDecodeTimestamp()) |
| return; |
| start_timestamp = last_output_buffer_timestamp_ + |
| base::TimeDelta::FromInternalValue(1); |
| } |
| - base::TimeDelta seek_timestamp = |
| + DecodeTimestamp seek_timestamp = |
| FindNewSelectedRangeSeekTimestamp(start_timestamp); |
| // If we don't have buffered data to seek to, then return. |
| - if (seek_timestamp == kNoTimestamp()) |
| + if (seek_timestamp == kNoDecodeTimestamp()) |
| return; |
| DCHECK(track_buffer_.empty()); |
| @@ -1507,10 +1514,10 @@ void SourceBufferStream::SetSelectedRangeIfNeeded( |
| seek_timestamp); |
| } |
| -base::TimeDelta SourceBufferStream::FindNewSelectedRangeSeekTimestamp( |
| - const base::TimeDelta start_timestamp) { |
| - DCHECK(start_timestamp != kNoTimestamp()); |
| - DCHECK(start_timestamp >= base::TimeDelta()); |
| +DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp( |
| + const DecodeTimestamp start_timestamp) { |
| + DCHECK(start_timestamp != kNoDecodeTimestamp()); |
| + DCHECK(start_timestamp >= DecodeTimestamp()); |
| RangeList::iterator itr = ranges_.begin(); |
| @@ -1521,31 +1528,31 @@ base::TimeDelta SourceBufferStream::FindNewSelectedRangeSeekTimestamp( |
| } |
| if (itr == ranges_.end()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| // First check for a keyframe timestamp >= |start_timestamp| |
| // in the current range. |
| - base::TimeDelta keyframe_timestamp = |
| + DecodeTimestamp keyframe_timestamp = |
| (*itr)->NextKeyframeTimestamp(start_timestamp); |
| - if (keyframe_timestamp != kNoTimestamp()) |
| + if (keyframe_timestamp != kNoDecodeTimestamp()) |
| return keyframe_timestamp; |
| // If a keyframe was not found then look for a keyframe that is |
| // "close enough" in the current or next range. |
| - base::TimeDelta end_timestamp = |
| + DecodeTimestamp end_timestamp = |
| start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance()); |
| DCHECK(start_timestamp < end_timestamp); |
| // Make sure the current range doesn't start beyond |end_timestamp|. |
| if ((*itr)->GetStartTimestamp() >= end_timestamp) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); |
| // Check to see if the keyframe is within the acceptable range |
| // (|start_timestamp|, |end_timestamp|]. |
| - if (keyframe_timestamp != kNoTimestamp() && |
| + if (keyframe_timestamp != kNoDecodeTimestamp() && |
| start_timestamp < keyframe_timestamp && |
| keyframe_timestamp <= end_timestamp) { |
| return keyframe_timestamp; |
| @@ -1554,36 +1561,36 @@ base::TimeDelta SourceBufferStream::FindNewSelectedRangeSeekTimestamp( |
| // If |end_timestamp| is within this range, then no other checks are |
| // necessary. |
| if (end_timestamp <= (*itr)->GetEndTimestamp()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| // Move on to the next range. |
| ++itr; |
| // Return early if the next range does not contain |end_timestamp|. |
| if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp); |
| // Check to see if the keyframe is within the acceptable range |
| // (|start_timestamp|, |end_timestamp|]. |
| - if (keyframe_timestamp != kNoTimestamp() && |
| + if (keyframe_timestamp != kNoDecodeTimestamp() && |
| start_timestamp < keyframe_timestamp && |
| keyframe_timestamp <= end_timestamp) { |
| return keyframe_timestamp; |
| } |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| } |
| -base::TimeDelta SourceBufferStream::FindKeyframeAfterTimestamp( |
| - const base::TimeDelta timestamp) { |
| - DCHECK(timestamp != kNoTimestamp()); |
| +DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp( |
| + const DecodeTimestamp timestamp) { |
| + DCHECK(timestamp != kNoDecodeTimestamp()); |
| RangeList::iterator itr = FindExistingRangeFor(timestamp); |
| if (itr == ranges_.end()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| // First check for a keyframe timestamp >= |timestamp| |
| // in the current range. |
| @@ -1624,7 +1631,7 @@ void SourceBufferStream::DeleteAndRemoveRange(RangeList::iterator* itr) { |
| if (*itr == range_for_next_append_) { |
| DVLOG(1) << __FUNCTION__ << " deleting range_for_next_append_."; |
| range_for_next_append_ = ranges_.end(); |
| - last_appended_buffer_timestamp_ = kNoTimestamp(); |
| + last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); |
| last_appended_buffer_is_keyframe_ = false; |
| } |
| @@ -1641,18 +1648,20 @@ void SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) { |
| // Find the overlapped range (if any). |
| const base::TimeDelta splice_timestamp = new_buffers.front()->timestamp(); |
| - RangeList::iterator range_itr = FindExistingRangeFor(splice_timestamp); |
| + const DecodeTimestamp splice_dts = |
| + DecodeTimestamp::FromPresentationTime(splice_timestamp); |
| + RangeList::iterator range_itr = FindExistingRangeFor(splice_dts); |
| if (range_itr == ranges_.end()) |
| return; |
| - const base::TimeDelta max_splice_end_timestamp = |
| - splice_timestamp + base::TimeDelta::FromMilliseconds( |
| - AudioSplicer::kCrossfadeDurationInMilliseconds); |
| + const DecodeTimestamp max_splice_end_dts = |
| + splice_dts + base::TimeDelta::FromMilliseconds( |
| + AudioSplicer::kCrossfadeDurationInMilliseconds); |
| // Find all buffers involved before the splice point. |
| BufferQueue pre_splice_buffers; |
| if (!(*range_itr)->GetBuffersInRange( |
| - splice_timestamp, max_splice_end_timestamp, &pre_splice_buffers)) { |
| + splice_dts, max_splice_end_dts, &pre_splice_buffers)) { |
| return; |
| } |
| @@ -1702,7 +1711,7 @@ void SourceBufferStream::GenerateSpliceFrame(const BufferQueue& new_buffers) { |
| SourceBufferRange::SourceBufferRange( |
| SourceBufferStream::Type type, const BufferQueue& new_buffers, |
| - base::TimeDelta media_segment_start_time, |
| + DecodeTimestamp media_segment_start_time, |
| const InterbufferDistanceCB& interbuffer_distance_cb) |
| : type_(type), |
| keyframe_map_index_base_(0), |
| @@ -1718,13 +1727,13 @@ SourceBufferRange::SourceBufferRange( |
| void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { |
| DCHECK(buffers_.empty() || CanAppendBuffersToEnd(new_buffers)); |
| - DCHECK(media_segment_start_time_ == kNoTimestamp() || |
| + DCHECK(media_segment_start_time_ == kNoDecodeTimestamp() || |
| media_segment_start_time_ <= |
| new_buffers.front()->GetDecodeTimestamp()); |
| for (BufferQueue::const_iterator itr = new_buffers.begin(); |
| itr != new_buffers.end(); |
| ++itr) { |
| - DCHECK((*itr)->GetDecodeTimestamp() != kNoTimestamp()); |
| + DCHECK((*itr)->GetDecodeTimestamp() != kNoDecodeTimestamp()); |
| buffers_.push_back(*itr); |
| size_in_bytes_ += (*itr)->data_size(); |
| @@ -1736,7 +1745,7 @@ void SourceBufferRange::AppendBuffersToEnd(const BufferQueue& new_buffers) { |
| } |
| } |
| -void SourceBufferRange::Seek(base::TimeDelta timestamp) { |
| +void SourceBufferRange::Seek(DecodeTimestamp timestamp) { |
| DCHECK(CanSeekTo(timestamp)); |
| DCHECK(!keyframe_map_.empty()); |
| @@ -1745,15 +1754,15 @@ void SourceBufferRange::Seek(base::TimeDelta timestamp) { |
| DCHECK_LT(next_buffer_index_, static_cast<int>(buffers_.size())); |
| } |
| -void SourceBufferRange::SeekAheadTo(base::TimeDelta timestamp) { |
| +void SourceBufferRange::SeekAheadTo(DecodeTimestamp timestamp) { |
| SeekAhead(timestamp, false); |
| } |
| -void SourceBufferRange::SeekAheadPast(base::TimeDelta timestamp) { |
| +void SourceBufferRange::SeekAheadPast(DecodeTimestamp timestamp) { |
| SeekAhead(timestamp, true); |
| } |
| -void SourceBufferRange::SeekAhead(base::TimeDelta timestamp, |
| +void SourceBufferRange::SeekAhead(DecodeTimestamp timestamp, |
| bool skip_given_timestamp) { |
| DCHECK(!keyframe_map_.empty()); |
| @@ -1776,7 +1785,7 @@ void SourceBufferRange::SeekToStart() { |
| } |
| SourceBufferRange* SourceBufferRange::SplitRange( |
| - base::TimeDelta timestamp, bool is_exclusive) { |
| + DecodeTimestamp timestamp, bool is_exclusive) { |
| CHECK(!buffers_.empty()); |
| // Find the first keyframe after |timestamp|. If |is_exclusive|, do not |
| @@ -1796,7 +1805,7 @@ SourceBufferRange* SourceBufferRange::SplitRange( |
| BufferQueue::iterator starting_point = buffers_.begin() + keyframe_index; |
| BufferQueue removed_buffers(starting_point, buffers_.end()); |
| - base::TimeDelta new_range_start_timestamp = kNoTimestamp(); |
| + DecodeTimestamp new_range_start_timestamp = kNoDecodeTimestamp(); |
| if (GetStartTimestamp() < buffers_.front()->GetDecodeTimestamp() && |
| timestamp < removed_buffers.front()->GetDecodeTimestamp()) { |
| // The split is in the gap between |media_segment_start_time_| and |
| @@ -1826,7 +1835,7 @@ SourceBufferRange* SourceBufferRange::SplitRange( |
| } |
| BufferQueue::iterator SourceBufferRange::GetBufferItrAt( |
| - base::TimeDelta timestamp, |
| + DecodeTimestamp timestamp, |
| bool skip_given_timestamp) { |
| return skip_given_timestamp |
| ? std::upper_bound(buffers_.begin(), |
| @@ -1840,7 +1849,7 @@ BufferQueue::iterator SourceBufferRange::GetBufferItrAt( |
| } |
| SourceBufferRange::KeyframeMap::iterator |
| -SourceBufferRange::GetFirstKeyframeAt(base::TimeDelta timestamp, |
| +SourceBufferRange::GetFirstKeyframeAt(DecodeTimestamp timestamp, |
| bool skip_given_timestamp) { |
| return skip_given_timestamp ? |
| keyframe_map_.upper_bound(timestamp) : |
| @@ -1848,7 +1857,7 @@ SourceBufferRange::GetFirstKeyframeAt(base::TimeDelta timestamp, |
| } |
| SourceBufferRange::KeyframeMap::iterator |
| -SourceBufferRange::GetFirstKeyframeBefore(base::TimeDelta timestamp) { |
| +SourceBufferRange::GetFirstKeyframeBefore(DecodeTimestamp timestamp) { |
| KeyframeMap::iterator result = keyframe_map_.lower_bound(timestamp); |
| // lower_bound() returns the first element >= |timestamp|, so we want the |
| // previous element if it did not return the element exactly equal to |
| @@ -1865,7 +1874,7 @@ void SourceBufferRange::DeleteAll(BufferQueue* removed_buffers) { |
| } |
| bool SourceBufferRange::TruncateAt( |
| - base::TimeDelta timestamp, BufferQueue* removed_buffers, |
| + DecodeTimestamp timestamp, BufferQueue* removed_buffers, |
| bool is_exclusive) { |
| // Find the place in |buffers_| where we will begin deleting data. |
| BufferQueue::iterator starting_point = |
| @@ -1914,7 +1923,7 @@ int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| // Invalidate media segment start time if we've deleted the first buffer of |
| // the range. |
| if (buffers_deleted > 0) |
| - media_segment_start_time_ = kNoTimestamp(); |
| + media_segment_start_time_ = kNoDecodeTimestamp(); |
| return total_bytes_deleted; |
| } |
| @@ -1949,8 +1958,8 @@ int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| } |
| int SourceBufferRange::GetRemovalGOP( |
| - base::TimeDelta start_timestamp, base::TimeDelta end_timestamp, |
| - int total_bytes_to_free, base::TimeDelta* removal_end_timestamp) { |
| + DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp, |
| + int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) { |
| int bytes_to_free = total_bytes_to_free; |
| int bytes_removed = 0; |
| @@ -2037,8 +2046,8 @@ bool SourceBufferRange::TruncateAt( |
| // Reset the next buffer index if we will be deleting the buffer that's next |
| // in sequence. |
| if (HasNextBufferPosition()) { |
| - base::TimeDelta next_buffer_timestamp = GetNextTimestamp(); |
| - if (next_buffer_timestamp == kNoTimestamp() || |
| + DecodeTimestamp next_buffer_timestamp = GetNextTimestamp(); |
| + if (next_buffer_timestamp == kNoDecodeTimestamp() || |
| next_buffer_timestamp >= (*starting_point)->GetDecodeTimestamp()) { |
| if (HasNextBuffer() && removed_buffers) { |
| int starting_offset = starting_point - buffers_.begin(); |
| @@ -2083,12 +2092,12 @@ int SourceBufferRange::GetNextConfigId() const { |
| return GetConfigId(buffers_[next_buffer_index_], 0); |
| } |
| -base::TimeDelta SourceBufferRange::GetNextTimestamp() const { |
| +DecodeTimestamp SourceBufferRange::GetNextTimestamp() const { |
| DCHECK(!buffers_.empty()); |
| DCHECK(HasNextBufferPosition()); |
| if (next_buffer_index_ >= static_cast<int>(buffers_.size())) { |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| } |
| return buffers_[next_buffer_index_]->GetDecodeTimestamp(); |
| @@ -2125,16 +2134,16 @@ bool SourceBufferRange::CanAppendBuffersToEnd( |
| buffers.front()->IsKeyframe()); |
| } |
| -bool SourceBufferRange::BelongsToRange(base::TimeDelta timestamp) const { |
| +bool SourceBufferRange::BelongsToRange(DecodeTimestamp timestamp) const { |
| DCHECK(!buffers_.empty()); |
| return (IsNextInSequence(timestamp, false) || |
| (GetStartTimestamp() <= timestamp && timestamp <= GetEndTimestamp())); |
| } |
| -bool SourceBufferRange::CanSeekTo(base::TimeDelta timestamp) const { |
| - base::TimeDelta start_timestamp = |
| - std::max(base::TimeDelta(), GetStartTimestamp() - GetFudgeRoom()); |
| +bool SourceBufferRange::CanSeekTo(DecodeTimestamp timestamp) const { |
| + DecodeTimestamp start_timestamp = |
| + std::max(DecodeTimestamp(), GetStartTimestamp() - GetFudgeRoom()); |
| return !keyframe_map_.empty() && start_timestamp <= timestamp && |
| timestamp < GetBufferedEndTimestamp(); |
| } |
| @@ -2150,20 +2159,20 @@ bool SourceBufferRange::EndOverlaps(const SourceBufferRange& range) const { |
| GetEndTimestamp() < range.GetEndTimestamp(); |
| } |
| -base::TimeDelta SourceBufferRange::GetStartTimestamp() const { |
| +DecodeTimestamp SourceBufferRange::GetStartTimestamp() const { |
| DCHECK(!buffers_.empty()); |
| - base::TimeDelta start_timestamp = media_segment_start_time_; |
| - if (start_timestamp == kNoTimestamp()) |
| + DecodeTimestamp start_timestamp = media_segment_start_time_; |
| + if (start_timestamp == kNoDecodeTimestamp()) |
| start_timestamp = buffers_.front()->GetDecodeTimestamp(); |
| return start_timestamp; |
| } |
| -base::TimeDelta SourceBufferRange::GetEndTimestamp() const { |
| +DecodeTimestamp SourceBufferRange::GetEndTimestamp() const { |
| DCHECK(!buffers_.empty()); |
| return buffers_.back()->GetDecodeTimestamp(); |
| } |
| -base::TimeDelta SourceBufferRange::GetBufferedEndTimestamp() const { |
| +DecodeTimestamp SourceBufferRange::GetBufferedEndTimestamp() const { |
| DCHECK(!buffers_.empty()); |
| base::TimeDelta duration = buffers_.back()->duration(); |
| if (duration == kNoTimestamp() || duration == base::TimeDelta()) |
| @@ -2171,16 +2180,16 @@ base::TimeDelta SourceBufferRange::GetBufferedEndTimestamp() const { |
| return GetEndTimestamp() + duration; |
| } |
| -base::TimeDelta SourceBufferRange::NextKeyframeTimestamp( |
| - base::TimeDelta timestamp) { |
| +DecodeTimestamp SourceBufferRange::NextKeyframeTimestamp( |
| + DecodeTimestamp timestamp) { |
| DCHECK(!keyframe_map_.empty()); |
| if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| KeyframeMap::iterator itr = GetFirstKeyframeAt(timestamp, false); |
| if (itr == keyframe_map_.end()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| // If the timestamp is inside the gap between the start of the media |
| // segment and the first buffer, then just pretend there is a |
| @@ -2194,19 +2203,19 @@ base::TimeDelta SourceBufferRange::NextKeyframeTimestamp( |
| return itr->first; |
| } |
| -base::TimeDelta SourceBufferRange::KeyframeBeforeTimestamp( |
| - base::TimeDelta timestamp) { |
| +DecodeTimestamp SourceBufferRange::KeyframeBeforeTimestamp( |
| + DecodeTimestamp timestamp) { |
| DCHECK(!keyframe_map_.empty()); |
| if (timestamp < GetStartTimestamp() || timestamp >= GetBufferedEndTimestamp()) |
| - return kNoTimestamp(); |
| + return kNoDecodeTimestamp(); |
| return GetFirstKeyframeBefore(timestamp)->first; |
| } |
| bool SourceBufferRange::IsNextInSequence( |
| - base::TimeDelta timestamp, bool is_keyframe) const { |
| - base::TimeDelta end = buffers_.back()->GetDecodeTimestamp(); |
| + DecodeTimestamp timestamp, bool is_keyframe) const { |
| + DecodeTimestamp end = buffers_.back()->GetDecodeTimestamp(); |
| if (end < timestamp && |
| (type_ == SourceBufferStream::kText || |
| timestamp <= end + GetFudgeRoom())) { |
| @@ -2227,12 +2236,12 @@ base::TimeDelta SourceBufferRange::GetApproximateDuration() const { |
| return max_interbuffer_distance; |
| } |
| -bool SourceBufferRange::GetBuffersInRange(base::TimeDelta start, |
| - base::TimeDelta end, |
| +bool SourceBufferRange::GetBuffersInRange(DecodeTimestamp start, |
| + DecodeTimestamp end, |
| BufferQueue* buffers) { |
| // Find the nearest buffer with a decode timestamp <= start. |
| - const base::TimeDelta first_timestamp = KeyframeBeforeTimestamp(start); |
| - if (first_timestamp == kNoTimestamp()) |
| + const DecodeTimestamp first_timestamp = KeyframeBeforeTimestamp(start); |
| + if (first_timestamp == kNoDecodeTimestamp()) |
| return false; |
| // Find all buffers involved in the range. |
| @@ -2246,9 +2255,12 @@ bool SourceBufferRange::GetBuffersInRange(base::TimeDelta start, |
| buffer->duration() <= base::TimeDelta()) { |
| return false; |
| } |
| - if (buffer->end_of_stream() || buffer->timestamp() >= end) |
| + if (buffer->end_of_stream() || |
| + buffer->timestamp() >= end.ToPresentationTime()) { |
| break; |
| - if (buffer->timestamp() + buffer->duration() <= start) |
| + } |
| + |
| + if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime()) |
| continue; |
| buffers->push_back(buffer); |
| } |