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

Commit d02c0867 authored by Chong Zhang's avatar Chong Zhang
Browse files

IOMX: add API for setPortMode

- Add setPortMode to centralize port mode configuration

- Remove storeMetaDataInBuffers and enableNativeBuffers. These are
  no longer exposed to the client. Metadata mode and native/secure
  buffer mode will be enabled by OMX as needed by the port mode.

- Move handling of legacy adpative experiment (legacy metadata mode)
  to OMX side. Legacy mode will now appear the same as non-metadata
  mode to client.

bug: 31399200

Change-Id: Iaf33bd7c30fab4acbc19e9fb8c19e322f9b4a0a0
parent 300379ab
Loading
Loading
Loading
Loading
+16 −24
Original line number Diff line number Diff line
@@ -52,6 +52,20 @@ public:
        kFenceTimeoutMs = 1000
    };

    enum PortMode {
        kPortModePresetStart = 0,
        kPortModePresetByteBuffer,
        kPortModePresetANWBuffer,
        kPortModePresetSecureBuffer,
        kPortModePresetEnd,

        kPortModeDynamicStart = 100,
        kPortModeDynamicANWBuffer,      // uses metadata mode kMetadataBufferTypeANWBuffer
                                        // or kMetadataBufferTypeGrallocSource
        kPortModeDynamicNativeHandle,   // uses metadata mode kMetadataBufferTypeNativeHandleSource
        kPortModeDynamicEnd,
    };

    struct ComponentInfo {
        String8 mName;
        List<String8> mRoles;
@@ -90,10 +104,8 @@ public:
    virtual status_t setConfig(
            OMX_INDEXTYPE index, const void *params, size_t size) = 0;

    // This will set *type to previous metadata buffer type on OMX error (not on binder error), and
    // new metadata buffer type on success.
    virtual status_t storeMetaDataInBuffers(
            OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type = NULL) = 0;
    virtual status_t setPortMode(
            OMX_U32 port_index, IOMX::PortMode mode) = 0;

    virtual status_t prepareForAdaptivePlayback(
            OMX_U32 portIndex, OMX_BOOL enable,
@@ -103,9 +115,6 @@ public:
            OMX_U32 portIndex, OMX_BOOL tunneled,
            OMX_U32 audioHwSync, native_handle_t **sidebandHandle) = 0;

    virtual status_t enableNativeBuffers(
            OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) = 0;

    virtual status_t getGraphicBufferUsage(
            OMX_U32 port_index, OMX_U32* usage) = 0;

@@ -241,23 +250,6 @@ public:
            uint32_t flags = 0);
};

struct CodecProfileLevel {
    OMX_U32 mProfile;
    OMX_U32 mLevel;
};

inline static const char *asString(MetadataBufferType i, const char *def = "??") {
    using namespace android;
    switch (i) {
        case kMetadataBufferTypeCameraSource:   return "CameraSource";
        case kMetadataBufferTypeGrallocSource:  return "GrallocSource";
        case kMetadataBufferTypeANWBuffer:      return "ANWBuffer";
        case kMetadataBufferTypeNativeHandleSource: return "NativeHandleSource";
        case kMetadataBufferTypeInvalid:        return "Invalid";
        default:                                return def;
    }
}

}  // namespace android

#endif  // ANDROID_IOMX_H_
+1 −2
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ public:
    OMXBuffer(const sp<MediaCodecBuffer> &codecBuffer);

    // Constructs a buffer of type kBufferTypeSharedMem.
    OMXBuffer(const sp<IMemory> &mem, size_t allottedSize = 0);
    OMXBuffer(const sp<IMemory> &mem);

    // Constructs a buffer of type kBufferTypeANWBuffer.
    OMXBuffer(const sp<GraphicBuffer> &gbuf);
@@ -78,7 +78,6 @@ private:

    // kBufferTypeSharedMem
    sp<IMemory> mMem;
    OMX_U32 mAllottedSize;

    // kBufferTypeANWBuffer
    sp<GraphicBuffer> mGraphicBuffer;
