diff options
author | Anu Sundararajan <sanuradha@ti.com> | 2011-06-22 10:49:21 -0500 |
---|---|---|
committer | Iliyan Malchev <malchev@google.com> | 2011-06-23 18:35:25 -0700 |
commit | c5a57efb706ec79032fc09c43b16d11ed0876604 (patch) | |
tree | 95444a8ebe96bdd635f5669ae91e8f53a0d57a3e | |
parent | cb62bc3fe54222cf05824e6f98fefafee552049a (diff) | |
download | frameworks_av-c5a57efb706ec79032fc09c43b16d11ed0876604.zip frameworks_av-c5a57efb706ec79032fc09c43b16d11ed0876604.tar.gz frameworks_av-c5a57efb706ec79032fc09c43b16d11ed0876604.tar.bz2 |
Stagefright: add support for gralloc OMX_UseBuffer.
XXX: This change should go along with a documentation change to
HardwareAPI.h that describes the new extension.
This change adds support for passing a buffer_handle_t to OMX_UseBuffer
during OMXCodec initialization. This new way of passing the
buffer_handle_t's replaces the old OMX_SetParameter-based approach, and
this change deprecates that interface, but still supports it for OMX IL
implementations that do not support the new interface.
Change-Id: If9c1cb3c6c349c54dab094aeb8af13eae9f85271
Signed-off-by: Jamie Gennis <jgennis@google.com>
Signed-off-by: Sarthak Aggarwal <sarthak@ti.com>
-rw-r--r-- | media/libstagefright/include/OMXNodeInstance.h | 4 | ||||
-rw-r--r-- | media/libstagefright/omx/OMXNodeInstance.cpp | 65 |
2 files changed, 68 insertions, 1 deletions
diff --git a/media/libstagefright/include/OMXNodeInstance.h b/media/libstagefright/include/OMXNodeInstance.h index ca2578f..1ccf50d 100644 --- a/media/libstagefright/include/OMXNodeInstance.h +++ b/media/libstagefright/include/OMXNodeInstance.h @@ -109,7 +109,9 @@ private: void addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); void removeActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id); void freeActiveBuffers(); - + status_t useGraphicBuffer2_l( + OMX_U32 portIndex, const sp<GraphicBuffer> &graphicBuffer, + OMX::buffer_id *buffer); static OMX_ERRORTYPE OnEvent( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 8462988..12ab941 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -406,12 +406,77 @@ status_t OMXNodeInstance::useBuffer( return OK; } +status_t OMXNodeInstance::useGraphicBuffer2_l( + OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, + OMX::buffer_id *buffer) { + + // port definition + OMX_PARAM_PORTDEFINITIONTYPE def; + def.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); + def.nVersion.s.nVersionMajor = 1; + def.nVersion.s.nVersionMinor = 0; + def.nVersion.s.nRevision = 0; + def.nVersion.s.nStep = 0; + def.nPortIndex = portIndex; + OMX_ERRORTYPE err = OMX_GetParameter(mHandle, OMX_IndexParamPortDefinition, &def); + if (err != OK) + { + LOGE("%s::%d:Error getting OMX_IndexParamPortDefinition", __FUNCTION__, __LINE__); + return err; + } + + BufferMeta *bufferMeta = new BufferMeta(graphicBuffer); + + OMX_BUFFERHEADERTYPE *header = NULL; + OMX_U8* bufferHandle = const_cast<OMX_U8*>( + reinterpret_cast<const OMX_U8*>(graphicBuffer->handle)); + + err = OMX_UseBuffer( + mHandle, + &header, + portIndex, + bufferMeta, + def.nBufferSize, + bufferHandle); + + if (err != OMX_ErrorNone) { + LOGE("OMX_UseBuffer failed with error %d (0x%08x)", err, err); + delete bufferMeta; + bufferMeta = NULL; + *buffer = 0; + return UNKNOWN_ERROR; + } + + CHECK_EQ(header->pBuffer, bufferHandle); + CHECK_EQ(header->pAppPrivate, bufferMeta); + + *buffer = header; + + addActiveBuffer(portIndex, *buffer); + + return OK; +} + +// XXX: This function is here for backwards compatibility. Once the OMX +// implementations have been updated this can be removed and useGraphicBuffer2 +// can be renamed to useGraphicBuffer. status_t OMXNodeInstance::useGraphicBuffer( OMX_U32 portIndex, const sp<GraphicBuffer>& graphicBuffer, OMX::buffer_id *buffer) { Mutex::Autolock autoLock(mLock); + // See if the newer version of the extension is present. OMX_INDEXTYPE index; + if (OMX_GetExtensionIndex( + mHandle, + const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer2"), + &index) == OMX_ErrorNone) { + return useGraphicBuffer2_l(portIndex, graphicBuffer, buffer); + } + + LOGW("Falling back to the deprecated useAndroidNativeBuffer support. You " + "should switch to the useAndroidNativeBuffer2 extension."); + OMX_ERRORTYPE err = OMX_GetExtensionIndex( mHandle, const_cast<OMX_STRING>("OMX.google.android.index.useAndroidNativeBuffer"), |