Chromium Code Reviews| Index: media/filters/video_renderer_base.cc |
| diff --git a/media/filters/video_renderer_base.cc b/media/filters/video_renderer_base.cc |
| index e4d90c78d2fe70e6fccb40691f393122791d533e..929ac82268712ff99552128b4dd481d8b42dd917 100644 |
| --- a/media/filters/video_renderer_base.cc |
| +++ b/media/filters/video_renderer_base.cc |
| @@ -15,6 +15,10 @@ |
| namespace media { |
| +base::TimeDelta VideoRendererBase::kMaxLastFrameDuration() { |
| + return base::TimeDelta::FromMilliseconds(250); |
| +} |
| + |
| VideoRendererBase::VideoRendererBase(const base::Closure& paint_cb, |
| const SetOpaqueCB& set_opaque_cb, |
| bool drop_frames) |
| @@ -484,13 +488,30 @@ void VideoRendererBase::AddReadyFrame(const scoped_refptr<VideoFrame>& frame) { |
| // frame rate. Another way for this to happen is for the container to state a |
| // smaller duration than the largest packet timestamp. |
| base::TimeDelta duration = get_duration_cb_.Run(); |
| - if (frame->GetTimestamp() > duration || frame->IsEndOfStream()) { |
| + if (frame->IsEndOfStream()) { |
| + base::TimeDelta end_timestamp = kNoTimestamp(); |
| + if (!ready_frames_.empty()) { |
| + end_timestamp = std::min( |
| + duration, |
| + ready_frames_.back()->GetTimestamp() + kMaxLastFrameDuration()); |
| + } else if (current_frame_) { |
| + end_timestamp = |
| + std::min(duration, |
| + current_frame_->GetTimestamp() + kMaxLastFrameDuration()); |
| + } |
| + frame->SetTimestamp(end_timestamp); |
| + } else if (frame->GetTimestamp() > duration) { |
| frame->SetTimestamp(duration); |
| } |
| ready_frames_.push_back(frame); |
| DCHECK_LE(NumFrames_Locked(), limits::kMaxVideoFrames); |
| - time_cb_.Run(frame->GetTimestamp()); |
| + |
| + base::TimeDelta maxClockTime = |
|
scherkus (not reviewing)
2012/08/07 23:03:19
unix_hacker
|
| + frame->IsEndOfStream() ? duration : frame->GetTimestamp(); |
| + DCHECK(maxClockTime != kNoTimestamp()); |
| + time_cb_.Run(maxClockTime); |
|
scherkus (not reviewing)
2012/08/07 22:01:00
wait a tick -- what is this time_cb_ used for agai
scherkus (not reviewing)
2012/08/07 23:03:19
Discussed offline -- this is really a max_time_cb_
|
| + |
| frame_available_.Signal(); |
| } |