Index: media/renderers/renderer_impl.cc |
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc |
index c06553a0d7dc9f955352b26b57cd066208df6fa7..8efe432a7ccd64f8fb5dc982ff2a17b415fbe05d 100644 |
--- a/media/renderers/renderer_impl.cc |
+++ b/media/renderers/renderer_impl.cc |
@@ -405,6 +405,10 @@ void RendererImpl::OnAudioRendererFlushDone() { |
DCHECK_EQ(state_, STATE_FLUSHING); |
DCHECK(!flush_cb_.is_null()); |
+ // If we had a deferred video renderer underflow prior to the flush, it should |
+ // have been cleared by the audio renderer changing to BUFFERING_HAVE_NOTHING. |
+ DCHECK(deferred_underflow_cb_.IsCancelled()); |
+ |
DCHECK_EQ(audio_buffering_state_, BUFFERING_HAVE_NOTHING); |
audio_ended_ = false; |
FlushVideoRenderer(); |
@@ -457,10 +461,12 @@ void RendererImpl::OnBufferingStateChanged(BufferingState* buffering_state, |
bool was_waiting_for_enough_data = WaitingForEnoughData(); |
- // When audio is present, defer underflow callbacks for some time to avoid |
- // unnecessary glitches in audio; see http://crbug.com/144683#c53. |
+ // When audio is present and has enough data, defer video underflow callbacks |
+ // for some time to avoid unnecessary glitches in audio; see |
+ // http://crbug.com/144683#c53. |
if (audio_renderer_ && !is_audio && state_ == STATE_PLAYING) { |
if (video_buffering_state_ == BUFFERING_HAVE_ENOUGH && |
+ audio_buffering_state_ == BUFFERING_HAVE_ENOUGH && |
new_buffering_state == BUFFERING_HAVE_NOTHING && |
deferred_underflow_cb_.IsCancelled()) { |
deferred_underflow_cb_.Reset(base::Bind( |