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()); |