Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1000)

Unified Diff: media/filters/chunk_demuxer.cc

Issue 7806002: Fix ChunkDemuxer end of stream handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nit and added helper class to reduce duplicated code. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/filters/chunk_demuxer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()) {
« no previous file with comments | « no previous file | media/filters/chunk_demuxer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698