Chromium Code Reviews| Index: media/filters/video_renderer_algorithm.cc |
| diff --git a/media/filters/video_renderer_algorithm.cc b/media/filters/video_renderer_algorithm.cc |
| index 8df9e5c90fe91b0b4af65961b26eb16012e4f496..59b6d51be5322e62b1ecc0ba6d127ad5ad513eaf 100644 |
| --- a/media/filters/video_renderer_algorithm.cc |
| +++ b/media/filters/video_renderer_algorithm.cc |
| @@ -363,25 +363,30 @@ void VideoRendererAlgorithm::EnqueueFrame( |
| frame_queue_.end(), frame); |
| DCHECK_GE(it - frame_queue_.begin(), 0); |
| - // If a frame was inserted before the first frame, update the index. On the |
| - // next call to Render() it will be dropped. |
| + // Drop any frames inserted before or at the last rendered frame if we've |
| + // already rendered any frames. |
| const size_t new_frame_index = it - frame_queue_.begin(); |
| if (new_frame_index <= last_frame_index_ && have_rendered_frames_) { |
| - if (new_frame_index == last_frame_index_ && |
| - frame->timestamp() == |
| - frame_queue_[last_frame_index_].frame->timestamp()) { |
| - DVLOG(2) << "Ignoring frame with the same timestamp as the most recently " |
| - "rendered frame."; |
| - ++frames_dropped_during_enqueue_; |
| - return; |
| - } |
| - ++last_frame_index_; |
| - } else if (new_frame_index < frame_queue_.size() && |
| - frame->timestamp() == |
| - frame_queue_[new_frame_index].frame->timestamp()) { |
| - DVLOG(2) << "Replacing existing frame with the same timestamp with most " |
| - << "recently received frame."; |
| - frame_queue_[new_frame_index].frame = frame; |
| + DVLOG(2) << "Dropping frame inserted before the last rendered frame."; |
| + ++frames_dropped_during_enqueue_; |
| + return; |
| + } |
| + |
| + // Drop any frames which are less than a millisecond apart in media time (even |
| + // those with timestamps matching an already enqueued frame), there's no way |
| + // we can reasonably render these frames; it's effectively a 1000fps limit. |
| + const base::TimeDelta delta = |
| + std::min(new_frame_index < frame_queue_.size() |
| + ? frame_queue_[new_frame_index].frame->timestamp() - |
| + frame->timestamp() |
| + : base::TimeDelta::Max(), |
| + new_frame_index > 0 |
| + ? frame->timestamp() - |
| + frame_queue_[new_frame_index - 1].frame->timestamp() |
| + : base::TimeDelta::Max()); |
| + if (delta < base::TimeDelta::FromMilliseconds(1)) { |
| + DVLOG(2) << "Dropping frame too close to an already enqueued frame: " |
| + << delta.InMicroseconds() << " us"; |
|
xhwang
2015/05/18 23:27:04
nit: Can "<< delta" work? That'll print a double v
DaleCurtis
2015/05/18 23:32:27
It would, but these values are < 1ms, so displayin
|
| ++frames_dropped_during_enqueue_; |
| return; |
| } |