OMX.h revision 570a3cb7582daa030cb38eedc5eb6a06f86ecc7f
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_OMX_H_
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define ANDROID_OMX_H_
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IOMX.h>
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/threads.h>
22318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber#include <utils/KeyedVector.h>
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huberstruct OMXMaster;
27318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberclass OMXNodeInstance;
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberclass OMX : public BnOMX,
30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            public IBinder::DeathRecipient {
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX();
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
347eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber    virtual bool livesLocally(pid_t pid);
357eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
36134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list);
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
39318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            const char *name, const sp<IOMXObserver> &observer, node_id *node);
4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node);
42318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
46318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size);
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
50318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size);
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
54318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
55693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
56693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size);
57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
58318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
60693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size);
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
62318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer);
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
66318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBuffer(
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
68570a3cb7582daa030cb38eedc5eb6a06f86ecc7fAndreas Huber            buffer_id *buffer, void **buffer_data);
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
70318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id *buffer);
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
74318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer);
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer);
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
79318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 flags, OMX_TICKS timestamp);
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
85318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
86693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
87693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
88693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index);
89693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
908b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber    virtual sp<IOMXRenderer> createRenderer(
918b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const sp<ISurface> &surface,
928b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            const char *componentName,
938b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            OMX_COLOR_FORMATTYPE colorFormat,
948b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t encodedWidth, size_t encodedHeight,
958b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber            size_t displayWidth, size_t displayHeight);
968b938cdab5bd3d074d9b41bc2915fcfc11e47f27Andreas Huber
97318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void binderDied(const wp<IBinder> &the_late_who);
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnEvent(
100318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id node,
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_EVENTTYPE eEvent,
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_U32 nData1,
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_U32 nData2,
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_PTR pEventData);
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnEmptyBufferDone(
107318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnFillBufferDone(
110318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id node, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
111318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
112318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void invalidateNodeID(node_id node);
113318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
114e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huberprotected:
115e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    virtual ~OMX();
116e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
117318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
118318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    Mutex mLock;
119318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
120e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    OMXMaster *mMaster;
121e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
122318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    struct CallbackDispatcher;
123318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    sp<CallbackDispatcher> mDispatcher;
124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
125318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    int32_t mNodeCounter;
126318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
127318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
128318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
130318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    node_id makeNodeID(OMXNodeInstance *instance);
131318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *findInstance(node_id node);
132318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
133318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void invalidateNodeID_l(node_id node);
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX(const OMX &);
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX &operator=(const OMX &);
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_OMX_H_
142