From 43ec1dfc5dc3934680a52a026c5519ddc51bdbd3 Mon Sep 17 00:00:00 2001 From: James Dong Date: Fri, 6 May 2011 11:27:59 -0700 Subject: Add end of recording summary track info Change-Id: I2fcf589e70db225776ef7c8d0f28505ceb824c45 related-to-bug: 1854633 --- media/libstagefright/MPEG4Writer.cpp | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) (limited to 'media/libstagefright/MPEG4Writer.cpp') diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index fafac0e..e3c7eb9 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -84,6 +84,7 @@ private: bool mIsMPEG4; int32_t mTrackId; int64_t mTrackDurationUs; + int64_t mMaxChunkDurationUs; // For realtime applications, we need to adjust the media clock // for video track based on the audio media clock @@ -211,6 +212,7 @@ private: void addOneStscTableEntry(size_t chunkId, size_t sampleId); void addOneStssTableEntry(size_t sampleId); void addOneSttsTableEntry(size_t sampleCount, int64_t durationUs); + void sendTrackSummary(bool hasMultipleTracks); // Write the boxes void writeStcoBox(bool use32BitOffset); @@ -1359,6 +1361,7 @@ status_t MPEG4Writer::Track::start(MetaData *params) { mPrevMediaTimeAdjustSample = 0; mTotalDriftTimeToAdjustUs = 0; mPrevTotalAccumDriftTimeUs = 0; + mMaxChunkDurationUs = 0; pthread_create(&mThread, &attr, ThreadWrapper, this); pthread_attr_destroy(&attr); @@ -1796,6 +1799,7 @@ void MPEG4Writer::Track::updateDriftTime(const sp& meta) { status_t MPEG4Writer::Track::threadEntry() { int32_t count = 0; const int64_t interleaveDurationUs = mOwner->interleaveDuration(); + const bool hasMultipleTracks = (mOwner->numTracks() > 1); int64_t chunkTimestampUs = 0; int32_t nChunks = 0; int32_t nZeroLengthFrames = 0; @@ -2028,7 +2032,7 @@ status_t MPEG4Writer::Track::threadEntry() { } trackProgressStatus(timestampUs); } - if (mOwner->numTracks() == 1) { + if (!hasMultipleTracks) { off64_t offset = mIsAvc? mOwner->addLengthPrefixedSample_l(copy) : mOwner->addSample_l(copy); if (mChunkOffsets.empty()) { @@ -2047,7 +2051,11 @@ status_t MPEG4Writer::Track::threadEntry() { if (chunkTimestampUs == 0) { chunkTimestampUs = timestampUs; } else { - if (timestampUs - chunkTimestampUs > interleaveDurationUs) { + int64_t chunkDurationUs = timestampUs - chunkTimestampUs; + if (chunkDurationUs > interleaveDurationUs) { + if (chunkDurationUs > mMaxChunkDurationUs) { + mMaxChunkDurationUs = chunkDurationUs; + } ++nChunks; if (nChunks == 1 || // First chunk (--(mStscTableEntries.end()))->samplesPerChunk != @@ -2070,7 +2078,7 @@ status_t MPEG4Writer::Track::threadEntry() { mOwner->trackProgressStatus(mTrackId, -1, err); // Last chunk - if (mOwner->numTracks() == 1) { + if (!hasMultipleTracks) { addOneStscTableEntry(1, mNumSamples); } else if (!mChunkSamples.empty()) { addOneStscTableEntry(++nChunks, mChunkSamples.size()); @@ -2097,6 +2105,9 @@ status_t MPEG4Writer::Track::threadEntry() { mTrackDurationUs += lastDurationUs; mReachedEOS = true; + + sendTrackSummary(hasMultipleTracks); + LOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s", count, nZeroLengthFrames, mNumSamples, mIsAudio? "audio": "video"); if (mIsAudio) { @@ -2109,6 +2120,28 @@ status_t MPEG4Writer::Track::threadEntry() { return err; } +void MPEG4Writer::Track::sendTrackSummary(bool hasMultipleTracks) { + int trackNum = (mTrackId << 28); + + mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO, + trackNum | MEDIA_RECORDER_TRACK_INFO_TYPE, + mIsAudio? 0: 1); + + mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO, + trackNum | MEDIA_RECORDER_TRACK_INFO_DURATION_MS, + mTrackDurationUs / 1000); + + mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO, + trackNum | MEDIA_RECORDER_TRACK_INFO_ENCODED_FRAMES, + mNumSamples); + + if (hasMultipleTracks) { + mOwner->notify(MEDIA_RECORDER_TRACK_EVENT_INFO, + trackNum | MEDIA_RECORDER_TRACK_INFO_MAX_CHUNK_DUR_MS, + mMaxChunkDurationUs / 1000); + } +} + void MPEG4Writer::Track::trackProgressStatus(int64_t timeUs, status_t err) { LOGV("trackProgressStatus: %lld us", timeUs); if (mTrackEveryTimeDurationUs > 0 && -- cgit v1.1