1419d34016dceec65ea137490668984eb80119df4Byron Gardner/* 2419d34016dceec65ea137490668984eb80119df4Byron Gardner* Copyright (c) 2009-2011 Intel Corporation. All rights reserved. 3419d34016dceec65ea137490668984eb80119df4Byron Gardner* 4419d34016dceec65ea137490668984eb80119df4Byron Gardner* Licensed under the Apache License, Version 2.0 (the "License"); 5419d34016dceec65ea137490668984eb80119df4Byron Gardner* you may not use this file except in compliance with the License. 6419d34016dceec65ea137490668984eb80119df4Byron Gardner* You may obtain a copy of the License at 7419d34016dceec65ea137490668984eb80119df4Byron Gardner* 8419d34016dceec65ea137490668984eb80119df4Byron Gardner* http://www.apache.org/licenses/LICENSE-2.0 9419d34016dceec65ea137490668984eb80119df4Byron Gardner* 10419d34016dceec65ea137490668984eb80119df4Byron Gardner* Unless required by applicable law or agreed to in writing, software 11419d34016dceec65ea137490668984eb80119df4Byron Gardner* distributed under the License is distributed on an "AS IS" BASIS, 12419d34016dceec65ea137490668984eb80119df4Byron Gardner* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13419d34016dceec65ea137490668984eb80119df4Byron Gardner* See the License for the specific language governing permissions and 14419d34016dceec65ea137490668984eb80119df4Byron Gardner* limitations under the License. 15419d34016dceec65ea137490668984eb80119df4Byron Gardner*/ 16419d34016dceec65ea137490668984eb80119df4Byron Gardner 17419d34016dceec65ea137490668984eb80119df4Byron Gardner/* 18419d34016dceec65ea137490668984eb80119df4Byron Gardner * Copyright (C) 2009 The Android Open Source Project 19419d34016dceec65ea137490668984eb80119df4Byron Gardner * 20419d34016dceec65ea137490668984eb80119df4Byron Gardner * Licensed under the Apache License, Version 2.0 (the "License"); 21419d34016dceec65ea137490668984eb80119df4Byron Gardner * you may not use this file except in compliance with the License. 22419d34016dceec65ea137490668984eb80119df4Byron Gardner * You may obtain a copy of the License at 23419d34016dceec65ea137490668984eb80119df4Byron Gardner * 24419d34016dceec65ea137490668984eb80119df4Byron Gardner * http://www.apache.org/licenses/LICENSE-2.0 25419d34016dceec65ea137490668984eb80119df4Byron Gardner * 26419d34016dceec65ea137490668984eb80119df4Byron Gardner * Unless required by applicable law or agreed to in writing, software 27419d34016dceec65ea137490668984eb80119df4Byron Gardner * distributed under the License is distributed on an "AS IS" BASIS, 28419d34016dceec65ea137490668984eb80119df4Byron Gardner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 29419d34016dceec65ea137490668984eb80119df4Byron Gardner * See the License for the specific language governing permissions and 30419d34016dceec65ea137490668984eb80119df4Byron Gardner * limitations under the License. 31419d34016dceec65ea137490668984eb80119df4Byron Gardner */ 32419d34016dceec65ea137490668984eb80119df4Byron Gardner 33419d34016dceec65ea137490668984eb80119df4Byron Gardner#include "WrsOMXPlugin.h" 34419d34016dceec65ea137490668984eb80119df4Byron Gardner 35419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <dlfcn.h> 36419d34016dceec65ea137490668984eb80119df4Byron Gardner 37419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <HardwareAPI.h> 38419d34016dceec65ea137490668984eb80119df4Byron Gardner#include <media/stagefright/foundation/ADebug.h> 39419d34016dceec65ea137490668984eb80119df4Byron Gardner 40419d34016dceec65ea137490668984eb80119df4Byron Gardnernamespace android { 41419d34016dceec65ea137490668984eb80119df4Byron Gardner 42419d34016dceec65ea137490668984eb80119df4Byron GardnerOMXPluginBase *createOMXPlugin() { 43419d34016dceec65ea137490668984eb80119df4Byron Gardner return new WrsOMXPlugin; 44419d34016dceec65ea137490668984eb80119df4Byron Gardner} 45419d34016dceec65ea137490668984eb80119df4Byron Gardner 46419d34016dceec65ea137490668984eb80119df4Byron GardnerWrsOMXPlugin::WrsOMXPlugin() 47419d34016dceec65ea137490668984eb80119df4Byron Gardner{ 48419d34016dceec65ea137490668984eb80119df4Byron Gardner AddCore("libwrs_omxil_core_pvwrapped.so"); 49419d34016dceec65ea137490668984eb80119df4Byron Gardner#if defined(USE_MEDIASDK) 50419d34016dceec65ea137490668984eb80119df4Byron Gardner AddCore("libmfx_omx_core.so"); 51419d34016dceec65ea137490668984eb80119df4Byron Gardner#endif 52419d34016dceec65ea137490668984eb80119df4Byron Gardner} 53419d34016dceec65ea137490668984eb80119df4Byron Gardner 54419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::AddCore(const char* coreName) 55419d34016dceec65ea137490668984eb80119df4Byron Gardner{ 56419d34016dceec65ea137490668984eb80119df4Byron Gardner void* libHandle = dlopen(coreName, RTLD_NOW); 57419d34016dceec65ea137490668984eb80119df4Byron Gardner 58419d34016dceec65ea137490668984eb80119df4Byron Gardner if (libHandle != NULL) { 59419d34016dceec65ea137490668984eb80119df4Byron Gardner WrsOMXCore* core = (WrsOMXCore*)calloc(1,sizeof(WrsOMXCore)); 60419d34016dceec65ea137490668984eb80119df4Byron Gardner 61419d34016dceec65ea137490668984eb80119df4Byron Gardner if (!core) { 62419d34016dceec65ea137490668984eb80119df4Byron Gardner dlclose(libHandle); 63419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorUndefined; 64419d34016dceec65ea137490668984eb80119df4Byron Gardner } 65419d34016dceec65ea137490668984eb80119df4Byron Gardner // set plugin lib handle and methods 66419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mLibHandle = libHandle; 67419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mInit = (WrsOMXCore::InitFunc)dlsym(libHandle, "OMX_Init"); 68419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mDeinit = (WrsOMXCore::DeinitFunc)dlsym(libHandle, "OMX_Deinit"); 69419d34016dceec65ea137490668984eb80119df4Byron Gardner 70419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mComponentNameEnum = 71419d34016dceec65ea137490668984eb80119df4Byron Gardner (WrsOMXCore::ComponentNameEnumFunc)dlsym(libHandle, "OMX_ComponentNameEnum"); 72419d34016dceec65ea137490668984eb80119df4Byron Gardner 73419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mGetHandle = (WrsOMXCore::GetHandleFunc)dlsym(libHandle, "OMX_GetHandle"); 74419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mFreeHandle = (WrsOMXCore::FreeHandleFunc)dlsym(libHandle, "OMX_FreeHandle"); 75419d34016dceec65ea137490668984eb80119df4Byron Gardner 76419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mGetRolesOfComponentHandle = 77419d34016dceec65ea137490668984eb80119df4Byron Gardner (WrsOMXCore::GetRolesOfComponentFunc)dlsym( 78419d34016dceec65ea137490668984eb80119df4Byron Gardner libHandle, "OMX_GetRolesOfComponent"); 79419d34016dceec65ea137490668984eb80119df4Byron Gardner if (core->mInit != NULL) { 80419d34016dceec65ea137490668984eb80119df4Byron Gardner (*(core->mInit))(); 81419d34016dceec65ea137490668984eb80119df4Byron Gardner } 82419d34016dceec65ea137490668984eb80119df4Byron Gardner if (core->mComponentNameEnum != NULL) { 83419d34016dceec65ea137490668984eb80119df4Byron Gardner // calculating number of components registered inside given OMX core 84419d34016dceec65ea137490668984eb80119df4Byron Gardner char tmpComponentName[OMX_MAX_STRINGNAME_SIZE] = { 0 }; 85419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U32 tmpIndex = 0; 86419d34016dceec65ea137490668984eb80119df4Byron Gardner while (OMX_ErrorNone == ((*(core->mComponentNameEnum))(tmpComponentName, OMX_MAX_STRINGNAME_SIZE, tmpIndex))) { 87419d34016dceec65ea137490668984eb80119df4Byron Gardner tmpIndex++; 88419d34016dceec65ea137490668984eb80119df4Byron Gardner ALOGI("OMX IL core %s: declares component %s", coreName, tmpComponentName); 89419d34016dceec65ea137490668984eb80119df4Byron Gardner } 90419d34016dceec65ea137490668984eb80119df4Byron Gardner core->mNumComponents = tmpIndex; 91419d34016dceec65ea137490668984eb80119df4Byron Gardner ALOGI("OMX IL core %s: contains %ld components", coreName, core->mNumComponents); 92419d34016dceec65ea137490668984eb80119df4Byron Gardner } 93419d34016dceec65ea137490668984eb80119df4Byron Gardner // add plugin to the vector 94419d34016dceec65ea137490668984eb80119df4Byron Gardner mCores.push_back(core); 95419d34016dceec65ea137490668984eb80119df4Byron Gardner } 96419d34016dceec65ea137490668984eb80119df4Byron Gardner else { 97419d34016dceec65ea137490668984eb80119df4Byron Gardner ALOGW("OMX IL core %s not found", coreName); 98419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorUndefined; // Do we need to return error message 99419d34016dceec65ea137490668984eb80119df4Byron Gardner } 100419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorNone; 101419d34016dceec65ea137490668984eb80119df4Byron Gardner} 102419d34016dceec65ea137490668984eb80119df4Byron Gardner 103419d34016dceec65ea137490668984eb80119df4Byron GardnerWrsOMXPlugin::~WrsOMXPlugin() { 104419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < mCores.size(); i++) { 105419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mCores[i] != NULL && mCores[i]->mLibHandle != NULL) { 106419d34016dceec65ea137490668984eb80119df4Byron Gardner (*(mCores[i]->mDeinit))(); 107419d34016dceec65ea137490668984eb80119df4Byron Gardner 108419d34016dceec65ea137490668984eb80119df4Byron Gardner dlclose(mCores[i]->mLibHandle); 109419d34016dceec65ea137490668984eb80119df4Byron Gardner free(mCores[i]); 110419d34016dceec65ea137490668984eb80119df4Byron Gardner } 111419d34016dceec65ea137490668984eb80119df4Byron Gardner } 112419d34016dceec65ea137490668984eb80119df4Byron Gardner} 113419d34016dceec65ea137490668984eb80119df4Byron Gardner 114419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::makeComponentInstance( 115419d34016dceec65ea137490668984eb80119df4Byron Gardner const char *name, 116419d34016dceec65ea137490668984eb80119df4Byron Gardner const OMX_CALLBACKTYPE *callbacks, 117419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_PTR appData, 118419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_COMPONENTTYPE **component) { 119419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < mCores.size(); i++) { 120419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mCores[i] != NULL) { 121419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mCores[i]->mLibHandle == NULL) { 122419d34016dceec65ea137490668984eb80119df4Byron Gardner continue; 123419d34016dceec65ea137490668984eb80119df4Byron Gardner } 124419d34016dceec65ea137490668984eb80119df4Byron Gardner 125419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_ERRORTYPE omx_res = (*(mCores[i]->mGetHandle))( 126419d34016dceec65ea137490668984eb80119df4Byron Gardner reinterpret_cast<OMX_HANDLETYPE *>(component), 127419d34016dceec65ea137490668984eb80119df4Byron Gardner const_cast<char *>(name), 128419d34016dceec65ea137490668984eb80119df4Byron Gardner appData, const_cast<OMX_CALLBACKTYPE *>(callbacks)); 129419d34016dceec65ea137490668984eb80119df4Byron Gardner if(omx_res == OMX_ErrorNone) { 130419d34016dceec65ea137490668984eb80119df4Byron Gardner Mutex::Autolock autoLock(mMutex); 131419d34016dceec65ea137490668984eb80119df4Byron Gardner WrsOMXComponent comp; 132419d34016dceec65ea137490668984eb80119df4Byron Gardner 133419d34016dceec65ea137490668984eb80119df4Byron Gardner comp.mComponent = *component; 134419d34016dceec65ea137490668984eb80119df4Byron Gardner comp.mCore = mCores[i]; 135419d34016dceec65ea137490668984eb80119df4Byron Gardner 136419d34016dceec65ea137490668984eb80119df4Byron Gardner mComponents.push_back(comp); 137419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorNone; 138419d34016dceec65ea137490668984eb80119df4Byron Gardner } 139419d34016dceec65ea137490668984eb80119df4Byron Gardner } 140419d34016dceec65ea137490668984eb80119df4Byron Gardner } 141419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorInvalidComponentName; 142419d34016dceec65ea137490668984eb80119df4Byron Gardner} 143419d34016dceec65ea137490668984eb80119df4Byron Gardner 144419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::destroyComponentInstance( 145419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_COMPONENTTYPE *component) { 146419d34016dceec65ea137490668984eb80119df4Byron Gardner Mutex::Autolock autoLock(mMutex); 147419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < mComponents.size(); i++) { 148419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mComponents[i].mComponent == component) { 149419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mComponents[i].mCore == NULL || mComponents[i].mCore->mLibHandle == NULL) { 150419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorUndefined; 151419d34016dceec65ea137490668984eb80119df4Byron Gardner } 152419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_ERRORTYPE omx_res = (*(mComponents[i].mCore->mFreeHandle))(reinterpret_cast<OMX_HANDLETYPE *>(component)); 153419d34016dceec65ea137490668984eb80119df4Byron Gardner mComponents.erase(mComponents.begin() + i); 154419d34016dceec65ea137490668984eb80119df4Byron Gardner return omx_res; 155419d34016dceec65ea137490668984eb80119df4Byron Gardner } 156419d34016dceec65ea137490668984eb80119df4Byron Gardner } 157419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorInvalidComponent; 158419d34016dceec65ea137490668984eb80119df4Byron Gardner} 159419d34016dceec65ea137490668984eb80119df4Byron Gardner 160419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::enumerateComponents( 161419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_STRING name, 162419d34016dceec65ea137490668984eb80119df4Byron Gardner size_t size, 163419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U32 index) { 164419d34016dceec65ea137490668984eb80119df4Byron Gardner // returning components 165419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U32 relativeIndex = index; 166419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < mCores.size(); i++) { 167419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mCores[i]->mLibHandle == NULL) { 168419d34016dceec65ea137490668984eb80119df4Byron Gardner continue; 169419d34016dceec65ea137490668984eb80119df4Byron Gardner } 170419d34016dceec65ea137490668984eb80119df4Byron Gardner if (relativeIndex < mCores[i]->mNumComponents) return ((*(mCores[i]->mComponentNameEnum))(name, size, relativeIndex)); 171419d34016dceec65ea137490668984eb80119df4Byron Gardner else relativeIndex -= mCores[i]->mNumComponents; 172419d34016dceec65ea137490668984eb80119df4Byron Gardner } 173419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorNoMore; 174419d34016dceec65ea137490668984eb80119df4Byron Gardner} 175419d34016dceec65ea137490668984eb80119df4Byron Gardner 176419d34016dceec65ea137490668984eb80119df4Byron GardnerOMX_ERRORTYPE WrsOMXPlugin::getRolesOfComponent( 177419d34016dceec65ea137490668984eb80119df4Byron Gardner const char *name, 178419d34016dceec65ea137490668984eb80119df4Byron Gardner Vector<String8> *roles) { 179419d34016dceec65ea137490668984eb80119df4Byron Gardner roles->clear(); 180419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 j = 0; j < mCores.size(); j++) { 181419d34016dceec65ea137490668984eb80119df4Byron Gardner if (mCores[j]->mLibHandle == NULL) { 182419d34016dceec65ea137490668984eb80119df4Byron Gardner continue; 183419d34016dceec65ea137490668984eb80119df4Byron Gardner } 184419d34016dceec65ea137490668984eb80119df4Byron Gardner 185419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U32 numRoles; 186419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_ERRORTYPE err = (*(mCores[j]->mGetRolesOfComponentHandle))( 187419d34016dceec65ea137490668984eb80119df4Byron Gardner const_cast<OMX_STRING>(name), &numRoles, NULL); 188419d34016dceec65ea137490668984eb80119df4Byron Gardner 189419d34016dceec65ea137490668984eb80119df4Byron Gardner if (err != OMX_ErrorNone) { 190419d34016dceec65ea137490668984eb80119df4Byron Gardner continue; 191419d34016dceec65ea137490668984eb80119df4Byron Gardner } 192419d34016dceec65ea137490668984eb80119df4Byron Gardner 193419d34016dceec65ea137490668984eb80119df4Byron Gardner if (numRoles > 0) { 194419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U8 **array = new OMX_U8 *[numRoles]; 195419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < numRoles; ++i) { 196419d34016dceec65ea137490668984eb80119df4Byron Gardner array[i] = new OMX_U8[OMX_MAX_STRINGNAME_SIZE]; 197419d34016dceec65ea137490668984eb80119df4Byron Gardner } 198419d34016dceec65ea137490668984eb80119df4Byron Gardner 199419d34016dceec65ea137490668984eb80119df4Byron Gardner OMX_U32 numRoles2 = numRoles; 200419d34016dceec65ea137490668984eb80119df4Byron Gardner err = (*(mCores[j]->mGetRolesOfComponentHandle))( 201419d34016dceec65ea137490668984eb80119df4Byron Gardner const_cast<OMX_STRING>(name), &numRoles2, array); 202419d34016dceec65ea137490668984eb80119df4Byron Gardner 203419d34016dceec65ea137490668984eb80119df4Byron Gardner CHECK_EQ(err, OMX_ErrorNone); 204419d34016dceec65ea137490668984eb80119df4Byron Gardner CHECK_EQ(numRoles, numRoles2); 205419d34016dceec65ea137490668984eb80119df4Byron Gardner 206419d34016dceec65ea137490668984eb80119df4Byron Gardner for (OMX_U32 i = 0; i < numRoles; ++i) { 207419d34016dceec65ea137490668984eb80119df4Byron Gardner String8 s((const char *)array[i]); 208419d34016dceec65ea137490668984eb80119df4Byron Gardner roles->push(s); 209419d34016dceec65ea137490668984eb80119df4Byron Gardner 210419d34016dceec65ea137490668984eb80119df4Byron Gardner delete[] array[i]; 211419d34016dceec65ea137490668984eb80119df4Byron Gardner array[i] = NULL; 212419d34016dceec65ea137490668984eb80119df4Byron Gardner } 213419d34016dceec65ea137490668984eb80119df4Byron Gardner 214419d34016dceec65ea137490668984eb80119df4Byron Gardner delete[] array; 215419d34016dceec65ea137490668984eb80119df4Byron Gardner array = NULL; 216419d34016dceec65ea137490668984eb80119df4Byron Gardner } 217419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorNone; 218419d34016dceec65ea137490668984eb80119df4Byron Gardner } 219419d34016dceec65ea137490668984eb80119df4Byron Gardner return OMX_ErrorInvalidComponent; 220419d34016dceec65ea137490668984eb80119df4Byron Gardner} 221419d34016dceec65ea137490668984eb80119df4Byron Gardner 222419d34016dceec65ea137490668984eb80119df4Byron Gardner} // namespace android 223