From 58ae9c530247668f8af36e30d228c716c226b3d4 Mon Sep 17 00:00:00 2001 From: James Dong Date: Tue, 22 Jun 2010 11:27:37 -0700 Subject: Single track optimization We don't need to do interleave when the total number of tracks to be recorded is one. Metadata-wise, we only need to have one chunk in chunk offset table, and a single entry in the stsc table. Change-Id: I46f0e4b3860620311e7a91b68a9067acaa137bb2 --- include/media/stagefright/MPEG4Writer.h | 1 + media/libstagefright/MPEG4Writer.cpp | 20 +++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h index 9812e41..d62df46 100644 --- a/include/media/stagefright/MPEG4Writer.h +++ b/include/media/stagefright/MPEG4Writer.h @@ -81,6 +81,7 @@ private: void setStartTimestampUs(int64_t timeUs); int64_t getStartTimestampUs(); // Not const status_t startTracks(); + size_t numTracks(); void lock(); void unlock(); diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index b6bbde7..cd20ec7 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -559,6 +559,11 @@ int64_t MPEG4Writer::getStartTimestampUs() { return mStartTimestampUs; } +size_t MPEG4Writer::numTracks() { + Mutex::Autolock autolock(mLock); + return mTracks.size(); +} + //////////////////////////////////////////////////////////////////////////////// MPEG4Writer::Track::Track( @@ -979,6 +984,16 @@ void MPEG4Writer::Track::threadEntry() { mStssTableEntries.push_back(mSampleInfos.size()); } + if (mOwner->numTracks() == 1) { + off_t offset = is_avc? mOwner->addLengthPrefixedSample_l(copy) + : mOwner->addSample_l(copy); + if (mChunkOffsets.empty()) { + mChunkOffsets.push_back(offset); + } + copy->release(); + copy = NULL; + continue; + } mChunkSamples.push_back(copy); if (interleaveDurationUs == 0) { @@ -1012,7 +1027,10 @@ void MPEG4Writer::Track::threadEntry() { } // Last chunk - if (!mChunkSamples.empty()) { + if (mOwner->numTracks() == 1) { + StscTableEntry stscEntry(1, mSampleInfos.size(), 1); + mStscTableEntries.push_back(stscEntry); + } else if (!mChunkSamples.empty()) { ++nChunks; StscTableEntry stscEntry(nChunks, mChunkSamples.size(), 1); mStscTableEntries.push_back(stscEntry); -- cgit v1.1