1ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu/* 22f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * cmodule.cpp, component module interface class 330bd6062e4b295f5f7bcaeb98165065310d29269Ho-Eun Ryu * 42f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Copyright (c) 2009-2010 Wind River Systems, Inc. 52f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 62f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Licensed under the Apache License, Version 2.0 (the "License"); 72f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * you may not use this file except in compliance with the License. 82f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * You may obtain a copy of the License at 92f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 102f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * http://www.apache.org/licenses/LICENSE-2.0 112f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * 122f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * Unless required by applicable law or agreed to in writing, software 132f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * distributed under the License is distributed on an "AS IS" BASIS, 142f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 152f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * See the License for the specific language governing permissions and 162f6e87e64736666857c1bbe2cb0692c1f4e56508Ho-Eun Ryu * limitations under the License. 17ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu */ 18ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 19ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <stdio.h> 20ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <stdlib.h> 21ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <string.h> 22ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 23ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <OMX_Core.h> 24ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 25ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <cmodule.h> 267586927b4a7d8e6a549b6b76c78ab5e36bb2f4a3Ho-Eun Ryu#include <componentbase.h> 27ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 28ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#define LOG_TAG "cmodule" 29ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu#include <log.h> 30ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 31b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* 32b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu * constructor / deconstructor 33b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu */ 3493829fc5dd7d8b02ab8425f4f6cecf39e0636508Ho-Eun RyuCModule::CModule(const OMX_STRING lname) 35ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu{ 36ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu module = NULL; 37aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu wrs_omxil_cmodule = NULL; 385463849b74e78069ba8853df8be5e185e712a6c1Ho-Eun Ryu 3913a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu roles = NULL; 4013a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu nr_roles = 0; 4113a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu 42f42ba278301ee8a8ee1d58f325bfac5d5883f1e6Ho-Eun Ryu memset(cname, 0, OMX_MAX_STRINGNAME_SIZE); 43f42ba278301ee8a8ee1d58f325bfac5d5883f1e6Ho-Eun Ryu 44fbe9b4b84433e601a41cec8bb4a703ce85fb8898Ho-Eun Ryu memset(this->lname, 0, OMX_MAX_STRINGNAME_SIZE); 4506d2b4622ddb4b2f9ae3bd5eefd4d991c5d69367nguo // strncpy(this->name, name, OMX_MAX_STRINGNAME_SIZE); 460fc2a2b43fa4b6f11f667aacea2e8f4ebe049eeewfeng strncpy(this->lname, lname, (strlen(lname) < OMX_MAX_STRINGNAME_SIZE) ? strlen(lname) : (OMX_MAX_STRINGNAME_SIZE-1)); 47fbe9b4b84433e601a41cec8bb4a703ce85fb8898Ho-Eun Ryu this->lname[OMX_MAX_STRINGNAME_SIZE-1] = '\0'; 48ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu} 49ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 50ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun RyuCModule::~CModule() 51ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu{ 52330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu if (module) { 53330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu int ref_count; 54330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu 55330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu while ((ref_count = Unload())); 56330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu } 5789e363635b79898d7dd07645b9db2ba3393b38e4Ho-Eun Ryu 5813a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu if (roles) { 5913a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu if (roles[0]) 6013a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu free(roles[0]); 6113a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu free(roles); 6213a3f2f8b40df4284788f42a2df9908efb356105Ho-Eun Ryu } 63ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu} 64ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 65b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* end of constructor / deconstructor */ 66b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu 67b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* 68b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu * library loading / unloading 69b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu */ 70aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun RyuOMX_ERRORTYPE CModule::Load(int flag) 71ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu{ 72abd0912a8db7a54ddacbfe87ad618c9418e6648cHo-Eun Ryu struct module *m; 73ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 74aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu m = module_open(lname, flag); 75abd0912a8db7a54ddacbfe87ad618c9418e6648cHo-Eun Ryu if (!m) { 7693829fc5dd7d8b02ab8425f4f6cecf39e0636508Ho-Eun Ryu LOGE("module not founded (%s)\n", lname); 77ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu return OMX_ErrorComponentNotFound; 78ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu } 79aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 80330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu if (m == module) 81330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu return OMX_ErrorNone; 82330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu 83aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu wrs_omxil_cmodule = (struct wrs_omxil_cmodule_s *) 84aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu module_symbol(m, WRS_OMXIL_CMODULE_SYMBOL_STRING); 85aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!wrs_omxil_cmodule) { 86aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu LOGE("module %s symbol not founded (%s)\n", 87aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu lname, WRS_OMXIL_CMODULE_SYMBOL_STRING); 88aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 89aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu module_close(m); 90aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorInvalidComponent; 91abd0912a8db7a54ddacbfe87ad618c9418e6648cHo-Eun Ryu } 92abd0912a8db7a54ddacbfe87ad618c9418e6648cHo-Eun Ryu 93274e417839e9335eccada4b08e082e238b0ed7dcGu, Wangyi if (module) 94274e417839e9335eccada4b08e082e238b0ed7dcGu, Wangyi LOGE("module %s will be overwrite",module->name); 95aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu module = m; 96aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu LOGI("module %s successfully loaded\n", lname); 97aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 98ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu return OMX_ErrorNone; 99ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu} 100ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 101e4cf7671304eade66d6f89200ccb7c448f12909cHo-Eun RyuOMX_U32 CModule::Unload(void) 102ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu{ 103330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu int ref_count; 104ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 105330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu ref_count = module_close(module); 106330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu if (!ref_count) { 107330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu module = NULL; 108330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu wrs_omxil_cmodule = NULL; 1095463849b74e78069ba8853df8be5e185e712a6c1Ho-Eun Ryu 110330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu LOGI("module %s successfully unloaded\n", lname); 111330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu } 112ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 113330baad1e1d86478f78358112466d37396824ee0Ho-Eun Ryu return ref_count; 114ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu} 115ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu 116b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* end of library loading / unloading */ 117b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu 118b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* 119b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu * accessor 120b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu */ 1213f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_STRING CModule::GetLibraryName(void) 122ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu{ 12393829fc5dd7d8b02ab8425f4f6cecf39e0636508Ho-Eun Ryu return lname; 124ad314a082b0ba22294ba369dde3f84f88010a612Ho-Eun Ryu} 125b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu 1263f7ceee13aa17ae32d4263aed2ce67eb9a37c58bywanOMX_STRING CModule::GetComponentName(void) 127dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu{ 128dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu return cname; 129dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu} 130dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 131dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun RyuOMX_ERRORTYPE CModule::GetComponentRoles(OMX_U32 *nr_roles, OMX_U8 **roles) 132dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu{ 133dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu OMX_U32 i; 134dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu OMX_U32 this_nr_roles = this->nr_roles; 135dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 136dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu if (!roles) { 137dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu *nr_roles = this_nr_roles; 138dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu return OMX_ErrorNone; 139dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu } 140dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 141dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu if (!nr_roles || (*nr_roles != this_nr_roles)) 142dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu return OMX_ErrorBadParameter; 143dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 144dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu for (i = 0; i < this_nr_roles; i++) { 145dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu if (!roles[i]) 146dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu break; 147dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 148dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu if (roles && roles[i]) 149dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu strncpy((OMX_STRING)&roles[i][0], 150dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu (const OMX_STRING)&this->roles[i][0], 151dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu OMX_MAX_STRINGNAME_SIZE); 152dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu } 153dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 154dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu if (i != this_nr_roles) 155dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu return OMX_ErrorBadParameter; 156dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 157dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu *nr_roles = this_nr_roles; 158dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu return OMX_ErrorNone; 159dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu} 160dcca56c316c37a3b79d54fc28631607e672db691Ho-Eun Ryu 1614d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryubool CModule::QueryHavingThisRole(const OMX_STRING role) 1624d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu{ 1634d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu OMX_U32 i; 1644d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu 1654d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu if (!roles || !role) 1664d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu return false; 1674d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu 1684d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu for (i = 0; i < nr_roles; i++) { 1694d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu if (!strcmp((OMX_STRING)&roles[i][0], role)) 1704d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu return true; 1714d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu } 1724d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu 1734d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu return false; 1744d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu} 1754d23422b4ee131b866bb3f3016bc436fb51f68c0Ho-Eun Ryu 176b82acc5264df5ef0d8cd5265826baa9a90f436b3Ho-Eun Ryu/* end of accessor */ 177ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 178ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu/* 179ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu * library symbol method and helpers 180ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu */ 181aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun RyuOMX_ERRORTYPE CModule::InstantiateComponent(ComponentBase **instance) 182ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu{ 183aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu ComponentBase *cbase; 184aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_ERRORTYPE ret; 185ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 186aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!instance) 187aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorBadParameter; 188aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu *instance = NULL; 189ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 190aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!wrs_omxil_cmodule) 191aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorUndefined; 192ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 193aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu ret = wrs_omxil_cmodule->ops->instantiate((void **)&cbase); 194aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (ret != OMX_ErrorNone) { 195aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu LOGE("%s failed to instantiate()\n", lname); 196aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return ret; 197aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu } 198ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 199aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu cbase->SetCModule(this); 200aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu cbase->SetName(cname); 201aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu ret = cbase->SetRolesOfComponent(nr_roles, (const OMX_U8 **)roles); 202aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (ret != OMX_ErrorNone) { 203aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu delete cbase; 204aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return ret; 205aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu } 206ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 207aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu *instance = cbase; 208aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorNone; 209ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu} 210ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 211aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun RyuOMX_ERRORTYPE CModule::QueryComponentNameAndRoles(void) 212ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu{ 213aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu const char *name; 214aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 name_len; 215aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 copy_name_len; 216ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 217aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu const OMX_U8 **roles; 218aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 nr_roles; 219aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 role_len; 220aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 copy_role_len; 221aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U8 **this_roles; 222aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 223aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_U32 i; 224ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 225aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (this->roles) 226ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu return OMX_ErrorNone; 227ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 228aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!wrs_omxil_cmodule) 229aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorUndefined; 230ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 231aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu roles = (const OMX_U8 **)wrs_omxil_cmodule->roles; 232aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu nr_roles = wrs_omxil_cmodule->nr_roles; 233aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu 234aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this_roles = (OMX_U8 **)malloc(sizeof(OMX_STRING) * nr_roles); 235aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!this_roles) 236ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu return OMX_ErrorInsufficientResources; 237ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 238aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this_roles[0] = (OMX_U8 *)malloc(OMX_MAX_STRINGNAME_SIZE * nr_roles); 239aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (!this_roles[0]) { 240aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu free(this_roles); 241aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorInsufficientResources; 242ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu } 243ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 244aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu for (i = 0; i < nr_roles; i++) { 245aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu if (i < nr_roles - 1) 246aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this_roles[i+1] = this_roles[i] + OMX_MAX_STRINGNAME_SIZE; 247ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 248aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu role_len = strlen((const OMX_STRING)&roles[i][0]); 249aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu copy_role_len = role_len > OMX_MAX_STRINGNAME_SIZE-1 ? 250aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_MAX_STRINGNAME_SIZE-1 : role_len; 251ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 252aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu strncpy((OMX_STRING)&this_roles[i][0], 253aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu (const OMX_STRING)&roles[i][0], copy_role_len); 254aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this_roles[i][copy_role_len] = '\0'; 255aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu } 256ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 257aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this->roles = this_roles; 258aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu this->nr_roles = nr_roles; 259ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 260aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu name = wrs_omxil_cmodule->name; 261aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu name_len = strlen(name); 262aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu copy_name_len = name_len > OMX_MAX_STRINGNAME_SIZE-1 ? 263aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu OMX_MAX_STRINGNAME_SIZE-1 : name_len; 264ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 265aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu strncpy(&cname[0], name, copy_name_len); 266aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu cname[copy_name_len] = '\0'; 267ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 268aa8a53ba28b4e12dcdc08683e770d7b3fd68ff8dHo-Eun Ryu return OMX_ErrorNone; 269ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu} 270ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu 271ebfafff3d5b90857bbbe1cc38e7e7914f5c24c6bHo-Eun Ryu/* end of library symbol method and helpers */ 272