Chromium Code Reviews| Index: media/filters/chunk_demuxer.cc |
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc |
| index 581b245dbc2bb77782ce893c5a05ad7f26dcdbe4..6e5ded89bf7e1b36ff47049651792d2e7189399f 100644 |
| --- a/media/filters/chunk_demuxer.cc |
| +++ b/media/filters/chunk_demuxer.cc |
| @@ -173,6 +173,7 @@ class ChunkDemuxerStream : public DemuxerStream { |
| void StartWaitingForSeek(); |
| void Seek(TimeDelta time); |
| + void BeginReturningNullBuffers(); |
| bool IsSeekPending() const; |
| // Add buffers to this stream. Buffers are stored in SourceBufferStreams, |
| @@ -214,6 +215,7 @@ class ChunkDemuxerStream : public DemuxerStream { |
| enum State { |
| RETURNING_DATA_FOR_READS, |
| WAITING_FOR_SEEK, |
| + CANCELED, |
| SHUTDOWN, |
| }; |
| @@ -280,12 +282,21 @@ void ChunkDemuxerStream::Seek(TimeDelta time) { |
| DCHECK(read_cbs_.empty()); |
| + // Ignore seek requests when cancelled. |
| + if (state_ == CANCELED) |
| + return; |
| + |
| stream_->Seek(time); |
| if (state_ == WAITING_FOR_SEEK) |
| ChangeState_Locked(RETURNING_DATA_FOR_READS); |
| } |
| +void ChunkDemuxerStream::BeginReturningNullBuffers() { |
| + base::AutoLock auto_lock(lock_); |
| + ChangeState_Locked(CANCELED); |
|
acolwell GONE FROM CHROMIUM
2012/08/07 20:26:51
I think you may need to copy the read_cbs code fro
vrk (LEFT CHROMIUM)
2012/08/07 22:44:51
Done.
|
| +} |
| + |
| bool ChunkDemuxerStream::IsSeekPending() const { |
| base::AutoLock auto_lock(lock_); |
| return stream_->IsSeekPending(); |
| @@ -490,6 +501,7 @@ bool ChunkDemuxerStream::GetNextBuffer_Locked( |
| return true; |
| } |
| break; |
| + case CANCELED: |
| case WAITING_FOR_SEEK: |
| // Null buffers should be returned in this state since we are waiting |
| // for a seek. Any buffers in the SourceBuffer should NOT be returned |
| @@ -605,6 +617,25 @@ void ChunkDemuxer::StartWaitingForSeek() { |
| ChangeState_Locked(INITIALIZED); |
| } |
| +void ChunkDemuxer::CancelPendingSeek() { |
| + PipelineStatusCB cb; |
| + { |
| + base::AutoLock auto_lock(lock_); |
| + if (IsSeekPending_Locked() && !seek_cb_.is_null()) { |
| + std::swap(cb, seek_cb_); |
| + } |
| + } |
| + |
| + if (audio_) |
| + audio_->BeginReturningNullBuffers(); |
|
acolwell GONE FROM CHROMIUM
2012/08/07 20:26:51
nit:s/BeginReturningNullBuffers/CancelPendingSeek/
vrk (LEFT CHROMIUM)
2012/08/07 22:44:51
...yeah that would make more sense :P Done!
|
| + |
| + if (video_) |
| + video_->BeginReturningNullBuffers(); |
| + |
| + if (!cb.is_null()) |
| + cb.Run(PIPELINE_OK); |
| +} |
| + |
| ChunkDemuxer::Status ChunkDemuxer::AddId(const std::string& id, |
| const std::string& type, |
| std::vector<std::string>& codecs) { |