summaryrefslogtreecommitdiffstats
path: root/media/mp4
diff options
context:
space:
mode:
authorstrobe@google.com <strobe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 07:09:20 +0000
committerstrobe@google.com <strobe@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-06-27 07:09:20 +0000
commit3d88ee4c89ae881722816b7f325b45466db281e6 (patch)
treea4c1d80f5703e5bb05a97a68b96c00a895a5f329 /media/mp4
parentc2e66e129d73bd28f2911731591c1e0ac74cd95b (diff)
downloadchromium_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/mp4')
-rw-r--r--media/mp4/mp4_stream_parser.cc31
-rw-r--r--media/mp4/mp4_stream_parser.h2
-rw-r--r--media/mp4/mp4_stream_parser_unittest.cc13
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