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) { |