IOMX.h revision 7eaa9c9385535b651064e02d05a8ffa4b2359281
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>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/List.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/String8.h>
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <OMX_Core.h>
268b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber#include <OMX_Video.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
281b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber#include "jni.h"
291b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IMemory;
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver;
348b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer;
358b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass ISurface;
36f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huberclass Surface;
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMX : public IInterface {
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMX);
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    typedef void *buffer_id;
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    typedef void *node_id;
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
457eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // Given the calling process' pid, returns true iff
467eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // the implementation of the OMX interface lives in the same
477eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    // process.
487eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    virtual bool livesLocally(pid_t pid) = 0;
497eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
50134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    struct ComponentInfo {
51134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        String8 mName;
52134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber        List<String8> mRoles;
53134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    };
54134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list) = 0;
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
57318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer,
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id *node) = 0;
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node) = 0;
61318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) = 0;
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size) = 0;
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
69318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size) = 0;
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
73318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
74693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
75693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size) = 0;
76693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
78693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
79693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size) = 0;
80693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
81318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) = 0;
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) = 0;
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
89318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer) = 0;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
93318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer) = 0;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
96318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer) = 0;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
98318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp) = 0;
1038b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
104318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
105693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
106693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
107693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index) = 0;
108693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
1098b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual sp<IOMXRenderer> createRenderer(
1108b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const sp<ISurface> &surface,
1118b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName,
1128b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1138b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth, size_t encodedHeight,
1148b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth, size_t displayHeight) = 0;
115f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber
1161b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    // Note: These methods are _not_ virtual, it exists as a wrapper around
117f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber    // the virtual "createRenderer" method above facilitating extraction
1181b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    // of the ISurface from a regular Surface or a java Surface object.
119f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber    sp<IOMXRenderer> createRenderer(
120f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            const sp<Surface> &surface,
121f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            const char *componentName,
122f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
123f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            size_t encodedWidth, size_t encodedHeight,
124f4148b55c5d6f68b22462e3880015fefa91ae7c6Andreas Huber            size_t displayWidth, size_t displayHeight);
1251b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber
1261b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber    sp<IOMXRenderer> createRendererFromJavaSurface(
1271b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            JNIEnv *env, jobject javaSurface,
1281b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            const char *componentName,
1291b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
1301b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            size_t encodedWidth, size_t encodedHeight,
1311b84df1a0823fbcb9cec754311f53eaccfe85ae3Andreas Huber            size_t displayWidth, size_t displayHeight);
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstruct omx_message {
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum {
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EVENT,
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        EMPTY_BUFFER_DONE,
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        FILL_BUFFER_DONE,
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } type;
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
142693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber    IOMX::node_id node;
143693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    union {
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        // if type == EVENT
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_EVENTTYPE event;
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data1;
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 data2;
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } event_data;
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
152e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == EMPTY_BUFFER_DONE
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } buffer_data;
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
157e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber        // if type == FILL_BUFFER_DONE
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        struct {
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            IOMX::buffer_id buffer;
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset;
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_length;
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags;
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_TICKS timestamp;
164e0f0b08aa692d15f3bfa19e10abfc84803c099b4Andreas Huber            OMX_PTR platform_private;
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } extended_buffer_data;
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    } u;
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass IOMXObserver : public IInterface {
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    DECLARE_META_INTERFACE(OMXObserver);
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
174318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void onMessage(const omx_message &msg) = 0;
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1778b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass IOMXRenderer : public IInterface {
1788b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic:
1798b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    DECLARE_META_INTERFACE(OMXRenderer);
1808b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
1818b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual void render(IOMX::buffer_id buffer) = 0;
1828b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber};
1838b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber////////////////////////////////////////////////////////////////////////////////
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMX : public BnInterface<IOMX> {
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass BnOMXObserver : public BnInterface<IOMXObserver> {
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual status_t onTransact(
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            uint32_t flags = 0);
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2008b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberclass BnOMXRenderer : public BnInterface<IOMXRenderer> {
2018b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huberpublic:
2028b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual status_t onTransact(
2038b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            uint32_t code, const Parcel &data, Parcel *reply,
2048b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            uint32_t flags = 0);
2058b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber};
2068b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_IOMX_H_
210