Index: media/filters/video_renderer_algorithm.cc |
diff --git a/media/filters/video_renderer_algorithm.cc b/media/filters/video_renderer_algorithm.cc |
index 5bad074339eb2f420bd39a3652079f63738cfa41..b1817d457480ef25e04843a334d436369f0ef812 100644 |
--- a/media/filters/video_renderer_algorithm.cc |
+++ b/media/filters/video_renderer_algorithm.cc |
@@ -30,13 +30,13 @@ bool VideoRendererAlgorithm::ReadyFrame::operator<( |
} |
VideoRendererAlgorithm::VideoRendererAlgorithm( |
- const TimeConverterCB& time_converter_cb) |
+ const TimeSource::WallClockTimeCB& wall_clock_time_cb) |
: cadence_estimator_(base::TimeDelta::FromSeconds( |
kMinimumAcceptableTimeBetweenGlitchesSecs)), |
- time_converter_cb_(time_converter_cb), |
+ wall_clock_time_cb_(wall_clock_time_cb), |
frame_duration_calculator_(kMovingAverageSamples), |
frame_dropping_disabled_(false) { |
- DCHECK(!time_converter_cb_.is_null()); |
+ DCHECK(!wall_clock_time_cb_.is_null()); |
Reset(); |
} |
@@ -381,7 +381,14 @@ bool VideoRendererAlgorithm::UpdateFrameStatistics() { |
for (size_t i = 0; i < frame_queue_.size(); ++i) { |
ReadyFrame& frame = frame_queue_[i]; |
const bool new_frame = frame.start_time.is_null(); |
- frame.start_time = time_converter_cb_.Run(frame.frame->timestamp()); |
+ frame.start_time = wall_clock_time_cb_.Run( |
+ frame.frame->timestamp(), |
+ frame_queue_.size() == 1 |
+ ? TimeSource::SINGLE_TIMESTAMP |
+ : (i == 0 ? TimeSource::SUSPEND_TIME |
+ : (i + 1 == frame_queue_.size() |
+ ? TimeSource::RESUME_TIME |
+ : TimeSource::TIME_IS_SUSPENDED))); |
// If time stops or never started, exit immediately. |
if (frame.start_time.is_null()) { |
@@ -389,16 +396,14 @@ bool VideoRendererAlgorithm::UpdateFrameStatistics() { |
return false; |
} |
- // TODO(dalecurtis): An unlucky tick of a playback rate change could cause |
- // this to skew so much that time goes backwards between calls. Fix this by |
- // either converting all timestamps at once or with some retry logic. |
if (i > 0) { |
frame_queue_[i - 1].end_time = frame.start_time; |
- const base::TimeDelta delta = |
- frame.start_time - frame_queue_[i - 1].start_time; |
- CHECK_GT(delta, base::TimeDelta()); |
- if (new_frame) |
+ if (new_frame) { |
+ const base::TimeDelta delta = |
+ frame.start_time - frame_queue_[i - 1].start_time; |
+ DCHECK_GT(delta, base::TimeDelta()); |
frame_duration_calculator_.AddSample(delta); |
+ } |
} |
} |