Loading media/libstagefright/MPEG4Writer.cpp +42 −10 Original line number Diff line number Diff line Loading @@ -41,6 +41,12 @@ #include "include/ESDS.h" #define WARN_UNLESS(condition, message, ...) \ ( (CONDITION(condition)) ? false : ({ \ ALOGW("Condition %s failed " message, #condition, ##__VA_ARGS__); \ true; \ })) namespace android { static const int64_t kMinStreamableFileSizeInBytes = 5 * 1024 * 1024; Loading Loading @@ -2098,6 +2104,7 @@ status_t MPEG4Writer::Track::threadEntry() { status_t err = OK; MediaBuffer *buffer; const char *trackName = mIsAudio ? "Audio" : "Video"; while (!mDone && (err = mSource->read(&buffer)) == OK) { if (buffer->range_length() == 0) { buffer->release(); Loading Loading @@ -2193,15 +2200,27 @@ status_t MPEG4Writer::Track::threadEntry() { if (mResumed) { int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs; CHECK_GE(durExcludingEarlierPausesUs, 0ll); if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } int64_t pausedDurationUs = durExcludingEarlierPausesUs - mTrackDurationUs; CHECK_GE(pausedDurationUs, lastDurationUs); if (WARN_UNLESS(pausedDurationUs >= lastDurationUs, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } previousPausedDurationUs += pausedDurationUs - lastDurationUs; mResumed = false; } timestampUs -= previousPausedDurationUs; CHECK_GE(timestampUs, 0ll); if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } if (!mIsAudio) { /* * Composition time: timestampUs Loading @@ -2213,7 +2232,11 @@ status_t MPEG4Writer::Track::threadEntry() { decodingTimeUs -= previousPausedDurationUs; cttsOffsetTimeUs = timestampUs + kMaxCttsOffsetTimeUs - decodingTimeUs; CHECK_GE(cttsOffsetTimeUs, 0ll); if (WARN_UNLESS(cttsOffsetTimeUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } timestampUs = decodingTimeUs; ALOGV("decoding time: %lld and ctts offset time: %lld", timestampUs, cttsOffsetTimeUs); Loading @@ -2221,7 +2244,11 @@ status_t MPEG4Writer::Track::threadEntry() { // Update ctts box table if necessary currCttsOffsetTimeTicks = (cttsOffsetTimeUs * mTimeScale + 500000LL) / 1000000LL; CHECK_LE(currCttsOffsetTimeTicks, 0x0FFFFFFFFLL); if (WARN_UNLESS(currCttsOffsetTimeTicks <= 0x0FFFFFFFFLL, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } if (mStszTableEntries->count() == 0) { // Force the first ctts table entry to have one single entry // so that we can do adjustment for the initial track start Loading Loading @@ -2259,9 +2286,13 @@ status_t MPEG4Writer::Track::threadEntry() { } } CHECK_GE(timestampUs, 0ll); if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } ALOGV("%s media time stamp: %lld and previous paused duration %lld", mIsAudio? "Audio": "Video", timestampUs, previousPausedDurationUs); trackName, timestampUs, previousPausedDurationUs); if (timestampUs > mTrackDurationUs) { mTrackDurationUs = timestampUs; } Loading @@ -2276,7 +2307,8 @@ status_t MPEG4Writer::Track::threadEntry() { (lastTimestampUs * mTimeScale + 500000LL) / 1000000LL); if (currDurationTicks < 0ll) { ALOGE("timestampUs %lld < lastTimestampUs %lld for %s track", timestampUs, lastTimestampUs, mIsAudio? "Audio": "Video"); timestampUs, lastTimestampUs, trackName); copy->release(); return UNKNOWN_ERROR; } Loading Loading @@ -2316,7 +2348,7 @@ status_t MPEG4Writer::Track::threadEntry() { previousSampleSize = sampleSize; } ALOGV("%s timestampUs/lastTimestampUs: %lld/%lld", mIsAudio? "Audio": "Video", timestampUs, lastTimestampUs); trackName, timestampUs, lastTimestampUs); lastDurationUs = timestampUs - lastTimestampUs; lastDurationTicks = currDurationTicks; lastTimestampUs = timestampUs; Loading Loading @@ -2421,7 +2453,7 @@ status_t MPEG4Writer::Track::threadEntry() { sendTrackSummary(hasMultipleTracks); ALOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s", count, nZeroLengthFrames, mStszTableEntries->count(), mIsAudio? "audio": "video"); count, nZeroLengthFrames, mStszTableEntries->count(), trackName); if (mIsAudio) { ALOGI("Audio track drift time: %lld us", mOwner->getDriftTimeUs()); } Loading Loading
media/libstagefright/MPEG4Writer.cpp +42 −10 Original line number Diff line number Diff line Loading @@ -41,6 +41,12 @@ #include "include/ESDS.h" #define WARN_UNLESS(condition, message, ...) \ ( (CONDITION(condition)) ? false : ({ \ ALOGW("Condition %s failed " message, #condition, ##__VA_ARGS__); \ true; \ })) namespace android { static const int64_t kMinStreamableFileSizeInBytes = 5 * 1024 * 1024; Loading Loading @@ -2098,6 +2104,7 @@ status_t MPEG4Writer::Track::threadEntry() { status_t err = OK; MediaBuffer *buffer; const char *trackName = mIsAudio ? "Audio" : "Video"; while (!mDone && (err = mSource->read(&buffer)) == OK) { if (buffer->range_length() == 0) { buffer->release(); Loading Loading @@ -2193,15 +2200,27 @@ status_t MPEG4Writer::Track::threadEntry() { if (mResumed) { int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs; CHECK_GE(durExcludingEarlierPausesUs, 0ll); if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } int64_t pausedDurationUs = durExcludingEarlierPausesUs - mTrackDurationUs; CHECK_GE(pausedDurationUs, lastDurationUs); if (WARN_UNLESS(pausedDurationUs >= lastDurationUs, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } previousPausedDurationUs += pausedDurationUs - lastDurationUs; mResumed = false; } timestampUs -= previousPausedDurationUs; CHECK_GE(timestampUs, 0ll); if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } if (!mIsAudio) { /* * Composition time: timestampUs Loading @@ -2213,7 +2232,11 @@ status_t MPEG4Writer::Track::threadEntry() { decodingTimeUs -= previousPausedDurationUs; cttsOffsetTimeUs = timestampUs + kMaxCttsOffsetTimeUs - decodingTimeUs; CHECK_GE(cttsOffsetTimeUs, 0ll); if (WARN_UNLESS(cttsOffsetTimeUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } timestampUs = decodingTimeUs; ALOGV("decoding time: %lld and ctts offset time: %lld", timestampUs, cttsOffsetTimeUs); Loading @@ -2221,7 +2244,11 @@ status_t MPEG4Writer::Track::threadEntry() { // Update ctts box table if necessary currCttsOffsetTimeTicks = (cttsOffsetTimeUs * mTimeScale + 500000LL) / 1000000LL; CHECK_LE(currCttsOffsetTimeTicks, 0x0FFFFFFFFLL); if (WARN_UNLESS(currCttsOffsetTimeTicks <= 0x0FFFFFFFFLL, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } if (mStszTableEntries->count() == 0) { // Force the first ctts table entry to have one single entry // so that we can do adjustment for the initial track start Loading Loading @@ -2259,9 +2286,13 @@ status_t MPEG4Writer::Track::threadEntry() { } } CHECK_GE(timestampUs, 0ll); if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) { copy->release(); return ERROR_MALFORMED; } ALOGV("%s media time stamp: %lld and previous paused duration %lld", mIsAudio? "Audio": "Video", timestampUs, previousPausedDurationUs); trackName, timestampUs, previousPausedDurationUs); if (timestampUs > mTrackDurationUs) { mTrackDurationUs = timestampUs; } Loading @@ -2276,7 +2307,8 @@ status_t MPEG4Writer::Track::threadEntry() { (lastTimestampUs * mTimeScale + 500000LL) / 1000000LL); if (currDurationTicks < 0ll) { ALOGE("timestampUs %lld < lastTimestampUs %lld for %s track", timestampUs, lastTimestampUs, mIsAudio? "Audio": "Video"); timestampUs, lastTimestampUs, trackName); copy->release(); return UNKNOWN_ERROR; } Loading Loading @@ -2316,7 +2348,7 @@ status_t MPEG4Writer::Track::threadEntry() { previousSampleSize = sampleSize; } ALOGV("%s timestampUs/lastTimestampUs: %lld/%lld", mIsAudio? "Audio": "Video", timestampUs, lastTimestampUs); trackName, timestampUs, lastTimestampUs); lastDurationUs = timestampUs - lastTimestampUs; lastDurationTicks = currDurationTicks; lastTimestampUs = timestampUs; Loading Loading @@ -2421,7 +2453,7 @@ status_t MPEG4Writer::Track::threadEntry() { sendTrackSummary(hasMultipleTracks); ALOGI("Received total/0-length (%d/%d) buffers and encoded %d frames. - %s", count, nZeroLengthFrames, mStszTableEntries->count(), mIsAudio? "audio": "video"); count, nZeroLengthFrames, mStszTableEntries->count(), trackName); if (mIsAudio) { ALOGI("Audio track drift time: %lld us", mOwner->getDriftTimeUs()); } Loading