summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xinclude/media/stagefright/OMXCodec.h2
-rwxr-xr-xmedia/libstagefright/OMXCodec.cpp14
2 files changed, 16 insertions, 0 deletions
diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h
index 32a3d19..69240f6 100755
--- a/include/media/stagefright/OMXCodec.h
+++ b/include/media/stagefright/OMXCodec.h
@@ -172,6 +172,8 @@ private:
size_t mSize;
void *mData;
MediaBuffer *mMediaBuffer;
+ OMX_U8 *mAllocatedBuffer;
+ size_t mAllocatedSize;
};
struct CodecSpecificData {
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 12428c6..5937249 100755
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -2207,6 +2207,8 @@ status_t OMXCodec::allocateBuffersOnPort(OMX_U32 portIndex) {
BufferInfo info;
info.mData = NULL;
info.mSize = def.nBufferSize;
+ info.mAllocatedBuffer = NULL;
+ info.mAllocatedSize = 0;
IOMX::buffer_id buffer;
if (portIndex == kPortIndexInput
@@ -3518,6 +3520,12 @@ status_t OMXCodec::freeBuffer(OMX_U32 portIndex, size_t bufIndex) {
BufferInfo *info = &buffers->editItemAt(bufIndex);
+ if (info->mAllocatedBuffer != NULL) {
+ OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
+ header->pBuffer = info->mAllocatedBuffer;
+ header->nAllocLen = info->mAllocatedSize;
+ }
+
status_t err = mOMX->freeBuffer(mNode, portIndex, info->mBuffer);
if (err == OK && info->mMediaBuffer != NULL) {
@@ -3897,8 +3905,14 @@ bool OMXCodec::drainInputBuffer(BufferInfo *info) {
//for encoder
CHECK(header->pBuffer == info->mData);
+ if (info->mAllocatedBuffer == NULL) {
+ info->mAllocatedBuffer = header->pBuffer;
+ info->mAllocatedSize = header->nAllocLen;
+ }
+
header->pBuffer =
(OMX_U8 *)srcBuffer->data() + srcBuffer->range_offset();
+ header->nAllocLen = srcBuffer->size() - srcBuffer->range_offset();
releaseBuffer = false;
info->mMediaBuffer = srcBuffer;