Chromium Code Reviews| Index: media/filters/source_buffer_range.cc |
| diff --git a/media/filters/source_buffer_range.cc b/media/filters/source_buffer_range.cc |
| index 4fad27dbceff01824060ffe30e2fb0b4f0ec14aa..b81e9c1240e1485995dac85835e5b691bbea57f9 100644 |
| --- a/media/filters/source_buffer_range.cc |
| +++ b/media/filters/source_buffer_range.cc |
| @@ -225,12 +225,12 @@ bool SourceBufferRange::TruncateAt( |
| return TruncateAt(starting_point, removed_buffers); |
| } |
| -int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| +size_t SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| DCHECK(!FirstGOPContainsNextBufferPosition()); |
| DCHECK(deleted_buffers); |
| int buffers_deleted = 0; |
| - int total_bytes_deleted = 0; |
| + size_t total_bytes_deleted = 0; |
| KeyframeMap::iterator front = keyframe_map_.begin(); |
| DCHECK(front != keyframe_map_.end()); |
| @@ -247,7 +247,9 @@ int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| // Delete buffers from the beginning of the buffered range up until (but not |
| // including) the next keyframe. |
| for (int i = 0; i < end_index; i++) { |
| - int bytes_deleted = buffers_.front()->data_size(); |
| + DCHECK_GE(buffers_.front()->data_size(), 0); |
| + size_t bytes_deleted = buffers_.front()->data_size(); |
| + DCHECK_GE(size_in_bytes_, bytes_deleted); |
| size_in_bytes_ -= bytes_deleted; |
| total_bytes_deleted += bytes_deleted; |
| deleted_buffers->push_back(buffers_.front()); |
| @@ -271,7 +273,7 @@ int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| return total_bytes_deleted; |
| } |
| -int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| +size_t SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| DCHECK(!LastGOPContainsNextBufferPosition()); |
| DCHECK(deleted_buffers); |
| @@ -285,9 +287,11 @@ int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| size_t goal_size = back->second - keyframe_map_index_base_; |
| keyframe_map_.erase(back); |
| - int total_bytes_deleted = 0; |
| + size_t total_bytes_deleted = 0; |
| while (buffers_.size() != goal_size) { |
| - int bytes_deleted = buffers_.back()->data_size(); |
| + DCHECK_GE(buffers_.back()->data_size(), 0); |
| + size_t bytes_deleted = buffers_.back()->data_size(); |
| + DCHECK_GE(size_in_bytes_, bytes_deleted); |
| size_in_bytes_ -= bytes_deleted; |
| total_bytes_deleted += bytes_deleted; |
| // We're removing buffers from the back, so push each removed buffer to the |
| @@ -300,11 +304,10 @@ int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| return total_bytes_deleted; |
| } |
| -int SourceBufferRange::GetRemovalGOP( |
| +size_t SourceBufferRange::GetRemovalGOP( |
| 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; |
| + size_t total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) { |
| + size_t bytes_removed = 0; |
| KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false); |
| if (gop_itr == keyframe_map_.end()) |
| @@ -321,18 +324,19 @@ int SourceBufferRange::GetRemovalGOP( |
| if (gop_itr_prev != keyframe_map_.begin() && --gop_itr_prev == gop_end) |
| gop_end = gop_itr; |
| - while (gop_itr != gop_end && bytes_to_free > 0) { |
| + while (gop_itr != gop_end && bytes_removed < total_bytes_to_free) { |
| ++gop_itr; |
| - int gop_size = 0; |
| + size_t gop_size = 0; |
| int next_gop_index = gop_itr == keyframe_map_.end() ? |
| buffers_.size() : gop_itr->second - keyframe_map_index_base_; |
| BufferQueue::iterator next_gop_start = buffers_.begin() + next_gop_index; |
| - for (; buffer_itr != next_gop_start; ++buffer_itr) |
| + for (; buffer_itr != next_gop_start; ++buffer_itr) { |
| + DCHECK_GE((*buffer_itr)->data_size(), 0); |
| gop_size += (*buffer_itr)->data_size(); |
| + } |
| bytes_removed += gop_size; |
| - bytes_to_free -= gop_size; |
| } |
| if (bytes_removed > 0) { |
| *removal_end_timestamp = gop_itr == keyframe_map_.end() ? |
| @@ -372,8 +376,10 @@ void SourceBufferRange::FreeBufferRange( |
| const BufferQueue::iterator& ending_point) { |
| for (BufferQueue::iterator itr = starting_point; |
| itr != ending_point; ++itr) { |
| - size_in_bytes_ -= (*itr)->data_size(); |
| - DCHECK_GE(size_in_bytes_, 0); |
| + DCHECK_GE((*itr)->data_size(), 0); |
|
ddorwin
2015/07/20 21:23:57
Should BufferQueue also be fixed in a separate CL?
servolk
2015/07/22 19:02:11
BufferQueue is just a typedef for a collection of
|
| + size_t itr_data_size = static_cast<size_t>((*itr)->data_size()); |
|
ddorwin
2015/07/20 21:23:57
Does this value always come from internal code or
servolk
2015/07/22 19:02:11
It comes from StreamParserBuffer::data_size.
I thi
|
| + DCHECK_GE(size_in_bytes_, itr_data_size); |
| + size_in_bytes_ -= itr_data_size; |
| } |
| buffers_.erase(starting_point, ending_point); |
| } |