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