Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d4370268 authored by Chong Zhang's avatar Chong Zhang Committed by Android (Google) Code Review
Browse files

Merge "IOMX: consolidate buffer passing on IOMX"

parents 9de2d727 3fd200fe
Loading
Loading
Loading
Loading
+27 −40
Original line number Diff line number Diff line
@@ -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>

@@ -39,6 +39,7 @@ class IOMXBufferSource;
class IOMXNode;
class IOMXObserver;
class NativeHandle;
class OMXBuffer;
struct omx_message;

class IOMX : public IInterface {
@@ -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> &params,
            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;

@@ -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;
+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_
+2 −0
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -65,6 +65,7 @@ LOCAL_SRC_FILES += \
    MediaProfiles.cpp \
    MediaResource.cpp \
    MediaResourcePolicy.cpp \
    OMXBuffer.cpp \
    IEffect.cpp \
    IEffectClient.cpp \
    AudioEffect.cpp \
+36 −166
Original line number Diff line number Diff line
@@ -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>

@@ -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,
@@ -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,
};
@@ -255,38 +251,19 @@ public:
    }

    virtual status_t useBuffer(
            OMX_U32 port_index, const sp<IMemory> &params,
            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;

@@ -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;
@@ -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 */);
@@ -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();
    }
@@ -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) {
@@ -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);
@@ -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