OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |