Merge "Avoid duplicated code calculating the stts sample duration"

This commit is contained in:
James Dong
2011-06-10 16:23:41 -07:00
committed by Android (Google) Code Review

View File

@@ -131,11 +131,11 @@ private:
size_t mNumSttsTableEntries;
struct SttsTableEntry {
SttsTableEntry(uint32_t count, uint32_t durationUs)
: sampleCount(count), sampleDurationUs(durationUs) {}
SttsTableEntry(uint32_t count, uint32_t duration)
: sampleCount(count), sampleDuration(duration) {}
uint32_t sampleCount;
uint32_t sampleDurationUs;
uint32_t sampleDuration; // time scale based
};
List<SttsTableEntry> mSttsTableEntries;
@@ -216,7 +216,9 @@ private:
void updateTrackSizeEstimate();
void addOneStscTableEntry(size_t chunkId, 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);
// Write the boxes
@@ -1164,9 +1166,9 @@ void MPEG4Writer::Track::addOneStssTableEntry(size_t sampleId) {
}
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);
++mNumSttsTableEntries;
}
@@ -2132,7 +2134,7 @@ status_t MPEG4Writer::Track::threadEntry() {
if (mNumSamples == 3 || currDurationTicks != lastDurationTicks) {
LOGV("%s lastDurationUs: %lld us, currDurationTicks: %lld us",
mIsAudio? "Audio": "Video", lastDurationUs, currDurationTicks);
addOneSttsTableEntry(sampleCount, lastDurationUs);
addOneSttsTableEntry(sampleCount, lastDurationTicks);
sampleCount = 1;
} else {
++sampleCount;
@@ -2218,17 +2220,18 @@ status_t MPEG4Writer::Track::threadEntry() {
// frame's duration.
if (mNumSamples == 1) {
lastDurationUs = 0; // A single sample's duration
lastDurationTicks = 0;
} else {
++sampleCount; // Count for the last sample
}
if (mNumSamples <= 2) {
addOneSttsTableEntry(1, lastDurationUs);
addOneSttsTableEntry(1, lastDurationTicks);
if (sampleCount - 1 > 0) {
addOneSttsTableEntry(sampleCount - 1, lastDurationUs);
addOneSttsTableEntry(sampleCount - 1, lastDurationTicks);
}
} else {
addOneSttsTableEntry(sampleCount, lastDurationUs);
addOneSttsTableEntry(sampleCount, lastDurationTicks);
}
mTrackDurationUs += lastDurationUs;
@@ -2773,19 +2776,15 @@ void MPEG4Writer::Track::writeSttsBox() {
CHECK(mStartTimestampUs > moovStartTimeUs);
trackStartTimeOffsetUs = mStartTimestampUs - moovStartTimeUs;
}
int64_t prevTimestampUs = trackStartTimeOffsetUs;
for (List<SttsTableEntry>::iterator it = mSttsTableEntries.begin();
it != mSttsTableEntries.end(); ++it) {
List<SttsTableEntry>::iterator it = mSttsTableEntries.begin();
CHECK(it != mSttsTableEntries.end() && it->sampleCount == 1);
mOwner->writeInt32(it->sampleCount);
int32_t dur = (trackStartTimeOffsetUs * mTimeScale + 500000LL) / 1000000LL;
mOwner->writeInt32(dur + it->sampleDuration);
while (++it != mSttsTableEntries.end()) {
mOwner->writeInt32(it->sampleCount);
// Make sure that we are calculating the sample duration the exactly
// same way as we made decision on how to create stts entries.
int64_t currTimestampUs = prevTimestampUs + it->sampleDurationUs;
int32_t dur = ((currTimestampUs * mTimeScale + 500000LL) / 1000000LL -
(prevTimestampUs * mTimeScale + 500000LL) / 1000000LL);
prevTimestampUs += (it->sampleCount * it->sampleDurationUs);
mOwner->writeInt32(dur);
mOwner->writeInt32(it->sampleDuration);
}
mOwner->endBox(); // stts
}