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