From d291c222357303b9611cab89d0c3b047584ef377 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Thu, 30 Apr 2015 18:15:52 -0700 Subject: MediaCodec: implement persistent input surface APIs Bug: 19127604 Bug: 19489395 Change-Id: Idaf1cc9008016f66903e93907a676f54e342e1a3 --- media/libmedia/IOMX.cpp | 83 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'media/libmedia/IOMX.cpp') diff --git a/media/libmedia/IOMX.cpp b/media/libmedia/IOMX.cpp index e208df9..39b135b 100644 --- a/media/libmedia/IOMX.cpp +++ b/media/libmedia/IOMX.cpp @@ -41,6 +41,8 @@ enum { USE_BUFFER, USE_GRAPHIC_BUFFER, CREATE_INPUT_SURFACE, + CREATE_PERSISTENT_INPUT_SURFACE, + USE_PERSISTENT_INPUT_SURFACE, SIGNAL_END_OF_INPUT_STREAM, STORE_META_DATA_IN_BUFFERS, PREPARE_FOR_ADAPTIVE_PLAYBACK, @@ -326,6 +328,51 @@ public: return err; } + virtual status_t createPersistentInputSurface( + sp *bufferProducer, + sp *bufferConsumer) { + Parcel data, reply; + status_t err; + data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); + err = remote()->transact(CREATE_PERSISTENT_INPUT_SURFACE, data, &reply); + if (err != OK) { + ALOGW("binder transaction failed: %d", err); + return err; + } + + err = reply.readInt32(); + if (err != OK) { + return err; + } + + *bufferProducer = IGraphicBufferProducer::asInterface( + reply.readStrongBinder()); + *bufferConsumer = IGraphicBufferConsumer::asInterface( + reply.readStrongBinder()); + + return err; + } + + virtual status_t usePersistentInputSurface( + node_id node, OMX_U32 port_index, + const sp &bufferConsumer) { + Parcel data, reply; + data.writeInterfaceToken(IOMX::getInterfaceDescriptor()); + status_t err; + data.writeInt32((int32_t)node); + data.writeInt32(port_index); + data.writeStrongBinder(IInterface::asBinder(bufferConsumer)); + + err = remote()->transact(USE_PERSISTENT_INPUT_SURFACE, data, &reply); + + if (err != OK) { + ALOGW("binder transaction failed: %d", err); + return err; + } + return reply.readInt32(); + } + + virtual status_t signalEndOfInputStream(node_id node) { Parcel data, reply; status_t err; @@ -781,6 +828,42 @@ status_t BnOMX::onTransact( return NO_ERROR; } + case CREATE_PERSISTENT_INPUT_SURFACE: + { + CHECK_OMX_INTERFACE(IOMX, data, reply); + + sp bufferProducer; + sp bufferConsumer; + status_t err = createPersistentInputSurface( + &bufferProducer, &bufferConsumer); + + reply->writeInt32(err); + + if (err == OK) { + reply->writeStrongBinder(IInterface::asBinder(bufferProducer)); + reply->writeStrongBinder(IInterface::asBinder(bufferConsumer)); + } + + return NO_ERROR; + } + + case USE_PERSISTENT_INPUT_SURFACE: + { + CHECK_OMX_INTERFACE(IOMX, data, reply); + + node_id node = (node_id)data.readInt32(); + OMX_U32 port_index = data.readInt32(); + + sp bufferConsumer = + interface_cast(data.readStrongBinder()); + + status_t err = usePersistentInputSurface( + node, port_index, bufferConsumer); + + reply->writeInt32(err); + return NO_ERROR; + } + case SIGNAL_END_OF_INPUT_STREAM: { CHECK_OMX_INTERFACE(IOMX, data, reply); -- cgit v1.1