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

Commit a7ea9f93 authored by James Dong's avatar James Dong
Browse files

Avoid duplicated code calculating the stts sample duration

o This also speeds up the MediaRecorder.stop() call.
o Also fix incorrect start time compensation in stts box

Change-Id: I6392b8b980e0f786ddeeec0fe2c341de67208c6f
parent a2aee84e
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
}
}