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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: media/filters/source_buffer_stream.cc
diff --git a/media/filters/source_buffer_stream.cc b/media/filters/source_buffer_stream.cc
index 05f23379ddcd07a9cf365ba6d8653ecedd2ecd62..2f90bd74ea787bc4778035c97f99379e1a8a2451 100644
--- a/media/filters/source_buffer_stream.cc
+++ b/media/filters/source_buffer_stream.cc
@@ -1600,68 +1600,33 @@ DecodeTimestamp SourceBufferStream::FindNewSelectedRangeSeekTimestamp(
RangeList::iterator itr = ranges_.begin();
+ // When checking a range to see if it has or begins soon enough after
+ // |start_timestamp|, use the fudge room to determine "soon enough".
+ DecodeTimestamp start_timestamp_plus_fudge =
+ start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
+
+ // Multiple ranges could be within the fudge room, because the fudge room is
+ // dynamic based on max inter-buffer distance seen so far. Optimistically
+ // check the earliest ones first.
for (; itr != ranges_.end(); ++itr) {
- if ((*itr)->GetEndTimestamp() >= start_timestamp) {
+ DecodeTimestamp range_start = (*itr)->GetStartTimestamp();
+ 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
break;
+ if ((*itr)->GetEndTimestamp() < start_timestamp)
+ continue;
+ DecodeTimestamp search_timestamp = start_timestamp;
+ if (start_timestamp < range_start &&
+ start_timestamp_plus_fudge >= range_start) {
+ search_timestamp = range_start;
}
+ DecodeTimestamp keyframe_timestamp =
+ (*itr)->NextKeyframeTimestamp(search_timestamp);
+ if (keyframe_timestamp != kNoDecodeTimestamp())
+ return keyframe_timestamp;
}
- if (itr == ranges_.end()) {
- DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName()
- << " no buffered data for dts=" << start_timestamp.InSecondsF();
- return kNoDecodeTimestamp();
- }
-
- // First check for a keyframe timestamp >= |start_timestamp|
- // in the current range.
- DecodeTimestamp keyframe_timestamp =
- (*itr)->NextKeyframeTimestamp(start_timestamp);
-
- if (keyframe_timestamp != kNoDecodeTimestamp())
- return keyframe_timestamp;
-
- // If a keyframe was not found then look for a keyframe that is
- // "close enough" in the current or next range.
- DecodeTimestamp end_timestamp =
- start_timestamp + ComputeFudgeRoom(GetMaxInterbufferDistance());
- DCHECK(start_timestamp < end_timestamp);
-
- // Make sure the current range doesn't start beyond |end_timestamp|.
- if ((*itr)->GetStartTimestamp() >= end_timestamp)
- return kNoDecodeTimestamp();
-
- keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
-
- // Check to see if the keyframe is within the acceptable range
- // (|start_timestamp|, |end_timestamp|].
- if (keyframe_timestamp != kNoDecodeTimestamp() &&
- start_timestamp < keyframe_timestamp &&
- keyframe_timestamp <= end_timestamp) {
- return keyframe_timestamp;
- }
-
- // If |end_timestamp| is within this range, then no other checks are
- // necessary.
- if (end_timestamp <= (*itr)->GetEndTimestamp())
- return kNoDecodeTimestamp();
-
- // Move on to the next range.
- ++itr;
-
- // Return early if the next range does not contain |end_timestamp|.
- if (itr == ranges_.end() || (*itr)->GetStartTimestamp() >= end_timestamp)
- return kNoDecodeTimestamp();
-
- keyframe_timestamp = (*itr)->KeyframeBeforeTimestamp(end_timestamp);
-
- // Check to see if the keyframe is within the acceptable range
- // (|start_timestamp|, |end_timestamp|].
- if (keyframe_timestamp != kNoDecodeTimestamp() &&
- start_timestamp < keyframe_timestamp &&
- keyframe_timestamp <= end_timestamp) {
- return keyframe_timestamp;
- }
-
+ DVLOG(2) << __FUNCTION__ << " " << GetStreamTypeName()
+ << " no buffered data for dts=" << start_timestamp.InSecondsF();
return kNoDecodeTimestamp();
}
« 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