| Index: media/filters/video_renderer_algorithm.cc
|
| diff --git a/media/filters/video_renderer_algorithm.cc b/media/filters/video_renderer_algorithm.cc
|
| index 9402c09c818b6cfbb4675bfb4fe45a9c2ebc61a2..55182e93c54c4bb603bb03fe605812c0edaca519 100644
|
| --- a/media/filters/video_renderer_algorithm.cc
|
| +++ b/media/filters/video_renderer_algorithm.cc
|
| @@ -93,7 +93,9 @@ scoped_refptr<VideoFrame> VideoRendererAlgorithm::Render(
|
| base::TimeDelta selected_frame_drift;
|
|
|
| // Step 4: Attempt to find the best frame by cadence.
|
| - int frame_to_render = FindBestFrameByCadence();
|
| + int cadence_overage = 0;
|
| + int frame_to_render =
|
| + FindBestFrameByCadence(first_frame_ ? nullptr : &cadence_overage);
|
| if (frame_to_render >= 0) {
|
| selected_frame_drift =
|
| CalculateAbsoluteDriftForFrame(deadline_min, frame_to_render);
|
| @@ -118,6 +120,7 @@ scoped_refptr<VideoFrame> VideoRendererAlgorithm::Render(
|
| }
|
|
|
| if (frame_to_render >= 0) {
|
| + cadence_overage = 0;
|
| selected_frame_drift =
|
| CalculateAbsoluteDriftForFrame(deadline_min, frame_to_render);
|
| }
|
| @@ -127,8 +130,10 @@ scoped_refptr<VideoFrame> VideoRendererAlgorithm::Render(
|
| // least crappy option based on the drift from the deadline. If we're here the
|
| // selection is going to be bad because it means no suitable frame has any
|
| // coverage of the deadline interval.
|
| - if (frame_to_render < 0 || selected_frame_drift > max_acceptable_drift_)
|
| + if (frame_to_render < 0 || selected_frame_drift > max_acceptable_drift_) {
|
| + cadence_overage = 0;
|
| frame_to_render = FindBestFrameByDrift(deadline_min, &selected_frame_drift);
|
| + }
|
|
|
| last_render_had_glitch_ = selected_frame_drift > max_acceptable_drift_;
|
| DVLOG_IF(2, last_render_had_glitch_)
|
| @@ -196,7 +201,22 @@ scoped_refptr<VideoFrame> VideoRendererAlgorithm::Render(
|
|
|
| // Step 8: Congratulations, the frame selection gauntlet has been passed!
|
| last_frame_index_ = 0;
|
| - ++frame_queue_.front().render_count;
|
| +
|
| + // If we ended up choosing a frame selected by cadence, carry over the overage
|
| + // values from the previous frame. Overage is treated as having been
|
| + // displayed and dropped for each count. If the frame wasn't selected by
|
| + // cadence, |cadence_overage| will be zero.
|
| + //
|
| + // We also don't want to start counting render counts until the first frame
|
| + // has reached its presentation time; which is considered to be when its
|
| + // start time is at most |render_interval_| / 2 before |deadline_min|.
|
| + if (!first_frame_ ||
|
| + deadline_min >= frame_queue_.front().start_time - render_interval_ / 2) {
|
| + frame_queue_.front().render_count += cadence_overage + 1;
|
| + frame_queue_.front().drop_count += cadence_overage;
|
| + first_frame_ = false;
|
| + }
|
| +
|
| DCHECK(frame_queue_.front().frame);
|
| return frame_queue_.front().frame;
|
| }
|
| @@ -260,6 +280,7 @@ void VideoRendererAlgorithm::Reset() {
|
| frame_queue_.clear();
|
| cadence_estimator_.Reset();
|
| frame_duration_calculator_.Reset();
|
| + first_frame_ = true;
|
|
|
| // Default to ATSC IS/191 recommendations for maximum acceptable drift before
|
| // we have enough frames to base the maximum on frame duration.
|
| @@ -286,7 +307,7 @@ size_t VideoRendererAlgorithm::EffectiveFramesQueued() const {
|
| }
|
|
|
| // Find the first usable frame to start counting from.
|
| - const int start_index = FindBestFrameByCadenceInternal(nullptr);
|
| + const int start_index = FindBestFrameByCadence(nullptr);
|
| if (start_index < 0)
|
| return 0;
|
|
|
| @@ -472,27 +493,12 @@ void VideoRendererAlgorithm::UpdateCadenceForFrames() {
|
| }
|
| }
|
|
|
| -int VideoRendererAlgorithm::FindBestFrameByCadence() {
|
| +int VideoRendererAlgorithm::FindBestFrameByCadence(
|
| + int* remaining_overage) const {
|
| DCHECK(!frame_queue_.empty());
|
| if (!cadence_estimator_.has_cadence())
|
| return -1;
|
|
|
| - int remaining_overage = 0;
|
| - const int best_frame =
|
| - FindBestFrameByCadenceInternal(&remaining_overage);
|
| - if (best_frame < 0)
|
| - return -1;
|
| -
|
| - DCHECK_GE(remaining_overage, 0);
|
| -
|
| - // Overage is treated as having been displayed and dropped for each count.
|
| - frame_queue_[best_frame].render_count += remaining_overage;
|
| - frame_queue_[best_frame].drop_count += remaining_overage;
|
| - return best_frame;
|
| -}
|
| -
|
| -int VideoRendererAlgorithm::FindBestFrameByCadenceInternal(
|
| - int* remaining_overage) const {
|
| DCHECK(!frame_queue_.empty());
|
| DCHECK(cadence_estimator_.has_cadence());
|
| const ReadyFrame& current_frame = frame_queue_[last_frame_index_];
|
|
|