| Index: media/filters/chunk_demuxer.cc | 
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc | 
| index a70868009b392c7bc1243aaba9b25f84bcc8b130..670a8b08343c34744c465e7304a876c481b34fe4 100644 | 
| --- a/media/filters/chunk_demuxer.cc | 
| +++ b/media/filters/chunk_demuxer.cc | 
| @@ -160,8 +160,8 @@ class ChunkDemuxerStream : public DemuxerStream { | 
| bool UpdateAudioConfig(const AudioDecoderConfig& config, const LogCB& log_cb); | 
| bool UpdateVideoConfig(const VideoDecoderConfig& config, const LogCB& log_cb); | 
|  | 
| -  void EndOfStream(); | 
| -  void CancelEndOfStream(); | 
| +  void MarkEndOfStream(); | 
| +  void UnmarkEndOfStream(); | 
|  | 
| // DemuxerStream methods. | 
| virtual void Read(const ReadCB& read_cb) OVERRIDE; | 
| @@ -532,14 +532,14 @@ bool ChunkDemuxerStream::UpdateVideoConfig(const VideoDecoderConfig& config, | 
| return stream_->UpdateVideoConfig(config); | 
| } | 
|  | 
| -void ChunkDemuxerStream::EndOfStream() { | 
| +void ChunkDemuxerStream::MarkEndOfStream() { | 
| base::AutoLock auto_lock(lock_); | 
| -  stream_->EndOfStream(); | 
| +  stream_->MarkEndOfStream(); | 
| } | 
|  | 
| -void ChunkDemuxerStream::CancelEndOfStream() { | 
| +void ChunkDemuxerStream::UnmarkEndOfStream() { | 
| base::AutoLock auto_lock(lock_); | 
| -  stream_->CancelEndOfStream(); | 
| +  stream_->UnmarkEndOfStream(); | 
| } | 
|  | 
| // DemuxerStream methods. | 
| @@ -882,21 +882,12 @@ void ChunkDemuxer::AppendData(const std::string& id, | 
|  | 
| { | 
| base::AutoLock auto_lock(lock_); | 
| +    DCHECK_NE(state_, ENDED); | 
|  | 
| // Capture if any of the SourceBuffers are waiting for data before we start | 
| // parsing. | 
| bool old_waiting_for_data = IsSeekWaitingForData_Locked(); | 
|  | 
| -    if (state_ == ENDED) { | 
| -      ChangeState_Locked(INITIALIZED); | 
| - | 
| -      if (audio_) | 
| -        audio_->CancelEndOfStream(); | 
| - | 
| -      if (video_) | 
| -        video_->CancelEndOfStream(); | 
| -    } | 
| - | 
| if (length == 0u) | 
| return; | 
|  | 
| @@ -1022,8 +1013,8 @@ bool ChunkDemuxer::SetTimestampOffset(const std::string& id, TimeDelta offset) { | 
| return source_state_map_[id]->SetTimestampOffset(offset); | 
| } | 
|  | 
| -void ChunkDemuxer::EndOfStream(PipelineStatus status) { | 
| -  DVLOG(1) << "EndOfStream(" << status << ")"; | 
| +void ChunkDemuxer::MarkEndOfStream(PipelineStatus status) { | 
| +  DVLOG(1) << "MarkEndOfStream(" << status << ")"; | 
| base::AutoLock auto_lock(lock_); | 
| DCHECK_NE(state_, WAITING_FOR_INIT); | 
| DCHECK_NE(state_, ENDED); | 
| @@ -1038,10 +1029,10 @@ void ChunkDemuxer::EndOfStream(PipelineStatus status) { | 
|  | 
| bool old_waiting_for_data = IsSeekWaitingForData_Locked(); | 
| if (audio_) | 
| -    audio_->EndOfStream(); | 
| +    audio_->MarkEndOfStream(); | 
|  | 
| if (video_) | 
| -    video_->EndOfStream(); | 
| +    video_->MarkEndOfStream(); | 
|  | 
| CompletePendingReadsIfPossible(); | 
|  | 
| @@ -1060,6 +1051,20 @@ void ChunkDemuxer::EndOfStream(PipelineStatus status) { | 
| } | 
| } | 
|  | 
| +void ChunkDemuxer::UnmarkEndOfStream() { | 
| +  DVLOG(1) << "UnmarkEndOfStream()"; | 
| +  base::AutoLock auto_lock(lock_); | 
| +  DCHECK_EQ(state_, ENDED); | 
| + | 
| +  ChangeState_Locked(INITIALIZED); | 
| + | 
| +  if (audio_) | 
| +    audio_->UnmarkEndOfStream(); | 
| + | 
| +  if (video_) | 
| +    video_->UnmarkEndOfStream(); | 
| +} | 
| + | 
| void ChunkDemuxer::Shutdown() { | 
| DVLOG(1) << "Shutdown()"; | 
| base::AutoLock auto_lock(lock_); | 
|  |