| Index: media/filters/video_decoder_impl.cc
|
| diff --git a/media/filters/video_decoder_impl.cc b/media/filters/video_decoder_impl.cc
|
| index a4a655efd13e493a7fda11f3dcdc7c1c7f23ee18..9932620bf01791fa8065d976e4c01a677cb8d2f1 100644
|
| --- a/media/filters/video_decoder_impl.cc
|
| +++ b/media/filters/video_decoder_impl.cc
|
| @@ -212,29 +212,38 @@ VideoDecoderImpl::TimeTuple VideoDecoderImpl::FindPtsAndDuration(
|
|
|
| // First search the VideoFrame for the pts. This is the most authoritative.
|
| // Make a special exclusion for the value pts == 0. Though this is
|
| - // technically a valid value, it seems a number of ffmpeg codecs will
|
| + // technically a valid value, it seems a number of FFmpeg codecs will
|
| // mistakenly always set pts to 0.
|
| + //
|
| + // TODO(scherkus): FFmpegVideoDecodeEngine should be able to detect this
|
| + // situation and set the timestamp to kInvalidTimestamp.
|
| DCHECK(frame);
|
| base::TimeDelta timestamp = frame->GetTimestamp();
|
| if (timestamp != StreamSample::kInvalidTimestamp &&
|
| timestamp.ToInternalValue() != 0) {
|
| - pts.timestamp = ConvertTimestamp(time_base, timestamp.ToInternalValue());
|
| - pts.duration = ConvertTimestamp(time_base, 1 + frame->GetRepeatCount());
|
| - return pts;
|
| - }
|
| -
|
| - if (!pts_heap.IsEmpty()) {
|
| + pts.timestamp = timestamp;
|
| + } else if (!pts_heap.IsEmpty()) {
|
| // If the frame did not have pts, try to get the pts from the |pts_heap|.
|
| pts.timestamp = pts_heap.Top();
|
| - } else {
|
| - DCHECK(last_pts.timestamp != StreamSample::kInvalidTimestamp);
|
| - DCHECK(last_pts.duration != StreamSample::kInvalidTimestamp);
|
| - // Unable to read the pts from anywhere. Time to guess.
|
| + } else if (last_pts.timestamp != StreamSample::kInvalidTimestamp &&
|
| + last_pts.duration != StreamSample::kInvalidTimestamp) {
|
| + // Guess assuming this frame was the same as the last frame.
|
| pts.timestamp = last_pts.timestamp + last_pts.duration;
|
| + } else {
|
| + // Now we really have no clue!!! Mark an invalid timestamp and let the
|
| + // video renderer handle it (i.e., drop frame).
|
| + pts.timestamp = StreamSample::kInvalidTimestamp;
|
| }
|
|
|
| - // Fill in the duration while accounting for repeated frames.
|
| - pts.duration = ConvertTimestamp(time_base, 1);
|
| + // Fill in the duration, using the frame itself as the authoratative source.
|
| + base::TimeDelta duration = frame->GetDuration();
|
| + if (duration != StreamSample::kInvalidTimestamp &&
|
| + duration.ToInternalValue() != 0) {
|
| + pts.duration = duration;
|
| + } else {
|
| + // Otherwise assume a normal frame duration.
|
| + pts.duration = ConvertTimestamp(time_base, 1);
|
| + }
|
|
|
| return pts;
|
| }
|
|
|