OMXMaster.cpp revision fb41d59595a09f60fd2fa3618e9d5a4937c4555b
1b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber/*
2b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *
4b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * you may not use this file except in compliance with the License.
6b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * You may obtain a copy of the License at
7b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *
8b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber *
10b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * Unless required by applicable law or agreed to in writing, software
11b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * See the License for the specific language governing permissions and
14b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber * limitations under the License.
15b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber */
16b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
17fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber//#define LOG_NDEBUG 0
18fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber#define LOG_TAG "OMXMaster"
19fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber#include <utils/Log.h>
20fb41d59595a09f60fd2fa3618e9d5a4937c4555bAndreas Huber
21b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXMaster.h"
22b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
23b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <dlfcn.h>
24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
25b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <media/stagefright/MediaDebug.h>
26b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
27b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE
28b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXPVCodecsPlugin.h"
29b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif
30b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
31b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubernamespace android {
32b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
33b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::OMXMaster()
34b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    : mVendorLibHandle(NULL) {
35b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    addVendorPlugin();
36b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
37b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE
38b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    addPlugin(new OMXPVCodecsPlugin);
39b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif
40b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
41b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
42b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::~OMXMaster() {
43b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    clearPlugins();
44b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
45b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (mVendorLibHandle != NULL) {
46b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        dlclose(mVendorLibHandle);
47b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        mVendorLibHandle = NULL;
48b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
49b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
50b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
51b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addVendorPlugin() {
52b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
53b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
54b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (mVendorLibHandle == NULL) {
55b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return;
56b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
57b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
58b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    typedef OMXPluginBase *(*CreateOMXPluginFunc)();
59b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CreateOMXPluginFunc createOMXPlugin =
60b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        (CreateOMXPluginFunc)dlsym(
61b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                mVendorLibHandle, "_ZN7android15createOMXPluginEv");
62b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
63fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (createOMXPlugin) {
64fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        addPlugin((*createOMXPlugin)());
65fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
66b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
67b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
68b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addPlugin(OMXPluginBase *plugin) {
69b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
70b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
71b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPlugins.push_back(plugin);
72b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
73b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMX_U32 index = 0;
74b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
75b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    char name[128];
76b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMX_ERRORTYPE err;
77b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    while ((err = plugin->enumerateComponents(
78b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                    name, sizeof(name), index++)) == OMX_ErrorNone) {
79b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        String8 name8(name);
80b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
81b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        if (mPluginByComponentName.indexOfKey(name8) >= 0) {
82b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber            LOGE("A component of name '%s' already exists, ignoring this one.",
83b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                 name8.string());
84b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
85b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber            continue;
86b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        }
87b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
88b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        mPluginByComponentName.add(name8, plugin);
89b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
90b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CHECK_EQ(err, OMX_ErrorNoMore);
91b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
92b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
93b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::clearPlugins() {
94b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
95b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
96b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPluginByComponentName.clear();
97b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
98b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    for (List<OMXPluginBase *>::iterator it = mPlugins.begin();
99b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber         it != mPlugins.end(); ++it) {
100b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        delete *it;
101b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        *it = NULL;
102b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
103b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
104b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPlugins.clear();
105b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
106b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
107b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::makeComponentInstance(
108b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        const char *name,
109b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        const OMX_CALLBACKTYPE *callbacks,
110b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_PTR appData,
111b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_COMPONENTTYPE **component) {
112b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
113b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
114b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    *component = NULL;
115b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
116b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    ssize_t index = mPluginByComponentName.indexOfKey(String8(name));
117b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
118b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (index < 0) {
119b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return OMX_ErrorInvalidComponentName;
120b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
121b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
122b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
123fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMX_ERRORTYPE err =
124fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        plugin->makeComponentInstance(name, callbacks, appData, component);
125fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
126fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (err != OMX_ErrorNone) {
127fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        return err;
128fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
129fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
130fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    mPluginByInstance.add(*component, plugin);
131fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
132fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    return err;
133fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber}
134fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
135fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas HuberOMX_ERRORTYPE OMXMaster::destroyComponentInstance(
136fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        OMX_COMPONENTTYPE *component) {
137fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    Mutex::Autolock autoLock(mLock);
138fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
139fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    ssize_t index = mPluginByInstance.indexOfKey(component);
140fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
141fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (index < 0) {
142fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        return OMX_ErrorBadParameter;
143fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
144fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
145fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMXPluginBase *plugin = mPluginByInstance.valueAt(index);
146fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    mPluginByInstance.removeItemsAt(index);
147fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
148fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    return plugin->destroyComponentInstance(component);
149b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
150b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
151b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::enumerateComponents(
152b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_STRING name,
153b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        size_t size,
154b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_U32 index) {
155b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
156b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
157b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    size_t numComponents = mPluginByComponentName.size();
158b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
159b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (index >= numComponents) {
160b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return OMX_ErrorNoMore;
161b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
162b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
163b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    const String8 &name8 = mPluginByComponentName.keyAt(index);
164b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
165b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CHECK(size >= 1 + name8.size());
166b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    strcpy(name, name8.string());
167b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
168b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    return OMX_ErrorNone;
169b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
170b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
171c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas HuberOMX_ERRORTYPE OMXMaster::getRolesOfComponent(
172c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        const char *name,
173c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        Vector<String8> *roles) {
174c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    Mutex::Autolock autoLock(mLock);
175c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
176c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    roles->clear();
177c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
178c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    ssize_t index = mPluginByComponentName.indexOfKey(String8(name));
179c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
180c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    if (index < 0) {
181c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        return OMX_ErrorInvalidComponentName;
182c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    }
183c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
184c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
185c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    return plugin->getRolesOfComponent(name, roles);
186c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber}
187c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
188b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}  // namespace android
189