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"
19f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung
20f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__
21f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#define OMX_ANDROID_COMPILE_AS_32BIT_ON_64BIT_PLATFORMS
22f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif
23f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <binder/IServiceManager.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/IMediaPlayerService.h>
28e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <media/stagefright/foundation/ADebug.h>
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/OMXClient.h>
30e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include <utils/KeyedVector.h>
31e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
32e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber#include "include/OMX.h"
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstruct MuxOMX : public IOMX {
37e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    MuxOMX(const sp<IOMX> &remoteOMX);
38e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual ~MuxOMX();
39e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
40ac0230da14a3d223c2144b165a3a163e8519d239Andreas Huber    virtual IBinder *onAsBinder() { return mRemoteOMX->asBinder().get(); }
41e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
42d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    virtual bool livesLocally(node_id node, pid_t pid);
43e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
44e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t listNodes(List<ComponentInfo> *list);
45e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
46e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateNode(
47e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const char *name, const sp<IOMXObserver> &observer,
48e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id *node);
49e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
50e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t freeNode(node_id node);
51e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
52e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t sendCommand(
53e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param);
54e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
55e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getParameter(
56e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
57e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            void *params, size_t size);
58e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
59e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t setParameter(
60e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
61e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const void *params, size_t size);
62e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
63e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getConfig(
64e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
65e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            void *params, size_t size);
66e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
67e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t setConfig(
68e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_INDEXTYPE index,
69e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const void *params, size_t size);
70e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
71e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getState(
72e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_STATETYPE* state);
73e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
74e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t storeMetaDataInBuffers(
75e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_BOOL enable);
76e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
7756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    virtual status_t prepareForAdaptivePlayback(
7856ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node_id node, OMX_U32 port_index, OMX_BOOL enable,
7956ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight);
8056ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
815a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    virtual status_t configureVideoTunnelMode(
825a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node_id node, OMX_U32 portIndex, OMX_BOOL tunneled,
835a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            OMX_U32 audioHwSync, native_handle_t **sidebandHandle);
845a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
85e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t enableGraphicBuffers(
86e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_BOOL enable);
87e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
88e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getGraphicBufferUsage(
89e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, OMX_U32* usage);
90e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
91e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t useBuffer(
92e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
93e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer);
94e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
95e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t useGraphicBuffer(
96e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index,
97e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer);
98e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
99d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    virtual status_t updateGraphicBufferInMeta(
100d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node_id node, OMX_U32 port_index,
101d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer);
102d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
1037cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t createInputSurface(
1047cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node_id node, OMX_U32 port_index,
1057cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            sp<IGraphicBufferProducer> *bufferProducer);
1067cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
1077cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    virtual status_t signalEndOfInputStream(node_id node);
1087cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
109e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateBuffer(
110e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, size_t size,
111e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer, void **buffer_data);
112e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
113e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t allocateBufferWithBackup(
114e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, const sp<IMemory> &params,
115e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id *buffer);
116e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
117e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t freeBuffer(
118e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node, OMX_U32 port_index, buffer_id buffer);
119e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
120e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t fillBuffer(node_id node, buffer_id buffer);
121e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
122e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t emptyBuffer(
123e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node,
124e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            buffer_id buffer,
125e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_U32 range_offset, OMX_U32 range_length,
126e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_U32 flags, OMX_TICKS timestamp);
127e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
128e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    virtual status_t getExtensionIndex(
129e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node_id node,
130e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            const char *parameter_name,
131e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            OMX_INDEXTYPE *index);
132e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
133e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    virtual status_t setInternalOption(
134e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            node_id node,
135e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            OMX_U32 port_index,
136e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            InternalOptionType type,
137e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            const void *data,
138e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber            size_t size);
139e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
140e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberprivate:
141e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    mutable Mutex mLock;
142e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
143e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> mRemoteOMX;
144e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> mLocalOMX;
145e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
146e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    KeyedVector<node_id, bool> mIsLocalNode;
147e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
148e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    bool isLocalNode(node_id node) const;
149e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    bool isLocalNode_l(node_id node) const;
150e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    const sp<IOMX> &getOMX(node_id node) const;
151e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    const sp<IOMX> &getOMX_l(node_id node) const;
152e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
153609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    static bool CanLiveLocally(const char *name);
154e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
155e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(MuxOMX);
156e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber};
157e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
158e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::MuxOMX(const sp<IOMX> &remoteOMX)
159e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    : mRemoteOMX(remoteOMX) {
160e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
161e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
162e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas HuberMuxOMX::~MuxOMX() {
163e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
164e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
165e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode(node_id node) const {
166e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
167e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
168e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode_l(node);
169e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
170e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
171e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberbool MuxOMX::isLocalNode_l(node_id node) const {
172e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return mIsLocalNode.indexOfKey(node) >= 0;
173e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
174e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
175e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber// static
176609b815a3131d22da38b2f452faa9f89daad4039Andy Hungbool MuxOMX::CanLiveLocally(const char *name) {
177f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#ifdef __LP64__
178f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung    (void)name; // disable unused parameter warning
179f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung    // 64 bit processes always run OMX remote on MediaServer
180f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung    return false;
181f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#else
182f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung    // 32 bit processes run only OMX.google.* components locally
183e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return !strncasecmp(name, "OMX.google.", 11);
184f87e30fe71752dc431d8e8d5682c38271c03265aAndy Hung#endif
185e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
186e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
187e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX(node_id node) const {
188e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode(node) ? mLocalOMX : mRemoteOMX;
189e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
190e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
191e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberconst sp<IOMX> &MuxOMX::getOMX_l(node_id node) const {
192e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return isLocalNode_l(node) ? mLocalOMX : mRemoteOMX;
193e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
194e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
195d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huberbool MuxOMX::livesLocally(node_id node, pid_t pid) {
196d459b485c61bd3e7fd81c5cd3af8ada27fc3e8d3Andreas Huber    return getOMX(node)->livesLocally(node, pid);
197e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
198e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
199e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::listNodes(List<ComponentInfo> *list) {
200e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
201e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
202e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (mLocalOMX == NULL) {
203e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mLocalOMX = new OMX;
204e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
205e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
206e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return mLocalOMX->listNodes(list);
207e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
208e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
209e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateNode(
210e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const char *name, const sp<IOMXObserver> &observer,
211e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id *node) {
212e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
213e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
214e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    sp<IOMX> omx;
215e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
216609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (CanLiveLocally(name)) {
217e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        if (mLocalOMX == NULL) {
218e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            mLocalOMX = new OMX;
219e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        }
220e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        omx = mLocalOMX;
221e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    } else {
222e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        omx = mRemoteOMX;
223e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
224e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
225e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    status_t err = omx->allocateNode(name, observer, node);
226e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
227e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (err != OK) {
228e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        return err;
229e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
230e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
231e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (omx == mLocalOMX) {
232e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mIsLocalNode.add(*node, true);
233e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
234e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
235e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return OK;
236e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
237e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
238e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeNode(node_id node) {
239e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    Mutex::Autolock autoLock(mLock);
240e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
241e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    status_t err = getOMX_l(node)->freeNode(node);
242e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
243e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    if (err != OK) {
244e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        return err;
245e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
246e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
247e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    mIsLocalNode.removeItem(node);
248e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
249e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return OK;
250e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
251e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
252e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::sendCommand(
253e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_COMMANDTYPE cmd, OMX_S32 param) {
254e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->sendCommand(node, cmd, param);
255e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
256e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
257e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getParameter(
258e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
259e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        void *params, size_t size) {
260e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getParameter(node, index, params, size);
261e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
262e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
263e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setParameter(
264e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
265e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const void *params, size_t size) {
266e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->setParameter(node, index, params, size);
267e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
268e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
269e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getConfig(
270e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
271e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        void *params, size_t size) {
272e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getConfig(node, index, params, size);
273e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
274e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
275e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::setConfig(
276e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_INDEXTYPE index,
277e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const void *params, size_t size) {
278e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->setConfig(node, index, params, size);
279e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
280e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
281e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getState(
282e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_STATETYPE* state) {
283e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getState(node, state);
284e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
285e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
286e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::storeMetaDataInBuffers(
287e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
288e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->storeMetaDataInBuffers(node, port_index, enable);
289e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
290e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
29156ce726019f700a95ce5b45beebceadae4836e30Lajos Molnarstatus_t MuxOMX::prepareForAdaptivePlayback(
29256ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        node_id node, OMX_U32 port_index, OMX_BOOL enable,
29356ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar        OMX_U32 maxFrameWidth, OMX_U32 maxFrameHeight) {
29456ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar    return getOMX(node)->prepareForAdaptivePlayback(
29556ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar            node, port_index, enable, maxFrameWidth, maxFrameHeight);
29656ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar}
29756ce726019f700a95ce5b45beebceadae4836e30Lajos Molnar
2985a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachadstatus_t MuxOMX::configureVideoTunnelMode(
2995a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        node_id node, OMX_U32 portIndex, OMX_BOOL enable,
3005a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad        OMX_U32 audioHwSync, native_handle_t **sidebandHandle) {
3015a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad    return getOMX(node)->configureVideoTunnelMode(
3025a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad            node, portIndex, enable, audioHwSync, sidebandHandle);
3035a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad}
3045a446aafff3020d607ad6fb14cc7ae76dd8f7947Rachad
305e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::enableGraphicBuffers(
306e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_BOOL enable) {
307e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->enableGraphicBuffers(node, port_index, enable);
308e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
309e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
310e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getGraphicBufferUsage(
311e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, OMX_U32* usage) {
312e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getGraphicBufferUsage(node, port_index, usage);
313e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
314e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
315e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useBuffer(
316e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
317e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer) {
318e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->useBuffer(node, port_index, params, buffer);
319e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
320e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
321e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::useGraphicBuffer(
322e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index,
323e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const sp<GraphicBuffer> &graphicBuffer, buffer_id *buffer) {
324e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->useGraphicBuffer(
325e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, graphicBuffer, buffer);
326e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
327e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
328d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnarstatus_t MuxOMX::updateGraphicBufferInMeta(
329d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        node_id node, OMX_U32 port_index,
330d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar        const sp<GraphicBuffer> &graphicBuffer, buffer_id buffer) {
331d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar    return getOMX(node)->updateGraphicBufferInMeta(
332d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar            node, port_index, graphicBuffer, buffer);
333d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar}
334d0715867861c216e88a4a7523b6da8a3cb128724Lajos Molnar
3357cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::createInputSurface(
3367cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        node_id node, OMX_U32 port_index,
3377cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden        sp<IGraphicBufferProducer> *bufferProducer) {
3387cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    status_t err = getOMX(node)->createInputSurface(
3397cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden            node, port_index, bufferProducer);
3407cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return err;
3417cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3427cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
3437cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFaddenstatus_t MuxOMX::signalEndOfInputStream(node_id node) {
3447cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden    return getOMX(node)->signalEndOfInputStream(node);
3457cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden}
3467cd58537932ef6f481f68be0b9c597a89cebdfecAndy McFadden
347e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBuffer(
348e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, size_t size,
349e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer, void **buffer_data) {
350e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->allocateBuffer(
351e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, size, buffer, buffer_data);
352e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
353e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
354e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::allocateBufferWithBackup(
355e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, const sp<IMemory> &params,
356e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id *buffer) {
357e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->allocateBufferWithBackup(
358e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, port_index, params, buffer);
359e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
360e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
361e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::freeBuffer(
362e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node, OMX_U32 port_index, buffer_id buffer) {
363e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->freeBuffer(node, port_index, buffer);
364e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
365e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
366e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::fillBuffer(node_id node, buffer_id buffer) {
367e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->fillBuffer(node, buffer);
368e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
369e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
370e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::emptyBuffer(
371e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node,
372e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        buffer_id buffer,
373e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_U32 range_offset, OMX_U32 range_length,
374e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_U32 flags, OMX_TICKS timestamp) {
375e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->emptyBuffer(
376e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber            node, buffer, range_offset, range_length, flags, timestamp);
377e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
378e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
379e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huberstatus_t MuxOMX::getExtensionIndex(
380e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        node_id node,
381e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        const char *parameter_name,
382e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        OMX_INDEXTYPE *index) {
383e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    return getOMX(node)->getExtensionIndex(node, parameter_name, index);
384e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber}
385e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
386e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huberstatus_t MuxOMX::setInternalOption(
387e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        node_id node,
388e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        OMX_U32 port_index,
389e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        InternalOptionType type,
390e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        const void *data,
391e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber        size_t size) {
392e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber    return getOMX(node)->setInternalOption(node, port_index, type, data, size);
393e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber}
394e40cda70eec141fa05cbcca1de420fdb22b98be6Andreas Huber
395408b8e1073385d0d09bb96b9952f84731a0b4aebAndreas HuberOMXClient::OMXClient() {
39620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
39720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
39820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t OMXClient::connect() {
39920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IServiceManager> sm = defaultServiceManager();
40020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IBinder> binder = sm->getService(String16("media.player"));
40120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sp<IMediaPlayerService> service = interface_cast<IMediaPlayerService>(binder);
40220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4030c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(service.get() != NULL);
40420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
405318ad9c1d9d6515026dfc2c021359d27decaa7a1Andreas Huber    mOMX = service->getOMX();
4060c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK(mOMX.get() != NULL);
40720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
408609b815a3131d22da38b2f452faa9f89daad4039Andy Hung    if (!mOMX->livesLocally(0 /* node */, getpid())) {
409e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        ALOGI("Using client-side OMX mux.");
410e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber        mOMX = new MuxOMX(mOMX);
411e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber    }
412e9c52da6fdb755ed832325c2fe4fe5b3bc4c9eedAndreas Huber
41320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
41420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
41520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
41620111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid OMXClient::disconnect() {
41704394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong    if (mOMX.get() != NULL) {
41804394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong        mOMX.clear();
41904394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong        mOMX = NULL;
42004394b1c83d56e2956ba84aa9cb4b5d3b01d8ae8James Dong    }
42120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
42220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
42320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
424