Index: media/filters/audio_renderer_impl.cc |
diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc |
index fdfb45df916a5a1d3b376ceb9151b5b0c44d383a..fc5b7bf589af914cec7184837c8f763606d5d9b0 100644 |
--- a/media/filters/audio_renderer_impl.cc |
+++ b/media/filters/audio_renderer_impl.cc |
@@ -399,8 +399,22 @@ bool AudioRendererImpl::HandleSplicerBuffer( |
if (state_ == kUnderflow || state_ == kRebuffering) |
ChangeState_Locked(kPlaying); |
} else { |
- if (state_ == kPrerolling && IsBeforePrerollTime(buffer)) |
- return true; |
+ if (state_ == kPrerolling) { |
+ if (IsBeforePrerollTime(buffer)) |
+ return true; |
+ |
+ // Trim off any additional time before the preroll timestamp. |
+ const base::TimeDelta trim_time = |
+ preroll_timestamp_ - buffer->timestamp(); |
+ if (trim_time > base::TimeDelta()) { |
+ buffer->TrimStart(buffer->frame_count() * |
+ (static_cast<double>(trim_time.InMicroseconds()) / |
+ buffer->duration().InMicroseconds())); |
+ } |
+ // If the entire buffer was trimmed, request a new one. |
+ if (!buffer->frame_count()) |
+ return true; |
+ } |
if (state_ != kUninitialized && state_ != kStopped) |
algorithm_->EnqueueBuffer(buffer); |