diff options
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 16b1094894bc..baf9f4f11864 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -66,6 +66,10 @@ private: pthread_t mThread; + // mNumSamples is used to track how many samples in mSampleSizes List. + // This is to reduce the cost associated with mSampleSizes.size() call, + // since it is O(n). Ideally, the fix should be in List class. + size_t mNumSamples; List<size_t> mSampleSizes; bool mSamplesHaveSameSize; @@ -942,6 +946,7 @@ void MPEG4Writer::Track::threadEntry() { sp<MetaData> meta_data; bool collectStats = collectStatisticalData(); + mNumSamples = 0; status_t err = OK; MediaBuffer *buffer; while (!mDone && (err = mSource->read(&buffer)) == OK) { @@ -1133,7 +1138,8 @@ void MPEG4Writer::Track::threadEntry() { } mSampleSizes.push_back(sampleSize); - if (mSampleSizes.size() > 2) { + ++mNumSamples; + if (mNumSamples > 2) { if (lastDurationUs != timestampUs - lastTimestampUs) { SttsTableEntry sttsEntry(sampleCount, lastDurationUs); mSttsTableEntries.push_back(sttsEntry); @@ -1143,7 +1149,7 @@ void MPEG4Writer::Track::threadEntry() { } } if (mSamplesHaveSameSize) { - if (mSampleSizes.size() >= 2 && previousSampleSize != sampleSize) { + if (mNumSamples >= 2 && previousSampleSize != sampleSize) { mSamplesHaveSameSize = false; } previousSampleSize = sampleSize; @@ -1152,7 +1158,7 @@ void MPEG4Writer::Track::threadEntry() { lastTimestampUs = timestampUs; if (isSync != 0) { - mStssTableEntries.push_back(mSampleSizes.size()); + mStssTableEntries.push_back(mNumSamples); } if (mTrackingProgressStatus) { @@ -1208,7 +1214,7 @@ void MPEG4Writer::Track::threadEntry() { // Last chunk if (mOwner->numTracks() == 1) { - StscTableEntry stscEntry(1, mSampleSizes.size(), 1); + StscTableEntry stscEntry(1, mNumSamples, 1); mStscTableEntries.push_back(stscEntry); } else if (!mChunkSamples.empty()) { ++nChunks; @@ -1220,7 +1226,7 @@ void MPEG4Writer::Track::threadEntry() { // We don't really know how long the last frame lasts, since // there is no frame time after it, just repeat the previous // frame's duration. - if (mSampleSizes.size() == 1) { + if (mNumSamples == 1) { lastDurationUs = 0; // A single sample's duration } else { ++sampleCount; // Count for the last sample @@ -1229,7 +1235,7 @@ void MPEG4Writer::Track::threadEntry() { mSttsTableEntries.push_back(sttsEntry); mReachedEOS = true; LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames - %s", - count, nZeroLengthFrames, mSampleSizes.size(), is_audio? "audio": "video"); + count, nZeroLengthFrames, mNumSamples, is_audio? "audio": "video"); logStatisticalData(is_audio); } @@ -1292,7 +1298,7 @@ void MPEG4Writer::trackProgressStatus( void MPEG4Writer::Track::findMinAvgMaxSampleDurationMs( int32_t *min, int32_t *avg, int32_t *max) { CHECK(!mSampleSizes.empty()); - int32_t avgSampleDurationMs = mMaxTimeStampUs / 1000 / mSampleSizes.size(); + int32_t avgSampleDurationMs = mMaxTimeStampUs / 1000 / mNumSamples; int32_t minSampleDurationMs = 0x7FFFFFFF; int32_t maxSampleDurationMs = 0; for (List<SttsTableEntry>::iterator it = mSttsTableEntries.begin(); @@ -1344,7 +1350,7 @@ void MPEG4Writer::Track::logStatisticalData(bool isAudio) { if (collectStats) { LOGI("%s track - duration %lld us, total %d frames", isAudio? "audio": "video", mMaxTimeStampUs, - mSampleSizes.size()); + mNumSamples); int32_t min, avg, max; findMinAvgMaxSampleDurationMs(&min, &avg, &max); LOGI("min/avg/max sample duration (ms): %d/%d/%d", min, avg, max); @@ -1738,7 +1744,7 @@ void MPEG4Writer::Track::writeTrackHeader( } else { mOwner->writeInt32(0); } - mOwner->writeInt32(mSampleSizes.size()); + mOwner->writeInt32(mNumSamples); if (!mSamplesHaveSameSize) { for (List<size_t>::iterator it = mSampleSizes.begin(); it != mSampleSizes.end(); ++it) { |