summaryrefslogtreecommitdiff
path: root/media/libmediaplayerservice
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-08-13 10:59:48 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-08-13 11:13:22 -0700
commitbd828233d3eda966bf7145108dde74616abd97fb (patch)
tree942a6d829a42a3b3f3a1ac2286015a94acde5332 /media/libmediaplayerservice
parent8cf9c1a8640553a146f3a7aad01b393c664a46af (diff)
Use the correct data offset by remembering the offset of the enclosing 'moof'
container. Change-Id: I2f0f92dabe31341a6a91d435943e4a65e34884ba
Diffstat (limited to 'media/libmediaplayerservice')
-rw-r--r--media/libmediaplayerservice/nuplayer/mp4/Parser.cpp20
-rw-r--r--media/libmediaplayerservice/nuplayer/mp4/Parser.h3
2 files changed, 15 insertions, 8 deletions
diff --git a/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp b/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp
index 68508426..f664e926 100644
--- a/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp
+++ b/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp
@@ -239,7 +239,7 @@ void Parser::onMessageReceived(const sp<AMessage> &msg) {
mBuffer = new ABuffer(512 * 1024);
mBuffer->setRange(0, 0);
- enter(0, 0);
+ enter(0ll, 0, 0);
(new AMessage(kWhatProceed, id()))->post();
break;
@@ -529,7 +529,7 @@ status_t Parser::onProceed() {
ALOGV("%sentering box of type '%s'",
IndentString(mStack.size()), Fourcc2String(type));
- enter(type, size - offset);
+ enter(mBufferPos - offset, type, size - offset);
} else {
if (!fitsContainer(size)) {
return -EINVAL;
@@ -819,8 +819,9 @@ status_t Parser::need(size_t size) {
return -EAGAIN;
}
-void Parser::enter(uint32_t type, uint64_t size) {
+void Parser::enter(off64_t offset, uint32_t type, uint64_t size) {
Container container;
+ container.mOffset = offset;
container.mType = type;
container.mExtendsToEOF = (size == 0);
container.mBytesRemaining = size;
@@ -1484,13 +1485,18 @@ status_t Parser::parseTrackFragmentHeader(
}
if (!(flags & TrackFragmentHeaderInfo::kBaseDataOffsetPresent)) {
- CHECK(!mStack.isEmpty());
+ // This should point to the position of the first byte of the
+ // enclosing 'moof' container for the first track and
+ // the end of the data of the preceding fragment for subsequent
+ // tracks.
- // This should point to the start of the data inside the 'mdat' box
- // following the current 'moof' box.
+ CHECK_GE(mStack.size(), 2u);
mTrackFragmentHeaderInfo.mBaseDataOffset =
- mBufferPos + mStack.itemAt(mStack.size() - 1).mBytesRemaining + 8;
+ mStack.itemAt(mStack.size() - 2).mOffset;
+
+ // XXX TODO: This does not do the right thing for the 2nd and
+ // subsequent tracks yet.
}
mTrackFragmentHeaderInfo.mDataOffset =
diff --git a/media/libmediaplayerservice/nuplayer/mp4/Parser.h b/media/libmediaplayerservice/nuplayer/mp4/Parser.h
index c8f9ad4d..0d8d0f57 100644
--- a/media/libmediaplayerservice/nuplayer/mp4/Parser.h
+++ b/media/libmediaplayerservice/nuplayer/mp4/Parser.h
@@ -71,6 +71,7 @@ private:
};
struct Container {
+ uint64_t mOffset;
uint64_t mBytesRemaining;
uint32_t mType;
bool mExtendsToEOF;
@@ -164,7 +165,7 @@ private:
status_t onProceed();
status_t onDequeueAccessUnit(size_t trackIndex, sp<ABuffer> *accessUnit);
- void enter(uint32_t type, uint64_t size);
+ void enter(off64_t offset, uint32_t type, uint64_t size);
uint16_t readU16(size_t offset);
uint32_t readU32(size_t offset);