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

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

Issue 10736021: Reland r145965 - Make sure previous seek points in SourceBufferStream are ignored during overlaps (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix asan Created 8 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 | Annotate | Revision Log
« no previous file with comments | « media/filters/source_buffer_stream.h ('k') | media/filters/source_buffer_stream_unittest.cc » ('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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_stream.h" 5 #include "media/filters/source_buffer_stream.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <map> 8 #include <map>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 // filled with a valid buffer, false if there is not enough data to fulfill 88 // filled with a valid buffer, false if there is not enough data to fulfill
89 // the request. 89 // the request.
90 bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer); 90 bool GetNextBuffer(scoped_refptr<StreamParserBuffer>* out_buffer);
91 bool HasNextBuffer() const; 91 bool HasNextBuffer() const;
92 92
93 // Returns true if the range knows the position of the next buffer it should 93 // Returns true if the range knows the position of the next buffer it should
94 // return, i.e. it has been Seek()ed. This does not necessarily mean that it 94 // return, i.e. it has been Seek()ed. This does not necessarily mean that it
95 // has the next buffer yet. 95 // has the next buffer yet.
96 bool HasNextBufferPosition() const; 96 bool HasNextBufferPosition() const;
97 97
98 // Resets this range to an "unseeked" state.
99 void ResetNextBufferPosition();
100
98 // Returns the timestamp of the next buffer that will be returned from 101 // Returns the timestamp of the next buffer that will be returned from
99 // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown. 102 // GetNextBuffer(), or kNoTimestamp() if the timestamp is unknown.
100 base::TimeDelta GetNextTimestamp() const; 103 base::TimeDelta GetNextTimestamp() const;
101 104
102 // Returns the start timestamp of the range. 105 // Returns the start timestamp of the range.
103 base::TimeDelta GetStartTimestamp() const; 106 base::TimeDelta GetStartTimestamp() const;
104 107
105 // Returns the timestamp of the last buffer in the range. 108 // Returns the timestamp of the last buffer in the range.
106 base::TimeDelta GetEndTimestamp() const; 109 base::TimeDelta GetEndTimestamp() const;
107 110
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 ResolveCompleteOverlaps( 319 ResolveCompleteOverlaps(
317 range_for_new_buffers, &deleted_next_buffer, &deleted_buffers); 320 range_for_new_buffers, &deleted_next_buffer, &deleted_buffers);
318 ResolveEndOverlap( 321 ResolveEndOverlap(
319 range_for_new_buffers, &deleted_next_buffer, &deleted_buffers); 322 range_for_new_buffers, &deleted_next_buffer, &deleted_buffers);
320 MergeWithAdjacentRangeIfNecessary(range_for_new_buffers); 323 MergeWithAdjacentRangeIfNecessary(range_for_new_buffers);
321 324
322 // If these were the first buffers appended to the stream, seek to the 325 // If these were the first buffers appended to the stream, seek to the
323 // beginning of the range. 326 // beginning of the range.
324 // TODO(vrk): This should be done by ChunkDemuxer. (crbug.com/132815) 327 // TODO(vrk): This should be done by ChunkDemuxer. (crbug.com/132815)
325 if (!seek_pending_ && !selected_range_) { 328 if (!seek_pending_ && !selected_range_) {
326 selected_range_ = *range_for_new_buffers; 329 SetSelectedRange(*range_for_new_buffers);
327 selected_range_->Seek(buffers.front()->GetDecodeTimestamp()); 330 selected_range_->Seek(buffers.front()->GetDecodeTimestamp());
328 } 331 }
329 332
330 // Seek to try to fulfill a previous call to Seek(). 333 // Seek to try to fulfill a previous call to Seek().
331 if (seek_pending_) { 334 if (seek_pending_) {
332 DCHECK(!selected_range_); 335 DCHECK(!selected_range_);
333 DCHECK(!deleted_next_buffer); 336 DCHECK(!deleted_next_buffer);
334 Seek(seek_buffer_timestamp_); 337 Seek(seek_buffer_timestamp_);
335 } 338 }
336 339
337 // Seek because the Append() has deleted the buffer that would have been 340 // Seek because the Append() has deleted the buffer that would have been
338 // returned in the next call to GetNextBuffer(). 341 // returned in the next call to GetNextBuffer().
339 if (deleted_next_buffer) { 342 if (deleted_next_buffer) {
340 DCHECK(!seek_pending_); 343 DCHECK(!seek_pending_);
341 selected_range_ = *range_for_new_buffers; 344 SetSelectedRange(*range_for_new_buffers);
342 if (!deleted_buffers.empty()) { 345 if (!deleted_buffers.empty()) {
343 // Seek the range to the keyframe at or after |next_buffer_timestamp|. 346 // Seek the range to the keyframe at or after |next_buffer_timestamp|.
344 selected_range_->SeekAheadTo(next_buffer_timestamp); 347 selected_range_->SeekAheadTo(next_buffer_timestamp);
345 UpdateTrackBuffer(deleted_buffers); 348 UpdateTrackBuffer(deleted_buffers);
346 } else { 349 } else {
347 // If we've deleted the next buffer but |deleted_buffers| is empty, 350 // If we've deleted the next buffer but |deleted_buffers| is empty,
348 // that means we need to seek past the timestamp of the last buffer in 351 // that means we need to seek past the timestamp of the last buffer in
349 // the range (i.e. the keyframe timestamp needs to be strictly greater 352 // the range (i.e. the keyframe timestamp needs to be strictly greater
350 // than |end_buffer_timestamp|). 353 // than |end_buffer_timestamp|).
351 selected_range_->SeekAheadPast(end_buffer_timestamp); 354 selected_range_->SeekAheadPast(end_buffer_timestamp);
352 } 355 }
353 } 356 }
354 357
355 DCHECK(IsRangeListSorted(ranges_)); 358 DCHECK(IsRangeListSorted(ranges_));
359 DCHECK(OnlySelectedRangeIsSeeked());
356 return true; 360 return true;
357 } 361 }
358 362
359 bool SourceBufferStream::IsMonotonicallyIncreasing( 363 bool SourceBufferStream::IsMonotonicallyIncreasing(
360 const BufferQueue& buffers) { 364 const BufferQueue& buffers) {
361 DCHECK(!buffers.empty()); 365 DCHECK(!buffers.empty());
362 base::TimeDelta prev_timestamp = last_buffer_timestamp_; 366 base::TimeDelta prev_timestamp = last_buffer_timestamp_;
363 for (BufferQueue::const_iterator itr = buffers.begin(); 367 for (BufferQueue::const_iterator itr = buffers.begin();
364 itr != buffers.end(); ++itr) { 368 itr != buffers.end(); ++itr) {
365 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); 369 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp();
366 DCHECK(current_timestamp != kNoTimestamp()); 370 DCHECK(current_timestamp != kNoTimestamp());
367 371
368 if (prev_timestamp != kNoTimestamp() && current_timestamp < prev_timestamp) 372 if (prev_timestamp != kNoTimestamp() && current_timestamp < prev_timestamp)
369 return false; 373 return false;
370 374
371 prev_timestamp = current_timestamp; 375 prev_timestamp = current_timestamp;
372 } 376 }
373 return true; 377 return true;
374 } 378 }
375 379
380 bool SourceBufferStream::OnlySelectedRangeIsSeeked() const {
381 for (RangeList::const_iterator itr = ranges_.begin();
382 itr != ranges_.end(); ++itr) {
383 if ((*itr)->HasNextBufferPosition() && (*itr) != selected_range_)
384 return false;
385 }
386 return !selected_range_ || selected_range_->HasNextBufferPosition();
387 }
388
376 void SourceBufferStream::UpdateMaxInterbufferDistance( 389 void SourceBufferStream::UpdateMaxInterbufferDistance(
377 const BufferQueue& buffers) { 390 const BufferQueue& buffers) {
378 DCHECK(!buffers.empty()); 391 DCHECK(!buffers.empty());
379 base::TimeDelta prev_timestamp = last_buffer_timestamp_; 392 base::TimeDelta prev_timestamp = last_buffer_timestamp_;
380 for (BufferQueue::const_iterator itr = buffers.begin(); 393 for (BufferQueue::const_iterator itr = buffers.begin();
381 itr != buffers.end(); ++itr) { 394 itr != buffers.end(); ++itr) {
382 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp(); 395 base::TimeDelta current_timestamp = (*itr)->GetDecodeTimestamp();
383 DCHECK(current_timestamp != kNoTimestamp()); 396 DCHECK(current_timestamp != kNoTimestamp());
384 397
385 if (prev_timestamp != kNoTimestamp()) { 398 if (prev_timestamp != kNoTimestamp()) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 // of |new_buffers|, and add them into a new range. 430 // of |new_buffers|, and add them into a new range.
418 SourceBufferRange* new_next_range = 431 SourceBufferRange* new_next_range =
419 range_for_new_buffers->SplitRange( 432 range_for_new_buffers->SplitRange(
420 new_buffers.back()->GetDecodeTimestamp()); 433 new_buffers.back()->GetDecodeTimestamp());
421 434
422 if (new_next_range) 435 if (new_next_range)
423 AddToRanges(new_next_range); 436 AddToRanges(new_next_range);
424 437
425 // Delete the buffers that are overlapped by |new_buffers|, then append 438 // Delete the buffers that are overlapped by |new_buffers|, then append
426 // |new_buffers| to the end of the range. 439 // |new_buffers| to the end of the range.
440 BufferQueue saved_buffers;
441 bool deleted_next_buffer_from_range =
442 range_for_new_buffers->TruncateAt(new_buffers.front(), &saved_buffers);
443 range_for_new_buffers->AppendToEnd(new_buffers);
444
445 if (selected_range_ != range_for_new_buffers)
446 return;
447
427 DCHECK(!*deleted_next_buffer); 448 DCHECK(!*deleted_next_buffer);
428 *deleted_next_buffer = 449 *deleted_buffers = saved_buffers;
429 range_for_new_buffers->TruncateAt(new_buffers.front(), deleted_buffers); 450 *deleted_next_buffer = deleted_next_buffer_from_range;
430 range_for_new_buffers->AppendToEnd(new_buffers);
431 451
432 // If this was a middle overlap resulting in a new range, and the next buffer 452 // If this was a middle overlap resulting in a new range, and the next buffer
433 // position has been transferred to the newly created range, update the 453 // position has been transferred to the newly created range, update the
434 // |selected_range_| accordingly. 454 // |selected_range_| accordingly.
435 if (new_next_range && new_next_range->HasNextBufferPosition()) { 455 if (new_next_range && new_next_range->HasNextBufferPosition()) {
436 DCHECK(!range_for_new_buffers->HasNextBufferPosition()); 456 DCHECK(!range_for_new_buffers->HasNextBufferPosition());
437 DCHECK(!*deleted_next_buffer); 457 DCHECK(!*deleted_next_buffer);
438 selected_range_ = new_next_range; 458 SetSelectedRange(new_next_range);
439 } 459 }
440 } 460 }
441 461
442 void SourceBufferStream::ResolveCompleteOverlaps( 462 void SourceBufferStream::ResolveCompleteOverlaps(
443 const RangeList::iterator& range_with_new_buffers_itr, 463 const RangeList::iterator& range_with_new_buffers_itr,
444 bool* deleted_next_buffer, BufferQueue* deleted_buffers) { 464 bool* deleted_next_buffer, BufferQueue* deleted_buffers) {
445 DCHECK(deleted_next_buffer); 465 DCHECK(deleted_next_buffer);
446 DCHECK(deleted_buffers); 466 DCHECK(deleted_buffers);
447 467
448 SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr; 468 SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr;
449 RangeList::iterator next_range_itr = range_with_new_buffers_itr; 469 RangeList::iterator next_range_itr = range_with_new_buffers_itr;
450 next_range_itr++; 470 next_range_itr++;
451 471
452 while (next_range_itr != ranges_.end() && 472 while (next_range_itr != ranges_.end() &&
453 range_with_new_buffers->CompletelyOverlaps(**next_range_itr)) { 473 range_with_new_buffers->CompletelyOverlaps(**next_range_itr)) {
454 if (*next_range_itr == selected_range_) { 474 if (*next_range_itr == selected_range_) {
455 selected_range_ = NULL;
456 DCHECK(!*deleted_next_buffer); 475 DCHECK(!*deleted_next_buffer);
457 *deleted_next_buffer = (*next_range_itr)->DeleteAll(deleted_buffers); 476 *deleted_next_buffer = selected_range_->DeleteAll(deleted_buffers);
458 DCHECK(*deleted_next_buffer); 477 DCHECK(*deleted_next_buffer);
478 SetSelectedRange(NULL);
459 } 479 }
460 delete *next_range_itr; 480 delete *next_range_itr;
461 next_range_itr = ranges_.erase(next_range_itr); 481 next_range_itr = ranges_.erase(next_range_itr);
462 } 482 }
463 } 483 }
464 484
465 void SourceBufferStream::ResolveEndOverlap( 485 void SourceBufferStream::ResolveEndOverlap(
466 const RangeList::iterator& range_with_new_buffers_itr, 486 const RangeList::iterator& range_with_new_buffers_itr,
467 bool* deleted_next_buffer, BufferQueue* deleted_buffers) { 487 bool* deleted_next_buffer, BufferQueue* deleted_buffers) {
468 DCHECK(deleted_next_buffer); 488 DCHECK(deleted_next_buffer);
(...skipping 23 matching lines...) Expand all
492 AddToRanges(new_next_range); 512 AddToRanges(new_next_range);
493 513
494 // If we didn't overlap a selected range, return. 514 // If we didn't overlap a selected range, return.
495 if (selected_range_ != overlapped_range.get()) 515 if (selected_range_ != overlapped_range.get())
496 return; 516 return;
497 517
498 // If the |overlapped_range| transfers its next buffer position to 518 // If the |overlapped_range| transfers its next buffer position to
499 // |new_next_range|, make |new_next_range| the |selected_range_|. 519 // |new_next_range|, make |new_next_range| the |selected_range_|.
500 if (new_next_range && new_next_range->HasNextBufferPosition()) { 520 if (new_next_range && new_next_range->HasNextBufferPosition()) {
501 DCHECK(!overlapped_range->HasNextBufferPosition()); 521 DCHECK(!overlapped_range->HasNextBufferPosition());
502 selected_range_ = new_next_range; 522 SetSelectedRange(new_next_range);
503 return; 523 return;
504 } 524 }
505 525
506 // Save the buffers in |overlapped_range|. 526 // Save the buffers in |overlapped_range|.
507 DCHECK(!*deleted_next_buffer); 527 DCHECK(!*deleted_next_buffer);
528 DCHECK_EQ(overlapped_range.get(), selected_range_);
508 *deleted_next_buffer = overlapped_range->DeleteAll(deleted_buffers); 529 *deleted_next_buffer = overlapped_range->DeleteAll(deleted_buffers);
509 DCHECK(*deleted_next_buffer); 530 DCHECK(*deleted_next_buffer);
531
532 // |overlapped_range| will be deleted, so set |selected_range_| to NULL.
533 SetSelectedRange(NULL);
510 } 534 }
511 535
512 void SourceBufferStream::UpdateTrackBuffer(const BufferQueue& deleted_buffers) { 536 void SourceBufferStream::UpdateTrackBuffer(const BufferQueue& deleted_buffers) {
513 DCHECK(!deleted_buffers.empty()); 537 DCHECK(!deleted_buffers.empty());
514 if (!track_buffer_.empty()) 538 if (!track_buffer_.empty())
515 return; 539 return;
516 540
517 DCHECK(selected_range_); 541 DCHECK(selected_range_);
518 DCHECK(selected_range_->HasNextBufferPosition()); 542 DCHECK(selected_range_->HasNextBufferPosition());
519 543
(...skipping 27 matching lines...) Expand all
547 571
548 // See if the next range contains the keyframe after the end of the 572 // See if the next range contains the keyframe after the end of the
549 // |track_buffer_|, and if so, change |selected_range_|. 573 // |track_buffer_|, and if so, change |selected_range_|.
550 RangeList::iterator next_range_itr = ++(GetSelectedRangeItr()); 574 RangeList::iterator next_range_itr = ++(GetSelectedRangeItr());
551 if (next_range_itr != ranges_.end()) { 575 if (next_range_itr != ranges_.end()) {
552 (*next_range_itr)->SeekAheadPast( 576 (*next_range_itr)->SeekAheadPast(
553 track_buffer_.back()->GetDecodeTimestamp()); 577 track_buffer_.back()->GetDecodeTimestamp());
554 if ((*next_range_itr)->HasNextBuffer() && 578 if ((*next_range_itr)->HasNextBuffer() &&
555 selected_range_->IsNextInSequence( 579 selected_range_->IsNextInSequence(
556 track_buffer_.back(), (*next_range_itr)->GetNextTimestamp())) { 580 track_buffer_.back(), (*next_range_itr)->GetNextTimestamp())) {
557 selected_range_ = *next_range_itr; 581 SetSelectedRange(*next_range_itr);
558 } 582 }
559 } 583 }
560 } 584 }
561 585
562 void SourceBufferStream::MergeWithAdjacentRangeIfNecessary( 586 void SourceBufferStream::MergeWithAdjacentRangeIfNecessary(
563 const RangeList::iterator& range_with_new_buffers_itr) { 587 const RangeList::iterator& range_with_new_buffers_itr) {
564 SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr; 588 SourceBufferRange* range_with_new_buffers = *range_with_new_buffers_itr;
565 RangeList::iterator next_range_itr = range_with_new_buffers_itr; 589 RangeList::iterator next_range_itr = range_with_new_buffers_itr;
566 next_range_itr++; 590 next_range_itr++;
567 591
568 if (next_range_itr != ranges_.end() && 592 if (next_range_itr != ranges_.end() &&
569 range_with_new_buffers->CanAppendToEnd(**next_range_itr)) { 593 range_with_new_buffers->CanAppendToEnd(**next_range_itr)) {
570 bool transfer_current_position = selected_range_ == *next_range_itr; 594 bool transfer_current_position = selected_range_ == *next_range_itr;
571 range_with_new_buffers->AppendToEnd(**next_range_itr, 595 range_with_new_buffers->AppendToEnd(**next_range_itr,
572 transfer_current_position); 596 transfer_current_position);
573 // Update |selected_range_| pointer if |range| has become selected after 597 // Update |selected_range_| pointer if |range| has become selected after
574 // merges. 598 // merges.
575 if (transfer_current_position) 599 if (transfer_current_position)
576 selected_range_ = range_with_new_buffers; 600 SetSelectedRange(range_with_new_buffers);
577 601
578 delete *next_range_itr; 602 delete *next_range_itr;
579 ranges_.erase(next_range_itr); 603 ranges_.erase(next_range_itr);
580 } 604 }
581 } 605 }
582 606
583 void SourceBufferStream::Seek(base::TimeDelta timestamp) { 607 void SourceBufferStream::Seek(base::TimeDelta timestamp) {
584 selected_range_ = NULL; 608 SetSelectedRange(NULL);
585 track_buffer_.clear(); 609 track_buffer_.clear();
586 610
587 seek_buffer_timestamp_ = timestamp; 611 seek_buffer_timestamp_ = timestamp;
588 seek_pending_ = true; 612 seek_pending_ = true;
589 613
590 RangeList::iterator itr = ranges_.end(); 614 RangeList::iterator itr = ranges_.end();
591 for (itr = ranges_.begin(); itr != ranges_.end(); itr++) { 615 for (itr = ranges_.begin(); itr != ranges_.end(); itr++) {
592 if ((*itr)->CanSeekTo(timestamp)) 616 if ((*itr)->CanSeekTo(timestamp))
593 break; 617 break;
594 } 618 }
595 619
596 if (itr == ranges_.end()) 620 if (itr == ranges_.end())
597 return; 621 return;
598 622
599 selected_range_ = *itr; 623 SetSelectedRange(*itr);
600 selected_range_->Seek(timestamp); 624 selected_range_->Seek(timestamp);
601 seek_pending_ = false; 625 seek_pending_ = false;
602 end_of_stream_ = false; 626 end_of_stream_ = false;
603 } 627 }
604 628
605 bool SourceBufferStream::IsSeekPending() const { 629 bool SourceBufferStream::IsSeekPending() const {
606 return seek_pending_; 630 return seek_pending_;
607 } 631 }
608 632
609 bool SourceBufferStream::GetNextBuffer( 633 bool SourceBufferStream::GetNextBuffer(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 DCHECK(selected_range_); 686 DCHECK(selected_range_);
663 RangeList::iterator itr = ranges_.end(); 687 RangeList::iterator itr = ranges_.end();
664 for (itr = ranges_.begin(); itr != ranges_.end(); itr++) { 688 for (itr = ranges_.begin(); itr != ranges_.end(); itr++) {
665 if (*itr == selected_range_) 689 if (*itr == selected_range_)
666 break; 690 break;
667 } 691 }
668 DCHECK(itr != ranges_.end()); 692 DCHECK(itr != ranges_.end());
669 return itr; 693 return itr;
670 } 694 }
671 695
696 void SourceBufferStream::SetSelectedRange(SourceBufferRange* range) {
697 if (selected_range_)
698 selected_range_->ResetNextBufferPosition();
699 selected_range_ = range;
700 }
701
672 Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const { 702 Ranges<base::TimeDelta> SourceBufferStream::GetBufferedTime() const {
673 Ranges<base::TimeDelta> ranges; 703 Ranges<base::TimeDelta> ranges;
674 for (RangeList::const_iterator itr = ranges_.begin(); 704 for (RangeList::const_iterator itr = ranges_.begin();
675 itr != ranges_.end(); itr++) { 705 itr != ranges_.end(); itr++) {
676 ranges.Add((*itr)->GetStartTimestamp(), (*itr)->GetBufferedEndTimestamp()); 706 ranges.Add((*itr)->GetStartTimestamp(), (*itr)->GetBufferedEndTimestamp());
677 } 707 }
678 return ranges; 708 return ranges;
679 } 709 }
680 710
681 void SourceBufferStream::EndOfStream() { 711 void SourceBufferStream::EndOfStream() {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
898 if (next_buffer_index_ >= static_cast<int>(buffers_.size())) 928 if (next_buffer_index_ >= static_cast<int>(buffers_.size()))
899 return kNoTimestamp(); 929 return kNoTimestamp();
900 930
901 return buffers_.at(next_buffer_index_)->GetDecodeTimestamp(); 931 return buffers_.at(next_buffer_index_)->GetDecodeTimestamp();
902 } 932 }
903 933
904 bool SourceBufferRange::HasNextBufferPosition() const { 934 bool SourceBufferRange::HasNextBufferPosition() const {
905 return next_buffer_index_ >= 0 || waiting_for_keyframe_; 935 return next_buffer_index_ >= 0 || waiting_for_keyframe_;
906 } 936 }
907 937
938 void SourceBufferRange::ResetNextBufferPosition() {
939 next_buffer_index_ = -1;
940 waiting_for_keyframe_ = false;
941 next_keyframe_timestamp_ = kNoTimestamp();
942 }
943
908 void SourceBufferRange::AppendToEnd(const SourceBufferRange& range, 944 void SourceBufferRange::AppendToEnd(const SourceBufferRange& range,
909 bool transfer_current_position) { 945 bool transfer_current_position) {
910 DCHECK(CanAppendToEnd(range)); 946 DCHECK(CanAppendToEnd(range));
911 DCHECK(!buffers_.empty()); 947 DCHECK(!buffers_.empty());
912 948
913 if (transfer_current_position) 949 if (transfer_current_position)
914 next_buffer_index_ = range.next_buffer_index_ + buffers_.size(); 950 next_buffer_index_ = range.next_buffer_index_ + buffers_.size();
915 951
916 AppendToEnd(range.buffers_); 952 AppendToEnd(range.buffers_);
917 } 953 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 return 2 * GetApproximateDuration(); 1022 return 2 * GetApproximateDuration();
987 } 1023 }
988 1024
989 base::TimeDelta SourceBufferRange::GetApproximateDuration() const { 1025 base::TimeDelta SourceBufferRange::GetApproximateDuration() const {
990 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run(); 1026 base::TimeDelta max_interbuffer_distance = interbuffer_distance_cb_.Run();
991 DCHECK(max_interbuffer_distance != kNoTimestamp()); 1027 DCHECK(max_interbuffer_distance != kNoTimestamp());
992 return max_interbuffer_distance; 1028 return max_interbuffer_distance;
993 } 1029 }
994 1030
995 } // namespace media 1031 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/source_buffer_stream.h ('k') | media/filters/source_buffer_stream_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698