mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1128939: Part1. Ensure we have any space in the media buffer before writing. r=k17e
This commit is contained in:
parent
b949dd90a8
commit
911759aeb7
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user