Loading media/libstagefright/MPEG4Writer.cpp +21 −22 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 } } Loading Loading
media/libstagefright/MPEG4Writer.cpp +21 −22 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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; } } Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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 } } Loading