From 609b815a3131d22da38b2f452faa9f89daad4039 Mon Sep 17 00:00:00 2001 From: Andy Hung Date: Fri, 2 May 2014 11:05:04 -0700 Subject: Update OMX messages for 64 bit Change node_id and buffer_id to uint32_t. Ensure IOMX messages are fixed size. Remove 64 bit compile warnings in associated files. Change-Id: Icdbef00aca575e5dc502ebb52e3ce7d0d7883203 Signed-off-by: Andy Hung --- media/libstagefright/omx/OMX.cpp | 12 +-- media/libstagefright/omx/OMXNodeInstance.cpp | 108 ++++++++++++++++++++++----- 2 files changed, 95 insertions(+), 25 deletions(-) (limited to 'media/libstagefright/omx') diff --git a/media/libstagefright/omx/OMX.cpp b/media/libstagefright/omx/OMX.cpp index b62d5f5..22b12d9 100644 --- a/media/libstagefright/omx/OMX.cpp +++ b/media/libstagefright/omx/OMX.cpp @@ -287,6 +287,7 @@ status_t OMX::sendCommand( status_t OMX::getParameter( node_id node, OMX_INDEXTYPE index, void *params, size_t size) { + ALOGV("getParameter(%u %#x %p %zd)", node, index, params, size); return findInstance(node)->getParameter( index, params, size); } @@ -294,6 +295,7 @@ status_t OMX::getParameter( status_t OMX::setParameter( node_id node, OMX_INDEXTYPE index, const void *params, size_t size) { + ALOGV("setParameter(%u %#x %p %zd)", node, index, params, size); return findInstance(node)->setParameter( index, params, size); } @@ -445,13 +447,13 @@ OMX_ERRORTYPE OMX::OnEvent( } OMX_ERRORTYPE OMX::OnEmptyBufferDone( - node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { + node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { ALOGV("OnEmptyBufferDone buffer=%p", pBuffer); omx_message msg; msg.type = omx_message::EMPTY_BUFFER_DONE; msg.node = node; - msg.u.buffer_data.buffer = pBuffer; + msg.u.buffer_data.buffer = buffer; findDispatcher(node)->post(msg); @@ -459,13 +461,13 @@ OMX_ERRORTYPE OMX::OnEmptyBufferDone( } OMX_ERRORTYPE OMX::OnFillBufferDone( - node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { + node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer) { ALOGV("OnFillBufferDone buffer=%p", pBuffer); omx_message msg; msg.type = omx_message::FILL_BUFFER_DONE; msg.node = node; - msg.u.extended_buffer_data.buffer = pBuffer; + msg.u.extended_buffer_data.buffer = buffer; msg.u.extended_buffer_data.range_offset = pBuffer->nOffset; msg.u.extended_buffer_data.range_length = pBuffer->nFilledLen; msg.u.extended_buffer_data.flags = pBuffer->nFlags; @@ -479,7 +481,7 @@ OMX_ERRORTYPE OMX::OnFillBufferDone( OMX::node_id OMX::makeNodeID(OMXNodeInstance *instance) { // mLock is already held. - node_id node = (node_id)(uintptr_t)++mNodeCounter; + node_id node = (node_id)++mNodeCounter; mNodeIDToInstance.add(node, instance); return node; diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 0fb38fa..d6ab109 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp @@ -92,10 +92,14 @@ OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = { OMXNodeInstance::OMXNodeInstance( OMX *owner, const sp &observer) : mOwner(owner), - mNodeID(NULL), + mNodeID(0), mHandle(NULL), mObserver(observer), - mDying(false) { + mDying(false) +#ifdef __LP64__ + , mBufferIDCount(0) +#endif +{ } OMXNodeInstance::~OMXNodeInstance() { @@ -232,7 +236,7 @@ status_t OMXNodeInstance::freeNode(OMXMaster *master) { } mOwner->invalidateNodeID(mNodeID); - mNodeID = NULL; + mNodeID = 0; ALOGV("OMXNodeInstance going away."); delete this; @@ -270,7 +274,7 @@ status_t OMXNodeInstance::getParameter( Mutex::Autolock autoLock(mLock); OMX_ERRORTYPE err = OMX_GetParameter(mHandle, index, params); - + ALOGE_IF(err != OMX_ErrorNone, "getParameter(%d) ERROR: %#x", index, err); return StatusFromOMXError(err); } @@ -280,7 +284,7 @@ status_t OMXNodeInstance::setParameter( OMX_ERRORTYPE err = OMX_SetParameter( mHandle, index, const_cast(params)); - + ALOGE_IF(err != OMX_ErrorNone, "setParameter(%d) ERROR: %#x", index, err); return StatusFromOMXError(err); } @@ -482,7 +486,7 @@ status_t OMXNodeInstance::useBuffer( CHECK_EQ(header->pAppPrivate, buffer_meta); - *buffer = header; + *buffer = makeBufferID(header); addActiveBuffer(portIndex, *buffer); @@ -538,7 +542,7 @@ status_t OMXNodeInstance::useGraphicBuffer2_l( CHECK_EQ(header->pBuffer, bufferHandle); CHECK_EQ(header->pAppPrivate, bufferMeta); - *buffer = header; + *buffer = makeBufferID(header); addActiveBuffer(portIndex, *buffer); @@ -602,7 +606,7 @@ status_t OMXNodeInstance::useGraphicBuffer( CHECK_EQ(header->pAppPrivate, bufferMeta); - *buffer = header; + *buffer = makeBufferID(header); addActiveBuffer(portIndex, *buffer); @@ -614,7 +618,7 @@ status_t OMXNodeInstance::updateGraphicBufferInMeta( OMX::buffer_id buffer) { Mutex::Autolock autoLock(mLock); - OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)(buffer); + OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer); VideoDecoderOutputMetaData *metadata = (VideoDecoderOutputMetaData *)(header->pBuffer); BufferMeta *bufferMeta = (BufferMeta *)(header->pAppPrivate); @@ -710,7 +714,7 @@ status_t OMXNodeInstance::allocateBuffer( CHECK_EQ(header->pAppPrivate, buffer_meta); - *buffer = header; + *buffer = makeBufferID(header); *buffer_data = header->pBuffer; addActiveBuffer(portIndex, *buffer); @@ -748,7 +752,7 @@ status_t OMXNodeInstance::allocateBufferWithBackup( CHECK_EQ(header->pAppPrivate, buffer_meta); - *buffer = header; + *buffer = makeBufferID(header); addActiveBuffer(portIndex, *buffer); @@ -766,13 +770,14 @@ status_t OMXNodeInstance::freeBuffer( removeActiveBuffer(portIndex, buffer); - OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; + OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer); BufferMeta *buffer_meta = static_cast(header->pAppPrivate); OMX_ERRORTYPE err = OMX_FreeBuffer(mHandle, portIndex, header); delete buffer_meta; buffer_meta = NULL; + invalidateBufferID(buffer); return StatusFromOMXError(err); } @@ -780,7 +785,7 @@ status_t OMXNodeInstance::freeBuffer( status_t OMXNodeInstance::fillBuffer(OMX::buffer_id buffer) { Mutex::Autolock autoLock(mLock); - OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; + OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer); header->nFilledLen = 0; header->nOffset = 0; header->nFlags = 0; @@ -796,7 +801,7 @@ status_t OMXNodeInstance::emptyBuffer( OMX_U32 flags, OMX_TICKS timestamp) { Mutex::Autolock autoLock(mLock); - OMX_BUFFERHEADERTYPE *header = (OMX_BUFFERHEADERTYPE *)buffer; + OMX_BUFFERHEADERTYPE *header = findBufferHeader(buffer); header->nFilledLen = rangeLength; header->nOffset = rangeOffset; header->nFlags = flags; @@ -914,8 +919,7 @@ void OMXNodeInstance::onMessage(const omx_message &msg) { if (msg.type == omx_message::FILL_BUFFER_DONE) { OMX_BUFFERHEADERTYPE *buffer = - static_cast( - msg.u.extended_buffer_data.buffer); + findBufferHeader(msg.u.extended_buffer_data.buffer); BufferMeta *buffer_meta = static_cast(buffer->pAppPrivate); @@ -940,8 +944,7 @@ void OMXNodeInstance::onMessage(const omx_message &msg) { // be very confused. OMX_BUFFERHEADERTYPE *buffer = - static_cast( - msg.u.buffer_data.buffer); + findBufferHeader(msg.u.buffer_data.buffer); bufferSource->codecBufferEmptied(buffer); return; @@ -1001,7 +1004,8 @@ OMX_ERRORTYPE OMXNodeInstance::OnEmptyBufferDone( if (instance->mDying) { return OMX_ErrorNone; } - return instance->owner()->OnEmptyBufferDone(instance->nodeID(), pBuffer); + return instance->owner()->OnEmptyBufferDone(instance->nodeID(), + instance->findBufferID(pBuffer), pBuffer); } // static @@ -1013,7 +1017,8 @@ OMX_ERRORTYPE OMXNodeInstance::OnFillBufferDone( if (instance->mDying) { return OMX_ErrorNone; } - return instance->owner()->OnFillBufferDone(instance->nodeID(), pBuffer); + return instance->owner()->OnFillBufferDone(instance->nodeID(), + instance->findBufferID(pBuffer), pBuffer); } void OMXNodeInstance::addActiveBuffer(OMX_U32 portIndex, OMX::buffer_id id) { @@ -1048,4 +1053,67 @@ void OMXNodeInstance::freeActiveBuffers() { } } +#ifdef __LP64__ + +OMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { + if (bufferHeader == NULL) { + return 0; + } + Mutex::Autolock autoLock(mBufferIDLock); + OMX::buffer_id buffer; + do { // handle the very unlikely case of ID overflow + if (++mBufferIDCount == 0) { + ++mBufferIDCount; + } + buffer = (OMX::buffer_id)mBufferIDCount; + } while (mBufferIDToBufferHeader.indexOfKey(buffer) >= 0); + mBufferIDToBufferHeader.add(buffer, bufferHeader); + mBufferHeaderToBufferID.add(bufferHeader, buffer); + return buffer; +} + +OMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(OMX::buffer_id buffer) { + if (buffer == 0) { + return NULL; + } + Mutex::Autolock autoLock(mBufferIDLock); + return mBufferIDToBufferHeader.valueFor(buffer); +} + +OMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { + if (bufferHeader == NULL) { + return 0; + } + Mutex::Autolock autoLock(mBufferIDLock); + return mBufferHeaderToBufferID.valueFor(bufferHeader); +} + +void OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer) { + if (buffer == 0) { + return; + } + Mutex::Autolock autoLock(mBufferIDLock); + mBufferHeaderToBufferID.removeItem(mBufferIDToBufferHeader.valueFor(buffer)); + mBufferIDToBufferHeader.removeItem(buffer); +} + +#else + +OMX::buffer_id OMXNodeInstance::makeBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { + return (OMX::buffer_id)bufferHeader; +} + +OMX_BUFFERHEADERTYPE *OMXNodeInstance::findBufferHeader(OMX::buffer_id buffer) { + return (OMX_BUFFERHEADERTYPE *)buffer; +} + +OMX::buffer_id OMXNodeInstance::findBufferID(OMX_BUFFERHEADERTYPE *bufferHeader) { + return (OMX::buffer_id)bufferHeader; +} + +void OMXNodeInstance::invalidateBufferID(OMX::buffer_id buffer __unused) { +} + +#endif + } // namespace android -- cgit v1.1