diff options
author | strobe@google.com <strobe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 07:09:20 +0000 |
---|---|---|
committer | strobe@google.com <strobe@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-06-27 07:09:20 +0000 |
commit | 3d88ee4c89ae881722816b7f325b45466db281e6 (patch) | |
tree | a4c1d80f5703e5bb05a97a68b96c00a895a5f329 /media | |
parent | c2e66e129d73bd28f2911731591c1e0ac74cd95b (diff) | |
download | chromium_src-3d88ee4c89ae881722816b7f325b45466db281e6.zip chromium_src-3d88ee4c89ae881722816b7f325b45466db281e6.tar.gz chromium_src-3d88ee4c89ae881722816b7f325b45466db281e6.tar.bz2 |
Flush sample buffers when reading new segments in Media Source BMFF parser.
BUG=134274
TEST=MP4StreamParserTest
Review URL: https://chromiumcodereview.appspot.com/10660005
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@144410 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media')
-rw-r--r-- | media/mp4/mp4_stream_parser.cc | 31 | ||||
-rw-r--r-- | media/mp4/mp4_stream_parser.h | 2 | ||||
-rw-r--r-- | media/mp4/mp4_stream_parser_unittest.cc | 13 |
3 files changed, 35 insertions, 11 deletions
diff --git a/media/mp4/mp4_stream_parser.cc b/media/mp4/mp4_stream_parser.cc index 4f4a6db..fff9ff5 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()); diff --git a/media/mp4/mp4_stream_parser.h b/media/mp4/mp4_stream_parser.h index 5d0d0f9..df767b3 100644 --- a/media/mp4/mp4_stream_parser.h +++ b/media/mp4/mp4_stream_parser.h @@ -53,6 +53,8 @@ class MEDIA_EXPORT MP4StreamParser : public StreamParser { bool EnqueueSample(BufferQueue* audio_buffers, BufferQueue* video_buffers, bool* err); + bool SendAndFlushSamples(BufferQueue* audio_buffers, + BufferQueue* video_buffers); State state_; InitCB init_cb_; diff --git a/media/mp4/mp4_stream_parser_unittest.cc b/media/mp4/mp4_stream_parser_unittest.cc index 96fd913..9b6a923 100644 --- a/media/mp4/mp4_stream_parser_unittest.cc +++ b/media/mp4/mp4_stream_parser_unittest.cc @@ -30,6 +30,7 @@ class MP4StreamParserTest : public testing::Test { protected: scoped_ptr<MP4StreamParser> parser_; + base::TimeDelta segment_start_; bool AppendData(const uint8* data, size_t length) { parser_->Parse(data, length); @@ -72,6 +73,7 @@ class MP4StreamParserTest : public testing::Test { DVLOG(3) << " n=" << buf - bufs.begin() << ", size=" << (*buf)->GetDataSize() << ", dur=" << (*buf)->GetDuration().InMilliseconds(); + EXPECT_LE(segment_start_, (*buf)->GetTimestamp()); } return true; } @@ -83,6 +85,7 @@ class MP4StreamParserTest : public testing::Test { void NewSegmentF(TimeDelta start_dts) { DVLOG(1) << "NewSegmentF: " << start_dts.InMilliseconds(); + segment_start_ = start_dts; } void InitializeParser() { @@ -95,19 +98,23 @@ class MP4StreamParserTest : public testing::Test { base::Bind(&MP4StreamParserTest::NewSegmentF, base::Unretained(this))); } - bool ParseMP4File(const std::string& filename) { + bool ParseMP4File(const std::string& filename, int append_size) { InitializeParser(); scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); EXPECT_TRUE(AppendDataInPieces(buffer->GetData(), buffer->GetDataSize(), - 512)); + append_size)); return true; } }; TEST_F(MP4StreamParserTest, TestParseBearDASH) { - ParseMP4File("bear.1280x720_dash.mp4"); + ParseMP4File("bear.1280x720_dash.mp4", 512); +} + +TEST_F(MP4StreamParserTest, TestMultiFragmentAppend) { + ParseMP4File("bear.1280x720_dash.mp4", 768432); } } // namespace mp4 |