From 6a9e39ac55b32a2847546ef1784c2d6c91863a55 Mon Sep 17 00:00:00 2001 From: James Dong Date: Mon, 4 Oct 2010 16:41:53 -0700 Subject: [PATCH] Fixed an issue where the reserved free space in the file writer was larger than intended The problem was that even though user does not explicitly request the max file size limit via MediaRecorder.setMaxFileSize(), the file writer sets an implicit file size limit if 32-bit file offset is used on user's behalf. The reserved free space is estimated based on the file size, if the file size limit is set by the user. The fix is to add an extra bool to tell the difference between an explit requested file size and an implicit file limit and use that to set the estimated moov box size accordingly. Change-Id: I731aca6c7833aa764ed7b905edb77721577471b3 --- include/media/stagefright/MPEG4Writer.h | 1 + media/libstagefright/MPEG4Writer.cpp | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h index 70bd8e8fdd955..cff38b25d2da7 100644 --- a/include/media/stagefright/MPEG4Writer.h +++ b/include/media/stagefright/MPEG4Writer.h @@ -64,6 +64,7 @@ private: FILE *mFile; bool mUse4ByteNalLength; bool mUse32BitOffset; + bool mIsFileSizeLimitExplicitlyRequested; bool mPaused; bool mStarted; off_t mOffset; diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 90b1aab304ee3..6d00d7c89c9b2 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -212,6 +212,7 @@ MPEG4Writer::MPEG4Writer(const char *filename) : mFile(fopen(filename, "wb")), mUse4ByteNalLength(true), mUse32BitOffset(true), + mIsFileSizeLimitExplicitlyRequested(false), mPaused(false), mStarted(false), mOffset(0), @@ -225,6 +226,7 @@ MPEG4Writer::MPEG4Writer(int fd) : mFile(fdopen(fd, "wb")), mUse4ByteNalLength(true), mUse32BitOffset(true), + mIsFileSizeLimitExplicitlyRequested(false), mPaused(false), mStarted(false), mOffset(0), @@ -322,7 +324,7 @@ int64_t MPEG4Writer::estimateMoovBoxSize(int32_t bitRate) { static const int64_t MAX_MOOV_BOX_SIZE = (180 * 3000000 * 6LL / 8000); int64_t size = MIN_MOOV_BOX_SIZE; - if (mMaxFileSizeLimitBytes != 0) { + if (mMaxFileSizeLimitBytes != 0 && mIsFileSizeLimitExplicitlyRequested) { size = mMaxFileSizeLimitBytes * 4 / 1000; } else if (mMaxFileDurationLimitUs != 0) { if (bitRate <= 0) { @@ -342,7 +344,7 @@ int64_t MPEG4Writer::estimateMoovBoxSize(int32_t bitRate) { size = MAX_MOOV_BOX_SIZE; } - LOGV("limits: %lld/%lld bytes/us, bit rate: %d bps and the estimated" + LOGI("limits: %lld/%lld bytes/us, bit rate: %d bps and the estimated" " moov size %lld bytes", mMaxFileSizeLimitBytes, mMaxFileDurationLimitUs, bitRate, size); return factor * size; @@ -353,6 +355,16 @@ status_t MPEG4Writer::start(MetaData *param) { return UNKNOWN_ERROR; } + /* + * Check mMaxFileSizeLimitBytes at the beginning + * since mMaxFileSizeLimitBytes may be implicitly + * changed later for 32-bit file offset even if + * user does not ask to set it explicitly. + */ + if (mMaxFileSizeLimitBytes != 0) { + mIsFileSizeLimitExplicitlyRequested = true; + } + int32_t use64BitOffset; if (param && param->findInt32(kKey64BitFileOffset, &use64BitOffset) &&