1419d34016dceec65ea137490668984eb80119df4Byron Gardner/*
2419d34016dceec65ea137490668984eb80119df4Byron Gardner* Copyright (c) 2009-2011 Intel Corporation.  All rights reserved.
3419d34016dceec65ea137490668984eb80119df4Byron Gardner*
4419d34016dceec65ea137490668984eb80119df4Byron Gardner* Licensed under the Apache License, Version 2.0 (the "License");
5419d34016dceec65ea137490668984eb80119df4Byron Gardner* you may not use this file except in compliance with the License.
6419d34016dceec65ea137490668984eb80119df4Byron Gardner* You may obtain a copy of the License at
7419d34016dceec65ea137490668984eb80119df4Byron Gardner*
8419d34016dceec65ea137490668984eb80119df4Byron Gardner* http://www.apache.org/licenses/LICENSE-2.0
9419d34016dceec65ea137490668984eb80119df4Byron Gardner*
10419d34016dceec65ea137490668984eb80119df4Byron Gardner* Unless required by applicable law or agreed to in writing, software
11419d34016dceec65ea137490668984eb80119df4Byron Gardner* distributed under the License is distributed on an "AS IS" BASIS,
12419d34016dceec65ea137490668984eb80119df4Byron Gardner* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13419d34016dceec65ea137490668984eb80119df4Byron Gardner* See the License for the specific language governing permissions and
14419d34016dceec65ea137490668984eb80119df4Byron Gardner* limitations under the License.
15419d34016dceec65ea137490668984eb80119df4Byron Gardner*/
16419d34016dceec65ea137490668984eb80119df4Byron Gardner
17419d34016dceec65ea137490668984eb80119df4Byron Gardner/*
18419d34016dceec65ea137490668984eb80119df4Byron Gardner * Copyright (C) 2009 The Android Open Source Project
19419d34016dceec65ea137490668984eb80119df4Byron Gardner *
20419d34016dceec65ea137490668984eb80119df4Byron Gardner * Licensed under the Apache License, Version 2.0 (the "License");
21419d34016dceec65ea137490668984eb80119df4Byron Gardner * you may not use this file except in compliance with the License.
22419d34016dceec65ea137490668984eb80119df4Byron Gardner * You may obtain a copy of the License at
23419d34016dceec65ea137490668984eb80119df4Byron Gardner *
24419d34016dceec65ea137490668984eb80119df4Byron Gardner *      http://www.apache.org/licenses/LICENSE-2.0
25419d34016dceec65ea137490668984eb80119df4Byron Gardner *
26419d34016dceec65ea137490668984eb80119df4Byron Gardner * Unless required by applicable law or agreed to in writing, software
27419d34016dceec65ea137490668984eb80119df4Byron Gardner * distributed under the License is distributed on an "AS IS" BASIS,
28419d34016dceec65ea137490668984eb80119df4Byron Gardner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
29419d34016dceec65ea137490668984eb80119df4Byron Gardner * See the License for the specific language governing permissions and
30419d34016dceec65ea137490668984eb80119df4Byron Gardner * limitations under the License.
31419d34016dceec65ea137490668984eb80119df4Byron Gardner */
32419d34016dceec65ea137490668984eb80119df4Byron Gardner
33419d34016dceec65ea137490668984eb80119df4Byron Gardner#include "WrsOMXPlugin.h"
34419d34016dceec65ea137490668984eb80119df4Byron Gardner
35419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <dlfcn.h>
36419d34016dceec65ea137490668984eb80119df4Byron Gardner
37419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <HardwareAPI.h>
38419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <media/stagefright/foundation/ADebug.h>
39419d34016dceec65ea137490668984eb80119df4Byron Gardner
40419d34016dceec65ea137490668984eb80119df4Byron Gardnernamespace android {
41419d34016dceec65ea137490668984eb80119df4Byron Gardner
42419d34016dceec65ea137490668984eb80119df4Byron GardnerOMXPluginBase *createOMXPlugin() {
43419d34016dceec65ea137490668984eb80119df4Byron Gardner    return new WrsOMXPlugin;
44419d34016dceec65ea137490668984eb80119df4Byron Gardner}
45419d34016dceec65ea137490668984eb80119df4Byron Gardner
46419d34016dceec65ea137490668984eb80119df4Byron GardnerWrsOMXPlugin::WrsOMXPlugin()
47419d34016dceec65ea137490668984eb80119df4Byron Gardner{
48419d34016dceec65ea137490668984eb80119df4Byron Gardner   AddCore("libwrs_omxil_core_pvwrapped.so");
49419d34016dceec65ea137490668984eb80119df4Byron Gardner#if defined(USE_MEDIASDK)
50419d34016dceec65ea137490668984eb80119df4Byron Gardner   AddCore("libmfx_omx_core.so");
51419d34016dceec65ea137490668984eb80119df4Byron Gardner#endif
52419d34016dceec65ea137490668984eb80119df4Byron Gardner}
53419d34016dceec65ea137490668984eb80119df4Byron Gardner
54419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::AddCore(const char* coreName)
55419d34016dceec65ea137490668984eb80119df4Byron Gardner{
56419d34016dceec65ea137490668984eb80119df4Byron Gardner   void* libHandle = dlopen(coreName, RTLD_NOW);
57419d34016dceec65ea137490668984eb80119df4Byron Gardner
58419d34016dceec65ea137490668984eb80119df4Byron Gardner   if (libHandle != NULL) {
59419d34016dceec65ea137490668984eb80119df4Byron Gardner        WrsOMXCore* core = (WrsOMXCore*)calloc(1,sizeof(WrsOMXCore));
60419d34016dceec65ea137490668984eb80119df4Byron Gardner
61419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (!core) {
62419d34016dceec65ea137490668984eb80119df4Byron Gardner            dlclose(libHandle);
63419d34016dceec65ea137490668984eb80119df4Byron Gardner            return OMX_ErrorUndefined;
64419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
65419d34016dceec65ea137490668984eb80119df4Byron Gardner        // set plugin lib handle and methods
66419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mLibHandle = libHandle;
67419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mInit = (WrsOMXCore::InitFunc)dlsym(libHandle, "OMX_Init");
68419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mDeinit = (WrsOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit");
69419d34016dceec65ea137490668984eb80119df4Byron Gardner
70419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mComponentNameEnum =
71419d34016dceec65ea137490668984eb80119df4Byron Gardner            (WrsOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum");
72419d34016dceec65ea137490668984eb80119df4Byron Gardner
73419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mGetHandle = (WrsOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle");
74419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mFreeHandle = (WrsOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle");
75419d34016dceec65ea137490668984eb80119df4Byron Gardner
76419d34016dceec65ea137490668984eb80119df4Byron Gardner        core->mGetRolesOfComponentHandle =
77419d34016dceec65ea137490668984eb80119df4Byron Gardner            (WrsOMXCore::GetRolesOfComponentFunc)dlsym(
78419d34016dceec65ea137490668984eb80119df4Byron Gardner                    libHandle, "OMX_GetRolesOfComponent");
79419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (core->mInit != NULL) {
80419d34016dceec65ea137490668984eb80119df4Byron Gardner            (*(core->mInit))();
81419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
82419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (core->mComponentNameEnum != NULL) {
83419d34016dceec65ea137490668984eb80119df4Byron Gardner            // calculating number of components registered inside given OMX core
84419d34016dceec65ea137490668984eb80119df4Byron Gardner            char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 };
85419d34016dceec65ea137490668984eb80119df4Byron Gardner            OMX_U32 tmpIndex = 0;
86419d34016dceec65ea137490668984eb80119df4Byron Gardner            while (OMX_ErrorNone == ((*(core->mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) {
87419d34016dceec65ea137490668984eb80119df4Byron Gardner                tmpIndex++;
88419d34016dceec65ea137490668984eb80119df4Byron Gardner            ALOGI("OMX IL core %s: declares component %s", coreName, tmpComponentName);
89419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
90419d34016dceec65ea137490668984eb80119df4Byron Gardner            core->mNumComponents = tmpIndex;
91419d34016dceec65ea137490668984eb80119df4Byron Gardner            ALOGI("OMX IL core %s: contains %ld components", coreName, core->mNumComponents);
92419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
93419d34016dceec65ea137490668984eb80119df4Byron Gardner        // add plugin to the vector
94419d34016dceec65ea137490668984eb80119df4Byron Gardner        mCores.push_back(core);
95419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
96419d34016dceec65ea137490668984eb80119df4Byron Gardner    else {
97419d34016dceec65ea137490668984eb80119df4Byron Gardner        ALOGW("OMX IL core %s not found", coreName);
98419d34016dceec65ea137490668984eb80119df4Byron Gardner        return OMX_ErrorUndefined; // Do we need to return error message
99419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
100419d34016dceec65ea137490668984eb80119df4Byron Gardner    return OMX_ErrorNone;
101419d34016dceec65ea137490668984eb80119df4Byron Gardner}
102419d34016dceec65ea137490668984eb80119df4Byron Gardner
103419d34016dceec65ea137490668984eb80119df4Byron GardnerWrsOMXPlugin::~WrsOMXPlugin() {
104419d34016dceec65ea137490668984eb80119df4Byron Gardner    for (OMX_U32 i = 0; i < mCores.size(); i++) {
105419d34016dceec65ea137490668984eb80119df4Byron Gardner       if (mCores[i] != NULL && mCores[i]->mLibHandle != NULL) {
106419d34016dceec65ea137490668984eb80119df4Byron Gardner          (*(mCores[i]->mDeinit))();
107419d34016dceec65ea137490668984eb80119df4Byron Gardner
108419d34016dceec65ea137490668984eb80119df4Byron Gardner          dlclose(mCores[i]->mLibHandle);
109419d34016dceec65ea137490668984eb80119df4Byron Gardner          free(mCores[i]);
110419d34016dceec65ea137490668984eb80119df4Byron Gardner       }
111419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
112419d34016dceec65ea137490668984eb80119df4Byron Gardner}
113419d34016dceec65ea137490668984eb80119df4Byron Gardner
114419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::makeComponentInstance(
115419d34016dceec65ea137490668984eb80119df4Byron Gardner        const char *name,
116419d34016dceec65ea137490668984eb80119df4Byron Gardner        const OMX_CALLBACKTYPE *callbacks,
117419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_PTR appData,
118419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_COMPONENTTYPE **component) {
119419d34016dceec65ea137490668984eb80119df4Byron Gardner    for (OMX_U32 i = 0; i < mCores.size(); i++) {
120419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (mCores[i] != NULL) {
121419d34016dceec65ea137490668984eb80119df4Byron Gardner            if (mCores[i]->mLibHandle == NULL) {
122419d34016dceec65ea137490668984eb80119df4Byron Gardner                continue;
123419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
124419d34016dceec65ea137490668984eb80119df4Byron Gardner
125419d34016dceec65ea137490668984eb80119df4Byron Gardner            OMX_ERRORTYPE omx_res = (*(mCores[i]->mGetHandle))(
126419d34016dceec65ea137490668984eb80119df4Byron Gardner                reinterpret_cast<OMX_HANDLETYPE *>(component),
127419d34016dceec65ea137490668984eb80119df4Byron Gardner                const_cast<char *>(name),
128419d34016dceec65ea137490668984eb80119df4Byron Gardner                appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
129419d34016dceec65ea137490668984eb80119df4Byron Gardner            if(omx_res == OMX_ErrorNone) {
130419d34016dceec65ea137490668984eb80119df4Byron Gardner                Mutex::Autolock autoLock(mMutex);
131419d34016dceec65ea137490668984eb80119df4Byron Gardner                WrsOMXComponent comp;
132419d34016dceec65ea137490668984eb80119df4Byron Gardner
133419d34016dceec65ea137490668984eb80119df4Byron Gardner                comp.mComponent = *component;
134419d34016dceec65ea137490668984eb80119df4Byron Gardner                comp.mCore = mCores[i];
135419d34016dceec65ea137490668984eb80119df4Byron Gardner
136419d34016dceec65ea137490668984eb80119df4Byron Gardner                mComponents.push_back(comp);
137419d34016dceec65ea137490668984eb80119df4Byron Gardner                return OMX_ErrorNone;
138419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
139419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
140419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
141419d34016dceec65ea137490668984eb80119df4Byron Gardner    return OMX_ErrorInvalidComponentName;
142419d34016dceec65ea137490668984eb80119df4Byron Gardner}
143419d34016dceec65ea137490668984eb80119df4Byron Gardner
144419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::destroyComponentInstance(
145419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_COMPONENTTYPE *component) {
146419d34016dceec65ea137490668984eb80119df4Byron Gardner    Mutex::Autolock autoLock(mMutex);
147419d34016dceec65ea137490668984eb80119df4Byron Gardner    for (OMX_U32 i = 0; i < mComponents.size(); i++) {
148419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (mComponents[i].mComponent == component) {
149419d34016dceec65ea137490668984eb80119df4Byron Gardner            if (mComponents[i].mCore == NULL || mComponents[i].mCore->mLibHandle == NULL) {
150419d34016dceec65ea137490668984eb80119df4Byron Gardner                return OMX_ErrorUndefined;
151419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
152419d34016dceec65ea137490668984eb80119df4Byron Gardner            OMX_ERRORTYPE omx_res = (*(mComponents[i].mCore->mFreeHandle))(reinterpret_cast<OMX_HANDLETYPE *>(component));
153419d34016dceec65ea137490668984eb80119df4Byron Gardner            mComponents.erase(mComponents.begin() + i);
154419d34016dceec65ea137490668984eb80119df4Byron Gardner            return omx_res;
155419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
156419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
157419d34016dceec65ea137490668984eb80119df4Byron Gardner    return OMX_ErrorInvalidComponent;
158419d34016dceec65ea137490668984eb80119df4Byron Gardner}
159419d34016dceec65ea137490668984eb80119df4Byron Gardner
160419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::enumerateComponents(
161419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_STRING name,
162419d34016dceec65ea137490668984eb80119df4Byron Gardner        size_t size,
163419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_U32 index) {
164419d34016dceec65ea137490668984eb80119df4Byron Gardner    // returning components
165419d34016dceec65ea137490668984eb80119df4Byron Gardner    OMX_U32 relativeIndex = index;
166419d34016dceec65ea137490668984eb80119df4Byron Gardner    for (OMX_U32 i = 0; i < mCores.size(); i++) {
167419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (mCores[i]->mLibHandle == NULL) {
168419d34016dceec65ea137490668984eb80119df4Byron Gardner           continue;
169419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
170419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (relativeIndex < mCores[i]->mNumComponents) return ((*(mCores[i]->mComponentNameEnum))(name, size, relativeIndex));
171419d34016dceec65ea137490668984eb80119df4Byron Gardner        else relativeIndex -= mCores[i]->mNumComponents;
172419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
173419d34016dceec65ea137490668984eb80119df4Byron Gardner    return OMX_ErrorNoMore;
174419d34016dceec65ea137490668984eb80119df4Byron Gardner}
175419d34016dceec65ea137490668984eb80119df4Byron Gardner
176419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::getRolesOfComponent(
177419d34016dceec65ea137490668984eb80119df4Byron Gardner        const char *name,
178419d34016dceec65ea137490668984eb80119df4Byron Gardner        Vector<String8> *roles) {
179419d34016dceec65ea137490668984eb80119df4Byron Gardner    roles->clear();
180419d34016dceec65ea137490668984eb80119df4Byron Gardner    for (OMX_U32 j = 0; j < mCores.size(); j++) {
181419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (mCores[j]->mLibHandle == NULL) {
182419d34016dceec65ea137490668984eb80119df4Byron Gardner           continue;
183419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
184419d34016dceec65ea137490668984eb80119df4Byron Gardner
185419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_U32 numRoles;
186419d34016dceec65ea137490668984eb80119df4Byron Gardner        OMX_ERRORTYPE err = (*(mCores[j]->mGetRolesOfComponentHandle))(
187419d34016dceec65ea137490668984eb80119df4Byron Gardner                const_cast<OMX_STRING>(name), &numRoles, NULL);
188419d34016dceec65ea137490668984eb80119df4Byron Gardner
189419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (err != OMX_ErrorNone) {
190419d34016dceec65ea137490668984eb80119df4Byron Gardner            continue;
191419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
192419d34016dceec65ea137490668984eb80119df4Byron Gardner
193419d34016dceec65ea137490668984eb80119df4Byron Gardner        if (numRoles > 0) {
194419d34016dceec65ea137490668984eb80119df4Byron Gardner            OMX_U8 **array = new OMX_U8 *[numRoles];
195419d34016dceec65ea137490668984eb80119df4Byron Gardner            for (OMX_U32 i = 0; i < numRoles; ++i) {
196419d34016dceec65ea137490668984eb80119df4Byron Gardner                array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
197419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
198419d34016dceec65ea137490668984eb80119df4Byron Gardner
199419d34016dceec65ea137490668984eb80119df4Byron Gardner            OMX_U32 numRoles2 = numRoles;
200419d34016dceec65ea137490668984eb80119df4Byron Gardner            err = (*(mCores[j]->mGetRolesOfComponentHandle))(
201419d34016dceec65ea137490668984eb80119df4Byron Gardner                    const_cast<OMX_STRING>(name), &numRoles2, array);
202419d34016dceec65ea137490668984eb80119df4Byron Gardner
203419d34016dceec65ea137490668984eb80119df4Byron Gardner            CHECK_EQ(err, OMX_ErrorNone);
204419d34016dceec65ea137490668984eb80119df4Byron Gardner            CHECK_EQ(numRoles, numRoles2);
205419d34016dceec65ea137490668984eb80119df4Byron Gardner
206419d34016dceec65ea137490668984eb80119df4Byron Gardner            for (OMX_U32 i = 0; i < numRoles; ++i) {
207419d34016dceec65ea137490668984eb80119df4Byron Gardner                String8 s((const char *)array[i]);
208419d34016dceec65ea137490668984eb80119df4Byron Gardner                roles->push(s);
209419d34016dceec65ea137490668984eb80119df4Byron Gardner
210419d34016dceec65ea137490668984eb80119df4Byron Gardner                delete[] array[i];
211419d34016dceec65ea137490668984eb80119df4Byron Gardner                array[i] = NULL;
212419d34016dceec65ea137490668984eb80119df4Byron Gardner            }
213419d34016dceec65ea137490668984eb80119df4Byron Gardner
214419d34016dceec65ea137490668984eb80119df4Byron Gardner            delete[] array;
215419d34016dceec65ea137490668984eb80119df4Byron Gardner            array = NULL;
216419d34016dceec65ea137490668984eb80119df4Byron Gardner        }
217419d34016dceec65ea137490668984eb80119df4Byron Gardner        return OMX_ErrorNone;
218419d34016dceec65ea137490668984eb80119df4Byron Gardner    }
219419d34016dceec65ea137490668984eb80119df4Byron Gardner    return OMX_ErrorInvalidComponent;
220419d34016dceec65ea137490668984eb80119df4Byron Gardner}
221419d34016dceec65ea137490668984eb80119df4Byron Gardner
222419d34016dceec65ea137490668984eb80119df4Byron Gardner}  // namespace android
223