117e995d39771569792c528f3dea559c83f0fc238Andreas Huber/*
217e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Copyright (C) 2009 The Android Open Source Project
317e995d39771569792c528f3dea559c83f0fc238Andreas Huber *
417e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
517e995d39771569792c528f3dea559c83f0fc238Andreas Huber * you may not use this file except in compliance with the License.
617e995d39771569792c528f3dea559c83f0fc238Andreas Huber * You may obtain a copy of the License at
717e995d39771569792c528f3dea559c83f0fc238Andreas Huber *
817e995d39771569792c528f3dea559c83f0fc238Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
917e995d39771569792c528f3dea559c83f0fc238Andreas Huber *
1017e995d39771569792c528f3dea559c83f0fc238Andreas Huber * Unless required by applicable law or agreed to in writing, software
1117e995d39771569792c528f3dea559c83f0fc238Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1217e995d39771569792c528f3dea559c83f0fc238Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317e995d39771569792c528f3dea559c83f0fc238Andreas Huber * See the License for the specific language governing permissions and
1417e995d39771569792c528f3dea559c83f0fc238Andreas Huber * limitations under the License.
1517e995d39771569792c528f3dea559c83f0fc238Andreas Huber */
1617e995d39771569792c528f3dea559c83f0fc238Andreas Huber
1717e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include "TIOMXPlugin.h"
1817e995d39771569792c528f3dea559c83f0fc238Andreas Huber
1917e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include <dlfcn.h>
2017e995d39771569792c528f3dea559c83f0fc238Andreas Huber
2117e995d39771569792c528f3dea559c83f0fc238Andreas Huber#include <media/stagefright/HardwareAPI.h>
226239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber#include <media/stagefright/MediaDebug.h>
2317e995d39771569792c528f3dea559c83f0fc238Andreas Huber
2417e995d39771569792c528f3dea559c83f0fc238Andreas Hubernamespace android {
2517e995d39771569792c528f3dea559c83f0fc238Andreas Huber
2617e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMXPluginBase *createOMXPlugin() {
2717e995d39771569792c528f3dea559c83f0fc238Andreas Huber    return new TIOMXPlugin;
2817e995d39771569792c528f3dea559c83f0fc238Andreas Huber}
2917e995d39771569792c528f3dea559c83f0fc238Andreas Huber
3017e995d39771569792c528f3dea559c83f0fc238Andreas HuberTIOMXPlugin::TIOMXPlugin()
3117e995d39771569792c528f3dea559c83f0fc238Andreas Huber    : mLibHandle(dlopen("libOMX_Core.so", RTLD_NOW)),
3217e995d39771569792c528f3dea559c83f0fc238Andreas Huber      mInit(NULL),
3317e995d39771569792c528f3dea559c83f0fc238Andreas Huber      mDeinit(NULL),
3417e995d39771569792c528f3dea559c83f0fc238Andreas Huber      mComponentNameEnum(NULL),
35f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber      mGetHandle(NULL),
366239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber      mFreeHandle(NULL),
376239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber      mGetRolesOfComponentHandle(NULL) {
3817e995d39771569792c528f3dea559c83f0fc238Andreas Huber    if (mLibHandle != NULL) {
3917e995d39771569792c528f3dea559c83f0fc238Andreas Huber        mInit = (InitFunc)dlsym(mLibHandle, "TIOMX_Init");
4017e995d39771569792c528f3dea559c83f0fc238Andreas Huber        mDeinit = (DeinitFunc)dlsym(mLibHandle, "TIOMX_DeInit");
4117e995d39771569792c528f3dea559c83f0fc238Andreas Huber
4217e995d39771569792c528f3dea559c83f0fc238Andreas Huber        mComponentNameEnum =
4317e995d39771569792c528f3dea559c83f0fc238Andreas Huber            (ComponentNameEnumFunc)dlsym(mLibHandle, "TIOMX_ComponentNameEnum");
4417e995d39771569792c528f3dea559c83f0fc238Andreas Huber
4517e995d39771569792c528f3dea559c83f0fc238Andreas Huber        mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "TIOMX_GetHandle");
46f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber        mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "TIOMX_FreeHandle");
4717e995d39771569792c528f3dea559c83f0fc238Andreas Huber
486239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        mGetRolesOfComponentHandle =
496239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            (GetRolesOfComponentFunc)dlsym(
506239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber                    mLibHandle, "TIOMX_GetRolesOfComponent");
516239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
5217e995d39771569792c528f3dea559c83f0fc238Andreas Huber        (*mInit)();
5317e995d39771569792c528f3dea559c83f0fc238Andreas Huber    }
5417e995d39771569792c528f3dea559c83f0fc238Andreas Huber}
5517e995d39771569792c528f3dea559c83f0fc238Andreas Huber
5617e995d39771569792c528f3dea559c83f0fc238Andreas HuberTIOMXPlugin::~TIOMXPlugin() {
5717e995d39771569792c528f3dea559c83f0fc238Andreas Huber    if (mLibHandle != NULL) {
5817e995d39771569792c528f3dea559c83f0fc238Andreas Huber        (*mDeinit)();
5917e995d39771569792c528f3dea559c83f0fc238Andreas Huber
6017e995d39771569792c528f3dea559c83f0fc238Andreas Huber        dlclose(mLibHandle);
6117e995d39771569792c528f3dea559c83f0fc238Andreas Huber        mLibHandle = NULL;
6217e995d39771569792c528f3dea559c83f0fc238Andreas Huber    }
6317e995d39771569792c528f3dea559c83f0fc238Andreas Huber}
6417e995d39771569792c528f3dea559c83f0fc238Andreas Huber
6517e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMX_ERRORTYPE TIOMXPlugin::makeComponentInstance(
6617e995d39771569792c528f3dea559c83f0fc238Andreas Huber        const char *name,
6717e995d39771569792c528f3dea559c83f0fc238Andreas Huber        const OMX_CALLBACKTYPE *callbacks,
6817e995d39771569792c528f3dea559c83f0fc238Andreas Huber        OMX_PTR appData,
6917e995d39771569792c528f3dea559c83f0fc238Andreas Huber        OMX_COMPONENTTYPE **component) {
7017e995d39771569792c528f3dea559c83f0fc238Andreas Huber    if (mLibHandle == NULL) {
7117e995d39771569792c528f3dea559c83f0fc238Andreas Huber        return OMX_ErrorUndefined;
7217e995d39771569792c528f3dea559c83f0fc238Andreas Huber    }
7317e995d39771569792c528f3dea559c83f0fc238Andreas Huber
7417e995d39771569792c528f3dea559c83f0fc238Andreas Huber    return (*mGetHandle)(
7517e995d39771569792c528f3dea559c83f0fc238Andreas Huber            reinterpret_cast<OMX_HANDLETYPE *>(component),
7617e995d39771569792c528f3dea559c83f0fc238Andreas Huber            const_cast<char *>(name),
7717e995d39771569792c528f3dea559c83f0fc238Andreas Huber            appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
7817e995d39771569792c528f3dea559c83f0fc238Andreas Huber}
7917e995d39771569792c528f3dea559c83f0fc238Andreas Huber
80f40810585b61295f84d7d6b4e63ef935222bf18eAndreas HuberOMX_ERRORTYPE TIOMXPlugin::destroyComponentInstance(
81f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber        OMX_COMPONENTTYPE *component) {
82f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber    if (mLibHandle == NULL) {
83f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber        return OMX_ErrorUndefined;
84f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber    }
85f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber
86f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber    return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
87f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber}
88f40810585b61295f84d7d6b4e63ef935222bf18eAndreas Huber
8917e995d39771569792c528f3dea559c83f0fc238Andreas HuberOMX_ERRORTYPE TIOMXPlugin::enumerateComponents(
9017e995d39771569792c528f3dea559c83f0fc238Andreas Huber        OMX_STRING name,
9117e995d39771569792c528f3dea559c83f0fc238Andreas Huber        size_t size,
9217e995d39771569792c528f3dea559c83f0fc238Andreas Huber        OMX_U32 index) {
9317e995d39771569792c528f3dea559c83f0fc238Andreas Huber    if (mLibHandle == NULL) {
9417e995d39771569792c528f3dea559c83f0fc238Andreas Huber        return OMX_ErrorUndefined;
9517e995d39771569792c528f3dea559c83f0fc238Andreas Huber    }
9617e995d39771569792c528f3dea559c83f0fc238Andreas Huber
9717e995d39771569792c528f3dea559c83f0fc238Andreas Huber    return (*mComponentNameEnum)(name, size, index);
9817e995d39771569792c528f3dea559c83f0fc238Andreas Huber}
9917e995d39771569792c528f3dea559c83f0fc238Andreas Huber
1006239f8a9287b511c2a7e417979ca5299a15436bcAndreas HuberOMX_ERRORTYPE TIOMXPlugin::getRolesOfComponent(
1016239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        const char *name,
1026239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        Vector<String8> *roles) {
1036239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    roles->clear();
1046239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1056239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    if (mLibHandle == NULL) {
1066239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        return OMX_ErrorUndefined;
1076239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    }
1086239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1096239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    OMX_U32 numRoles;
1106239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
1116239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            const_cast<OMX_STRING>(name), &numRoles, NULL);
1126239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1136239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    if (err != OMX_ErrorNone) {
1146239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        return err;
1156239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    }
1166239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1176239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    if (numRoles > 0) {
1186239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        OMX_U8 **array = new OMX_U8 *[numRoles];
1196239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        for (OMX_U32 i = 0; i < numRoles; ++i) {
1206239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
1216239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        }
1226239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1236239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        OMX_U32 numRoles2;
1246239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        err = (*mGetRolesOfComponentHandle)(
1256239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber                const_cast<OMX_STRING>(name), &numRoles2, array);
1266239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1276239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        CHECK_EQ(err, OMX_ErrorNone);
1286239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        CHECK_EQ(numRoles, numRoles2);
1296239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1306239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        for (OMX_U32 i = 0; i < numRoles; ++i) {
1316239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            String8 s((const char *)array[i]);
1326239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            roles->push(s);
1336239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1346239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            delete[] array[i];
1356239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber            array[i] = NULL;
1366239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        }
1376239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1386239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        delete[] array;
1396239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber        array = NULL;
1406239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    }
1416239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
1426239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber    return OMX_ErrorNone;
1436239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber}
1446239f8a9287b511c2a7e417979ca5299a15436bcAndreas Huber
14517e995d39771569792c528f3dea559c83f0fc238Andreas Huber}  // namespace android
146