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

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

Issue 1235403002: Change ChunkDemuxerStream/SourceBufferStream memory limit to size_t type (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: A few more minor fixes Created 5 years, 5 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
« no previous file with comments | « media/filters/source_buffer_range.h ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 namespace media { 9 namespace media {
10 10
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 media_segment_start_time_ <= 49 media_segment_start_time_ <=
50 new_buffers.front()->GetDecodeTimestamp()); 50 new_buffers.front()->GetDecodeTimestamp());
51 51
52 AdjustEstimatedDurationForNewAppend(new_buffers); 52 AdjustEstimatedDurationForNewAppend(new_buffers);
53 53
54 for (BufferQueue::const_iterator itr = new_buffers.begin(); 54 for (BufferQueue::const_iterator itr = new_buffers.begin();
55 itr != new_buffers.end(); 55 itr != new_buffers.end();
56 ++itr) { 56 ++itr) {
57 DCHECK((*itr)->GetDecodeTimestamp() != kNoDecodeTimestamp()); 57 DCHECK((*itr)->GetDecodeTimestamp() != kNoDecodeTimestamp());
58 buffers_.push_back(*itr); 58 buffers_.push_back(*itr);
59 DCHECK_GE((*itr)->data_size(), 0);
59 size_in_bytes_ += (*itr)->data_size(); 60 size_in_bytes_ += (*itr)->data_size();
60 61
61 if ((*itr)->is_key_frame()) { 62 if ((*itr)->is_key_frame()) {
62 keyframe_map_.insert( 63 keyframe_map_.insert(
63 std::make_pair((*itr)->GetDecodeTimestamp(), 64 std::make_pair((*itr)->GetDecodeTimestamp(),
64 buffers_.size() - 1 + keyframe_map_index_base_)); 65 buffers_.size() - 1 + keyframe_map_index_base_));
65 } 66 }
66 } 67 }
67 } 68 }
68 69
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 219
219 bool SourceBufferRange::TruncateAt( 220 bool SourceBufferRange::TruncateAt(
220 DecodeTimestamp timestamp, BufferQueue* removed_buffers, 221 DecodeTimestamp timestamp, BufferQueue* removed_buffers,
221 bool is_exclusive) { 222 bool is_exclusive) {
222 // Find the place in |buffers_| where we will begin deleting data. 223 // Find the place in |buffers_| where we will begin deleting data.
223 BufferQueue::iterator starting_point = 224 BufferQueue::iterator starting_point =
224 GetBufferItrAt(timestamp, is_exclusive); 225 GetBufferItrAt(timestamp, is_exclusive);
225 return TruncateAt(starting_point, removed_buffers); 226 return TruncateAt(starting_point, removed_buffers);
226 } 227 }
227 228
228 int SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) { 229 size_t SourceBufferRange::DeleteGOPFromFront(BufferQueue* deleted_buffers) {
229 DCHECK(!FirstGOPContainsNextBufferPosition()); 230 DCHECK(!FirstGOPContainsNextBufferPosition());
230 DCHECK(deleted_buffers); 231 DCHECK(deleted_buffers);
231 232
232 int buffers_deleted = 0; 233 int buffers_deleted = 0;
233 int total_bytes_deleted = 0; 234 size_t total_bytes_deleted = 0;
234 235
235 KeyframeMap::iterator front = keyframe_map_.begin(); 236 KeyframeMap::iterator front = keyframe_map_.begin();
236 DCHECK(front != keyframe_map_.end()); 237 DCHECK(front != keyframe_map_.end());
237 238
238 // Delete the keyframe at the start of |keyframe_map_|. 239 // Delete the keyframe at the start of |keyframe_map_|.
239 keyframe_map_.erase(front); 240 keyframe_map_.erase(front);
240 241
241 // Now we need to delete all the buffers that depend on the keyframe we've 242 // Now we need to delete all the buffers that depend on the keyframe we've
242 // just deleted. 243 // just deleted.
243 int end_index = keyframe_map_.size() > 0 ? 244 int end_index = keyframe_map_.size() > 0 ?
244 keyframe_map_.begin()->second - keyframe_map_index_base_ : 245 keyframe_map_.begin()->second - keyframe_map_index_base_ :
245 buffers_.size(); 246 buffers_.size();
246 247
247 // Delete buffers from the beginning of the buffered range up until (but not 248 // Delete buffers from the beginning of the buffered range up until (but not
248 // including) the next keyframe. 249 // including) the next keyframe.
249 for (int i = 0; i < end_index; i++) { 250 for (int i = 0; i < end_index; i++) {
250 int bytes_deleted = buffers_.front()->data_size(); 251 DCHECK_GE(buffers_.front()->data_size(), 0);
252 size_t bytes_deleted = buffers_.front()->data_size();
253 DCHECK_GE(size_in_bytes_, bytes_deleted);
251 size_in_bytes_ -= bytes_deleted; 254 size_in_bytes_ -= bytes_deleted;
252 total_bytes_deleted += bytes_deleted; 255 total_bytes_deleted += bytes_deleted;
253 deleted_buffers->push_back(buffers_.front()); 256 deleted_buffers->push_back(buffers_.front());
254 buffers_.pop_front(); 257 buffers_.pop_front();
255 ++buffers_deleted; 258 ++buffers_deleted;
256 } 259 }
257 260
258 // Update |keyframe_map_index_base_| to account for the deleted buffers. 261 // Update |keyframe_map_index_base_| to account for the deleted buffers.
259 keyframe_map_index_base_ += buffers_deleted; 262 keyframe_map_index_base_ += buffers_deleted;
260 263
261 if (next_buffer_index_ > -1) { 264 if (next_buffer_index_ > -1) {
262 next_buffer_index_ -= buffers_deleted; 265 next_buffer_index_ -= buffers_deleted;
263 DCHECK_GE(next_buffer_index_, 0); 266 DCHECK_GE(next_buffer_index_, 0);
264 } 267 }
265 268
266 // Invalidate media segment start time if we've deleted the first buffer of 269 // Invalidate media segment start time if we've deleted the first buffer of
267 // the range. 270 // the range.
268 if (buffers_deleted > 0) 271 if (buffers_deleted > 0)
269 media_segment_start_time_ = kNoDecodeTimestamp(); 272 media_segment_start_time_ = kNoDecodeTimestamp();
270 273
271 return total_bytes_deleted; 274 return total_bytes_deleted;
272 } 275 }
273 276
274 int SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) { 277 size_t SourceBufferRange::DeleteGOPFromBack(BufferQueue* deleted_buffers) {
275 DCHECK(!LastGOPContainsNextBufferPosition()); 278 DCHECK(!LastGOPContainsNextBufferPosition());
276 DCHECK(deleted_buffers); 279 DCHECK(deleted_buffers);
277 280
278 // Remove the last GOP's keyframe from the |keyframe_map_|. 281 // Remove the last GOP's keyframe from the |keyframe_map_|.
279 KeyframeMap::iterator back = keyframe_map_.end(); 282 KeyframeMap::iterator back = keyframe_map_.end();
280 DCHECK_GT(keyframe_map_.size(), 0u); 283 DCHECK_GT(keyframe_map_.size(), 0u);
281 --back; 284 --back;
282 285
283 // The index of the first buffer in the last GOP is equal to the new size of 286 // The index of the first buffer in the last GOP is equal to the new size of
284 // |buffers_| after that GOP is deleted. 287 // |buffers_| after that GOP is deleted.
285 size_t goal_size = back->second - keyframe_map_index_base_; 288 size_t goal_size = back->second - keyframe_map_index_base_;
286 keyframe_map_.erase(back); 289 keyframe_map_.erase(back);
287 290
288 int total_bytes_deleted = 0; 291 size_t total_bytes_deleted = 0;
289 while (buffers_.size() != goal_size) { 292 while (buffers_.size() != goal_size) {
290 int bytes_deleted = buffers_.back()->data_size(); 293 DCHECK_GE(buffers_.back()->data_size(), 0);
294 size_t bytes_deleted = buffers_.back()->data_size();
295 DCHECK_GE(size_in_bytes_, bytes_deleted);
291 size_in_bytes_ -= bytes_deleted; 296 size_in_bytes_ -= bytes_deleted;
292 total_bytes_deleted += bytes_deleted; 297 total_bytes_deleted += bytes_deleted;
293 // We're removing buffers from the back, so push each removed buffer to the 298 // We're removing buffers from the back, so push each removed buffer to the
294 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing 299 // front of |deleted_buffers| so that |deleted_buffers| are in nondecreasing
295 // order. 300 // order.
296 deleted_buffers->push_front(buffers_.back()); 301 deleted_buffers->push_front(buffers_.back());
297 buffers_.pop_back(); 302 buffers_.pop_back();
298 } 303 }
299 304
300 return total_bytes_deleted; 305 return total_bytes_deleted;
301 } 306 }
302 307
303 int SourceBufferRange::GetRemovalGOP( 308 size_t SourceBufferRange::GetRemovalGOP(
304 DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp, 309 DecodeTimestamp start_timestamp, DecodeTimestamp end_timestamp,
305 int total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) { 310 size_t total_bytes_to_free, DecodeTimestamp* removal_end_timestamp) {
306 int bytes_to_free = total_bytes_to_free; 311 size_t bytes_removed = 0;
307 int bytes_removed = 0;
308 312
309 KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false); 313 KeyframeMap::iterator gop_itr = GetFirstKeyframeAt(start_timestamp, false);
310 if (gop_itr == keyframe_map_.end()) 314 if (gop_itr == keyframe_map_.end())
311 return 0; 315 return 0;
312 int keyframe_index = gop_itr->second - keyframe_map_index_base_; 316 int keyframe_index = gop_itr->second - keyframe_map_index_base_;
313 BufferQueue::iterator buffer_itr = buffers_.begin() + keyframe_index; 317 BufferQueue::iterator buffer_itr = buffers_.begin() + keyframe_index;
314 KeyframeMap::iterator gop_end = keyframe_map_.end(); 318 KeyframeMap::iterator gop_end = keyframe_map_.end();
315 if (end_timestamp < GetBufferedEndTimestamp()) 319 if (end_timestamp < GetBufferedEndTimestamp())
316 gop_end = GetFirstKeyframeAtOrBefore(end_timestamp); 320 gop_end = GetFirstKeyframeAtOrBefore(end_timestamp);
317 321
318 // Check if the removal range is within a GOP and skip the loop if so. 322 // Check if the removal range is within a GOP and skip the loop if so.
319 // [keyframe]...[start_timestamp]...[end_timestamp]...[keyframe] 323 // [keyframe]...[start_timestamp]...[end_timestamp]...[keyframe]
320 KeyframeMap::iterator gop_itr_prev = gop_itr; 324 KeyframeMap::iterator gop_itr_prev = gop_itr;
321 if (gop_itr_prev != keyframe_map_.begin() && --gop_itr_prev == gop_end) 325 if (gop_itr_prev != keyframe_map_.begin() && --gop_itr_prev == gop_end)
322 gop_end = gop_itr; 326 gop_end = gop_itr;
323 327
324 while (gop_itr != gop_end && bytes_to_free > 0) { 328 while (gop_itr != gop_end && bytes_removed < total_bytes_to_free) {
325 ++gop_itr; 329 ++gop_itr;
326 330
327 int gop_size = 0; 331 size_t gop_size = 0;
328 int next_gop_index = gop_itr == keyframe_map_.end() ? 332 int next_gop_index = gop_itr == keyframe_map_.end() ?
329 buffers_.size() : gop_itr->second - keyframe_map_index_base_; 333 buffers_.size() : gop_itr->second - keyframe_map_index_base_;
330 BufferQueue::iterator next_gop_start = buffers_.begin() + next_gop_index; 334 BufferQueue::iterator next_gop_start = buffers_.begin() + next_gop_index;
331 for (; buffer_itr != next_gop_start; ++buffer_itr) 335 for (; buffer_itr != next_gop_start; ++buffer_itr) {
336 DCHECK_GE((*buffer_itr)->data_size(), 0);
332 gop_size += (*buffer_itr)->data_size(); 337 gop_size += (*buffer_itr)->data_size();
338 }
333 339
334 bytes_removed += gop_size; 340 bytes_removed += gop_size;
335 bytes_to_free -= gop_size;
336 } 341 }
337 if (bytes_removed > 0) { 342 if (bytes_removed > 0) {
338 *removal_end_timestamp = gop_itr == keyframe_map_.end() ? 343 *removal_end_timestamp = gop_itr == keyframe_map_.end() ?
339 GetBufferedEndTimestamp() : gop_itr->first; 344 GetBufferedEndTimestamp() : gop_itr->first;
340 } 345 }
341 return bytes_removed; 346 return bytes_removed;
342 } 347 }
343 348
344 bool SourceBufferRange::FirstGOPContainsNextBufferPosition() const { 349 bool SourceBufferRange::FirstGOPContainsNextBufferPosition() const {
345 if (!HasNextBufferPosition()) 350 if (!HasNextBufferPosition())
(...skipping 19 matching lines...) Expand all
365 KeyframeMap::const_iterator last_gop = keyframe_map_.end(); 370 KeyframeMap::const_iterator last_gop = keyframe_map_.end();
366 --last_gop; 371 --last_gop;
367 return last_gop->second - keyframe_map_index_base_ <= next_buffer_index_; 372 return last_gop->second - keyframe_map_index_base_ <= next_buffer_index_;
368 } 373 }
369 374
370 void SourceBufferRange::FreeBufferRange( 375 void SourceBufferRange::FreeBufferRange(
371 const BufferQueue::iterator& starting_point, 376 const BufferQueue::iterator& starting_point,
372 const BufferQueue::iterator& ending_point) { 377 const BufferQueue::iterator& ending_point) {
373 for (BufferQueue::iterator itr = starting_point; 378 for (BufferQueue::iterator itr = starting_point;
374 itr != ending_point; ++itr) { 379 itr != ending_point; ++itr) {
375 size_in_bytes_ -= (*itr)->data_size(); 380 DCHECK_GE((*itr)->data_size(), 0);
376 DCHECK_GE(size_in_bytes_, 0); 381 size_t itr_data_size = static_cast<size_t>((*itr)->data_size());
382 DCHECK_GE(size_in_bytes_, itr_data_size);
383 size_in_bytes_ -= itr_data_size;
377 } 384 }
378 buffers_.erase(starting_point, ending_point); 385 buffers_.erase(starting_point, ending_point);
379 } 386 }
380 387
381 bool SourceBufferRange::TruncateAt( 388 bool SourceBufferRange::TruncateAt(
382 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) { 389 const BufferQueue::iterator& starting_point, BufferQueue* removed_buffers) {
383 DCHECK(!removed_buffers || removed_buffers->empty()); 390 DCHECK(!removed_buffers || removed_buffers->empty());
384 391
385 // Return if we're not deleting anything. 392 // Return if we're not deleting anything.
386 if (starting_point == buffers_.end()) 393 if (starting_point == buffers_.end())
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
607 } 614 }
608 615
609 if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime()) 616 if (buffer->timestamp() + buffer->duration() <= start.ToPresentationTime())
610 continue; 617 continue;
611 buffers->push_back(buffer); 618 buffers->push_back(buffer);
612 } 619 }
613 return previous_size < buffers->size(); 620 return previous_size < buffers->size();
614 } 621 }
615 622
616 } // namespace media 623 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/source_buffer_range.h ('k') | media/filters/source_buffer_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698