diff options
author | James Dong <jdong@google.com> | 2010-07-28 13:18:14 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-07-28 15:21:59 -0700 |
commit | ff4a7fa411401910e6e5ac88aeb6e0080a8cc8b1 (patch) | |
tree | 807f4f3fc4a792446a9d2905ae30bbcafa8e803a /media/libstagefright/MPEG4Writer.cpp | |
parent | 8644c14618d30d9e57a69df40ed939986ebf02c4 (diff) | |
download | frameworks_av-ff4a7fa411401910e6e5ac88aeb6e0080a8cc8b1.zip frameworks_av-ff4a7fa411401910e6e5ac88aeb6e0080a8cc8b1.tar.gz frameworks_av-ff4a7fa411401910e6e5ac88aeb6e0080a8cc8b1.tar.bz2 |
Eliminate the linear cost associated with mSampleSizes.size()
- The linear cost associated with mSampleSizes.size() call causes the
CPU load to increase overtime as more and more audio/video samples
are recorded.
- Other Lists used in the MP4 file writer may have similar issues, but
the size() call is not made for each output audio/video output sample,
or the size of the list is bounded (not linear to the total number
of audio/video output samples). As for now, we can live with the small
cost (tested with 30 minutes long recording).
Change-Id: I23bd93ea4256cb0be0c1649760e39e6809eb4946
Diffstat (limited to 'media/libstagefright/MPEG4Writer.cpp')
-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 16b1094..baf9f4f 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) { |