summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-10-04 16:41:53 -0700
committerJames Dong <jdong@google.com>2010-10-04 16:54:59 -0700
commita007e8229fb2be4866c483f9cd6c4af238a2da5e (patch)
tree48ef6f33a27a4cdba76218932db8ade197ae190e
parent3754a7901b6bed448eaecfbd29a4705b30a6b656 (diff)
downloadframeworks_av-a007e8229fb2be4866c483f9cd6c4af238a2da5e.zip
frameworks_av-a007e8229fb2be4866c483f9cd6c4af238a2da5e.tar.gz
frameworks_av-a007e8229fb2be4866c483f9cd6c4af238a2da5e.tar.bz2
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
-rw-r--r--include/media/stagefright/MPEG4Writer.h1
-rw-r--r--media/libstagefright/MPEG4Writer.cpp16
2 files changed, 15 insertions, 2 deletions
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index 70bd8e8..cff38b2 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 90b1aab..6d00d7c 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) &&