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;
27ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarstruct OMXNodeInstance;
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberclass OMX : public BnOMX,
30318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            public IBinder::DeathRecipient {
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX();
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
34d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid);
357eaa9c9385535b651064e02d05a8ffa4b2359281Andreas Huber
36134ee6a324c35f39e3576172e4eae4c6de6eb9dcAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list);
3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
38318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateNode(
3923858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen            const char *name, const sp<IOMXObserver> &observer,
4023858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen            sp<IBinder> *nodeBinder,
4123858874bbce68fb5ac83250087fa7788c97dd12Marco Nelissen            node_id *node);
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
43318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeNode(node_id node);
44318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
45318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t sendCommand(
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
48318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getParameter(
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *params, size_t size);
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
52318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setParameter(
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_INDEXTYPE index,
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            const void *params, size_t size);
5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
56318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getConfig(
57693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
58693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            void *params, size_t size);
59693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
60318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t setConfig(
61693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node, OMX_INDEXTYPE index,
62693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const void *params, size_t size);
63693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
64b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis    virtual status_t getState(
65b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis            node_id node, OMX_STATETYPE* state);
66b1d666f5cb555d135eb69e005e88a03330bbb54cJamie Gennis
67a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    virtual status_t enableNativeBuffers(
68a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL graphic, OMX_BOOL enable);
6983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
70e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis    virtual status_t getGraphicBufferUsage(
71e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis            node_id node, OMX_U32 port_index, OMX_U32* usage);
72e2ce6458659c6e1bad420357b61dc10cd8bbe2abJamie Gennis
73e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong    virtual status_t storeMetaDataInBuffers(
74054219874873b41f1c815552987c10465c34ba2bLajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL enable, MetadataBufferType *type);
75e870772a78ffe08b1c14a791e368f1499f1be0f3James Dong
7656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    virtual status_t prepareForAdaptivePlayback(
7756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node_id node, OMX_U32 portIndex, OMX_BOOL enable,
7856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 max_frame_width, OMX_U32 max_frame_height);
7956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
805a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    virtual status_t configureVideoTunnelMode(
815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle);
835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
84318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t useBuffer(
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
86cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize);
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8883750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis    virtual status_t useGraphicBuffer(
8983750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            node_id node, OMX_U32 port_index,
9083750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer);
9183750eaf5a3f38c243a9e7eb81d4b2421e3a0d88Jamie Gennis
92d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    virtual status_t updateGraphicBufferInMeta(
93d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node_id node, OMX_U32 port_index,
94d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
95d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
967e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar    virtual status_t updateNativeHandleInMeta(
977e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            node_id node, OMX_U32 port_index,
987e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar            const sp<NativeHandle> &nativeHandle, buffer_id buffer);
997e0bef8aa6bf9db06079b743794ec2712ad84431Lajos Molnar
1007cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
10157fad3c31f46ec98d15bc253c16f9d269aeb8ea7Lajos Molnar            node_id node, OMX_U32 port_index, android_dataspace dataSpace,
102054219874873b41f1c815552987c10465c34ba2bLajos Molnar            sp<IGraphicBufferProducer> *bufferProducer,
103054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type);
1047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
105d291c222357303b9611cab89d0c3b047584ef377Chong Zhang    virtual status_t createPersistentInputSurface(
106d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferProducer> *bufferProducer,
107d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            sp<IGraphicBufferConsumer> *bufferConsumer);
108d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1098f469e18c307cb9dc0d16ed9225972aa8be4516fChong Zhang    virtual status_t setInputSurface(
110d291c222357303b9611cab89d0c3b047584ef377Chong Zhang            node_id node, OMX_U32 port_index,
111054219874873b41f1c815552987c10465c34ba2bLajos Molnar            const sp<IGraphicBufferConsumer> &bufferConsumer,
112054219874873b41f1c815552987c10465c34ba2bLajos Molnar            MetadataBufferType *type);
113d291c222357303b9611cab89d0c3b047584ef377Chong Zhang
1147cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node);
1157cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
116a63141af8f036bda0b8f7800107ca8a0e0623135Lajos Molnar    virtual status_t allocateSecureBuffer(
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, size_t size,
1181b40f2804a27b695e9e53fb1699b64cb0dd387f9Lajos Molnar            buffer_id *buffer, void **buffer_data, sp<NativeHandle> *native_handle);
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
120318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t allocateBufferWithBackup(
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
122cc7cc67349b7a3f498882087aa42ffc05a2daf11Lajos Molnar            buffer_id *buffer, OMX_U32 allottedSize);
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
124318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t freeBuffer(
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12715ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar    virtual status_t fillBuffer(node_id node, buffer_id buffer, int fenceFd);
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
129318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t emptyBuffer(
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            node_id node,
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            buffer_id buffer,
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
13315ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            OMX_U32 flags, OMX_TICKS timestamp, int fenceFd);
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
135318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual status_t getExtensionIndex(
136693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            node_id node,
137693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            const char *parameter_name,
138693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber            OMX_INDEXTYPE *index);
139693d271e62a3726689ff68f4505ba49228eb94b2Andreas Huber
140e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    virtual status_t setInternalOption(
141e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            node_id node,
142e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            OMX_U32 port_index,
143e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            InternalOptionType type,
144e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const void *data,
145e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            size_t size);
146e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
147318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    virtual void binderDied(const wp<IBinder> &the_late_who);
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1498dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia    virtual bool isSecure(IOMX::node_id node);
1508dde7269a5356503d2b283234b6cb46d0c3f214eWei Jia
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnEvent(
152318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber            node_id node,
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_EVENTTYPE eEvent,
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_U32 nData1,
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_U32 nData2,
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            OMX_IN OMX_PTR pEventData);
15778d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnEmptyBufferDone(
15915ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer, int fenceFd);
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX_ERRORTYPE OnFillBufferDone(
16215ab4996019387f27a48b81cb4774c21502bc0e5Lajos Molnar            node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer, int fenceFd);
163318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
164318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void invalidateNodeID(node_id node);
165318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
166e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huberprotected:
167e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber    virtual ~OMX();
168e3ec3cec3a2e27033249ff82964d2cbd441d9873Andreas Huber
169318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huberprivate:
170ca9718b81d1edb3d094a11502737293dcb7526e7Glenn Kasten    struct CallbackDispatcherThread;
171318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    struct CallbackDispatcher;
172318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
17378d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    Mutex mLock;
17478d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    OMXMaster *mMaster;
175cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    size_t mNodeCounter;
176318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
177318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
178318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
17978d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
180318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
181cf3abd4875fd54ba40fccdbd90755d2a5ecfca60Marco Nelissen    node_id makeNodeID_l(OMXNodeInstance *instance);
182318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    OMXNodeInstance *findInstance(node_id node);
18378d26445a7dfe8f49d7005185f28b01cffe80adfJames Dong    sp<CallbackDispatcher> findDispatcher(node_id node);
184318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber
185318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    void invalidateNodeID_l(node_id node);
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX(const OMX &);
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    OMX &operator=(const OMX &);
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // ANDROID_OMX_H_
194