OMXMaster.cpp revision c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8
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
17b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXMaster.h"
18b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
19b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <dlfcn.h>
20b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
21b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include <media/stagefright/MediaDebug.h>
22b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
23b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE
24b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#include "OMXPVCodecsPlugin.h"
25b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif
26b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
27b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubernamespace android {
28b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
29b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::OMXMaster()
30b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    : mVendorLibHandle(NULL) {
31b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    addVendorPlugin();
32b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
33b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#ifndef NO_OPENCORE
34b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    addPlugin(new OMXPVCodecsPlugin);
35b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber#endif
36b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
37b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
38b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMXMaster::~OMXMaster() {
39b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    clearPlugins();
40b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
41b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (mVendorLibHandle != NULL) {
42b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        dlclose(mVendorLibHandle);
43b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        mVendorLibHandle = NULL;
44b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
45b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
46b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
47b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addVendorPlugin() {
48b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mVendorLibHandle = dlopen("libstagefrighthw.so", RTLD_NOW);
49b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
50b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (mVendorLibHandle == NULL) {
51b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return;
52b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
53b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
54b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    typedef OMXPluginBase *(*CreateOMXPluginFunc)();
55b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CreateOMXPluginFunc createOMXPlugin =
56b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        (CreateOMXPluginFunc)dlsym(
57b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                mVendorLibHandle, "_ZN7android15createOMXPluginEv");
58b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
59fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (createOMXPlugin) {
60fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        addPlugin((*createOMXPlugin)());
61fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
62b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
63b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
64b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::addPlugin(OMXPluginBase *plugin) {
65b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
66b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
67b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPlugins.push_back(plugin);
68b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
69b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMX_U32 index = 0;
70b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
71b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    char name[128];
72b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMX_ERRORTYPE err;
73b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    while ((err = plugin->enumerateComponents(
74b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                    name, sizeof(name), index++)) == OMX_ErrorNone) {
75b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        String8 name8(name);
76b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
77b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        if (mPluginByComponentName.indexOfKey(name8) >= 0) {
78b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber            LOGE("A component of name '%s' already exists, ignoring this one.",
79b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber                 name8.string());
80b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
81b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber            continue;
82b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        }
83b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
84b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        mPluginByComponentName.add(name8, plugin);
85b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
86b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CHECK_EQ(err, OMX_ErrorNoMore);
87b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
88b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
89b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Hubervoid OMXMaster::clearPlugins() {
90b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
91b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
92b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPluginByComponentName.clear();
93b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
94b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    for (List<OMXPluginBase *>::iterator it = mPlugins.begin();
95b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber         it != mPlugins.end(); ++it) {
96b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        delete *it;
97b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        *it = NULL;
98b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
99b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
100b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    mPlugins.clear();
101b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
102b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
103b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::makeComponentInstance(
104b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        const char *name,
105b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        const OMX_CALLBACKTYPE *callbacks,
106b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_PTR appData,
107b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_COMPONENTTYPE **component) {
108b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
109b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
110b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    *component = NULL;
111b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
112b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    ssize_t index = mPluginByComponentName.indexOfKey(String8(name));
113b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
114b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (index < 0) {
115b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return OMX_ErrorInvalidComponentName;
116b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
117b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
118b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
119fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMX_ERRORTYPE err =
120fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        plugin->makeComponentInstance(name, callbacks, appData, component);
121fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
122fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (err != OMX_ErrorNone) {
123fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        return err;
124fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
125fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
126fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    mPluginByInstance.add(*component, plugin);
127fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
128fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    return err;
129fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber}
130fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
131fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas HuberOMX_ERRORTYPE OMXMaster::destroyComponentInstance(
132fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        OMX_COMPONENTTYPE *component) {
133fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    Mutex::Autolock autoLock(mLock);
134fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
135fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    ssize_t index = mPluginByInstance.indexOfKey(component);
136fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
137fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    if (index < 0) {
138fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber        return OMX_ErrorBadParameter;
139fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    }
140fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
141fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    OMXPluginBase *plugin = mPluginByInstance.valueAt(index);
142fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    mPluginByInstance.removeItemsAt(index);
143fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber
144fef6435a0692f3c9b6055903dfb7699e90e19d46Andreas Huber    return plugin->destroyComponentInstance(component);
145b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
146b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
147b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas HuberOMX_ERRORTYPE OMXMaster::enumerateComponents(
148b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_STRING name,
149b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        size_t size,
150b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        OMX_U32 index) {
151b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    Mutex::Autolock autoLock(mLock);
152b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
153b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    size_t numComponents = mPluginByComponentName.size();
154b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
155b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    if (index >= numComponents) {
156b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber        return OMX_ErrorNoMore;
157b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    }
158b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
159b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    const String8 &name8 = mPluginByComponentName.keyAt(index);
160b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
161b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    CHECK(size >= 1 + name8.size());
162b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    strcpy(name, name8.string());
163b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
164b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber    return OMX_ErrorNone;
165b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}
166b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber
167c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas HuberOMX_ERRORTYPE OMXMaster::getRolesOfComponent(
168c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        const char *name,
169c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        Vector<String8> *roles) {
170c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    Mutex::Autolock autoLock(mLock);
171c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
172c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    roles->clear();
173c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
174c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    ssize_t index = mPluginByComponentName.indexOfKey(String8(name));
175c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
176c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    if (index < 0) {
177c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber        return OMX_ErrorInvalidComponentName;
178c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    }
179c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
180c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    OMXPluginBase *plugin = mPluginByComponentName.valueAt(index);
181c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber    return plugin->getRolesOfComponent(name, roles);
182c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber}
183c7e91eee2e79e3e4c8f84fd6b8a753215955d4e8Andreas Huber
184b0caf946b7ae9be519c0cede935ea2ecb44f9bd0Andreas Huber}  // namespace android
185