summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorDeva Ramasubramanian <dramasub@codeaurora.org>2011-07-15 17:32:33 -0700
committerSteve Kondik <shade@chemlab.org>2011-11-13 19:38:49 -0800
commit49cf37f00e16bf4bccf2877fbd3050e266ccd468 (patch)
treeea0f2ee5b2a4f9780dd3d1cfc8519f7562b30f9f /media
parent91101bd5d7b3be0131e5f1a288992fee9fd1db2b (diff)
downloadframeworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.zip
frameworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.tar.gz
frameworks_base-49cf37f00e16bf4bccf2877fbd3050e266ccd468.tar.bz2
libstagefright: Fix for handling empty buffers from extractors
There is a possiblity that mSource->read will return a NULL buffer with a invalid size. As some implementations of memcpy don't handle NULL buffers well, it's best to check for a NULL buffer and avoid the memcpy. This fix also handles the case where the buffer happens to be NULL but size happens to be wrongly set. (cherry picked from commit b05336ce6a579a2a4912177b0606d25430382abf) Change-Id: Ic48ba92c7bc73afefc3b63e5cf00cb96ee384175 Conflicts: media/libstagefright/OMXCodec.cpp
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/OMXCodec.cpp20
1 files changed, 14 insertions, 6 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 1da93a6..8fc92eb 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -4067,13 +4067,14 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
}
size_t remainingBytes = info->mSize - offset;
+ size_t srcBufferLength = srcBuffer->range_length();
- if (srcBuffer->range_length() > remainingBytes) {
+ if (srcBufferLength > remainingBytes) {
if (offset == 0) {
CODEC_LOGE(
"Codec's input buffers are too small to accomodate "
"buffer read from source (info->mSize = %d, srcLength = %d)",
- info->mSize, srcBuffer->range_length());
+ info->mSize, srcBufferLength);
srcBuffer->release();
srcBuffer = NULL;
@@ -4118,9 +4119,16 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
tmpBuffer->release();
}
#else
- memcpy((uint8_t *)info->mData + offset,
- (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
- srcBuffer->range_length());
+ if (srcBuffer->data()) {
+ memcpy((uint8_t *)info->mData + offset,
+ (const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
+ srcBufferLength);
+ } else {
+ if (srcBufferLength != 0) {
+ LOGW("Source buffer was NULL but the size wasn't 0 bytes (is %d bytes)", srcBufferLength);
+ srcBufferLength = 0;
+ }
+ }
#endif
}
@@ -4132,7 +4140,7 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
timestampUs = lastBufferTimeUs;
}
- offset += srcBuffer->range_length();
+ offset += srcBufferLength;
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
info->mMediaBuffer = srcBuffer;