| Index: media/filters/legacy_frame_processor.cc | 
| diff --git a/media/filters/legacy_frame_processor.cc b/media/filters/legacy_frame_processor.cc | 
| index f7b0547f586e85d69ec6cc96461eba4c1459e83f..de1deb7dfe0b983a6fff269891ef69c1075e5e68 100644 | 
| --- a/media/filters/legacy_frame_processor.cc | 
| +++ b/media/filters/legacy_frame_processor.cc | 
| @@ -164,10 +164,17 @@ void LegacyFrameProcessor::FilterWithAppendWindow( | 
| // because we can only resume decoding at keyframes. | 
| base::TimeDelta presentation_timestamp = (*itr)->timestamp(); | 
|  | 
| -    // TODO(acolwell): Change |frame_end_timestamp| value to | 
| +    // TODO(acolwell): Change |frame_end_timestamp| value to always be | 
| // |presentation_timestamp + (*itr)->duration()|, like the spec | 
| // requires, once frame durations are actually present in all buffers. | 
| +    // See http://crbug.com/351166. | 
| base::TimeDelta frame_end_timestamp = presentation_timestamp; | 
| +    base::TimeDelta frame_duration = (*itr)->duration(); | 
| +    if (frame_duration > base::TimeDelta()) { | 
| +      DCHECK(frame_duration != kNoTimestamp()); | 
| +      frame_end_timestamp += frame_duration; | 
| +    } | 
| + | 
| if (presentation_timestamp < append_window_start || | 
| frame_end_timestamp > append_window_end) { | 
| DVLOG(1) << "Dropping buffer outside append window." | 
| @@ -206,7 +213,11 @@ bool LegacyFrameProcessor::AppendAndUpdateDuration( | 
| if (!stream || !stream->Append(buffers)) | 
| return false; | 
|  | 
| -  increase_duration_cb_.Run(buffers.back()->timestamp(), stream); | 
| +  // Approximate spec's "highest presentation end timestamp". | 
| +  base::TimeDelta highest_end_timestamp = stream->GetBufferedDuration(); | 
| +  DCHECK(highest_end_timestamp > base::TimeDelta()); | 
| + | 
| +  increase_duration_cb_.Run(highest_end_timestamp); | 
| return true; | 
| } | 
|  | 
|  |