| Index: media/filters/chunk_demuxer.cc
|
| diff --git a/media/filters/chunk_demuxer.cc b/media/filters/chunk_demuxer.cc
|
| index 9da955a7a8497bdbb350a5ef63e331a658862a7d..89efadbbbcd1e2a19febbf6704b55c9cc6582df3 100644
|
| --- a/media/filters/chunk_demuxer.cc
|
| +++ b/media/filters/chunk_demuxer.cc
|
| @@ -91,6 +91,7 @@ class ChunkDemuxerStream : public DemuxerStream {
|
| ReadCBQueue read_cbs_;
|
| BufferQueue buffers_;
|
| bool shutdown_called_;
|
| + bool received_end_of_stream_;
|
|
|
| // Keeps track of the timestamp of the last buffer we have
|
| // added to |buffers_|. This is used to enforce buffers with strictly
|
| @@ -104,6 +105,7 @@ ChunkDemuxerStream::ChunkDemuxerStream(Type type, AVStream* stream)
|
| : type_(type),
|
| av_stream_(stream),
|
| shutdown_called_(false),
|
| + received_end_of_stream_(false),
|
| last_buffer_timestamp_(kNoTimestamp) {
|
| }
|
|
|
| @@ -113,6 +115,7 @@ void ChunkDemuxerStream::Flush() {
|
| VLOG(1) << "Flush()";
|
| base::AutoLock auto_lock(lock_);
|
| buffers_.clear();
|
| + received_end_of_stream_ = false;
|
| last_buffer_timestamp_ = kNoTimestamp;
|
| }
|
|
|
| @@ -139,8 +142,21 @@ void ChunkDemuxerStream::AddBuffers(const BufferQueue& buffers) {
|
|
|
| for (BufferQueue::const_iterator itr = buffers.begin();
|
| itr != buffers.end(); itr++) {
|
| -
|
| - if (!(*itr)->IsEndOfStream()) {
|
| + // Make sure we aren't trying to add a buffer after we have received and
|
| + // "end of stream" buffer.
|
| + DCHECK(!received_end_of_stream_);
|
| +
|
| + if ((*itr)->IsEndOfStream()) {
|
| + received_end_of_stream_ = true;
|
| +
|
| + // Push enough EOS buffers to satisfy outstanding Read() requests.
|
| + if (read_cbs_.size() > buffers_.size()) {
|
| + size_t pending_read_without_data = read_cbs_.size() - buffers_.size();
|
| + for (size_t i = 0; i <= pending_read_without_data; ++i) {
|
| + buffers_.push_back(*itr);
|
| + }
|
| + }
|
| + } else {
|
| base::TimeDelta current_ts = (*itr)->GetTimestamp();
|
| if (last_buffer_timestamp_ != kNoTimestamp) {
|
| DCHECK_GT(current_ts.ToInternalValue(),
|
| @@ -148,9 +164,8 @@ void ChunkDemuxerStream::AddBuffers(const BufferQueue& buffers) {
|
| }
|
|
|
| last_buffer_timestamp_ = current_ts;
|
| + buffers_.push_back(*itr);
|
| }
|
| -
|
| - buffers_.push_back(*itr);
|
| }
|
|
|
| while (!buffers_.empty() && !read_cbs_.empty()) {
|
| @@ -230,7 +245,7 @@ void ChunkDemuxerStream::Read(const ReadCallback& read_callback) {
|
| {
|
| base::AutoLock auto_lock(lock_);
|
|
|
| - if (shutdown_called_) {
|
| + if (shutdown_called_ || (received_end_of_stream_ && buffers_.empty())) {
|
| buffer = CreateEOSBuffer();
|
| } else {
|
| if (buffers_.empty()) {
|
|
|