OMXClient.cpp revision 7cd58537932ef6f481f68be0b9c597a89cebdfec
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//#define LOG_NDEBUG 0
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "OMXClient"
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h>
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h>
23e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <media/stagefright/foundation/ADebug.h>
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h>
25e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <utils/KeyedVector.h>
26e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
27e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include "include/OMX.h"
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstruct MuxOMX : public IOMX {
32e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    MuxOMX(const sp<IOMX> &remoteOMX);
33e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual ~MuxOMX();
34e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
35e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual IBinder *onAsBinder() { return NULL; }
36e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
37d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid);
38e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
39e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list);
40e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
41e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateNode(
42e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const char *name, const sp<IOMXObserver> &observer,
43e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id *node);
44e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
45e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t freeNode(node_id node);
46e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
47e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t sendCommand(
48e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
49e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
50e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getParameter(
51e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
52e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            void *params, size_t size);
53e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
54e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t setParameter(
55e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
56e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const void *params, size_t size);
57e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
58e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getConfig(
59e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
60e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            void *params, size_t size);
61e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
62e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t setConfig(
63e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
64e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const void *params, size_t size);
65e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
66e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getState(
67e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_STATETYPE* state);
68e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
69e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t storeMetaDataInBuffers(
70e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_BOOL enable);
71e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
72e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t enableGraphicBuffers(
73e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_BOOL enable);
74e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
75e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getGraphicBufferUsage(
76e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_U32* usage);
77e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
78e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t useBuffer(
79e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
80e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer);
81e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
82e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t useGraphicBuffer(
83e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index,
84e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer);
85e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node_id node, OMX_U32 port_index,
887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            sp<IGraphicBufferProducer> *bufferProducer);
897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node);
917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
92e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateBuffer(
93e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, size_t size,
94e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer, void **buffer_data);
95e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
96e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateBufferWithBackup(
97e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
98e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer);
99e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
100e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t freeBuffer(
101e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer);
102e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
103e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer);
104e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
105e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t emptyBuffer(
106e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node,
107e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id buffer,
108e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
109e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_U32 flags, OMX_TICKS timestamp);
110e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
111e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getExtensionIndex(
112e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node,
113e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const char *parameter_name,
114e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_INDEXTYPE *index);
115e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
116e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberprivate:
117e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    mutable Mutex mLock;
118e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
119e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> mRemoteOMX;
120e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> mLocalOMX;
121e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
122e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    KeyedVector<node_id, bool> mIsLocalNode;
123e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
124e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    bool isLocalNode(node_id node) const;
125e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    bool isLocalNode_l(node_id node) const;
126e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    const sp<IOMX> &getOMX(node_id node) const;
127e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    const sp<IOMX> &getOMX_l(node_id node) const;
128e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
129e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    static bool IsSoftwareComponent(const char *name);
130e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
131e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MuxOMX);
132e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber};
133e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
134e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::MuxOMX(const sp<IOMX> &remoteOMX)
135e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    : mRemoteOMX(remoteOMX) {
136e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
137e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
138e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::~MuxOMX() {
139e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
140e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
141e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode(node_id node) const {
142e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
143e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
144e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode_l(node);
145e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
146e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
147e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode_l(node_id node) const {
148e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return mIsLocalNode.indexOfKey(node) >= 0;
149e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
150e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
151e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber// static
152e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::IsSoftwareComponent(const char *name) {
153e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return !strncasecmp(name, "OMX.google.", 11);
154e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
155e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
156e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX(node_id node) const {
157e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode(node) ? mLocalOMX : mRemoteOMX;
158e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
159e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
160e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX_l(node_id node) const {
161e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode_l(node) ? mLocalOMX : mRemoteOMX;
162e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
163e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
164d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool MuxOMX::livesLocally(node_id node, pid_t pid) {
165d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    return getOMX(node)->livesLocally(node, pid);
166e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
167e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
168e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::listNodes(List<ComponentInfo> *list) {
169e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
170e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
171e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (mLocalOMX == NULL) {
172e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mLocalOMX = new OMX;
173e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
174e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
175e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return mLocalOMX->listNodes(list);
176e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
177e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
178e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateNode(
179e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const char *name, const sp<IOMXObserver> &observer,
180e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id *node) {
181e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
182e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
183e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> omx;
184e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
185e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (IsSoftwareComponent(name)) {
186e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        if (mLocalOMX == NULL) {
187e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            mLocalOMX = new OMX;
188e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        }
189e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        omx = mLocalOMX;
190e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    } else {
191e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        omx = mRemoteOMX;
192e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
193e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
194e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    status_t err = omx->allocateNode(name, observer, node);
195e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
196e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (err != OK) {
197e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        return err;
198e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
199e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
200e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (omx == mLocalOMX) {
201e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mIsLocalNode.add(*node, true);
202e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
203e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
204e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return OK;
205e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
206e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
207e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeNode(node_id node) {
208e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
209e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
210e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    status_t err = getOMX_l(node)->freeNode(node);
211e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
212e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (err != OK) {
213e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        return err;
214e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
215e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
216e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    mIsLocalNode.removeItem(node);
217e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
218e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return OK;
219e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
220e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
221e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::sendCommand(
222e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
223e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->sendCommand(node, cmd, param);
224e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
225e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
226e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getParameter(
227e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
228e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        void *params, size_t size) {
229e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getParameter(node, index, params, size);
230e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
231e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
232e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setParameter(
233e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
234e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const void *params, size_t size) {
235e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->setParameter(node, index, params, size);
236e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
237e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
238e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getConfig(
239e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
240e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        void *params, size_t size) {
241e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getConfig(node, index, params, size);
242e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
243e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
244e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setConfig(
245e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
246e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const void *params, size_t size) {
247e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->setConfig(node, index, params, size);
248e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
249e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
250e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getState(
251e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_STATETYPE* state) {
252e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getState(node, state);
253e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
254e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
255e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::storeMetaDataInBuffers(
256e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
257e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->storeMetaDataInBuffers(node, port_index, enable);
258e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
259e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
260e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::enableGraphicBuffers(
261e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
262e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->enableGraphicBuffers(node, port_index, enable);
263e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
264e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
265e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getGraphicBufferUsage(
266e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_U32* usage) {
267e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getGraphicBufferUsage(node, port_index, usage);
268e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
269e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
270e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useBuffer(
271e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
272e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer) {
273e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->useBuffer(node, port_index, params, buffer);
274e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
275e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
276e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useGraphicBuffer(
277e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index,
278e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
279e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->useGraphicBuffer(
280e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, graphicBuffer, buffer);
281e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
282e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
2837cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::createInputSurface(
2847cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        node_id node, OMX_U32 port_index,
2857cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer> *bufferProducer) {
2867cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = getOMX(node)->createInputSurface(
2877cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node, port_index, bufferProducer);
2887cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
2897cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
2907cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
2917cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::signalEndOfInputStream(node_id node) {
2927cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return getOMX(node)->signalEndOfInputStream(node);
2937cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
2947cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
295e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBuffer(
296e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, size_t size,
297e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer, void **buffer_data) {
298e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->allocateBuffer(
299e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, size, buffer, buffer_data);
300e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
301e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
302e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBufferWithBackup(
303e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
304e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer) {
305e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->allocateBufferWithBackup(
306e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, params, buffer);
307e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
308e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
309e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeBuffer(
310e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, buffer_id buffer) {
311e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->freeBuffer(node, port_index, buffer);
312e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
313e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
314e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::fillBuffer(node_id node, buffer_id buffer) {
315e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->fillBuffer(node, buffer);
316e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
317e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
318e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::emptyBuffer(
319e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node,
320e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id buffer,
321e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_U32 range_offset, OMX_U32 range_length,
322e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
323e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->emptyBuffer(
324e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, buffer, range_offset, range_length, flags, timestamp);
325e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
326e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
327e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getExtensionIndex(
328e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node,
329e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const char *parameter_name,
330e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_INDEXTYPE *index) {
331e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getExtensionIndex(node, parameter_name, index);
332e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
333e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
334408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() {
33520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
33620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
33720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t OMXClient::connect() {
33820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IServiceManager> sm = defaultServiceManager();
33920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IBinder> binder = sm->getService(String16("media.player"));
34020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
34120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3420c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(service.get() != NULL);
34320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
344318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOMX = service->getOMX();
3450c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mOMX.get() != NULL);
34620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
347d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    if (!mOMX->livesLocally(NULL /* node */, getpid())) {
348e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        ALOGI("Using client-side OMX mux.");
349e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mOMX = new MuxOMX(mOMX);
350e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
351e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
35220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
35320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
35420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
35520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() {
35604394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong    if (mOMX.get() != NULL) {
35704394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong        mOMX.clear();
35804394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong        mOMX = NULL;
35904394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong    }
36020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
363