15d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber/*
25d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Copyright (C) 2009 The Android Open Source Project
3f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan * Copyright (c) 2014, The Linux Foundation. All rights reserved.
45d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber *
55d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
65d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * you may not use this file except in compliance with the License.
75d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * You may obtain a copy of the License at
85d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber *
95d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
105d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber *
115d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * Unless required by applicable law or agreed to in writing, software
125d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
135d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * See the License for the specific language governing permissions and
155d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber * limitations under the License.
165d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber */
175d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
185d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber#include "QComOMXPlugin.h"
195d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
205d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber#include <dlfcn.h>
215d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
22826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev#include <media/hardware/HardwareAPI.h>
235d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
245d9d41d3f964e47886a87435b841def04418f5a8Andreas Hubernamespace android {
255d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
265d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMXPluginBase *createOMXPlugin() {
275d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    return new QComOMXPlugin;
285d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
295d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
305d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberQComOMXPlugin::QComOMXPlugin()
315d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)),
325d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mInit(NULL),
335d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mDeinit(NULL),
345d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mComponentNameEnum(NULL),
355d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mGetHandle(NULL),
365d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mFreeHandle(NULL),
375d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber      mGetRolesOfComponentHandle(NULL) {
385d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle != NULL) {
395d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init");
4057d7e714e312fb07af793075526ba2ed83db0d9bHaynes Mathew George        mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit");
415d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
425d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mComponentNameEnum =
435d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum");
445d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
455d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle");
465d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle");
475d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
485d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mGetRolesOfComponentHandle =
495d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            (GetRolesOfComponentFunc)dlsym(
505d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber                    mLibHandle, "OMX_GetRolesOfComponent");
515d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
52f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle ||
53f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            !mFreeHandle || !mGetRolesOfComponentHandle) {
54f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            dlclose(mLibHandle);
55f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan            mLibHandle = NULL;
56f3ca23b5bd0c3d78d321ccf5c5af5eb0d461ff1aPraveen Chavan        } else
575d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        (*mInit)();
585d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
595d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
605d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
615d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberQComOMXPlugin::~QComOMXPlugin() {
625d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle != NULL) {
635d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        (*mDeinit)();
645d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
655d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        dlclose(mLibHandle);
665d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        mLibHandle = NULL;
675d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
685d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
695d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
705d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::makeComponentInstance(
715d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        const char *name,
725d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        const OMX_CALLBACKTYPE *callbacks,
735d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_PTR appData,
745d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_COMPONENTTYPE **component) {
755d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle == NULL) {
765d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        return OMX_ErrorUndefined;
775d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
785d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
795d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    return (*mGetHandle)(
805d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            reinterpret_cast<OMX_HANDLETYPE *>(component),
815d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            const_cast<char *>(name),
825d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
835d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
845d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
855d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::destroyComponentInstance(
865d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_COMPONENTTYPE *component) {
875d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle == NULL) {
885d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        return OMX_ErrorUndefined;
895d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
905d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
915d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
925d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
935d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
945d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::enumerateComponents(
955d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_STRING name,
965d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        size_t size,
975d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_U32 index) {
985d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle == NULL) {
995d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        return OMX_ErrorUndefined;
1005d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
1015d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
102826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return (*mComponentNameEnum)(name, size, index);
1035d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
1045d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1055d9d41d3f964e47886a87435b841def04418f5a8Andreas HuberOMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
1065d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        const char *name,
1075d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        Vector<String8> *roles) {
1085d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    roles->clear();
1095d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1105d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (mLibHandle == NULL) {
1115d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        return OMX_ErrorUndefined;
1125d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
1135d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1145d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    OMX_U32 numRoles;
1155d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
1165d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            const_cast<OMX_STRING>(name), &numRoles, NULL);
1175d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1185d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (err != OMX_ErrorNone) {
1195d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        return err;
1205d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
1215d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1225d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    if (numRoles > 0) {
1235d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_U8 **array = new OMX_U8 *[numRoles];
1245d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        for (OMX_U32 i = 0; i < numRoles; ++i) {
1255d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
1265d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        }
1275d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1285d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        OMX_U32 numRoles2;
1295d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        err = (*mGetRolesOfComponentHandle)(
1305d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber                const_cast<OMX_STRING>(name), &numRoles2, array);
1315d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
132826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (err != OMX_ErrorNone) {
133826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  return err;
134826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
135826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev
136826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	if (numRoles2 != numRoles) {
137826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	  return err;
138826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev	}
1395d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1405d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        for (OMX_U32 i = 0; i < numRoles; ++i) {
141826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            String8 s((const char *)array[i]);
142826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev            roles->push(s);
1435d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1445d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            delete[] array[i];
1455d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber            array[i] = NULL;
1465d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        }
1475d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1485d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        delete[] array;
1495d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber        array = NULL;
1505d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber    }
1515d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
152826ececcbea342f7a0b92ec61847f1c95d384e05Iliyan Malchev    return OMX_ErrorNone;
1535d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}
1545d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber
1555d9d41d3f964e47886a87435b841def04418f5a8Andreas Huber}  // namespace android
156