SoftOMXPlugin.cpp revision 0c1bc742181ded4930842b46e9507372f0b1b963
1bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber/* 2bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Copyright (C) 2011 The Android Open Source Project 3bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 4bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * you may not use this file except in compliance with the License. 6bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * You may obtain a copy of the License at 7bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 8bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * 10bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * Unless required by applicable law or agreed to in writing, software 11bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * See the License for the specific language governing permissions and 14bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber * limitations under the License. 15bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber */ 16bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 17bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber//#define LOG_NDEBUG 0 18bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#define LOG_TAG "SoftOMXPlugin" 19bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <utils/Log.h> 20bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 21bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include "SoftOMXPlugin.h" 22bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include "include/SoftOMXComponent.h" 23bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 24f2af5a2c607e71ff4cd39da28b077c0a68b206feAndreas Huber#include <media/stagefright/foundation/ADebug.h> 25bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <media/stagefright/foundation/AString.h> 26bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 27bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber#include <dlfcn.h> 28bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 29bbba88cb1bdc34705d1477208990a06904c022e7Andreas Hubernamespace android { 30bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 31bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstatic const struct { 32bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *mName; 33bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *mLibNameSuffix; 34bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *mRole; 35bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 36bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} kComponents[] = { 37bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.aac.decoder", "aacdec", "audio_decoder.aac" }, 38bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.amrnb.decoder", "amrdec", "audio_decoder.amrnb" }, 39bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.amrwb.decoder", "amrdec", "audio_decoder.amrwb" }, 400c1bc742181ded4930842b46e9507372f0b1b963James Dong { "OMX.google.h264.decoder", "h264dec", "video_decoder.avc" }, 41bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.avc.decoder", "avcdec", "video_decoder.avc" }, 42bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.g711.alaw.decoder", "g711dec", "audio_decoder.g711alaw" }, 43bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.g711.mlaw.decoder", "g711dec", "audio_decoder.g711mlaw" }, 44bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.h263.decoder", "mpeg4dec", "video_decoder.h263" }, 45bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.mpeg4.decoder", "mpeg4dec", "video_decoder.mpeg4" }, 46bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.mp3.decoder", "mp3dec", "audio_decoder.mp3" }, 47bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.vorbis.decoder", "vorbisdec", "audio_decoder.vorbis" }, 48bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber { "OMX.google.vpx.decoder", "vpxdec", "video_decoder.vpx" }, 49bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber}; 50bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 51bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huberstatic const size_t kNumComponents = 52bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sizeof(kComponents) / sizeof(kComponents[0]); 53bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 54bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberSoftOMXPlugin::SoftOMXPlugin() { 55bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 56bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 57bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SoftOMXPlugin::makeComponentInstance( 58bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *name, 59bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const OMX_CALLBACKTYPE *callbacks, 60bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR appData, 61bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMPONENTTYPE **component) { 62bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber LOGV("makeComponentInstance '%s'", name); 63bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 64bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < kNumComponents; ++i) { 65bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (strcmp(name, kComponents[i].mName)) { 66bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber continue; 67bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 68bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 69bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber AString libName = "libstagefright_soft_"; 70bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libName.append(kComponents[i].mLibNameSuffix); 71bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libName.append(".so"); 72bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 73bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void *libHandle = dlopen(libName.c_str(), RTLD_NOW); 74bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 75bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (libHandle == NULL) { 76bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber LOGE("unable to dlopen %s", libName.c_str()); 77bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 78bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorComponentNotFound; 79bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 80bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 81bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber typedef SoftOMXComponent *(*CreateSoftOMXComponentFunc)( 82bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *, const OMX_CALLBACKTYPE *, 83bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_PTR, OMX_COMPONENTTYPE **); 84bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 85bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber CreateSoftOMXComponentFunc createSoftOMXComponent = 86bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (CreateSoftOMXComponentFunc)dlsym( 87bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libHandle, 88bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber "_Z22createSoftOMXComponentPKcPK16OMX_CALLBACKTYPE" 89bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber "PvPP17OMX_COMPONENTTYPE"); 90bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 91bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (createSoftOMXComponent == NULL) { 92bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber dlclose(libHandle); 93bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libHandle = NULL; 94bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 95bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorComponentNotFound; 96bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 97bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 98bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber sp<SoftOMXComponent> codec = 99bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (*createSoftOMXComponent)(name, callbacks, appData, component); 100bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 101bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (codec == NULL) { 102bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber dlclose(libHandle); 103bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libHandle = NULL; 104bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 105bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorInsufficientResources; 106bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 107bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 108bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_ERRORTYPE err = codec->initCheck(); 109bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (err != OMX_ErrorNone) { 110bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber dlclose(libHandle); 111bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libHandle = NULL; 112bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 113bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return err; 114bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 115bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 116bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber codec->incStrong(this); 117bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber codec->setLibHandle(libHandle); 118bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 119bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 120bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 121bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 122bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorInvalidComponentName; 123bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 124bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 125bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SoftOMXPlugin::destroyComponentInstance( 126bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_COMPONENTTYPE *component) { 127bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber SoftOMXComponent *me = 128bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber (SoftOMXComponent *) 129bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber ((OMX_COMPONENTTYPE *)component)->pComponentPrivate; 130bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 1315a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber me->prepareForDestruction(); 1325a65e30064dc8dffa4f3d868f1c46038972c40c5Andreas Huber 133bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber void *libHandle = me->libHandle(); 134bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 135f2af5a2c607e71ff4cd39da28b077c0a68b206feAndreas Huber CHECK_EQ(me->getStrongCount(), 1); 136bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber me->decStrong(this); 137bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber me = NULL; 138bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 139bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber dlclose(libHandle); 140bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber libHandle = NULL; 141bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 142bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 143bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 144bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 145bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SoftOMXPlugin::enumerateComponents( 146bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_STRING name, 147bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber size_t size, 148bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber OMX_U32 index) { 149bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (index >= kNumComponents) { 150bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNoMore; 151bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 152bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 153bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber strcpy(name, kComponents[index].mName); 154bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 155bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 156bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 157bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 158bbba88cb1bdc34705d1477208990a06904c022e7Andreas HuberOMX_ERRORTYPE SoftOMXPlugin::getRolesOfComponent( 159bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber const char *name, 160bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber Vector<String8> *roles) { 161bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber for (size_t i = 0; i < kNumComponents; ++i) { 162bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber if (strcmp(name, kComponents[i].mName)) { 163bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber continue; 164bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 165bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 166bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber roles->clear(); 167bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber roles->push(String8(kComponents[i].mRole)); 168bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 169bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorNone; 170bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber } 171bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 172bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber return OMX_ErrorInvalidComponentName; 173bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} 174bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber 175bbba88cb1bdc34705d1477208990a06904c022e7Andreas Huber} // namespace android 176