diff options
author | Andreas Huber <andih@google.com> | 2012-08-13 11:17:53 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-08-13 11:17:53 -0700 |
commit | bf4c5d9f3bdb6fd3889afdeb0312d54f6f2e8de3 (patch) | |
tree | ae7a4e67c15398130c65e3645b0a66edab819307 /media/libmediaplayerservice/nuplayer | |
parent | 38b8d56d63b38e539daa44292ae3e01633c99fef (diff) | |
parent | 1f3d61f99c5cbe65a2cd32985445fc9ffa12adca (diff) | |
download | frameworks_av-bf4c5d9f3bdb6fd3889afdeb0312d54f6f2e8de3.zip frameworks_av-bf4c5d9f3bdb6fd3889afdeb0312d54f6f2e8de3.tar.gz frameworks_av-bf4c5d9f3bdb6fd3889afdeb0312d54f6f2e8de3.tar.bz2 |
am 1f3d61f9: am bd828233: Use the correct data offset by remembering the offset of the enclosing \'moof\'
* commit '1f3d61f99c5cbe65a2cd32985445fc9ffa12adca':
Use the correct data offset by remembering the offset of the enclosing 'moof'
Diffstat (limited to 'media/libmediaplayerservice/nuplayer')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/mp4/Parser.cpp | 20 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/mp4/Parser.h | 3 |
2 files changed, 15 insertions, 8 deletions
diff --git a/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp b/media/libmediaplayerservice/nuplayer/mp4/Parser.cpp index 6850842..f664e92 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 c8f9ad4..0d8d0f5 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); |