Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bd828233 authored by Andreas Huber's avatar Andreas Huber Committed by Android (Google) Code Review
Browse files

Use the correct data offset by remembering the offset of the enclosing 'moof'

container.

Change-Id: I2f0f92dabe31341a6a91d435943e4a65e34884ba
parent 8cf9c1a8
Loading
Loading
Loading
Loading
+13 −7
Original line number Original line Diff line number Diff line
@@ -239,7 +239,7 @@ void Parser::onMessageReceived(const sp<AMessage> &msg) {
            mBuffer = new ABuffer(512 * 1024);
            mBuffer = new ABuffer(512 * 1024);
            mBuffer->setRange(0, 0);
            mBuffer->setRange(0, 0);


            enter(0, 0);
            enter(0ll, 0, 0);


            (new AMessage(kWhatProceed, id()))->post();
            (new AMessage(kWhatProceed, id()))->post();
            break;
            break;
@@ -529,7 +529,7 @@ status_t Parser::onProceed() {
        ALOGV("%sentering box of type '%s'",
        ALOGV("%sentering box of type '%s'",
                IndentString(mStack.size()), Fourcc2String(type));
                IndentString(mStack.size()), Fourcc2String(type));


        enter(type, size - offset);
        enter(mBufferPos - offset, type, size - offset);
    } else {
    } else {
        if (!fitsContainer(size)) {
        if (!fitsContainer(size)) {
            return -EINVAL;
            return -EINVAL;
@@ -819,8 +819,9 @@ status_t Parser::need(size_t size) {
    return -EAGAIN;
    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 container;
    container.mOffset = offset;
    container.mType = type;
    container.mType = type;
    container.mExtendsToEOF = (size == 0);
    container.mExtendsToEOF = (size == 0);
    container.mBytesRemaining = size;
    container.mBytesRemaining = size;
@@ -1484,13 +1485,18 @@ status_t Parser::parseTrackFragmentHeader(
    }
    }


    if (!(flags & TrackFragmentHeaderInfo::kBaseDataOffsetPresent)) {
    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
        CHECK_GE(mStack.size(), 2u);
        // following the current 'moof' box.


        mTrackFragmentHeaderInfo.mBaseDataOffset =
        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 =
    mTrackFragmentHeaderInfo.mDataOffset =
+2 −1
Original line number Original line Diff line number Diff line
@@ -71,6 +71,7 @@ private:
    };
    };


    struct Container {
    struct Container {
        uint64_t mOffset;
        uint64_t mBytesRemaining;
        uint64_t mBytesRemaining;
        uint32_t mType;
        uint32_t mType;
        bool mExtendsToEOF;
        bool mExtendsToEOF;
@@ -164,7 +165,7 @@ private:
    status_t onProceed();
    status_t onProceed();
    status_t onDequeueAccessUnit(size_t trackIndex, sp<ABuffer> *accessUnit);
    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);
    uint16_t readU16(size_t offset);
    uint32_t readU32(size_t offset);
    uint32_t readU32(size_t offset);