summaryrefslogtreecommitdiff
path: root/WrsOMXPlugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WrsOMXPlugin.cpp')
-rw-r--r--WrsOMXPlugin.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/WrsOMXPlugin.cpp b/WrsOMXPlugin.cpp
new file mode 100644
index 0000000..f9c62e2
--- /dev/null
+++ b/WrsOMXPlugin.cpp
@@ -0,0 +1,222 @@
+/*
+* Copyright (c) 2009-2011 Intel Corporation. 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.
+*/
+
+/*
+ * Copyright (C) 2009 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#include "WrsOMXPlugin.h"
+
+#include <dlfcn.h>
+
+#include <HardwareAPI.h>
+#include <media/stagefright/foundation/ADebug.h>
+
+namespace android {
+
+OMXPluginBase *createOMXPlugin() {
+ return new WrsOMXPlugin;
+}
+
+WrsOMXPlugin::WrsOMXPlugin()
+{
+ AddCore("libwrs_omxil_core_pvwrapped.so");
+#if defined(USE_MEDIASDK)
+ AddCore("libmfx_omx_core.so");
+#endif
+}
+
+OMX_ERRORTYPE WrsOMXPlugin::AddCore(const char* coreName)
+{
+ void* libHandle = dlopen(coreName, RTLD_NOW);
+
+ if (libHandle != NULL) {
+ WrsOMXCore* core = (WrsOMXCore*)calloc(1,sizeof(WrsOMXCore));
+
+ if (!core) {
+ dlclose(libHandle);
+ return OMX_ErrorUndefined;
+ }
+ // set plugin lib handle and methods
+ core->mLibHandle = libHandle;
+ core->mInit = (WrsOMXCore::InitFunc)dlsym(libHandle, "OMX_Init");
+ core->mDeinit = (WrsOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit");
+
+ core->mComponentNameEnum =
+ (WrsOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum");
+
+ core->mGetHandle = (WrsOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle");
+ core->mFreeHandle = (WrsOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle");
+
+ core->mGetRolesOfComponentHandle =
+ (WrsOMXCore::GetRolesOfComponentFunc)dlsym(
+ libHandle, "OMX_GetRolesOfComponent");
+ if (core->mInit != NULL) {
+ (*(core->mInit))();
+ }
+ if (core->mComponentNameEnum != NULL) {
+ // calculating number of components registered inside given OMX core
+ char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 };
+ OMX_U32 tmpIndex = 0;
+ while (OMX_ErrorNone == ((*(core->mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) {
+ tmpIndex++;
+ ALOGI("OMX IL core %s: declares component %s", coreName, tmpComponentName);
+ }
+ core->mNumComponents = tmpIndex;
+ ALOGI("OMX IL core %s: contains %ld components", coreName, core->mNumComponents);
+ }
+ // add plugin to the vector
+ mCores.push_back(core);
+ }
+ else {
+ ALOGW("OMX IL core %s not found", coreName);
+ return OMX_ErrorUndefined; // Do we need to return error message
+ }
+ return OMX_ErrorNone;
+}
+
+WrsOMXPlugin::~WrsOMXPlugin() {
+ for (OMX_U32 i = 0; i < mCores.size(); i++) {
+ if (mCores[i] != NULL && mCores[i]->mLibHandle != NULL) {
+ (*(mCores[i]->mDeinit))();
+
+ dlclose(mCores[i]->mLibHandle);
+ free(mCores[i]);
+ }
+ }
+}
+
+OMX_ERRORTYPE WrsOMXPlugin::makeComponentInstance(
+ const char *name,
+ const OMX_CALLBACKTYPE *callbacks,
+ OMX_PTR appData,
+ OMX_COMPONENTTYPE **component) {
+ for (OMX_U32 i = 0; i < mCores.size(); i++) {
+ if (mCores[i] != NULL) {
+ if (mCores[i]->mLibHandle == NULL) {
+ continue;
+ }
+
+ OMX_ERRORTYPE omx_res = (*(mCores[i]->mGetHandle))(
+ reinterpret_cast<OMX_HANDLETYPE *>(component),
+ const_cast<char *>(name),
+ appData, const_cast<OMX_CALLBACKTYPE *>(callbacks));
+ if(omx_res == OMX_ErrorNone) {
+ Mutex::Autolock autoLock(mMutex);
+ WrsOMXComponent comp;
+
+ comp.mComponent = *component;
+ comp.mCore = mCores[i];
+
+ mComponents.push_back(comp);
+ return OMX_ErrorNone;
+ }
+ }
+ }
+ return OMX_ErrorInvalidComponentName;
+}
+
+OMX_ERRORTYPE WrsOMXPlugin::destroyComponentInstance(
+ OMX_COMPONENTTYPE *component) {
+ Mutex::Autolock autoLock(mMutex);
+ for (OMX_U32 i = 0; i < mComponents.size(); i++) {
+ if (mComponents[i].mComponent == component) {
+ if (mComponents[i].mCore == NULL || mComponents[i].mCore->mLibHandle == NULL) {
+ return OMX_ErrorUndefined;
+ }
+ OMX_ERRORTYPE omx_res = (*(mComponents[i].mCore->mFreeHandle))(reinterpret_cast<OMX_HANDLETYPE *>(component));
+ mComponents.erase(mComponents.begin() + i);
+ return omx_res;
+ }
+ }
+ return OMX_ErrorInvalidComponent;
+}
+
+OMX_ERRORTYPE WrsOMXPlugin::enumerateComponents(
+ OMX_STRING name,
+ size_t size,
+ OMX_U32 index) {
+ // returning components
+ OMX_U32 relativeIndex = index;
+ for (OMX_U32 i = 0; i < mCores.size(); i++) {
+ if (mCores[i]->mLibHandle == NULL) {
+ continue;
+ }
+ if (relativeIndex < mCores[i]->mNumComponents) return ((*(mCores[i]->mComponentNameEnum))(name, size, relativeIndex));
+ else relativeIndex -= mCores[i]->mNumComponents;
+ }
+ return OMX_ErrorNoMore;
+}
+
+OMX_ERRORTYPE WrsOMXPlugin::getRolesOfComponent(
+ const char *name,
+ Vector<String8> *roles) {
+ roles->clear();
+ for (OMX_U32 j = 0; j < mCores.size(); j++) {
+ if (mCores[j]->mLibHandle == NULL) {
+ continue;
+ }
+
+ OMX_U32 numRoles;
+ OMX_ERRORTYPE err = (*(mCores[j]->mGetRolesOfComponentHandle))(
+ const_cast<OMX_STRING>(name), &numRoles, NULL);
+
+ if (err != OMX_ErrorNone) {
+ continue;
+ }
+
+ 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 = numRoles;
+ err = (*(mCores[j]->mGetRolesOfComponentHandle))(
+ const_cast<OMX_STRING>(name), &numRoles2, array);
+
+ CHECK_EQ(err, OMX_ErrorNone);
+ CHECK_EQ(numRoles, numRoles2);
+
+ 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;
+ }
+ return OMX_ErrorInvalidComponent;
+}
+
+} // namespace android