use libOmxCore

This commit is contained in:
Ziyang Zhou
2022-10-10 14:58:58 +08:00
parent 3fa6b71f87
commit 7a22f37be3
43 changed files with 434 additions and 14776 deletions

View 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