diff options
author | James Dong <jdong@google.com> | 2010-07-15 19:08:20 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-07-20 08:39:57 -0700 |
commit | faed5cd124a54b8db3429f4c26b3220bbec4c8bb (patch) | |
tree | f0d4576711cdcc0af89e9f509d5a94eae995bdeb /media/libstagefright/MPEG4Writer.cpp | |
parent | 59f566c4ec3dfc097ad8163523e522280b27e5c3 (diff) | |
download | frameworks_av-faed5cd124a54b8db3429f4c26b3220bbec4c8bb.zip frameworks_av-faed5cd124a54b8db3429f4c26b3220bbec4c8bb.tar.gz frameworks_av-faed5cd124a54b8db3429f4c26b3220bbec4c8bb.tar.bz2 |
Progress status notification
- Keep track of per-track progress
Change-Id: Ibd36f0e8c78581928c8aa2f5e23c5e7e0615c2cc
Diffstat (limited to 'media/libstagefright/MPEG4Writer.cpp')
-rw-r--r-- | media/libstagefright/MPEG4Writer.cpp | 77 |
1 files changed, 51 insertions, 26 deletions
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index b7388bb..c4a25bc 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -111,7 +111,6 @@ private: int64_t mStartTimestampUs; int64_t mPreviousTrackTimeUs; int64_t mTrackEveryTimeDurationUs; - int32_t mTrackEveryNumberOfFrames; static void *ThreadWrapper(void *me); void threadEntry(); @@ -121,7 +120,7 @@ private: void writeOneChunk(bool isAvc); // Track authoring progress status - void trackProgressStatus(int32_t nFrames, int64_t timeUs); + void trackProgressStatus(int64_t timeUs, status_t err = OK); void initTrackingProgressStatus(MetaData *params); // Utilities for collecting statistical data @@ -742,7 +741,6 @@ void MPEG4Writer::Track::initTrackingProgressStatus(MetaData *params) { mPreviousTrackTimeUs = -1; mTrackingProgressStatus = false; mTrackEveryTimeDurationUs = 0; - mTrackEveryNumberOfFrames = 0; { int64_t timeUs; if (params && params->findInt64(kKeyTrackTimeStatus, &timeUs)) { @@ -751,14 +749,6 @@ void MPEG4Writer::Track::initTrackingProgressStatus(MetaData *params) { mTrackingProgressStatus = true; } } - { - int32_t nFrames; - if (params && params->findInt32(kKeyTrackFrameStatus, &nFrames)) { - LOGV("Receive request to track progress status for every %d frames", nFrames); - mTrackEveryNumberOfFrames = nFrames; - mTrackingProgressStatus = true; - } - } } status_t MPEG4Writer::Track::start(MetaData *params) { @@ -1164,7 +1154,7 @@ void MPEG4Writer::Track::threadEntry() { if (mPreviousTrackTimeUs <= 0) { mPreviousTrackTimeUs = mStartTimestampUs; } - trackProgressStatus(mSampleInfos.size(), timestampUs); + trackProgressStatus(timestampUs); } if (mOwner->numTracks() == 1) { off_t offset = is_avc? mOwner->addLengthPrefixedSample_l(copy) @@ -1207,7 +1197,7 @@ void MPEG4Writer::Track::threadEntry() { if (mSampleInfos.empty()) { err = UNKNOWN_ERROR; } - mOwner->notify(MEDIA_RECORDER_EVENT_INFO, MEDIA_RECORDER_INFO_COMPLETION_STATUS, err); + mOwner->trackProgressStatus(this, -1, err); // Last chunk if (mOwner->numTracks() == 1) { @@ -1237,26 +1227,61 @@ void MPEG4Writer::Track::threadEntry() { logStatisticalData(is_audio); } -void MPEG4Writer::Track::trackProgressStatus(int32_t nFrames, int64_t timeUs) { - LOGV("trackProgressStatus: %d frames and %lld us", nFrames, timeUs); - if (mTrackEveryNumberOfFrames > 0 && - nFrames % mTrackEveryNumberOfFrames == 0) { - LOGV("Fire frame tracking progress status at frame %d", nFrames); - mOwner->notify(MEDIA_RECORDER_EVENT_INFO, - MEDIA_RECORDER_INFO_PROGRESS_FRAME_STATUS, - nFrames); - } - +void MPEG4Writer::Track::trackProgressStatus(int64_t timeUs, status_t err) { + LOGV("trackProgressStatus: %lld us", timeUs); if (mTrackEveryTimeDurationUs > 0 && timeUs - mPreviousTrackTimeUs >= mTrackEveryTimeDurationUs) { LOGV("Fire time tracking progress status at %lld us", timeUs); - mOwner->notify(MEDIA_RECORDER_EVENT_INFO, - MEDIA_RECORDER_INFO_PROGRESS_TIME_STATUS, - timeUs / 1000); + mOwner->trackProgressStatus(this, timeUs - mPreviousTrackTimeUs, err); mPreviousTrackTimeUs = timeUs; } } +void MPEG4Writer::trackProgressStatus( + const MPEG4Writer::Track* track, int64_t timeUs, status_t err) { + Mutex::Autolock lock(mLock); + int32_t nTracks = mTracks.size(); + CHECK(nTracks >= 1); + CHECK(nTracks < 64); // Arbitrary number + + int32_t trackNum = 0; +#if 0 + // In the worst case, we can put the trackNum + // along with MEDIA_RECORDER_INFO_COMPLETION_STATUS + // to report the progress. + for (List<Track *>::iterator it = mTracks.begin(); + it != mTracks.end(); ++it, ++trackNum) { + if (track == (*it)) { + break; + } + } +#endif + CHECK(trackNum < nTracks); + trackNum <<= 16; + + // Error notification + // Do not consider ERROR_END_OF_STREAM an error + if (err != OK && err != ERROR_END_OF_STREAM) { + notify(MEDIA_RECORDER_EVENT_ERROR, + trackNum | MEDIA_RECORDER_ERROR_UNKNOWN, + err); + return; + } + + if (timeUs == -1) { + // Send completion notification + notify(MEDIA_RECORDER_EVENT_INFO, + trackNum | MEDIA_RECORDER_INFO_COMPLETION_STATUS, + err); + return; + } else { + // Send progress status + notify(MEDIA_RECORDER_EVENT_INFO, + trackNum | MEDIA_RECORDER_INFO_PROGRESS_TIME_STATUS, + timeUs / 1000); + } +} + void MPEG4Writer::Track::findMinAvgMaxSampleDurationMs( int32_t *min, int32_t *avg, int32_t *max) { CHECK(!mSampleInfos.empty()); |