Bug 1128939: Part1. Ensure we have any space in the media buffer before writing. r=k17e

This commit is contained in:
Jean-Yves Avenard 2015-02-11 17:40:13 +11:00
parent b949dd90a8
commit 911759aeb7

View File

@ -167,6 +167,9 @@ private:
MPEG4Source &operator=(const MPEG4Source &);
bool ensureSrcBufferAllocated(int32_t size);
// Ensure that we have enough data in mMediaBuffer to copy our data.
// Returns false if not and clear mMediaBuffer.
bool ensureMediaBufferAllocated(int32_t size);
};
// This custom data source wraps an existing one and satisfies requests
@ -3270,12 +3273,25 @@ bool MPEG4Source::ensureSrcBufferAllocated(int32_t aSize) {
return true;
}
if (!mSrcBackend.SetLength(aSize)) {
ALOGE("Error insufficient memory, requested %u bytes (had:%u)",
aSize, mSrcBackend.Length());
return false;
}
mSrcBuffer = mSrcBackend.Elements();
return true;
}
bool MPEG4Source::ensureMediaBufferAllocated(int32_t aSize) {
if (mBuffer->size() < aSize) {
ALOGE("Error insufficient memory, requested %u bytes (had:%u)",
aSize, mBuffer->size());
mBuffer->release();
mBuffer = NULL;
return false;
}
return true;
}
status_t MPEG4Source::read(
MediaBuffer **out, const ReadOptions *options) {
Mutex::Autolock autoLock(mLock);
@ -3410,6 +3426,9 @@ status_t MPEG4Source::read(
if (!mIsAVC || mWantsNALFragments) {
if (newBuffer) {
if (!ensureMediaBufferAllocated(size)) {
return ERROR_MALFORMED;
}
ssize_t num_bytes_read =
mDataSource->readAt(offset, (uint8_t *)mBuffer->data(), size);
@ -3517,12 +3536,13 @@ status_t MPEG4Source::read(
int32_t drm = 0;
bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0);
if (usesDRM) {
if (!ensureMediaBufferAllocated(size)) {
return ERROR_MALFORMED;
}
num_bytes_read =
mDataSource->readAt(offset, (uint8_t*)mBuffer->data(), size);
} else {
if (!ensureSrcBufferAllocated(size)) {
ALOGE("Error insufficient memory, requested %u bytes (had:%u)",
size, mSrcBackend.Length());
return ERROR_MALFORMED;
}
num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size);
@ -3564,7 +3584,9 @@ status_t MPEG4Source::read(
continue;
}
CHECK(dstOffset + 4 <= mBuffer->size());
if (!ensureMediaBufferAllocated(dstOffset + 4 + nalLength)) {
return ERROR_MALFORMED;
}
dstData[dstOffset++] = (uint8_t) (nalLength >> 24);
dstData[dstOffset++] = (uint8_t) (nalLength >> 16);
dstData[dstOffset++] = (uint8_t) (nalLength >> 8);
@ -3789,6 +3811,9 @@ status_t MPEG4Source::fragmentedRead(
if (!mIsAVC || mWantsNALFragments) {
if (newBuffer) {
if (!ensureMediaBufferAllocated(size)) {
return ERROR_MALFORMED;
}
ssize_t num_bytes_read =
mDataSource->readAt(offset, (uint8_t *)mBuffer->data(), size);
@ -3874,12 +3899,13 @@ status_t MPEG4Source::fragmentedRead(
int32_t drm = 0;
bool usesDRM = (mFormat->findInt32(kKeyIsDRM, &drm) && drm != 0);
if (usesDRM) {
if (!ensureMediaBufferAllocated(size)) {
return ERROR_MALFORMED;
}
num_bytes_read =
mDataSource->readAt(offset, (uint8_t*)mBuffer->data(), size);
} else {
if (!ensureSrcBufferAllocated(size)) {
ALOGE("Error insufficient memory, requested %u bytes (had:%u)",
size, mSrcBackend.Length());
return ERROR_MALFORMED;
}
num_bytes_read = mDataSource->readAt(offset, mSrcBuffer, size);
@ -3922,7 +3948,9 @@ status_t MPEG4Source::fragmentedRead(
continue;
}
CHECK(dstOffset + 4 <= mBuffer->size());
if (!ensureMediaBufferAllocated(dstOffset + 4 + nalLength)) {
return ERROR_MALFORMED;
}
dstData[dstOffset++] = (uint8_t) (nalLength >> 24);
dstData[dstOffset++] = (uint8_t) (nalLength >> 16);
dstData[dstOffset++] = (uint8_t) (nalLength >> 8);