OMX.h revision 8b1be2ca7cee71a4920d5d31fdcbad2b1d4ca49d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2009 The Android Open Source Project
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License");
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * you may not use this file except in compliance with the License.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * You may obtain a copy of the License at
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *      http://www.apache.org/licenses/LICENSE-2.0
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS,
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * See the License for the specific language governing permissions and
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * limitations under the License.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ANDROID_OMX_H_
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ANDROID_OMX_H_
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <media/IOMX.h>
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/threads.h>
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/KeyedVector.h>
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct OMXMaster;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OMXNodeInstance;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class OMX : public BnOMX,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            public IBinder::DeathRecipient {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OMX();
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool livesLocally(node_id node, pid_t pid);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t listNodes(List<ComponentInfo> *list);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t allocateNode(
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const char *name, const sp<IOMXObserver> &observer, node_id *node);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t freeNode(node_id node);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t sendCommand(
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t getParameter(
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_INDEXTYPE index,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            void *params, size_t size);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t setParameter(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_INDEXTYPE index,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const void *params, size_t size);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t getConfig(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_INDEXTYPE index,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            void *params, size_t size);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t setConfig(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_INDEXTYPE index,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const void *params, size_t size);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t getState(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_STATETYPE* state);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t enableGraphicBuffers(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index, OMX_BOOL enable);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t getGraphicBufferUsage(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index, OMX_U32* usage);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t storeMetaDataInBuffers(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index, OMX_BOOL enable);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t prepareForAdaptivePlayback(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 portIndex, OMX_BOOL enable,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_U32 max_frame_width, OMX_U32 max_frame_height);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t useBuffer(
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buffer_id *buffer);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t useGraphicBuffer(
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual status_t updateGraphicBufferInMeta(
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            node_id node, OMX_U32 port_index,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual status_t createInputSurface(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            node_id node, OMX_U32 port_index,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            sp<IGraphicBufferProducer> *bufferProducer);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual status_t signalEndOfInputStream(node_id node);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual status_t allocateBuffer(
9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            node_id node, OMX_U32 port_index, size_t size,
9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            buffer_id *buffer, void **buffer_data);
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    virtual status_t allocateBufferWithBackup(
10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            buffer_id *buffer);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t freeBuffer(
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, OMX_U32 port_index, buffer_id buffer);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t fillBuffer(node_id node, buffer_id buffer);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t emptyBuffer(
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            buffer_id buffer,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_U32 range_offset, OMX_U32 range_length,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_U32 flags, OMX_TICKS timestamp);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual status_t getExtensionIndex(
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            const char *parameter_name,
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            OMX_INDEXTYPE *index);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual status_t setInternalOption(
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            node_id node,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            OMX_U32 port_index,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            InternalOptionType type,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            const void *data,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            size_t size);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void binderDied(const wp<IBinder> &the_late_who);
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OMX_ERRORTYPE OnEvent(
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_IN OMX_EVENTTYPE eEvent,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_IN OMX_U32 nData1,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_IN OMX_U32 nData2,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            OMX_IN OMX_PTR pEventData);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OMX_ERRORTYPE OnEmptyBufferDone(
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OMX_ERRORTYPE OnFillBufferDone(
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            node_id node, buffer_id buffer, OMX_IN OMX_BUFFERHEADERTYPE *pBuffer);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void invalidateNodeID(node_id node);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~OMX();
146
147private:
148    struct CallbackDispatcherThread;
149    struct CallbackDispatcher;
150
151    Mutex mLock;
152    OMXMaster *mMaster;
153    int32_t mNodeCounter;
154
155    KeyedVector<wp<IBinder>, OMXNodeInstance *> mLiveNodes;
156    KeyedVector<node_id, OMXNodeInstance *> mNodeIDToInstance;
157    KeyedVector<node_id, sp<CallbackDispatcher> > mDispatchers;
158
159    node_id makeNodeID(OMXNodeInstance *instance);
160    OMXNodeInstance *findInstance(node_id node);
161    sp<CallbackDispatcher> findDispatcher(node_id node);
162
163    void invalidateNodeID_l(node_id node);
164
165    OMX(const OMX &);
166    OMX &operator=(const OMX &);
167};
168
169}  // namespace android
170
171#endif  // ANDROID_OMX_H_
172