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

Commit 8aec83eb authored by James Dong's avatar James Dong Committed by Android (Google) Code Review
Browse files

Merge "Avoid duplicated code calculating the stts sample duration"

parents c0e9e429 a7ea9f93
Loading
Loading
Loading
Loading
+21 −22
Original line number Original line Diff line number Diff line
@@ -131,11 +131,11 @@ private:
    size_t        mNumSttsTableEntries;
    size_t        mNumSttsTableEntries;
    struct SttsTableEntry {
    struct SttsTableEntry {


        SttsTableEntry(uint32_t count, uint32_t durationUs)
        SttsTableEntry(uint32_t count, uint32_t duration)
            : sampleCount(count), sampleDurationUs(durationUs) {}
            : sampleCount(count), sampleDuration(duration) {}


        uint32_t sampleCount;
        uint32_t sampleCount;
        uint32_t sampleDurationUs;
        uint32_t sampleDuration;  // time scale based
    };
    };
    List<SttsTableEntry> mSttsTableEntries;
    List<SttsTableEntry> mSttsTableEntries;


@@ -216,7 +216,9 @@ private:
    void updateTrackSizeEstimate();
    void updateTrackSizeEstimate();
    void addOneStscTableEntry(size_t chunkId, size_t sampleId);
    void addOneStscTableEntry(size_t chunkId, size_t sampleId);
    void addOneStssTableEntry(size_t sampleId);
    void addOneStssTableEntry(size_t sampleId);
    void addOneSttsTableEntry(size_t sampleCount, int64_t durationUs);

    // Duration is time scale based
    void addOneSttsTableEntry(size_t sampleCount, int32_t timescaledDur);
    void sendTrackSummary(bool hasMultipleTracks);
    void sendTrackSummary(bool hasMultipleTracks);


    // Write the boxes
    // Write the boxes
@@ -1164,9 +1166,9 @@ void MPEG4Writer::Track::addOneStssTableEntry(size_t sampleId) {
}
}


void MPEG4Writer::Track::addOneSttsTableEntry(
void MPEG4Writer::Track::addOneSttsTableEntry(
        size_t sampleCount, int64_t durationUs) {
        size_t sampleCount, int32_t duration) {


    SttsTableEntry sttsEntry(sampleCount, durationUs);
    SttsTableEntry sttsEntry(sampleCount, duration);
    mSttsTableEntries.push_back(sttsEntry);
    mSttsTableEntries.push_back(sttsEntry);
    ++mNumSttsTableEntries;
    ++mNumSttsTableEntries;
}
}
@@ -2132,7 +2134,7 @@ status_t MPEG4Writer::Track::threadEntry() {
            if (mNumSamples == 3 || currDurationTicks != lastDurationTicks) {
            if (mNumSamples == 3 || currDurationTicks != lastDurationTicks) {
                LOGV("%s lastDurationUs: %lld us, currDurationTicks: %lld us",
                LOGV("%s lastDurationUs: %lld us, currDurationTicks: %lld us",
                        mIsAudio? "Audio": "Video", lastDurationUs, currDurationTicks);
                        mIsAudio? "Audio": "Video", lastDurationUs, currDurationTicks);
                addOneSttsTableEntry(sampleCount, lastDurationUs);
                addOneSttsTableEntry(sampleCount, lastDurationTicks);
                sampleCount = 1;
                sampleCount = 1;
            } else {
            } else {
                ++sampleCount;
                ++sampleCount;
@@ -2218,17 +2220,18 @@ status_t MPEG4Writer::Track::threadEntry() {
    // frame's duration.
    // frame's duration.
    if (mNumSamples == 1) {
    if (mNumSamples == 1) {
        lastDurationUs = 0;  // A single sample's duration
        lastDurationUs = 0;  // A single sample's duration
        lastDurationTicks = 0;
    } else {
    } else {
        ++sampleCount;  // Count for the last sample
        ++sampleCount;  // Count for the last sample
    }
    }


    if (mNumSamples <= 2) {
    if (mNumSamples <= 2) {
        addOneSttsTableEntry(1, lastDurationUs);
        addOneSttsTableEntry(1, lastDurationTicks);
        if (sampleCount - 1 > 0) {
        if (sampleCount - 1 > 0) {
            addOneSttsTableEntry(sampleCount - 1, lastDurationUs);
            addOneSttsTableEntry(sampleCount - 1, lastDurationTicks);
        }
        }
    } else {
    } else {
        addOneSttsTableEntry(sampleCount, lastDurationUs);
        addOneSttsTableEntry(sampleCount, lastDurationTicks);
    }
    }


    mTrackDurationUs += lastDurationUs;
    mTrackDurationUs += lastDurationUs;
@@ -2773,19 +2776,15 @@ void MPEG4Writer::Track::writeSttsBox() {
        CHECK(mStartTimestampUs > moovStartTimeUs);
        CHECK(mStartTimestampUs > moovStartTimeUs);
        trackStartTimeOffsetUs = mStartTimestampUs - moovStartTimeUs;
        trackStartTimeOffsetUs = mStartTimestampUs - moovStartTimeUs;
    }
    }
    int64_t prevTimestampUs = trackStartTimeOffsetUs;
    List<SttsTableEntry>::iterator it = mSttsTableEntries.begin();
    for (List<SttsTableEntry>::iterator it = mSttsTableEntries.begin();
    CHECK(it != mSttsTableEntries.end() && it->sampleCount == 1);
        it != mSttsTableEntries.end(); ++it) {
    mOwner->writeInt32(it->sampleCount);
    mOwner->writeInt32(it->sampleCount);
    int32_t dur = (trackStartTimeOffsetUs * mTimeScale + 500000LL) / 1000000LL;
    mOwner->writeInt32(dur + it->sampleDuration);


        // Make sure that we are calculating the sample duration the exactly
    while (++it != mSttsTableEntries.end()) {
        // same way as we made decision on how to create stts entries.
        mOwner->writeInt32(it->sampleCount);
        int64_t currTimestampUs = prevTimestampUs + it->sampleDurationUs;
        mOwner->writeInt32(it->sampleDuration);
        int32_t dur = ((currTimestampUs * mTimeScale + 500000LL) / 1000000LL -
            (prevTimestampUs * mTimeScale + 500000LL) / 1000000LL);
        prevTimestampUs += (it->sampleCount * it->sampleDurationUs);

        mOwner->writeInt32(dur);
    }
    }
    mOwner->endBox();  // stts
    mOwner->endBox();  // stts
}
}