summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2010-11-03 09:25:08 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2010-11-03 09:25:08 -0700
commit26490f71a5a50b2200d60de28ad0ea6b1d0a1847 (patch)
tree5bda6ee67deb1d40786012aa4540ce6037724d15 /media/libstagefright
parent3041096d137144d9d1ebdd6df88ebe8e85133c05 (diff)
parent63a0a11e8b3292253b3d3bf3a7f7dc733cf6762f (diff)
downloadframeworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.zip
frameworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.tar.gz
frameworks_av-26490f71a5a50b2200d60de28ad0ea6b1d0a1847.tar.bz2
am f3847e87: Merge "DO NOT MERGE" into gingerbread
* commit 'f3847e875eb1c58094a2d159a2a6f3f0b381d77a': DO NOT MERGE
Diffstat (limited to 'media/libstagefright')
-rw-r--r--media/libstagefright/OMXCodec.cpp32
1 files changed, 29 insertions, 3 deletions
diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp
index 9a49a9b..980da77 100644
--- a/media/libstagefright/OMXCodec.cpp
+++ b/media/libstagefright/OMXCodec.cpp
@@ -412,6 +412,13 @@ uint32_t OMXCodec::getComponentQuirks(
quirks |= kOutputBuffersAreUnreadable;
}
+ if (!strncmp(componentName, "OMX.SEC.", 8) && isEncoder) {
+ // These input buffers contain meta data (for instance,
+ // information helps locate the actual YUV data, or
+ // the physical address of the YUV data).
+ quirks |= kStoreMetaDataInInputVideoBuffers;
+ }
+
return quirks;
}
@@ -1695,7 +1702,15 @@ void OMXCodec::on_message(const omx_message &msg) {
"an EMPTY_BUFFER_DONE.", buffer);
}
- buffers->editItemAt(i).mOwnedByComponent = false;
+ {
+ BufferInfo *info = &buffers->editItemAt(i);
+ info->mOwnedByComponent = false;
+ if (info->mMediaBuffer != NULL) {
+ // It is time to release the media buffers storing meta data
+ info->mMediaBuffer->release();
+ info->mMediaBuffer = NULL;
+ }
+ }
if (mPortStatus[kPortIndexInput] == DISABLING) {
CODEC_LOGV("Port is disabled, freeing buffer %p", buffer);
@@ -2202,6 +2217,7 @@ status_t OMXCodec::freeBuffersOnPort(
CHECK_EQ(info->mMediaBuffer->refcount(), 0);
info->mMediaBuffer->release();
+ info->mMediaBuffer = NULL;
}
buffers->removeAt(i);
@@ -2434,11 +2450,19 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
break;
}
+ // Do not release the media buffer if it stores meta data
+ // instead of YUV data. The release is delayed until
+ // EMPTY_BUFFER_DONE callback is received.
+ bool releaseBuffer = true;
if (mIsEncoder && (mQuirks & kAvoidMemcopyInputRecordingFrames)) {
CHECK(mOMXLivesLocally && offset == 0);
OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *) info->mBuffer;
header->pBuffer = (OMX_U8 *) srcBuffer->data() + srcBuffer->range_offset();
} else {
+ if (mQuirks & kStoreMetaDataInInputVideoBuffers) {
+ releaseBuffer = false;
+ info->mMediaBuffer = srcBuffer;
+ }
memcpy((uint8_t *)info->mData + offset,
(const uint8_t *)srcBuffer->data() + srcBuffer->range_offset(),
srcBuffer->range_length());
@@ -2454,8 +2478,10 @@ void OMXCodec::drainInputBuffer(BufferInfo *info) {
offset += srcBuffer->range_length();
- srcBuffer->release();
- srcBuffer = NULL;
+ if (releaseBuffer) {
+ srcBuffer->release();
+ srcBuffer = NULL;
+ }
++n;