From 054219874873b41f1c815552987c10465c34ba2b Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Fri, 15 May 2015 20:39:14 -0700 Subject: stagefright: rework metadata buffer support - Add fence to new metadata buffer mode structure, but don't use it yet, so that we don't have to add another mode soon. - Change GraphicBuffers to ANativeWindowBuffer in new metadata mode. This removes internal depencency from vendor codecs. - Extend new metadata mode from SW encoders to all codecs. - Fallback from new metadata mode to old mode (so Camera can always use the new mode even with legacy codecs) Related-bug: 19614055 Bug: 13222807 Change-Id: I405a21dd6ce8e99808f633bfeab8f14278eb7079 --- media/libmedia/IOMX.cpp | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) (limited to 'media/libmedia/IOMX.cpp') diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp index d556c33..cac2f7f 100644 --- a/media/libmedia/IOMX.cpp +++ b/media/libmedia/IOMX.cpp @@ -306,7 +306,7 @@ public: virtual status_t createInputSurface( node_id node, OMX_U32 port_index, - sp *bufferProducer) { + sp *bufferProducer, MetadataBufferType *type) { Parcel data, reply; status_t err; data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); @@ -318,6 +318,12 @@ public: return err; } + // read type even if createInputSurface failed + int negotiatedType = reply.readInt32(); + if (type != NULL) { + *type = (MetadataBufferType)negotiatedType; + } + err = reply.readInt32(); if (err != OK) { return err; @@ -356,7 +362,7 @@ public: virtual status_t setInputSurface( node_id node, OMX_U32 port_index, - const sp &bufferConsumer) { + const sp &bufferConsumer, MetadataBufferType *type) { Parcel data, reply; data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); status_t err; @@ -370,6 +376,13 @@ public: ALOGW("binder transaction failed: %d", err); return err; } + + // read type even if setInputSurface failed + int negotiatedType = reply.readInt32(); + if (type != NULL) { + *type = (MetadataBufferType)negotiatedType; + } + return reply.readInt32(); } @@ -388,7 +401,7 @@ public: } virtual status_t storeMetaDataInBuffers( - node_id node, OMX_U32 port_index, OMX_BOOL enable) { + node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) { Parcel data, reply; data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); data.writeInt32((int32_t)node); @@ -396,8 +409,13 @@ public: data.writeInt32((uint32_t)enable); remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply); - status_t err = reply.readInt32(); - return err; + // read type even storeMetaDataInBuffers failed + int negotiatedType = reply.readInt32(); + if (type != NULL) { + *type = (MetadataBufferType)negotiatedType; + } + + return reply.readInt32(); } virtual status_t prepareForAdaptivePlayback( @@ -818,9 +836,10 @@ status_t BnOMX::onTransact( OMX_U32 port_index = data.readInt32(); sp bufferProducer; - status_t err = createInputSurface(node, port_index, - &bufferProducer); + MetadataBufferType type; + status_t err = createInputSurface(node, port_index, &bufferProducer, &type); + reply->writeInt32(type); reply->writeInt32(err); if (err == OK) { @@ -859,8 +878,10 @@ status_t BnOMX::onTransact( sp bufferConsumer = interface_cast(data.readStrongBinder()); - status_t err = setInputSurface(node, port_index, bufferConsumer); + MetadataBufferType type; + status_t err = setInputSurface(node, port_index, bufferConsumer, &type); + reply->writeInt32(type); reply->writeInt32(err); return NO_ERROR; } @@ -885,7 +906,9 @@ status_t BnOMX::onTransact( OMX_U32 port_index = data.readInt32(); OMX_BOOL enable = (OMX_BOOL)data.readInt32(); - status_t err = storeMetaDataInBuffers(node, port_index, enable); + MetadataBufferType type; + status_t err = storeMetaDataInBuffers(node, port_index, enable, &type); + reply->writeInt32(type); reply->writeInt32(err); return NO_ERROR; -- cgit v1.1