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 4c74c2ac73011195ff49609231828857ab62ca05..9c8f5cca3d14406c4d7c0712ff57aca7ba06f501 100644 |
| --- a/media/filters/source_buffer_stream.cc |
| +++ b/media/filters/source_buffer_stream.cc |
| @@ -140,6 +140,7 @@ SourceBufferStream::SourceBufferStream(const AudioDecoderConfig& audio_config, |
| media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| + last_appended_buffer_duration_(kNoTimestamp()), |
|
wolenetz
2015/12/01 01:12:43
nit: some of these common initializers can now hap
servolk
2015/12/01 18:51:49
Done.
|
| last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferAudioMemoryLimit), |
| @@ -156,6 +157,7 @@ SourceBufferStream::SourceBufferStream(const VideoDecoderConfig& video_config, |
| media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| + last_appended_buffer_duration_(kNoTimestamp()), |
| last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferVideoMemoryLimit), |
| @@ -173,6 +175,7 @@ SourceBufferStream::SourceBufferStream(const TextTrackConfig& text_config, |
| media_segment_start_time_(kNoDecodeTimestamp()), |
| range_for_next_append_(ranges_.end()), |
| last_appended_buffer_timestamp_(kNoDecodeTimestamp()), |
| + last_appended_buffer_duration_(kNoTimestamp()), |
| last_output_buffer_timestamp_(kNoDecodeTimestamp()), |
| max_interbuffer_distance_(kNoTimestamp()), |
| memory_limit_(kSourceBufferAudioMemoryLimit), |
| @@ -202,6 +205,7 @@ void SourceBufferStream::OnNewMediaSegment( |
| !AreAdjacentInSequence(last_appended_buffer_timestamp_, |
| media_segment_start_time)) { |
| last_appended_buffer_timestamp_ = kNoDecodeTimestamp(); |
| + last_appended_buffer_duration_ = kNoTimestamp(); |
| last_appended_buffer_is_keyframe_ = false; |
| DVLOG(3) << __FUNCTION__ << " next appended buffers will be in a new range"; |
| } else if (last_range != ranges_.end()) { |
| @@ -269,6 +273,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| if (range_for_next_append_ != ranges_.end()) { |
| (*range_for_next_append_)->AppendBuffersToEnd(buffers); |
| last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); |
| + last_appended_buffer_duration_ = buffers.back()->duration(); |
| last_appended_buffer_is_keyframe_ = buffers.back()->is_key_frame(); |
| } else { |
| DecodeTimestamp new_range_start_time = std::min( |
| @@ -292,6 +297,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| // buffer state and return. |
| if (itr == buffers.end()) { |
| last_appended_buffer_timestamp_ = buffers.back()->GetDecodeTimestamp(); |
| + last_appended_buffer_duration_ = buffers.back()->duration(); |
| last_appended_buffer_is_keyframe_ = buffers.back()->is_key_frame(); |
| DVLOG(1) << __FUNCTION__ << " " << GetStreamTypeName() |
| << ": new buffers in the middle of media segment depend on" |
| @@ -319,6 +325,7 @@ bool SourceBufferStream::Append(const BufferQueue& buffers) { |
| base::Unretained(this)))); |
| last_appended_buffer_timestamp_ = |
| buffers_for_new_range->back()->GetDecodeTimestamp(); |
| + last_appended_buffer_duration_ = buffers_for_new_range->back()->duration(); |
| last_appended_buffer_is_keyframe_ = |
| buffers_for_new_range->back()->is_key_frame(); |
| } |
| @@ -656,7 +663,9 @@ bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time, |
| // If last appended buffer position was earlier than the current playback time |
| // then try deleting data between last append and current media_time. |
| if (last_appended_buffer_timestamp_ != kNoDecodeTimestamp() && |
| - last_appended_buffer_timestamp_ < media_time) { |
| + last_appended_buffer_duration_ != kNoTimestamp() && |
| + media_time > |
| + last_appended_buffer_timestamp_ + last_appended_buffer_duration_) { |
| size_t between = FreeBuffersAfterLastAppended(bytes_to_free, media_time); |
| DVLOG(3) << __FUNCTION__ << " FreeBuffersAfterLastAppended " |
| << " released " << between << " bytes" |
| @@ -674,6 +683,8 @@ bool SourceBufferStream::GarbageCollectIfNeeded(DecodeTimestamp media_time, |
| if (range_for_next_append_ != ranges_.end()) { |
| DCHECK((*range_for_next_append_)->GetStartTimestamp() <= media_time); |
| media_time = (*range_for_next_append_)->GetStartTimestamp(); |
| + DVLOG(3) << __FUNCTION__ << " media_time adjusted to " |
| + << media_time.InSecondsF(); |
| } |
| } |