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

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

Issue 1347483003: Fix seeking back in the new MSE GC algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: upd Created 5 years, 3 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
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 #include <sstream> 9 #include <sstream>
10 10
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after
652 // If the last append happened before the current playback position 652 // If the last append happened before the current playback position
653 // |media_time|, then JS player is probably preparing to seek back and we 653 // |media_time|, then JS player is probably preparing to seek back and we
654 // should try to preserve all most recently appended data (which is in 654 // should try to preserve all most recently appended data (which is in
655 // range_for_next_append_) from being removed by GC (see crbug.com/440173) 655 // range_for_next_append_) from being removed by GC (see crbug.com/440173)
656 if (range_for_next_append_ != ranges_.end()) { 656 if (range_for_next_append_ != ranges_.end()) {
657 DCHECK((*range_for_next_append_)->GetStartTimestamp() <= media_time); 657 DCHECK((*range_for_next_append_)->GetStartTimestamp() <= media_time);
658 media_time = (*range_for_next_append_)->GetStartTimestamp(); 658 media_time = (*range_for_next_append_)->GetStartTimestamp();
659 } 659 }
660 } 660 }
661 661
662 // Try removing data from the front of the SourceBuffer up to |media_time| 662 // If |media_time| is earlier than any of the buffered data, that means we are
wolenetz 2015/09/16 19:25:27 I wonder if we should make this even more aggressi
663 // position. 663 // seeking back in the stream. In that case we should delete as much data as
664 if (bytes_freed < bytes_to_free) { 664 // possible from the back of the buffered range without evicting the most
665 size_t front = FreeBuffers(bytes_to_free - bytes_freed, media_time, false); 665 // recently appended chunks, and then, if that's not enough, we can delete
666 DVLOG(3) << __FUNCTION__ << " Removed " << front << " bytes from the front" 666 // from the front of the buffered ranges greedily, i.e. without trying to save
667 << " ranges_=" << RangesToString(ranges_); 667 // the previous media playback position, since the player is going to append
668 bytes_freed += front; 668 // new data to the new seek target next.
669 } 669 if (!ranges_.empty() &&
670 media_time < ranges_.front()->GetStartTimestamp()) {
671 DVLOG(3) << __FUNCTION__ << " Detected seeking backwards (media_time="
672 << media_time.InSecondsF() << "; buffered_start="
673 << ranges_.front()->GetStartTimestamp().InSecondsF()
674 << "), removing data from the back of buffered ranges first";
675 if (bytes_freed < bytes_to_free) {
676 // Remove data from the back, until we reach most recently appended GOP.
677 size_t back = FreeBuffers(bytes_to_free - bytes_freed, media_time, true);
678 DVLOG(3) << __FUNCTION__ << " Removed " << back << " bytes from the back"
679 << " ranges_=" << RangesToString(ranges_);
680 bytes_freed += back;
681 }
670 682
671 // Try removing data from the back of the SourceBuffer, until we reach the 683 if (bytes_freed < bytes_to_free) {
672 // most recent append position. 684 // Remove data from the front, removing as much as necessary.
673 if (bytes_freed < bytes_to_free) { 685 size_t back = FreeBuffers(bytes_to_free - bytes_freed,
674 size_t back = FreeBuffers(bytes_to_free - bytes_freed, media_time, true); 686 ranges_.back()->GetEndTimestamp(), false);
675 DVLOG(3) << __FUNCTION__ << " Removed " << back << " bytes from the back" 687 DVLOG(3) << __FUNCTION__ << " Removed " << back << " bytes from the back"
676 << " ranges_=" << RangesToString(ranges_); 688 << " ranges_=" << RangesToString(ranges_);
677 bytes_freed += back; 689 bytes_freed += back;
690 }
691 } else {
692 // Try removing data from the front of the SourceBuffer up to |media_time|
693 // position.
694 if (bytes_freed < bytes_to_free) {
695 size_t front =
696 FreeBuffers(bytes_to_free - bytes_freed, media_time, false);
697 DVLOG(3) << __FUNCTION__ << " Removed " << front << " bytes from the"
698 << " front. ranges_=" << RangesToString(ranges_);
699 bytes_freed += front;
700 }
701
702 // Try removing data from the back of the SourceBuffer, until we reach the
703 // most recent append position.
704 if (bytes_freed < bytes_to_free) {
705 size_t back = FreeBuffers(bytes_to_free - bytes_freed, media_time, true);
706 DVLOG(3) << __FUNCTION__ << " Removed " << back << " bytes from the back."
707 << " ranges_=" << RangesToString(ranges_);
708 bytes_freed += back;
709 }
678 } 710 }
679 711
680 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC" 712 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() << ": After GC"
681 << " bytes_to_free=" << bytes_to_free 713 << " bytes_to_free=" << bytes_to_free
682 << " bytes_freed=" << bytes_freed 714 << " bytes_freed=" << bytes_freed
683 << " ranges_=" << RangesToString(ranges_); 715 << " ranges_=" << RangesToString(ranges_);
684 716
685 return bytes_freed >= bytes_to_free; 717 return bytes_freed >= bytes_to_free;
686 } 718 }
687 719
(...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after
1731 return false; 1763 return false;
1732 1764
1733 DCHECK_NE(have_splice_buffers, have_preroll_buffer); 1765 DCHECK_NE(have_splice_buffers, have_preroll_buffer);
1734 splice_buffers_index_ = 0; 1766 splice_buffers_index_ = 0;
1735 pending_buffer_.swap(*out_buffer); 1767 pending_buffer_.swap(*out_buffer);
1736 pending_buffers_complete_ = false; 1768 pending_buffers_complete_ = false;
1737 return true; 1769 return true;
1738 } 1770 }
1739 1771
1740 } // namespace media 1772 } // namespace media
OLDNEW
« media/filters/chunk_demuxer_unittest.cc ('K') | « media/filters/chunk_demuxer_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698