summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/OMXCodec.cpp
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-11-10 21:11:41 -0800
committerJames Dong <jdong@google.com>2010-11-11 11:26:16 -0800
commitf23c4f92c3b0202435cf87db2642156fabc46f02 (patch)
tree49bc805b33eabf2cc39bb5c39d780d050bce3347 /media/libstagefright/OMXCodec.cpp
parent5f0cb5c62553125715dbbb171f0b81e4b7c6d6ac (diff)
downloadframeworks_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/OMXCodec.cpp')
-rw-r--r--media/libstagefright/OMXCodec.cpp19
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