120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/*
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License.
620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at
720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License.
1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef ANDROID_IOMX_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define ANDROID_IOMX_H_
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IInterface.h>
2283750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis#include <ui/GraphicBuffer.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h>
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Core.h>
278b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <OMX_Video.h>
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory;
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver;
338b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer;
34f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface;
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface {
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMX);
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    typedef void *buffer_id;
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    typedef void *node_id;
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    // Given a node_id and the calling process' pid, returns true iff
447eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // the implementation of the OMX interface lives in the same
457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // process.
46d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid) = 0;
477eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
48134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct ComponentInfo {
49134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        String8 mName;
50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        List<String8> mRoles;
51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
52134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
55318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer,
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id *node) = 0;
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) = 0;
59318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
63318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) = 0;
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
67318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) = 0;
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
72693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
73693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) = 0;
74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
75318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
77693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) = 0;
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
79b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
80b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state) = 0;
81b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
82e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
83e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
84e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
8583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t enableGraphicBuffers(
8683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index, OMX_BOOL enable) = 0;
8783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
88e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
89e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage) = 0;
90e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
91318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) = 0;
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9583750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
9683750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
9783750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) = 0;
9883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
99570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // This API clearly only makes sense if the caller lives in the
100570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // same process as the callee, i.e. is the media_server, as the
101570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // returned "buffer_data" pointer is just that, a pointer into local
102570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber    // address space.
103318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
105570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data) = 0;
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) = 0;
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
114318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
116318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
1218b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
123693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
124693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
125693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) = 0;
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message {
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum {
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EVENT,
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EMPTY_BUFFER_DONE,
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        FILL_BUFFER_DONE,
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } type;
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    IOMX::node_id node;
137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    union {
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // if type == EVENT
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_EVENTTYPE event;
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data1;
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data2;
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } event_data;
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
146e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == EMPTY_BUFFER_DONE
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } buffer_data;
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
151e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == FILL_BUFFER_DONE
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length;
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags;
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp;
158e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber            OMX_PTR platform_private;
159213addfaf4b359c69da4e9b4490c511d116845bbAndreas Huber            OMX_PTR data_ptr;
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } extended_buffer_data;
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } u;
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface {
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) = 0;
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> {
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
188457116d3a01618acf9a875020ca5860551ba03a6James Dongstruct CodecProfileLevel {
189457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mProfile;
190457116d3a01618acf9a875020ca5860551ba03a6James Dong    OMX_U32 mLevel;
191457116d3a01618acf9a875020ca5860551ba03a6James Dong};
192457116d3a01618acf9a875020ca5860551ba03a6James Dong
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_IOMX_H_
196