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

Unified Diff: media/mp4/mp4_stream_parser.cc

Issue 10660005: Flush sample buffers when reading new segments in Media Source BMFF parser. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address review comments Created 8 years, 6 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
Index: media/mp4/mp4_stream_parser.cc
diff --git a/media/mp4/mp4_stream_parser.cc b/media/mp4/mp4_stream_parser.cc
index 4f4a6db12818e03483bb2cfd59f884b4d94714b2..a557202fbdf48a3761ad345ac38c69503819e5f1 100644
--- a/media/mp4/mp4_stream_parser.cc
+++ b/media/mp4/mp4_stream_parser.cc
@@ -92,21 +92,17 @@ bool MP4StreamParser::Parse(const uint8* buf, int size) {
}
} while (result && !err);
+ if (!err)
+ err = !FlushSamples(&audio_buffers, &video_buffers);
+
if (err) {
- DLOG(ERROR) << "Unknown error while parsing MP4";
+ DLOG(ERROR) << "Error while parsing MP4";
queue_.Reset();
moov_.reset();
ChangeState(kError);
return false;
}
- if (!audio_buffers.empty() &&
- (audio_cb_.is_null() || !audio_cb_.Run(audio_buffers)))
- return false;
- if (!video_buffers.empty() &&
- (video_cb_.is_null() || !video_cb_.Run(video_buffers)))
- return false;
-
return true;
}
@@ -231,6 +227,10 @@ bool MP4StreamParser::EnqueueSample(BufferQueue* audio_buffers,
BufferQueue* video_buffers,
bool* err) {
if (!runs_.RunValid()) {
+ // Flush any buffers we've gotten in this chunk so that buffers don't
+ // cross NewSegment() calls
+ *err = !FlushSamples(audio_buffers, video_buffers);
+ if (*err) return false;
ChangeState(kParsingBoxes);
return true;
}
@@ -311,6 +311,21 @@ bool MP4StreamParser::EnqueueSample(BufferQueue* audio_buffers,
return true;
}
+bool MP4StreamParser::FlushSamples(BufferQueue* audio_buffers,
+ BufferQueue* video_buffers) {
+ if (!audio_buffers->empty()) {
+ if (audio_cb_.is_null() || !audio_cb_.Run(*audio_buffers))
+ return false;
+ audio_buffers->clear();
+ }
+ if (!video_buffers->empty()) {
+ if (video_cb_.is_null() || !video_cb_.Run(*video_buffers))
+ return false;
+ video_buffers->clear();
+ }
+ return true;
+}
+
bool MP4StreamParser::ReadMDATsUntil(const int64 tgt_offset) {
DCHECK(tgt_offset <= queue_.tail());

Powered by Google App Engine
This is Rietveld 408576698