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

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

Issue 1898373002: MSE: More cleanly handle stall resolution edge cases (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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 1582 matching lines...) Expand 10 before | Expand all | Expand 10 after
1593 seek_timestamp); 1593 seek_timestamp);
1594 } 1594 }
1595 1595
1596 DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp( 1596 DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp(
1597 const DecodeTimestamp start_timestamp) { 1597 const DecodeTimestamp start_timestamp) {
1598 DCHECK(start_timestamp != kNoDecodeTimestamp()); 1598 DCHECK(start_timestamp != kNoDecodeTimestamp());
1599 DCHECK(start_timestamp >= DecodeTimestamp()); 1599 DCHECK(start_timestamp >= DecodeTimestamp());
1600 1600
1601 RangeList::iterator itr = ranges_.begin(); 1601 RangeList::iterator itr = ranges_.begin();
1602 1602
1603 // When checking a range to see if it has or begins soon enough after
1604 // |start_timestamp|, use the fudge room to determine "soon enough".
1605 DecodeTimestamp start_timestamp_plus_fudge =
1606 start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
1607
1608 // Multiple ranges could be within the fudge room, because the fudge room is
1609 // dynamic based on max inter-buffer distance seen so far. Optimistically
1610 // check the earliest ones first.
1603 for (; itr != ranges_.end(); ++itr) { 1611 for (; itr != ranges_.end(); ++itr) {
1604 if ((*itr)->GetEndTimestamp() >= start_timestamp) { 1612 DecodeTimestamp range_start = (*itr)->GetStartTimestamp();
1613 if (range_start >= start_timestamp_plus_fudge)
chcunningham 2016/04/20 20:14:27 Do you want this comparison to be GE vs GT? IIUC G
wolenetz 2016/04/20 21:28:01 Hmm. I had based this on the previous logic in l16
1605 break; 1614 break;
1615 if ((*itr)->GetEndTimestamp() < start_timestamp)
1616 continue;
1617 DecodeTimestamp search_timestamp = start_timestamp;
1618 if (start_timestamp < range_start &&
1619 start_timestamp_plus_fudge >= range_start) {
1620 search_timestamp = range_start;
1606 } 1621 }
1622 DecodeTimestamp keyframe_timestamp =
1623 (*itr)->NextKeyframeTimestamp(search_timestamp);
1624 if (keyframe_timestamp != kNoDecodeTimestamp())
1625 return keyframe_timestamp;
1607 } 1626 }
1608 1627
1609 if (itr == ranges_.end()) { 1628 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName()
1610 DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName() 1629 << " no buffered data for dts=" << start_timestamp.InSecondsF();
1611 << " no buffered data for dts=" << start_timestamp.InSecondsF();
1612 return kNoDecodeTimestamp();
1613 }
1614
1615 // First check for a keyframe timestamp >= |start_timestamp|
1616 // in the current range.
1617 DecodeTimestamp keyframe_timestamp =
1618 (*itr)->NextKeyframeTimestamp(start_timestamp);
1619
1620 if (keyframe_timestamp != kNoDecodeTimestamp())
1621 return keyframe_timestamp;
1622
1623 // If a keyframe was not found then look for a keyframe that is
1624 // "close enough" in the current or next range.
1625 DecodeTimestamp end_timestamp =
1626 start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
1627 DCHECK(start_timestamp < end_timestamp);
1628
1629 // Make sure the current range doesn't start beyond |end_timestamp|.
1630 if ((*itr)->GetStartTimestamp() >= end_timestamp)
1631 return kNoDecodeTimestamp();
1632
1633 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
1634
1635 // Check to see if the keyframe is within the acceptable range
1636 // (|start_timestamp|, |end_timestamp|].
1637 if (keyframe_timestamp != kNoDecodeTimestamp() &&
1638 start_timestamp < keyframe_timestamp &&
1639 keyframe_timestamp <= end_timestamp) {
1640 return keyframe_timestamp;
1641 }
1642
1643 // If |end_timestamp| is within this range, then no other checks are
1644 // necessary.
1645 if (end_timestamp <= (*itr)->GetEndTimestamp())
1646 return kNoDecodeTimestamp();
1647
1648 // Move on to the next range.
1649 ++itr;
1650
1651 // Return early if the next range does not contain |end_timestamp|.
1652 if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp)
1653 return kNoDecodeTimestamp();
1654
1655 keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
1656
1657 // Check to see if the keyframe is within the acceptable range
1658 // (|start_timestamp|, |end_timestamp|].
1659 if (keyframe_timestamp != kNoDecodeTimestamp() &&
1660 start_timestamp < keyframe_timestamp &&
1661 keyframe_timestamp <= end_timestamp) {
1662 return keyframe_timestamp;
1663 }
1664
1665 return kNoDecodeTimestamp(); 1630 return kNoDecodeTimestamp();
1666 } 1631 }
1667 1632
1668 DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp( 1633 DecodeTimestamp SourceBufferStream::FindKeyframeAfterTimestamp(
1669 const DecodeTimestamp timestamp) { 1634 const DecodeTimestamp timestamp) {
1670 DCHECK(timestamp != kNoDecodeTimestamp()); 1635 DCHECK(timestamp != kNoDecodeTimestamp());
1671 1636
1672 RangeList::iterator itr = FindExistingRangeFor(timestamp); 1637 RangeList::iterator itr = FindExistingRangeFor(timestamp);
1673 1638
1674 if (itr == ranges_.end()) 1639 if (itr == ranges_.end())
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 return false; 1804 return false;
1840 1805
1841 DCHECK_NE(have_splice_buffers, have_preroll_buffer); 1806 DCHECK_NE(have_splice_buffers, have_preroll_buffer);
1842 splice_buffers_index_ = 0; 1807 splice_buffers_index_ = 0;
1843 pending_buffer_.swap(*out_buffer); 1808 pending_buffer_.swap(*out_buffer);
1844 pending_buffers_complete_ = false; 1809 pending_buffers_complete_ = false;
1845 return true; 1810 return true;
1846 } 1811 }
1847 1812
1848 } // namespace media 1813 } // namespace media
OLDNEW
« no previous file with comments | « no previous file | media/filters/source_buffer_stream_unittest.cc » ('j') | media/filters/source_buffer_stream_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698