Loading include/media/IOMX.h +27 −40 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #define ANDROID_IOMX_H_ #include <binder/IInterface.h> #include <ui/GraphicBuffer.h> #include <gui/IGraphicBufferProducer.h> #include <utils/List.h> #include <utils/String8.h> Loading @@ -39,6 +39,7 @@ class IOMXBufferSource; class IOMXNode; class IOMXObserver; class NativeHandle; class OMXBuffer; struct omx_message; class IOMX : public IInterface { Loading Loading @@ -108,23 +109,6 @@ public: virtual status_t getGraphicBufferUsage( OMX_U32 port_index, OMX_U32* usage) = 0; // Use |params| as an OMX buffer, but limit the size of the OMX buffer to |allottedSize|. virtual status_t useBuffer( OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer, OMX_U32 allottedSize) = 0; virtual status_t useGraphicBuffer( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; virtual status_t updateGraphicBufferInMeta( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0; virtual status_t updateNativeHandleInMeta( OMX_U32 port_index, const sp<NativeHandle> &nativeHandle, buffer_id buffer) = 0; virtual status_t setInputSurface( const sp<IOMXBufferSource> &bufferSource) = 0; Loading @@ -137,34 +121,37 @@ public: OMX_U32 port_index, size_t size, buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) = 0; // Instructs the component to use the buffer passed in via |omxBuf| on the // specified port. Returns in |*buffer| the buffer id that the component // assigns to this buffer. |omxBuf| must be one of: // 1) OMXBuffer::sPreset for meta-mode, // 2) type kBufferTypeANWBuffer for non-meta-graphic buffer mode, // 3) type kBufferTypeSharedMem for bytebuffer mode. virtual status_t useBuffer( OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) = 0; // Frees the buffer on the specified port with buffer id |buffer|. virtual status_t freeBuffer( OMX_U32 port_index, buffer_id buffer) = 0; // Calls OMX_FillBuffer on buffer, and passes |fenceFd| to component if it supports // fences. Otherwise, it waits on |fenceFd| before calling OMX_FillBuffer. // Takes ownership of |fenceFd| even if this call fails. virtual status_t fillBuffer(buffer_id buffer, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer (after updating buffer header with |range_offset|, // |range_length|, |flags| and |timestamp|). Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer. // Takes ownership of |fenceFd| even if this call fails. // Calls OMX_FillBuffer on buffer. Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling // OMX_FillBuffer. Takes ownership of |fenceFd| even if this call fails. // If the port is in metadata mode, the buffer will be updated to point // to the new buffer passed in via |omxBuf| before OMX_FillBuffer is called. // Otherwise info in the |omxBuf| is not used. virtual status_t fillBuffer( buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer. Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling // OMX_EmptyBuffer. Takes ownership of |fenceFd| even if this call fails. // If the port is in metadata mode, the buffer will be updated to point // to the new buffer passed in via |omxBuf| before OMX_EmptyBuffer is called. virtual status_t emptyBuffer( buffer_id buffer, OMX_U32 range_offset, OMX_U32 range_length, buffer_id buffer, const OMXBuffer &omxBuf, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer (after updating buffer header with metadata of // |graphicBuffer|, |flags| and |timestamp|). Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer. // Takes ownership of |fenceFd| even if this call fails. If |origTimestamp| >= 0, // timestamp on the filled buffer corresponding to this frame will be modified to // |origTimestamp| after it's filled. virtual status_t emptyGraphicBuffer( buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) = 0; virtual status_t getExtensionIndex( const char *parameter_name, OMX_INDEXTYPE *index) = 0; Loading include/media/OMXBuffer.h 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright 2016, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _OMXBUFFER_H_ #define _OMXBUFFER_H_ #include <cutils/native_handle.h> #include <media/IOMX.h> #include <system/window.h> #include <utils/StrongPointer.h> namespace android { class GraphicBuffer; class IMemory; class MediaCodecBuffer; class NativeHandle; class OMXNodeInstance; class OMXBuffer { public: // sPreset is used in places where we are referring to a pre-registered // buffer on a port. It has type kBufferTypePreset and mRangeLength of 0. static OMXBuffer sPreset; // Default constructor, constructs a buffer of type kBufferTypeInvalid. OMXBuffer(); // Constructs a buffer of type kBufferTypePreset with mRangeLength set to // |codecBuffer|'s size (or 0 if |codecBuffer| is NULL). OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer); // Constructs a buffer of type kBufferTypeSharedMem. OMXBuffer(const sp<IMemory> &mem, size_t allottedSize = 0); // Constructs a buffer of type kBufferTypeANWBuffer. OMXBuffer(const sp<GraphicBuffer> &gbuf); // Constructs a buffer of type kBufferTypeNativeHandle. OMXBuffer(const sp<NativeHandle> &handle); // Parcelling/Un-parcelling. status_t writeToParcel(Parcel *parcel) const; status_t readFromParcel(const Parcel *parcel); ~OMXBuffer(); private: friend class OMXNodeInstance; enum BufferType { kBufferTypeInvalid = 0, kBufferTypePreset, kBufferTypeSharedMem, kBufferTypeANWBuffer, kBufferTypeNativeHandle, }; BufferType mBufferType; // kBufferTypePreset // If the port is operating in byte buffer mode, mRangeLength is the valid // range length. Otherwise the range info should also be ignored. OMX_U32 mRangeLength; // kBufferTypeSharedMem sp<IMemory> mMem; OMX_U32 mAllottedSize; // kBufferTypeANWBuffer sp<GraphicBuffer> mGraphicBuffer; // kBufferTypeNativeHandle sp<NativeHandle> mNativeHandle; OMXBuffer(const OMXBuffer &); OMXBuffer &operator=(const OMXBuffer &); }; } // namespace android #endif // _OMXBUFFER_H_ include/media/stagefright/ACodec.h +2 −0 Original line number Diff line number Diff line Loading @@ -330,6 +330,8 @@ private: uint32_t portIndex, IOMX::buffer_id bufferID, ssize_t *index = NULL); status_t fillBuffer(BufferInfo *info); status_t setComponentRole(bool isEncoder, const char *mime); status_t configureCodec(const char *mime, const sp<AMessage> &msg); Loading media/libmedia/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ LOCAL_SRC_FILES += \ MediaProfiles.cpp \ MediaResource.cpp \ MediaResourcePolicy.cpp \ OMXBuffer.cpp \ IEffect.cpp \ IEffectClient.cpp \ AudioEffect.cpp \ Loading media/libmedia/IOMX.cpp +36 −166 Original line number Diff line number Diff line Loading @@ -26,8 +26,8 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/openmax/OMX_IndexExt.h> #include <utils/NativeHandle.h> #include <media/OMXBuffer.h> #include <gui/IGraphicBufferProducer.h> #include <android/IGraphicBufferSource.h> #include <android/IOMXBufferSource.h> Loading @@ -45,7 +45,6 @@ enum { SET_CONFIG, ENABLE_NATIVE_BUFFERS, USE_BUFFER, USE_GRAPHIC_BUFFER, CREATE_INPUT_SURFACE, SET_INPUT_SURFACE, STORE_META_DATA_IN_BUFFERS, Loading @@ -54,13 +53,10 @@ enum { FREE_BUFFER, FILL_BUFFER, EMPTY_BUFFER, EMPTY_GRAPHIC_BUFFER, GET_EXTENSION_INDEX, OBSERVER_ON_MSG, GET_GRAPHIC_BUFFER_USAGE, UPDATE_GRAPHIC_BUFFER_IN_META, CONFIGURE_VIDEO_TUNNEL_MODE, UPDATE_NATIVE_HANDLE_IN_META, DISPATCH_MESSAGE, SET_QUIRKS, }; Loading Loading @@ -255,38 +251,19 @@ public: } virtual status_t useBuffer( OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer, OMX_U32 allottedSize) { OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.writeStrongBinder(IInterface::asBinder(params)); data.writeInt32(allottedSize); remote()->transact(USE_BUFFER, data, &reply); status_t err = reply.readInt32(); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { *buffer = 0; return err; } *buffer = (buffer_id)reply.readInt32(); return err; } virtual status_t useGraphicBuffer( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.write(*graphicBuffer); remote()->transact(USE_GRAPHIC_BUFFER, data, &reply); remote()->transact(USE_BUFFER, data, &reply); status_t err = reply.readInt32(); err = reply.readInt32(); if (err != OK) { *buffer = 0; Loading @@ -298,37 +275,6 @@ public: return err; } virtual status_t updateGraphicBufferInMeta( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.write(*graphicBuffer); data.writeInt32((int32_t)buffer); remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply); status_t err = reply.readInt32(); return err; } virtual status_t updateNativeHandleInMeta( OMX_U32 port_index, const sp<NativeHandle> &nativeHandle, buffer_id buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.writeInt32(nativeHandle != NULL); if (nativeHandle != NULL) { data.writeNativeHandle(nativeHandle->handle()); } data.writeInt32((int32_t)buffer); remote()->transact(UPDATE_NATIVE_HANDLE_IN_META, data, &reply); status_t err = reply.readInt32(); return err; } virtual status_t setInputSurface( const sp<IOMXBufferSource> &bufferSource) { Parcel data, reply; Loading Loading @@ -439,10 +385,15 @@ public: return reply.readInt32(); } virtual status_t fillBuffer(buffer_id buffer, int fenceFd) { virtual status_t fillBuffer( buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { return err; } data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); Loading @@ -453,40 +404,22 @@ public: } virtual status_t emptyBuffer( buffer_id buffer, OMX_U32 range_offset, OMX_U32 range_length, buffer_id buffer, const OMXBuffer &omxBuf, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); data.writeInt32(range_offset); data.writeInt32(range_length); data.writeInt32(flags); data.writeInt64(timestamp); data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); } remote()->transact(EMPTY_BUFFER, data, &reply); return reply.readInt32(); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { return err; } virtual status_t emptyGraphicBuffer( buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); data.write(*graphicBuffer); data.writeInt32(flags); data.writeInt64(timestamp); data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); } remote()->transact(EMPTY_GRAPHIC_BUFFER, data, &reply); remote()->transact(EMPTY_BUFFER, data, &reply); return reply.readInt32(); } Loading Loading @@ -770,38 +703,15 @@ status_t BnOMXNode::onTransact( CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<IMemory> params = interface_cast<IMemory>(data.readStrongBinder()); OMX_U32 allottedSize = data.readInt32(); if (params == NULL) { ALOGE("b/26392700"); reply->writeInt32(INVALID_OPERATION); return NO_ERROR; } buffer_id buffer; status_t err = useBuffer(port_index, params, &buffer, allottedSize); reply->writeInt32(err); if (err == OK) { reply->writeInt32((int32_t)buffer); } return NO_ERROR; OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } case USE_GRAPHIC_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); buffer_id buffer; status_t err = useGraphicBuffer( port_index, graphicBuffer, &buffer); err = useBuffer(port_index, omxBuf, &buffer); reply->writeInt32(err); if (err == OK) { Loading @@ -811,40 +721,6 @@ status_t BnOMXNode::onTransact( return NO_ERROR; } case UPDATE_GRAPHIC_BUFFER_IN_META: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); buffer_id buffer = (buffer_id)data.readInt32(); status_t err = updateGraphicBufferInMeta( port_index, graphicBuffer, buffer); reply->writeInt32(err); return NO_ERROR; } case UPDATE_NATIVE_HANDLE_IN_META: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); native_handle *handle = NULL; if (data.readInt32()) { handle = data.readNativeHandle(); } buffer_id buffer = (buffer_id)data.readInt32(); status_t err = updateNativeHandleInMeta( port_index, NativeHandle::create(handle, true /* ownshandle */), buffer); reply->writeInt32(err); return NO_ERROR; } case SET_INPUT_SURFACE: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); Loading Loading @@ -956,43 +832,37 @@ status_t BnOMXNode::onTransact( CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(fillBuffer(buffer, fenceFd)); return NO_ERROR; OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } case EMPTY_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); OMX_U32 range_offset = data.readInt32(); OMX_U32 range_length = data.readInt32(); OMX_U32 flags = data.readInt32(); OMX_TICKS timestamp = data.readInt64(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(emptyBuffer( buffer, range_offset, range_length, flags, timestamp, fenceFd)); reply->writeInt32(fillBuffer(buffer, omxBuf, fenceFd)); return NO_ERROR; } case EMPTY_GRAPHIC_BUFFER: case EMPTY_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } OMX_U32 flags = data.readInt32(); OMX_TICKS timestamp = data.readInt64(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(emptyGraphicBuffer( buffer, graphicBuffer, flags, timestamp, fenceFd)); reply->writeInt32(emptyBuffer( buffer, omxBuf, flags, timestamp, fenceFd)); return NO_ERROR; } Loading Loading
include/media/IOMX.h +27 −40 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ #define ANDROID_IOMX_H_ #include <binder/IInterface.h> #include <ui/GraphicBuffer.h> #include <gui/IGraphicBufferProducer.h> #include <utils/List.h> #include <utils/String8.h> Loading @@ -39,6 +39,7 @@ class IOMXBufferSource; class IOMXNode; class IOMXObserver; class NativeHandle; class OMXBuffer; struct omx_message; class IOMX : public IInterface { Loading Loading @@ -108,23 +109,6 @@ public: virtual status_t getGraphicBufferUsage( OMX_U32 port_index, OMX_U32* usage) = 0; // Use |params| as an OMX buffer, but limit the size of the OMX buffer to |allottedSize|. virtual status_t useBuffer( OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer, OMX_U32 allottedSize) = 0; virtual status_t useGraphicBuffer( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0; virtual status_t updateGraphicBufferInMeta( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) = 0; virtual status_t updateNativeHandleInMeta( OMX_U32 port_index, const sp<NativeHandle> &nativeHandle, buffer_id buffer) = 0; virtual status_t setInputSurface( const sp<IOMXBufferSource> &bufferSource) = 0; Loading @@ -137,34 +121,37 @@ public: OMX_U32 port_index, size_t size, buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle) = 0; // Instructs the component to use the buffer passed in via |omxBuf| on the // specified port. Returns in |*buffer| the buffer id that the component // assigns to this buffer. |omxBuf| must be one of: // 1) OMXBuffer::sPreset for meta-mode, // 2) type kBufferTypeANWBuffer for non-meta-graphic buffer mode, // 3) type kBufferTypeSharedMem for bytebuffer mode. virtual status_t useBuffer( OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) = 0; // Frees the buffer on the specified port with buffer id |buffer|. virtual status_t freeBuffer( OMX_U32 port_index, buffer_id buffer) = 0; // Calls OMX_FillBuffer on buffer, and passes |fenceFd| to component if it supports // fences. Otherwise, it waits on |fenceFd| before calling OMX_FillBuffer. // Takes ownership of |fenceFd| even if this call fails. virtual status_t fillBuffer(buffer_id buffer, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer (after updating buffer header with |range_offset|, // |range_length|, |flags| and |timestamp|). Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer. // Takes ownership of |fenceFd| even if this call fails. // Calls OMX_FillBuffer on buffer. Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling // OMX_FillBuffer. Takes ownership of |fenceFd| even if this call fails. // If the port is in metadata mode, the buffer will be updated to point // to the new buffer passed in via |omxBuf| before OMX_FillBuffer is called. // Otherwise info in the |omxBuf| is not used. virtual status_t fillBuffer( buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer. Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling // OMX_EmptyBuffer. Takes ownership of |fenceFd| even if this call fails. // If the port is in metadata mode, the buffer will be updated to point // to the new buffer passed in via |omxBuf| before OMX_EmptyBuffer is called. virtual status_t emptyBuffer( buffer_id buffer, OMX_U32 range_offset, OMX_U32 range_length, buffer_id buffer, const OMXBuffer &omxBuf, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd = -1) = 0; // Calls OMX_EmptyBuffer on buffer (after updating buffer header with metadata of // |graphicBuffer|, |flags| and |timestamp|). Passes |fenceFd| to component if it // supports fences. Otherwise, it waits on |fenceFd| before calling OMX_EmptyBuffer. // Takes ownership of |fenceFd| even if this call fails. If |origTimestamp| >= 0, // timestamp on the filled buffer corresponding to this frame will be modified to // |origTimestamp| after it's filled. virtual status_t emptyGraphicBuffer( buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) = 0; virtual status_t getExtensionIndex( const char *parameter_name, OMX_INDEXTYPE *index) = 0; Loading
include/media/OMXBuffer.h 0 → 100644 +95 −0 Original line number Diff line number Diff line /* * Copyright 2016, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef _OMXBUFFER_H_ #define _OMXBUFFER_H_ #include <cutils/native_handle.h> #include <media/IOMX.h> #include <system/window.h> #include <utils/StrongPointer.h> namespace android { class GraphicBuffer; class IMemory; class MediaCodecBuffer; class NativeHandle; class OMXNodeInstance; class OMXBuffer { public: // sPreset is used in places where we are referring to a pre-registered // buffer on a port. It has type kBufferTypePreset and mRangeLength of 0. static OMXBuffer sPreset; // Default constructor, constructs a buffer of type kBufferTypeInvalid. OMXBuffer(); // Constructs a buffer of type kBufferTypePreset with mRangeLength set to // |codecBuffer|'s size (or 0 if |codecBuffer| is NULL). OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer); // Constructs a buffer of type kBufferTypeSharedMem. OMXBuffer(const sp<IMemory> &mem, size_t allottedSize = 0); // Constructs a buffer of type kBufferTypeANWBuffer. OMXBuffer(const sp<GraphicBuffer> &gbuf); // Constructs a buffer of type kBufferTypeNativeHandle. OMXBuffer(const sp<NativeHandle> &handle); // Parcelling/Un-parcelling. status_t writeToParcel(Parcel *parcel) const; status_t readFromParcel(const Parcel *parcel); ~OMXBuffer(); private: friend class OMXNodeInstance; enum BufferType { kBufferTypeInvalid = 0, kBufferTypePreset, kBufferTypeSharedMem, kBufferTypeANWBuffer, kBufferTypeNativeHandle, }; BufferType mBufferType; // kBufferTypePreset // If the port is operating in byte buffer mode, mRangeLength is the valid // range length. Otherwise the range info should also be ignored. OMX_U32 mRangeLength; // kBufferTypeSharedMem sp<IMemory> mMem; OMX_U32 mAllottedSize; // kBufferTypeANWBuffer sp<GraphicBuffer> mGraphicBuffer; // kBufferTypeNativeHandle sp<NativeHandle> mNativeHandle; OMXBuffer(const OMXBuffer &); OMXBuffer &operator=(const OMXBuffer &); }; } // namespace android #endif // _OMXBUFFER_H_
include/media/stagefright/ACodec.h +2 −0 Original line number Diff line number Diff line Loading @@ -330,6 +330,8 @@ private: uint32_t portIndex, IOMX::buffer_id bufferID, ssize_t *index = NULL); status_t fillBuffer(BufferInfo *info); status_t setComponentRole(bool isEncoder, const char *mime); status_t configureCodec(const char *mime, const sp<AMessage> &msg); Loading
media/libmedia/Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ LOCAL_SRC_FILES += \ MediaProfiles.cpp \ MediaResource.cpp \ MediaResourcePolicy.cpp \ OMXBuffer.cpp \ IEffect.cpp \ IEffectClient.cpp \ AudioEffect.cpp \ Loading
media/libmedia/IOMX.cpp +36 −166 Original line number Diff line number Diff line Loading @@ -26,8 +26,8 @@ #include <media/stagefright/foundation/ADebug.h> #include <media/openmax/OMX_IndexExt.h> #include <utils/NativeHandle.h> #include <media/OMXBuffer.h> #include <gui/IGraphicBufferProducer.h> #include <android/IGraphicBufferSource.h> #include <android/IOMXBufferSource.h> Loading @@ -45,7 +45,6 @@ enum { SET_CONFIG, ENABLE_NATIVE_BUFFERS, USE_BUFFER, USE_GRAPHIC_BUFFER, CREATE_INPUT_SURFACE, SET_INPUT_SURFACE, STORE_META_DATA_IN_BUFFERS, Loading @@ -54,13 +53,10 @@ enum { FREE_BUFFER, FILL_BUFFER, EMPTY_BUFFER, EMPTY_GRAPHIC_BUFFER, GET_EXTENSION_INDEX, OBSERVER_ON_MSG, GET_GRAPHIC_BUFFER_USAGE, UPDATE_GRAPHIC_BUFFER_IN_META, CONFIGURE_VIDEO_TUNNEL_MODE, UPDATE_NATIVE_HANDLE_IN_META, DISPATCH_MESSAGE, SET_QUIRKS, }; Loading Loading @@ -255,38 +251,19 @@ public: } virtual status_t useBuffer( OMX_U32 port_index, const sp<IMemory> ¶ms, buffer_id *buffer, OMX_U32 allottedSize) { OMX_U32 port_index, const OMXBuffer &omxBuf, buffer_id *buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.writeStrongBinder(IInterface::asBinder(params)); data.writeInt32(allottedSize); remote()->transact(USE_BUFFER, data, &reply); status_t err = reply.readInt32(); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { *buffer = 0; return err; } *buffer = (buffer_id)reply.readInt32(); return err; } virtual status_t useGraphicBuffer( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.write(*graphicBuffer); remote()->transact(USE_GRAPHIC_BUFFER, data, &reply); remote()->transact(USE_BUFFER, data, &reply); status_t err = reply.readInt32(); err = reply.readInt32(); if (err != OK) { *buffer = 0; Loading @@ -298,37 +275,6 @@ public: return err; } virtual status_t updateGraphicBufferInMeta( OMX_U32 port_index, const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.write(*graphicBuffer); data.writeInt32((int32_t)buffer); remote()->transact(UPDATE_GRAPHIC_BUFFER_IN_META, data, &reply); status_t err = reply.readInt32(); return err; } virtual status_t updateNativeHandleInMeta( OMX_U32 port_index, const sp<NativeHandle> &nativeHandle, buffer_id buffer) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32(port_index); data.writeInt32(nativeHandle != NULL); if (nativeHandle != NULL) { data.writeNativeHandle(nativeHandle->handle()); } data.writeInt32((int32_t)buffer); remote()->transact(UPDATE_NATIVE_HANDLE_IN_META, data, &reply); status_t err = reply.readInt32(); return err; } virtual status_t setInputSurface( const sp<IOMXBufferSource> &bufferSource) { Parcel data, reply; Loading Loading @@ -439,10 +385,15 @@ public: return reply.readInt32(); } virtual status_t fillBuffer(buffer_id buffer, int fenceFd) { virtual status_t fillBuffer( buffer_id buffer, const OMXBuffer &omxBuf, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { return err; } data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); Loading @@ -453,40 +404,22 @@ public: } virtual status_t emptyBuffer( buffer_id buffer, OMX_U32 range_offset, OMX_U32 range_length, buffer_id buffer, const OMXBuffer &omxBuf, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); data.writeInt32(range_offset); data.writeInt32(range_length); data.writeInt32(flags); data.writeInt64(timestamp); data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); } remote()->transact(EMPTY_BUFFER, data, &reply); return reply.readInt32(); status_t err = omxBuf.writeToParcel(&data); if (err != OK) { return err; } virtual status_t emptyGraphicBuffer( buffer_id buffer, const sp<GraphicBuffer> &graphicBuffer, OMX_U32 flags, OMX_TICKS timestamp, int fenceFd) { Parcel data, reply; data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor()); data.writeInt32((int32_t)buffer); data.write(*graphicBuffer); data.writeInt32(flags); data.writeInt64(timestamp); data.writeInt32(fenceFd >= 0); if (fenceFd >= 0) { data.writeFileDescriptor(fenceFd, true /* takeOwnership */); } remote()->transact(EMPTY_GRAPHIC_BUFFER, data, &reply); remote()->transact(EMPTY_BUFFER, data, &reply); return reply.readInt32(); } Loading Loading @@ -770,38 +703,15 @@ status_t BnOMXNode::onTransact( CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<IMemory> params = interface_cast<IMemory>(data.readStrongBinder()); OMX_U32 allottedSize = data.readInt32(); if (params == NULL) { ALOGE("b/26392700"); reply->writeInt32(INVALID_OPERATION); return NO_ERROR; } buffer_id buffer; status_t err = useBuffer(port_index, params, &buffer, allottedSize); reply->writeInt32(err); if (err == OK) { reply->writeInt32((int32_t)buffer); } return NO_ERROR; OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } case USE_GRAPHIC_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); buffer_id buffer; status_t err = useGraphicBuffer( port_index, graphicBuffer, &buffer); err = useBuffer(port_index, omxBuf, &buffer); reply->writeInt32(err); if (err == OK) { Loading @@ -811,40 +721,6 @@ status_t BnOMXNode::onTransact( return NO_ERROR; } case UPDATE_GRAPHIC_BUFFER_IN_META: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); buffer_id buffer = (buffer_id)data.readInt32(); status_t err = updateGraphicBufferInMeta( port_index, graphicBuffer, buffer); reply->writeInt32(err); return NO_ERROR; } case UPDATE_NATIVE_HANDLE_IN_META: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); OMX_U32 port_index = data.readInt32(); native_handle *handle = NULL; if (data.readInt32()) { handle = data.readNativeHandle(); } buffer_id buffer = (buffer_id)data.readInt32(); status_t err = updateNativeHandleInMeta( port_index, NativeHandle::create(handle, true /* ownshandle */), buffer); reply->writeInt32(err); return NO_ERROR; } case SET_INPUT_SURFACE: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); Loading Loading @@ -956,43 +832,37 @@ status_t BnOMXNode::onTransact( CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(fillBuffer(buffer, fenceFd)); return NO_ERROR; OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } case EMPTY_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); OMX_U32 range_offset = data.readInt32(); OMX_U32 range_length = data.readInt32(); OMX_U32 flags = data.readInt32(); OMX_TICKS timestamp = data.readInt64(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(emptyBuffer( buffer, range_offset, range_length, flags, timestamp, fenceFd)); reply->writeInt32(fillBuffer(buffer, omxBuf, fenceFd)); return NO_ERROR; } case EMPTY_GRAPHIC_BUFFER: case EMPTY_BUFFER: { CHECK_OMX_INTERFACE(IOMXNode, data, reply); buffer_id buffer = (buffer_id)data.readInt32(); sp<GraphicBuffer> graphicBuffer = new GraphicBuffer(); data.read(*graphicBuffer); OMXBuffer omxBuf; status_t err = omxBuf.readFromParcel(&data); if (err != OK) { return err; } OMX_U32 flags = data.readInt32(); OMX_TICKS timestamp = data.readInt64(); bool haveFence = data.readInt32(); int fenceFd = haveFence ? ::dup(data.readFileDescriptor()) : -1; reply->writeInt32(emptyGraphicBuffer( buffer, graphicBuffer, flags, timestamp, fenceFd)); reply->writeInt32(emptyBuffer( buffer, omxBuf, flags, timestamp, fenceFd)); return NO_ERROR; } Loading