| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index 564bbf544e7ff8e102df2d7f3cc8512e74bd1898..af7927bdc0cb4d394f17ab2d593822e3b7ddfa4c 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -211,9 +211,10 @@ class ChunkDemuxerStream : public DemuxerStream {
|
| void CreateReadDoneClosures_Locked(ClosureQueue* closures);
|
|
|
| // Gets the value to pass to the next Read() callback. Returns true if
|
| - // |buffer| should be passed to the callback. False indicates that |buffer|
|
| - // was not set and more data is needed.
|
| - bool GetNextBuffer_Locked(scoped_refptr<StreamParserBuffer>* buffer);
|
| + // |status| and |buffer| should be passed to the callback. False indicates
|
| + // that |status| and |buffer| were not set and more data is needed.
|
| + bool GetNextBuffer_Locked(DemuxerStream::Status* status,
|
| + scoped_refptr<StreamParserBuffer>* buffer);
|
|
|
| // Specifies the type of the stream (must be AUDIO or VIDEO for now).
|
| Type type_;
|
| @@ -253,7 +254,7 @@ void ChunkDemuxerStream::StartWaitingForSeek() {
|
| }
|
|
|
| for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it)
|
| - it->Run(NULL);
|
| + it->Run(kAborted, NULL);
|
| }
|
|
|
| void ChunkDemuxerStream::Seek(TimeDelta time) {
|
| @@ -385,34 +386,36 @@ void ChunkDemuxerStream::Shutdown() {
|
| // Pass end of stream buffers to all callbacks to signal that no more data
|
| // will be sent.
|
| for (ReadCBQueue::iterator it = read_cbs.begin(); it != read_cbs.end(); ++it)
|
| - it->Run(StreamParserBuffer::CreateEOSBuffer());
|
| + it->Run(DemuxerStream::kOk, StreamParserBuffer::CreateEOSBuffer());
|
| }
|
|
|
| // Helper function that makes sure |read_cb| runs on |message_loop|.
|
| static void RunOnMessageLoop(const DemuxerStream::ReadCB& read_cb,
|
| MessageLoop* message_loop,
|
| + DemuxerStream::Status status,
|
| const scoped_refptr<DecoderBuffer>& buffer) {
|
| if (MessageLoop::current() != message_loop) {
|
| message_loop->PostTask(FROM_HERE, base::Bind(
|
| - &RunOnMessageLoop, read_cb, message_loop, buffer));
|
| + &RunOnMessageLoop, read_cb, message_loop, status, buffer));
|
| return;
|
| }
|
|
|
| - read_cb.Run(buffer);
|
| + read_cb.Run(status, buffer);
|
| }
|
|
|
| // DemuxerStream methods.
|
| void ChunkDemuxerStream::Read(const ReadCB& read_cb) {
|
| + DemuxerStream::Status status = kOk;
|
| scoped_refptr<StreamParserBuffer> buffer;
|
| {
|
| base::AutoLock auto_lock(lock_);
|
| - if (!read_cbs_.empty() || !GetNextBuffer_Locked(&buffer)) {
|
| + if (!read_cbs_.empty() || !GetNextBuffer_Locked(&status, &buffer)) {
|
| DeferRead_Locked(read_cb);
|
| return;
|
| }
|
| }
|
|
|
| - read_cb.Run(buffer);
|
| + read_cb.Run(status, buffer);
|
| }
|
|
|
| DemuxerStream::Type ChunkDemuxerStream::type() { return type_; }
|
| @@ -452,25 +455,31 @@ void ChunkDemuxerStream::CreateReadDoneClosures_Locked(ClosureQueue* closures) {
|
| if (state_ != RETURNING_DATA_FOR_READS)
|
| return;
|
|
|
| + DemuxerStream::Status status;
|
| scoped_refptr<StreamParserBuffer> buffer;
|
| while (!read_cbs_.empty()) {
|
| - if (!GetNextBuffer_Locked(&buffer))
|
| + if (!GetNextBuffer_Locked(&status, &buffer))
|
| return;
|
| - closures->push_back(base::Bind(read_cbs_.front(), buffer));
|
| + closures->push_back(base::Bind(read_cbs_.front(),
|
| + status, buffer));
|
| read_cbs_.pop_front();
|
| }
|
| }
|
|
|
| bool ChunkDemuxerStream::GetNextBuffer_Locked(
|
| + DemuxerStream::Status* status,
|
| scoped_refptr<StreamParserBuffer>* buffer) {
|
| lock_.AssertAcquired();
|
|
|
| switch (state_) {
|
| case RETURNING_DATA_FOR_READS:
|
| - if (stream_->GetNextBuffer(buffer))
|
| + if (stream_->GetNextBuffer(buffer)) {
|
| + *status = DemuxerStream::kOk;
|
| return true;
|
| + }
|
|
|
| if (end_of_stream_) {
|
| + *status = DemuxerStream::kOk;
|
| *buffer = StreamParserBuffer::CreateEOSBuffer();
|
| return true;
|
| }
|
| @@ -480,10 +489,12 @@ bool ChunkDemuxerStream::GetNextBuffer_Locked(
|
| // for a seek. Any buffers in the SourceBuffer should NOT be returned
|
| // because they are associated with the seek.
|
| DCHECK(read_cbs_.empty());
|
| + *status = DemuxerStream::kAborted;
|
| *buffer = NULL;
|
| return true;
|
| case SHUTDOWN:
|
| DCHECK(read_cbs_.empty());
|
| + *status = DemuxerStream::kOk;
|
| *buffer = StreamParserBuffer::CreateEOSBuffer();
|
| return true;
|
| }
|
|
|