Chromium Code Reviews| Index: media/filters/decoder_stream.cc |
| diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc |
| index 039b2b95f2276517e89902fc4815227d040b6cd4..1c244f2609c949060003877fdc237b50aecbc539 100644 |
| --- a/media/filters/decoder_stream.cc |
| +++ b/media/filters/decoder_stream.cc |
| @@ -336,7 +336,19 @@ void DecoderStream<StreamType>::Decode( |
| if (!decoded_frames_since_fallback_) |
| pending_buffers_.push_back(buffer); |
| - DecodeInternal(buffer); |
| + // It's possible for a buffer to arrive from the demuxer right after the |
| + // fallback decoder successfully completed its initialization. At this point |
| + // |pending_buffers_| has alreadby been copied to |fallback_buffers_| and we |
|
sandersd (OOO until July 31)
2016/05/26 18:56:47
already
tguilbert
2016/05/26 22:01:27
Done.
|
| + // need to append it ourselves. |
| + if (!fallback_buffers_.empty()) { |
| + fallback_buffers_.push_back(buffer); |
| + |
| + scoped_refptr<DecoderBuffer> temp = fallback_buffers_.front(); |
| + fallback_buffers_.pop_front(); |
| + DecodeInternal(temp); |
| + } else { |
| + DecodeInternal(buffer); |
| + } |
| } |
| template <DemuxerStream::Type StreamType> |
| @@ -538,12 +550,13 @@ void DecoderStream<StreamType>::OnBufferReady( |
| : "NULL"); |
| DCHECK(task_runner_->BelongsToCurrentThread()); |
| + DCHECK(pending_demuxer_read_); |
| if (decoded_frames_since_fallback_) { |
| DCHECK(state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) |
| << state_; |
| } else { |
| DCHECK(state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR || |
| - STATE_REINITIALIZING_DECODER) |
| + state_ == STATE_REINITIALIZING_DECODER || state_ == STATE_NORMAL) |
| << state_; |
| } |
| DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status; |
| @@ -581,9 +594,8 @@ void DecoderStream<StreamType>::OnBufferReady( |
| return; |
| } |
| - // Decoding has been stopped (e.g due to an error). |
| - if (state_ != STATE_PENDING_DEMUXER_READ) { |
| - DCHECK(state_ == STATE_ERROR); |
| + // Decoding has been stopped. |
| + if (state_ == STATE_ERROR) { |
| DCHECK(read_cb_.is_null()); |
| if (!reset_cb_.is_null()) { |