+5 −8
Original line number Diff line number Diff line
@@ -277,9 +277,7 @@ private:
    bool mChannelMaskPresent;
    int32_t mChannelMask;
    unsigned mDequeueCounter;
    MetadataBufferType mInputMetadataType;
    MetadataBufferType mOutputMetadataType;
    bool mLegacyAdaptiveExperiment;
    IOMX::PortMode mPortMode[2];
    int32_t mMetadataBuffersToSubmit;
    size_t mNumUndequeuedBuffers;
    sp<DataConverter> mConverter[2];
@@ -303,6 +301,7 @@ private:
    status_t freeBuffer(OMX_U32 portIndex, size_t i);

    status_t handleSetSurface(const sp<Surface> &surface);
    status_t setPortMode(int32_t portIndex, IOMX::PortMode mode);
    status_t setupNativeWindowSizeFormatAndUsage(
            ANativeWindow *nativeWindow /* nonnull */, int *finalUsage /* nonnull */,
            bool reconnect);
@@ -319,11 +318,11 @@ private:
    BufferInfo *dequeueBufferFromNativeWindow();

    inline bool storingMetadataInDecodedBuffers() {
        return mOutputMetadataType >= 0 && !mIsEncoder;
        return (mPortMode[kPortIndexOutput] == IOMX::kPortModeDynamicANWBuffer) && !mIsEncoder;
    }

    inline bool usingMetadataOnEncoderOutput() {
        return mOutputMetadataType >= 0 && mIsEncoder;
    inline bool usingSecureBufferOnEncoderOutput() {
        return (mPortMode[kPortIndexOutput] == IOMX::kPortModePresetSecureBuffer) && mIsEncoder;
    }

    BufferInfo *findBufferByID(
@@ -494,8 +493,6 @@ private:

    status_t setupErrorCorrectionParameters();

    status_t initNativeWindow();

    // Returns true iff all buffers on the given port have status
    // OWNED_BY_US or OWNED_BY_NATIVE_WINDOW.
    bool allYourBuffersAreBelongToUs(OMX_U32 portIndex);
+11 −53
Original line number Diff line number Diff line
@@ -37,19 +37,18 @@ enum {
    CONNECT = IBinder::FIRST_CALL_TRANSACTION,
    LIST_NODES,
    ALLOCATE_NODE,
    CREATE_INPUT_SURFACE,
    FREE_NODE,
    SEND_COMMAND,
    GET_PARAMETER,
    SET_PARAMETER,
    GET_CONFIG,
    SET_CONFIG,
    ENABLE_NATIVE_BUFFERS,
    USE_BUFFER,
    CREATE_INPUT_SURFACE,
    SET_PORT_MODE,
    SET_INPUT_SURFACE,
    STORE_META_DATA_IN_BUFFERS,
    PREPARE_FOR_ADAPTIVE_PLAYBACK,
    ALLOC_SECURE_BUFFER,
    USE_BUFFER,
    FREE_BUFFER,
    FILL_BUFFER,
    EMPTY_BUFFER,
@@ -225,17 +224,15 @@ public:
        return reply.readInt32();
    }

    virtual status_t enableNativeBuffers(
            OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable) {
    virtual status_t setPortMode(
            OMX_U32 port_index, IOMX::PortMode mode) {
        Parcel data, reply;
        data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
        data.writeInt32(port_index);
        data.writeInt32((uint32_t)graphic);
        data.writeInt32((uint32_t)enable);
        remote()->transact(ENABLE_NATIVE_BUFFERS, data, &reply);
        data.writeInt32(mode);
        remote()->transact(SET_PORT_MODE, data, &reply);

        status_t err = reply.readInt32();
        return err;
        return reply.readInt32();
    }

    virtual status_t getGraphicBufferUsage(
@@ -294,25 +291,6 @@ public:
        return err;
    }

    virtual status_t storeMetaDataInBuffers(
            OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type) {
        Parcel data, reply;
        data.writeInterfaceToken(IOMXNode::getInterfaceDescriptor());
        data.writeInt32(port_index);
        data.writeInt32((int32_t)enable);
        data.writeInt32(type == NULL ? kMetadataBufferTypeANWBuffer : *type);

        remote()->transact(STORE_META_DATA_IN_BUFFERS, data, &reply);

        // read type even storeMetaDataInBuffers failed
        int negotiatedType = reply.readInt32();
        if (type != NULL) {
            *type = (MetadataBufferType)negotiatedType;
        }

        return reply.readInt32();
    }

    virtual status_t prepareForAdaptivePlayback(
            OMX_U32 port_index, OMX_BOOL enable,
            OMX_U32 max_width, OMX_U32 max_height) {
@@ -670,16 +648,12 @@ status_t BnOMXNode::onTransact(
            return NO_ERROR;
        }

        case ENABLE_NATIVE_BUFFERS:
        case SET_PORT_MODE:
        {
            CHECK_OMX_INTERFACE(IOMXNode, data, reply);

            OMX_U32 port_index = data.readInt32();
            OMX_BOOL graphic = (OMX_BOOL)data.readInt32();
            OMX_BOOL enable = (OMX_BOOL)data.readInt32();

            status_t err = enableNativeBuffers(port_index, graphic, enable);
            reply->writeInt32(err);
            IOMX::PortMode mode = (IOMX::PortMode) data.readInt32();
            reply->writeInt32(setPortMode(port_index, mode));

            return NO_ERROR;
        }
@@ -734,22 +708,6 @@ status_t BnOMXNode::onTransact(
            return NO_ERROR;
        }

        case STORE_META_DATA_IN_BUFFERS:
        {
            CHECK_OMX_INTERFACE(IOMXNode, data, reply);

            OMX_U32 port_index = data.readInt32();
            OMX_BOOL enable = (OMX_BOOL)data.readInt32();

            MetadataBufferType type = (MetadataBufferType)data.readInt32();
            status_t err = storeMetaDataInBuffers(port_index, enable, &type);

            reply->writeInt32(type);
            reply->writeInt32(err);

            return NO_ERROR;
        }

        case PREPARE_FOR_ADAPTIVE_PLAYBACK:
        {
            CHECK_OMX_INTERFACE(IOMXNode, data, reply);
+4 −12
Original line number Diff line number Diff line
@@ -38,10 +38,9 @@ OMXBuffer::OMXBuffer(const sp<MediaCodecBuffer>& codecBuffer)
      mRangeLength(codecBuffer != NULL ? codecBuffer->size() : 0) {
}

OMXBuffer::OMXBuffer(const sp<IMemory> &mem, size_t allottedSize)
OMXBuffer::OMXBuffer(const sp<IMemory> &mem)
    : mBufferType(kBufferTypeSharedMem),
      mMem(mem),
      mAllottedSize(allottedSize ? : mem->size()) {
      mMem(mem) {
}

OMXBuffer::OMXBuffer(const sp<GraphicBuffer> &gbuf)
@@ -68,11 +67,7 @@ status_t OMXBuffer::writeToParcel(Parcel *parcel) const {

        case kBufferTypeSharedMem:
        {
            status_t err = parcel->writeStrongBinder(IInterface::asBinder(mMem));
            if (err != NO_ERROR) {
                return err;
            }
            return parcel->writeUint32(mAllottedSize);
            return parcel->writeStrongBinder(IInterface::asBinder(mMem));
        }

        case kBufferTypeANWBuffer:
@@ -103,10 +98,7 @@ status_t OMXBuffer::readFromParcel(const Parcel *parcel) {

        case kBufferTypeSharedMem:
        {
            sp<IMemory> params = interface_cast<IMemory>(parcel->readStrongBinder());

            mMem = params;
            mAllottedSize = parcel->readUint32();
            mMem = interface_cast<IMemory>(parcel->readStrongBinder());
            break;
        }

Loading