summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/MPEG4Writer.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-07-28 13:18:14 -0700
committerJames Dong <jdong@google.com>2010-07-28 15:21:59 -0700
commitff4a7fa411401910e6e5ac88aeb6e0080a8cc8b1 (patch)
tree807f4f3fc4a792446a9d2905ae30bbcafa8e803a /media/libstagefright/MPEG4Writer.cpp
parent8644c14618d30d9e57a69df40ed939986ebf02c4 (diff)
downloadframeworks_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.cpp24
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) {