use libOmxCore
This commit is contained in:
172
libstagefrighthw/RedroidOMXPlugin.cpp
Normal file
172
libstagefrighthw/RedroidOMXPlugin.cpp
Normal file
@@ -0,0 +1,172 @@
|
||||
/*
|
||||
* Copyright (C) 2009 The Android Open Source Project
|
||||
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "RedroidOMXPlugin"
|
||||
#include "RedroidOMXPlugin.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
|
||||
#include <media/hardware/HardwareAPI.h>
|
||||
#include <cutils/properties.h>
|
||||
#include <log/log.h>
|
||||
|
||||
#define d(...) ALOGD(__VA_ARGS__)
|
||||
|
||||
namespace android {
|
||||
|
||||
OMXPluginBase *createOMXPlugin() {
|
||||
return new RedroidOMXPlugin;
|
||||
}
|
||||
|
||||
RedroidOMXPlugin::RedroidOMXPlugin()
|
||||
: mLibHandle(NULL),
|
||||
mInit(NULL),
|
||||
mDeinit(NULL),
|
||||
mComponentNameEnum(NULL),
|
||||
mGetHandle(NULL),
|
||||
mFreeHandle(NULL),
|
||||
mGetRolesOfComponentHandle(NULL) {
|
||||
|
||||
d("%s", __func__);
|
||||
|
||||
if (!property_get_bool("ro.boot.use_redroid_omx", false)) {
|
||||
d("redroid OMX disabled; try with androidboot.use_redroid_omx=1 to enable");
|
||||
return;
|
||||
}
|
||||
|
||||
mLibHandle = dlopen("libOmxCore.so", RTLD_NOW);
|
||||
|
||||
if (mLibHandle != NULL) {
|
||||
mInit = (InitFunc)dlsym(mLibHandle, "OMX_Init");
|
||||
mDeinit = (DeinitFunc)dlsym(mLibHandle, "OMX_Deinit");
|
||||
|
||||
mComponentNameEnum =
|
||||
(ComponentNameEnumFunc)dlsym(mLibHandle, "OMX_ComponentNameEnum");
|
||||
|
||||
mGetHandle = (GetHandleFunc)dlsym(mLibHandle, "OMX_GetHandle");
|
||||
mFreeHandle = (FreeHandleFunc)dlsym(mLibHandle, "OMX_FreeHandle");
|
||||
|
||||
mGetRolesOfComponentHandle =
|
||||
(GetRolesOfComponentFunc)dlsym(
|
||||
mLibHandle, "OMX_GetRolesOfComponent");
|
||||
|
||||
if (!mInit || !mDeinit || !mComponentNameEnum || !mGetHandle ||
|
||||
!mFreeHandle || !mGetRolesOfComponentHandle) {
|
||||
dlclose(mLibHandle);
|
||||
mLibHandle = NULL;
|
||||
} else
|
||||
(*mInit)();
|
||||
} else {
|
||||
d("%s", dlerror());
|
||||
}
|
||||
}
|
||||
|
||||
RedroidOMXPlugin::~RedroidOMXPlugin() {
|
||||
if (mLibHandle != NULL) {
|
||||
(*mDeinit)();
|
||||
|
||||
dlclose(mLibHandle);
|
||||
mLibHandle = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
OMX_ERRORTYPE RedroidOMXPlugin::makeComponentInstance(
|
||||
const char *name,
|
||||
const OMX_CALLBACKTYPE *callbacks,
|
||||
OMX_PTR appData,
|
||||
OMX_COMPONENTTYPE **component) {
|
||||
if (mLibHandle == NULL) {
|
||||
return OMX_ErrorUndefined;
|
||||
}
|
||||
|
||||
return (*mGetHandle)(
|
||||
reinterpret_cast<OMX_HANDLETYPE *>(component),
|
||||
const_cast<char *>(name),
|
||||
appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
|
||||
}
|
||||
|
||||
OMX_ERRORTYPE RedroidOMXPlugin::destroyComponentInstance(
|
||||
OMX_COMPONENTTYPE *component) {
|
||||
if (mLibHandle == NULL) {
|
||||
return OMX_ErrorUndefined;
|
||||
}
|
||||
|
||||
return (*mFreeHandle)(reinterpret_cast<OMX_HANDLETYPE *>(component));
|
||||
}
|
||||
|
||||
OMX_ERRORTYPE RedroidOMXPlugin::enumerateComponents(
|
||||
OMX_STRING name,
|
||||
size_t size,
|
||||
OMX_U32 index) {
|
||||
if (mLibHandle == NULL) {
|
||||
return OMX_ErrorUndefined;
|
||||
}
|
||||
|
||||
return (*mComponentNameEnum)(name, size, index);
|
||||
}
|
||||
|
||||
OMX_ERRORTYPE RedroidOMXPlugin::getRolesOfComponent(
|
||||
const char *name,
|
||||
Vector<String8> *roles) {
|
||||
roles->clear();
|
||||
|
||||
if (mLibHandle == NULL) {
|
||||
return OMX_ErrorUndefined;
|
||||
}
|
||||
|
||||
OMX_U32 numRoles;
|
||||
OMX_ERRORTYPE err = (*mGetRolesOfComponentHandle)(
|
||||
const_cast<OMX_STRING>(name), &numRoles, NULL);
|
||||
|
||||
if (err != OMX_ErrorNone) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (numRoles > 0) {
|
||||
OMX_U8 **array = new OMX_U8 *[numRoles];
|
||||
for (OMX_U32 i = 0; i < numRoles; ++i) {
|
||||
array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE];
|
||||
}
|
||||
|
||||
OMX_U32 numRoles2;
|
||||
err = (*mGetRolesOfComponentHandle)(
|
||||
const_cast<OMX_STRING>(name), &numRoles2, array);
|
||||
|
||||
if (err != OMX_ErrorNone) {
|
||||
return err;
|
||||
}
|
||||
|
||||
if (numRoles2 != numRoles) {
|
||||
return err;
|
||||
}
|
||||
|
||||
for (OMX_U32 i = 0; i < numRoles; ++i) {
|
||||
String8 s((const char *)array[i]);
|
||||
roles->push(s);
|
||||
|
||||
delete[] array[i];
|
||||
array[i] = NULL;
|
||||
}
|
||||
|
||||
delete[] array;
|
||||
array = NULL;
|
||||
}
|
||||
|
||||
return OMX_ErrorNone;
|
||||
}
|
||||
|
||||
} // namespace android
|
||||
Reference in New Issue
Block a user