diff options
-rwxr-xr-x | include/media/stagefright/OMXCodec.h | 2 | ||||
-rwxr-xr-x | media/libstagefright/OMXCodec.cpp | 14 |
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; |