| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_range.h" | 5 #include "media/filters/source_buffer_range.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "media/base/timestamp_constants.h" | 9 #include "media/base/timestamp_constants.h" |
| 10 | 10 |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 224 bool SourceBufferRange::TruncateAt( | 224 bool SourceBufferRange::TruncateAt( |
| 225 DecodeTimestamp timestamp, BufferQueue* removed_buffers, | 225 DecodeTimestamp timestamp, BufferQueue* removed_buffers, |
| 226 bool is_exclusive) { | 226 bool is_exclusive) { |
| 227 // Find the place in |buffers_| where we will begin deleting data. | 227 // Find the place in |buffers_| where we will begin deleting data. |
| 228 BufferQueue::iterator starting_point = | 228 BufferQueue::iterator starting_point = |
| 229 GetBufferItrAt(timestamp, is_exclusive); | 229 GetBufferItrAt(timestamp, is_exclusive); |
| 230 return TruncateAt(starting_point, removed_buffers); | 230 return TruncateAt(starting_point, removed_buffers); |
| 231 } | 231 } |
| 232 | 232 |
| 233 size_t SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { | 233 size_t SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { |
| 234 DCHECK(!buffers_.empty()); |
| 234 DCHECK(!FirstGOPContainsNextBufferPosition()); | 235 DCHECK(!FirstGOPContainsNextBufferPosition()); |
| 235 DCHECK(deleted_buffers); | 236 DCHECK(deleted_buffers); |
| 236 | 237 |
| 237 int buffers_deleted = 0; | 238 int buffers_deleted = 0; |
| 238 size_t total_bytes_deleted = 0; | 239 size_t total_bytes_deleted = 0; |
| 239 | 240 |
| 240 KeyframeMap::iterator front = keyframe_map_.begin(); | 241 KeyframeMap::iterator front = keyframe_map_.begin(); |
| 241 DCHECK(front != keyframe_map_.end()); | 242 DCHECK(front != keyframe_map_.end()); |
| 242 | 243 |
| 243 // Delete the keyframe at the start of |keyframe_map_|. | 244 // Delete the keyframe at the start of |keyframe_map_|. |
| (...skipping 28 matching lines...) Expand all Loading... |
| 272 | 273 |
| 273 // Invalidate media segment start time if we've deleted the first buffer of | 274 // Invalidate media segment start time if we've deleted the first buffer of |
| 274 // the range. | 275 // the range. |
| 275 if (buffers_deleted > 0) | 276 if (buffers_deleted > 0) |
| 276 media_segment_start_time_ = kNoDecodeTimestamp(); | 277 media_segment_start_time_ = kNoDecodeTimestamp(); |
| 277 | 278 |
| 278 return total_bytes_deleted; | 279 return total_bytes_deleted; |
| 279 } | 280 } |
| 280 | 281 |
| 281 size_t SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { | 282 size_t SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { |
| 283 DCHECK(!buffers_.empty()); |
| 282 DCHECK(!LastGOPContainsNextBufferPosition()); | 284 DCHECK(!LastGOPContainsNextBufferPosition()); |
| 283 DCHECK(deleted_buffers); | 285 DCHECK(deleted_buffers); |
| 284 | 286 |
| 285 // Remove the last GOP's keyframe from the |keyframe_map_|. | 287 // Remove the last GOP's keyframe from the |keyframe_map_|. |
| 286 KeyframeMap::iterator back = keyframe_map_.end(); | 288 KeyframeMap::iterator back = keyframe_map_.end(); |
| 287 DCHECK_GT(keyframe_map_.size(), 0u); | 289 DCHECK_GT(keyframe_map_.size(), 0u); |
| 288 --back; | 290 --back; |
| 289 | 291 |
| 290 // The index of the first buffer in the last GOP is equal to the new size of | 292 // The index of the first buffer in the last GOP is equal to the new size of |
| 291 // |buffers_| after that GOP is deleted. | 293 // |buffers_| after that GOP is deleted. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 if (bytes_removed > 0) { | 346 if (bytes_removed > 0) { |
| 345 *removal_end_timestamp = gop_itr == keyframe_map_.end() ? | 347 *removal_end_timestamp = gop_itr == keyframe_map_.end() ? |
| 346 GetBufferedEndTimestamp() : gop_itr->first; | 348 GetBufferedEndTimestamp() : gop_itr->first; |
| 347 } | 349 } |
| 348 return bytes_removed; | 350 return bytes_removed; |
| 349 } | 351 } |
| 350 | 352 |
| 351 bool SourceBufferRange::FirstGOPEarlierThanMediaTime( | 353 bool SourceBufferRange::FirstGOPEarlierThanMediaTime( |
| 352 DecodeTimestamp media_time) const { | 354 DecodeTimestamp media_time) const { |
| 353 if (keyframe_map_.size() == 1u) | 355 if (keyframe_map_.size() == 1u) |
| 354 return (GetEndTimestamp() < media_time); | 356 return (GetBufferedEndTimestamp() <= media_time); |
| 355 | 357 |
| 356 KeyframeMap::const_iterator second_gop = keyframe_map_.begin(); | 358 KeyframeMap::const_iterator second_gop = keyframe_map_.begin(); |
| 357 ++second_gop; | 359 ++second_gop; |
| 358 return second_gop->first <= media_time; | 360 return second_gop->first <= media_time; |
| 359 } | 361 } |
| 360 | 362 |
| 361 bool SourceBufferRange::FirstGOPContainsNextBufferPosition() const { | 363 bool SourceBufferRange::FirstGOPContainsNextBufferPosition() const { |
| 362 if (!HasNextBufferPosition()) | 364 if (!HasNextBufferPosition()) |
| 363 return false; | 365 return false; |
| 364 | 366 |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 } | 628 } |
| 627 | 629 |
| 628 if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime()) | 630 if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime()) |
| 629 continue; | 631 continue; |
| 630 buffers->push_back(buffer); | 632 buffers->push_back(buffer); |
| 631 } | 633 } |
| 632 return previous_size < buffers->size(); | 634 return previous_size < buffers->size(); |
| 633 } | 635 } |
| 634 | 636 |
| 635 } // namespace media | 637 } // namespace media |
| OLD | NEW |