diff options
author | James Dong <jdong@google.com> | 2010-11-10 21:11:41 -0800 |
---|---|---|
committer | James Dong <jdong@google.com> | 2010-11-11 11:26:16 -0800 |
commit | f23c4f92c3b0202435cf87db2642156fabc46f02 (patch) | |
tree | 49bc805b33eabf2cc39bb5c39d780d050bce3347 /media/libstagefright | |
parent | 5f0cb5c62553125715dbbb171f0b81e4b7c6d6ac (diff) | |
download | frameworks_av-f23c4f92c3b0202435cf87db2642156fabc46f02.zip frameworks_av-f23c4f92c3b0202435cf87db2642156fabc46f02.tar.gz frameworks_av-f23c4f92c3b0202435cf87db2642156fabc46f02.tar.bz2 |
Fix memory leak when 0-memcpy quirk is used
o minor change to the original patch by Andreas:
call restorePatchedDataPointer() method only if kAvoidMemcopyInputRecordingFrames is turned on
Change-Id: Idf3710e6f759d37d28e866613f98d39215722cb9
Diffstat (limited to 'media/libstagefright')
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index 9f9c83a..3a5d6af 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1913,6 +1913,13 @@ void OMXCodec::on_message(const omx_message &msg) { // Buffer could not be released until empty buffer done is called. if (info->mMediaBuffer != NULL) { + if (mIsEncoder && + (mQuirks & kAvoidMemcopyInputRecordingFrames)) { + // If zero-copy mode is enabled this will send the + // input buffer back to the upstream source. + restorePatchedDataPointer(info); + } + info->mMediaBuffer->release(); info->mMediaBuffer = NULL; } @@ -2462,6 +2469,7 @@ status_t OMXCodec::freeBuffer(OMX_U32 portIndex, size_t bufIndex) { status_t err = mOMX->freeBuffer(mNode, portIndex, info->mBuffer); if (err == OK && info->mMediaBuffer != NULL) { + CHECK_EQ(portIndex, kPortIndexOutput); info->mMediaBuffer->setObserver(NULL); // Make sure nobody but us owns this buffer at this point. @@ -2474,6 +2482,7 @@ status_t OMXCodec::freeBuffer(OMX_U32 portIndex, size_t bufIndex) { } info->mMediaBuffer->release(); + info->mMediaBuffer = NULL; } if (err == OK) { @@ -2714,10 +2723,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) { if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) { CHECK(mOMXLivesLocally && offset == 0); OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer; + CHECK(header->pBuffer == info->mData); header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset(); releaseBuffer = false; info->mMediaBuffer = srcBuffer; - // FIXME: we are leaking memory } else { if (mIsMetaDataStoredInVideoBuffers) { releaseBuffer = false; @@ -4001,4 +4010,12 @@ status_t QueryCodecs( } } +void OMXCodec::restorePatchedDataPointer(BufferInfo *info) { + CHECK(mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)); + CHECK(mOMXLivesLocally); + + OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)info->mBuffer; + header->pBuffer = (OMX_U8 *)info->mData; +} + } // namespace android |