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

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: FlushSamples -> SendAndFlushSamples 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
« no previous file with comments | « media/mp4/mp4_stream_parser.h ('k') | media/mp4/mp4_stream_parser_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..fff9ff53d64490059596996661530e0a9010d4be 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 = !SendAndFlushSamples(&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 = !SendAndFlushSamples(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::SendAndFlushSamples(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());
« no previous file with comments | « media/mp4/mp4_stream_parser.h ('k') | media/mp4/mp4_stream_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698