111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel/*
211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Copyright (C) 2009 The Android Open Source Project
311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Copyright (c) 2014, The Linux Foundation. All rights reserved.
411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *
511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Licensed under the Apache License, Version 2.0 (the "License");
611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * you may not use this file except in compliance with the License.
711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * You may obtain a copy of the License at
811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *
911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *      http://www.apache.org/licenses/LICENSE-2.0
1011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel *
1111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * Unless required by applicable law or agreed to in writing, software
1211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * distributed under the License is distributed on an "AS IS" BASIS,
1311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * See the License for the specific language governing permissions and
1511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel * limitations under the License.
1611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel */
1711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
1811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include "QComOMXPlugin.h"
1911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <dlfcn.h>
2111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel#include <media/hardware/HardwareAPI.h>
2311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudelnamespace android {
2511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
2611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMXPluginBase *createOMXPlugin() {
2711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return new QComOMXPlugin;
2811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
2911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
3011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelQComOMXPlugin::QComOMXPlugin()
3111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    : mLibHandle(dlopen("libOmxCore.so", RTLD_NOW)),
3211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mInit(NULL),
3311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mDeinit(NULL),
3411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mComponentNameEnum(NULL),
3511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mGetHandle(NULL),
3611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mFreeHandle(NULL),
3711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel      mGetRolesOfComponentHandle(NULL) {
3811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle != NULL) {
3911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init");
4011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit");
4111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mComponentNameEnum =
4311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum");
4411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle");
4611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle");
4711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
4811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mGetRolesOfComponentHandle =
4911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (GetRolesOfComponentFunc)dlsym(
5011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                    mLibHandle, "OMX_GetRolesOfComponent");
5111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
5211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle ||
5311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            !mFreeHandle || !mGetRolesOfComponentHandle) {
5411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            dlclose(mLibHandle);
5511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            mLibHandle = NULL;
5611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        } else
5711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            (*mInit)();
5811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
5911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
6011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelQComOMXPlugin::~QComOMXPlugin() {
6211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle != NULL) {
6311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        (*mDeinit)();
6411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
6511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        dlclose(mLibHandle);
6611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        mLibHandle = NULL;
6711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
6811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
6911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::makeComponentInstance(
7111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        const char *name,
7211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        const OMX_CALLBACKTYPE *callbacks,
7311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_PTR appData,
7411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENTTYPE **component) {
7511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle == NULL) {
7611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
7711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
7811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
7911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (*mGetHandle)(
8011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            reinterpret_cast<OMX_HANDLETYPE *>(component),
8111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            const_cast<char *>(name),
8211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
8311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
8411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
8511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::destroyComponentInstance(
8611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_COMPONENTTYPE *component) {
8711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle == NULL) {
8811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
8911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
9011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
9211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
9311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
9411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::enumerateComponents(
9511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_STRING name,
9611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        size_t size,
9711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 index) {
9811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle == NULL) {
9911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
10011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
10111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return (*mComponentNameEnum)(name, size, index);
10311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
10411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
10511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry StrudelOMX_ERRORTYPE QComOMXPlugin::getRolesOfComponent(
10611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        const char *name,
10711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        Vector<String8> *roles) {
10811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    roles->clear();
10911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (mLibHandle == NULL) {
11111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return OMX_ErrorUndefined;
11211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
11311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_U32 numRoles;
11511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
11611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            const_cast<OMX_STRING>(name), &numRoles, NULL);
11711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
11811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (err != OMX_ErrorNone) {
11911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        return err;
12011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
12111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    if (numRoles > 0) {
12311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U8 **array = new OMX_U8 *[numRoles];
12411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < numRoles; ++i) {
12511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
12611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
12711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
12811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        OMX_U32 numRoles2;
12911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        err = (*mGetRolesOfComponentHandle)(
13011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel                const_cast<OMX_STRING>(name), &numRoles2, array);
13111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	if (err != OMX_ErrorNone) {
13311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	  return err;
13411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	}
13511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
13611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	if (numRoles2 != numRoles) {
13711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	  return err;
13811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel	}
13911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        for (OMX_U32 i = 0; i < numRoles; ++i) {
14111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            String8 s((const char *)array[i]);
14211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            roles->push(s);
14311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            delete[] array[i];
14511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel            array[i] = NULL;
14611e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        }
14711e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
14811e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        delete[] array;
14911e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel        array = NULL;
15011e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    }
15111e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15211e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel    return OMX_ErrorNone;
15311e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}
15411e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel
15511e4d07ddf6a35f55d6ad06edb850b015218c7acThierry Strudel}  // namespace android
156