Loading media/libstagefright/include/OMXNodeInstance.h +3 −1 Original line number Diff line number Diff line Loading @@ -182,7 +182,9 @@ private: OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); status_t storeMetaDataInBuffers_l(OMX_U32 portIndex, OMX_BOOL enable); status_t storeMetaDataInBuffers_l( OMX_U32 portIndex, OMX_BOOL enable, OMX_BOOL useGraphicBuffer, OMX_BOOL *usingGraphicBufferInMeta); sp<GraphicBufferSource> getGraphicBufferSource(); void setGraphicBufferSource(const sp<GraphicBufferSource>& bufferSource); Loading media/libstagefright/omx/GraphicBufferSource.cpp +39 −13 Original line number Diff line number Diff line Loading @@ -37,7 +37,8 @@ static const bool EXTRA_CHECK = true; GraphicBufferSource::GraphicBufferSource(OMXNodeInstance* nodeInstance, uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount) : uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount, bool useGraphicBufferInMeta) : mInitCheck(UNKNOWN_ERROR), mNodeInstance(nodeInstance), mExecuting(false), Loading @@ -59,7 +60,8 @@ GraphicBufferSource::GraphicBufferSource(OMXNodeInstance* nodeInstance, mTimePerCaptureUs(-1ll), mTimePerFrameUs(-1ll), mPrevCaptureUs(-1ll), mPrevFrameUs(-1ll) { mPrevFrameUs(-1ll), mUseGraphicBufferInMeta(useGraphicBufferInMeta) { ALOGV("GraphicBufferSource w=%u h=%u c=%u", bufferWidth, bufferHeight, bufferCount); Loading Loading @@ -254,6 +256,8 @@ void GraphicBufferSource::codecBufferEmptied(OMX_BUFFERHEADERTYPE* header) { // Pull the graphic buffer handle back out of the buffer, and confirm // that it matches expectations. OMX_U8* data = header->pBuffer; MetadataBufferType type = *(MetadataBufferType *)data; if (type == kMetadataBufferTypeGrallocSource) { buffer_handle_t bufferHandle; memcpy(&bufferHandle, data + 4, sizeof(buffer_handle_t)); if (bufferHandle != codecBuffer.mGraphicBuffer->handle) { Loading @@ -262,6 +266,16 @@ void GraphicBufferSource::codecBufferEmptied(OMX_BUFFERHEADERTYPE* header) { bufferHandle, codecBuffer.mGraphicBuffer->handle); CHECK(!"codecBufferEmptied: mismatched buffer"); } } else if (type == kMetadataBufferTypeGraphicBuffer) { GraphicBuffer *buffer; memcpy(&buffer, data + 4, sizeof(buffer)); if (buffer != codecBuffer.mGraphicBuffer.get()) { // should never happen ALOGE("codecBufferEmptied: buffer is %p, expected %p", buffer, codecBuffer.mGraphicBuffer.get()); CHECK(!"codecBufferEmptied: mismatched buffer"); } } } // Find matching entry in our cached copy of the BufferQueue slots. Loading Loading @@ -642,10 +656,22 @@ status_t GraphicBufferSource::submitBuffer_l( OMX_BUFFERHEADERTYPE* header = codecBuffer.mHeader; CHECK(header->nAllocLen >= 4 + sizeof(buffer_handle_t)); OMX_U8* data = header->pBuffer; buffer_handle_t handle; if (!mUseGraphicBufferInMeta) { const OMX_U32 type = kMetadataBufferTypeGrallocSource; buffer_handle_t handle = codecBuffer.mGraphicBuffer->handle; handle = codecBuffer.mGraphicBuffer->handle; memcpy(data, &type, 4); memcpy(data + 4, &handle, sizeof(buffer_handle_t)); } else { // codecBuffer holds a reference to the GraphicBuffer, so // it is valid while it is with the OMX component const OMX_U32 type = kMetadataBufferTypeGraphicBuffer; memcpy(data, &type, 4); // passing a non-reference-counted graphicBuffer GraphicBuffer *buffer = codecBuffer.mGraphicBuffer.get(); handle = buffer->handle; memcpy(data + 4, &buffer, sizeof(buffer)); } status_t err = mNodeInstance->emptyDirectBuffer(header, 0, 4 + sizeof(buffer_handle_t), OMX_BUFFERFLAG_ENDOFFRAME, Loading media/libstagefright/omx/GraphicBufferSource.h +4 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,8 @@ namespace android { class GraphicBufferSource : public BufferQueue::ConsumerListener { public: GraphicBufferSource(OMXNodeInstance* nodeInstance, uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount); uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount, bool useGraphicBufferInMeta = false); virtual ~GraphicBufferSource(); // We can't throw an exception if the constructor fails, so we just set Loading Loading @@ -271,6 +272,8 @@ private: int64_t mPrevCaptureUs; int64_t mPrevFrameUs; bool mUseGraphicBufferInMeta; void onMessageReceived(const sp<AMessage> &msg); DISALLOW_EVIL_CONSTRUCTORS(GraphicBufferSource); Loading media/libstagefright/omx/OMXNodeInstance.cpp +29 −6 Original line number Diff line number Diff line Loading @@ -393,20 +393,39 @@ status_t OMXNodeInstance::storeMetaDataInBuffers( OMX_U32 portIndex, OMX_BOOL enable) { Mutex::Autolock autolock(mLock); return storeMetaDataInBuffers_l(portIndex, enable); return storeMetaDataInBuffers_l( portIndex, enable, OMX_FALSE /* useGraphicBuffer */, NULL /* usingGraphicBufferInMetadata */); } status_t OMXNodeInstance::storeMetaDataInBuffers_l( OMX_U32 portIndex, OMX_BOOL enable) { OMX_BOOL enable, OMX_BOOL useGraphicBuffer, OMX_BOOL *usingGraphicBufferInMetadata) { OMX_INDEXTYPE index; OMX_STRING name = const_cast<OMX_STRING>( "OMX.google.android.index.storeMetaDataInBuffers"); OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); OMX_STRING graphicBufferName = const_cast<OMX_STRING>( "OMX.google.android.index.storeGraphicBufferInMetaData"); if (usingGraphicBufferInMetadata == NULL) { usingGraphicBufferInMetadata = &useGraphicBuffer; } OMX_ERRORTYPE err = (useGraphicBuffer && portIndex == kPortIndexInput) ? OMX_GetExtensionIndex(mHandle, graphicBufferName, &index) : OMX_ErrorBadParameter; if (err == OMX_ErrorNone) { *usingGraphicBufferInMetadata = OMX_TRUE; } else { *usingGraphicBufferInMetadata = OMX_FALSE; err = OMX_GetExtensionIndex(mHandle, name, &index); } if (err != OMX_ErrorNone) { ALOGE("OMX_GetExtensionIndex %s failed", name); return StatusFromOMXError(err); } Loading @@ -421,6 +440,7 @@ status_t OMXNodeInstance::storeMetaDataInBuffers_l( params.bStoreMetaData = enable; if ((err = OMX_SetParameter(mHandle, index, ¶ms)) != OMX_ErrorNone) { ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err); *usingGraphicBufferInMetadata = OMX_FALSE; return UNKNOWN_ERROR; } return err; Loading Loading @@ -683,7 +703,10 @@ status_t OMXNodeInstance::createInputSurface( } // Input buffers will hold meta-data (gralloc references). err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE); OMX_BOOL usingGraphicBuffer = OMX_FALSE; err = storeMetaDataInBuffers_l( portIndex, OMX_TRUE, OMX_TRUE /* useGraphicBuffer */, &usingGraphicBuffer); if (err != OK) { return err; } Loading @@ -709,7 +732,7 @@ status_t OMXNodeInstance::createInputSurface( GraphicBufferSource* bufferSource = new GraphicBufferSource( this, def.format.video.nFrameWidth, def.format.video.nFrameHeight, def.nBufferCountActual); def.nBufferCountActual, usingGraphicBuffer); if ((err = bufferSource->initCheck()) != OK) { delete bufferSource; return err; Loading Loading
media/libstagefright/include/OMXNodeInstance.h +3 −1 Original line number Diff line number Diff line Loading @@ -182,7 +182,9 @@ private: OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer); status_t storeMetaDataInBuffers_l(OMX_U32 portIndex, OMX_BOOL enable); status_t storeMetaDataInBuffers_l( OMX_U32 portIndex, OMX_BOOL enable, OMX_BOOL useGraphicBuffer, OMX_BOOL *usingGraphicBufferInMeta); sp<GraphicBufferSource> getGraphicBufferSource(); void setGraphicBufferSource(const sp<GraphicBufferSource>& bufferSource); Loading
media/libstagefright/omx/GraphicBufferSource.cpp +39 −13 Original line number Diff line number Diff line Loading @@ -37,7 +37,8 @@ static const bool EXTRA_CHECK = true; GraphicBufferSource::GraphicBufferSource(OMXNodeInstance* nodeInstance, uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount) : uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount, bool useGraphicBufferInMeta) : mInitCheck(UNKNOWN_ERROR), mNodeInstance(nodeInstance), mExecuting(false), Loading @@ -59,7 +60,8 @@ GraphicBufferSource::GraphicBufferSource(OMXNodeInstance* nodeInstance, mTimePerCaptureUs(-1ll), mTimePerFrameUs(-1ll), mPrevCaptureUs(-1ll), mPrevFrameUs(-1ll) { mPrevFrameUs(-1ll), mUseGraphicBufferInMeta(useGraphicBufferInMeta) { ALOGV("GraphicBufferSource w=%u h=%u c=%u", bufferWidth, bufferHeight, bufferCount); Loading Loading @@ -254,6 +256,8 @@ void GraphicBufferSource::codecBufferEmptied(OMX_BUFFERHEADERTYPE* header) { // Pull the graphic buffer handle back out of the buffer, and confirm // that it matches expectations. OMX_U8* data = header->pBuffer; MetadataBufferType type = *(MetadataBufferType *)data; if (type == kMetadataBufferTypeGrallocSource) { buffer_handle_t bufferHandle; memcpy(&bufferHandle, data + 4, sizeof(buffer_handle_t)); if (bufferHandle != codecBuffer.mGraphicBuffer->handle) { Loading @@ -262,6 +266,16 @@ void GraphicBufferSource::codecBufferEmptied(OMX_BUFFERHEADERTYPE* header) { bufferHandle, codecBuffer.mGraphicBuffer->handle); CHECK(!"codecBufferEmptied: mismatched buffer"); } } else if (type == kMetadataBufferTypeGraphicBuffer) { GraphicBuffer *buffer; memcpy(&buffer, data + 4, sizeof(buffer)); if (buffer != codecBuffer.mGraphicBuffer.get()) { // should never happen ALOGE("codecBufferEmptied: buffer is %p, expected %p", buffer, codecBuffer.mGraphicBuffer.get()); CHECK(!"codecBufferEmptied: mismatched buffer"); } } } // Find matching entry in our cached copy of the BufferQueue slots. Loading Loading @@ -642,10 +656,22 @@ status_t GraphicBufferSource::submitBuffer_l( OMX_BUFFERHEADERTYPE* header = codecBuffer.mHeader; CHECK(header->nAllocLen >= 4 + sizeof(buffer_handle_t)); OMX_U8* data = header->pBuffer; buffer_handle_t handle; if (!mUseGraphicBufferInMeta) { const OMX_U32 type = kMetadataBufferTypeGrallocSource; buffer_handle_t handle = codecBuffer.mGraphicBuffer->handle; handle = codecBuffer.mGraphicBuffer->handle; memcpy(data, &type, 4); memcpy(data + 4, &handle, sizeof(buffer_handle_t)); } else { // codecBuffer holds a reference to the GraphicBuffer, so // it is valid while it is with the OMX component const OMX_U32 type = kMetadataBufferTypeGraphicBuffer; memcpy(data, &type, 4); // passing a non-reference-counted graphicBuffer GraphicBuffer *buffer = codecBuffer.mGraphicBuffer.get(); handle = buffer->handle; memcpy(data + 4, &buffer, sizeof(buffer)); } status_t err = mNodeInstance->emptyDirectBuffer(header, 0, 4 + sizeof(buffer_handle_t), OMX_BUFFERFLAG_ENDOFFRAME, Loading
media/libstagefright/omx/GraphicBufferSource.h +4 −1 Original line number Diff line number Diff line Loading @@ -49,7 +49,8 @@ namespace android { class GraphicBufferSource : public BufferQueue::ConsumerListener { public: GraphicBufferSource(OMXNodeInstance* nodeInstance, uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount); uint32_t bufferWidth, uint32_t bufferHeight, uint32_t bufferCount, bool useGraphicBufferInMeta = false); virtual ~GraphicBufferSource(); // We can't throw an exception if the constructor fails, so we just set Loading Loading @@ -271,6 +272,8 @@ private: int64_t mPrevCaptureUs; int64_t mPrevFrameUs; bool mUseGraphicBufferInMeta; void onMessageReceived(const sp<AMessage> &msg); DISALLOW_EVIL_CONSTRUCTORS(GraphicBufferSource); Loading
media/libstagefright/omx/OMXNodeInstance.cpp +29 −6 Original line number Diff line number Diff line Loading @@ -393,20 +393,39 @@ status_t OMXNodeInstance::storeMetaDataInBuffers( OMX_U32 portIndex, OMX_BOOL enable) { Mutex::Autolock autolock(mLock); return storeMetaDataInBuffers_l(portIndex, enable); return storeMetaDataInBuffers_l( portIndex, enable, OMX_FALSE /* useGraphicBuffer */, NULL /* usingGraphicBufferInMetadata */); } status_t OMXNodeInstance::storeMetaDataInBuffers_l( OMX_U32 portIndex, OMX_BOOL enable) { OMX_BOOL enable, OMX_BOOL useGraphicBuffer, OMX_BOOL *usingGraphicBufferInMetadata) { OMX_INDEXTYPE index; OMX_STRING name = const_cast<OMX_STRING>( "OMX.google.android.index.storeMetaDataInBuffers"); OMX_ERRORTYPE err = OMX_GetExtensionIndex(mHandle, name, &index); OMX_STRING graphicBufferName = const_cast<OMX_STRING>( "OMX.google.android.index.storeGraphicBufferInMetaData"); if (usingGraphicBufferInMetadata == NULL) { usingGraphicBufferInMetadata = &useGraphicBuffer; } OMX_ERRORTYPE err = (useGraphicBuffer && portIndex == kPortIndexInput) ? OMX_GetExtensionIndex(mHandle, graphicBufferName, &index) : OMX_ErrorBadParameter; if (err == OMX_ErrorNone) { *usingGraphicBufferInMetadata = OMX_TRUE; } else { *usingGraphicBufferInMetadata = OMX_FALSE; err = OMX_GetExtensionIndex(mHandle, name, &index); } if (err != OMX_ErrorNone) { ALOGE("OMX_GetExtensionIndex %s failed", name); return StatusFromOMXError(err); } Loading @@ -421,6 +440,7 @@ status_t OMXNodeInstance::storeMetaDataInBuffers_l( params.bStoreMetaData = enable; if ((err = OMX_SetParameter(mHandle, index, ¶ms)) != OMX_ErrorNone) { ALOGE("OMX_SetParameter() failed for StoreMetaDataInBuffers: 0x%08x", err); *usingGraphicBufferInMetadata = OMX_FALSE; return UNKNOWN_ERROR; } return err; Loading Loading @@ -683,7 +703,10 @@ status_t OMXNodeInstance::createInputSurface( } // Input buffers will hold meta-data (gralloc references). err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE); OMX_BOOL usingGraphicBuffer = OMX_FALSE; err = storeMetaDataInBuffers_l( portIndex, OMX_TRUE, OMX_TRUE /* useGraphicBuffer */, &usingGraphicBuffer); if (err != OK) { return err; } Loading @@ -709,7 +732,7 @@ status_t OMXNodeInstance::createInputSurface( GraphicBufferSource* bufferSource = new GraphicBufferSource( this, def.format.video.nFrameWidth, def.format.video.nFrameHeight, def.nBufferCountActual); def.nBufferCountActual, usingGraphicBuffer); if ((err = bufferSource->initCheck()) != OK) { delete bufferSource; return err; Loading