• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * cmodule.cpp, component module interface class
3  *
4  * Copyright (c) 2009-2010 Wind River Systems, Inc.
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 #include <stdio.h>
20 #include <stdlib.h>
21 #include <string.h>
22 
23 #include <OMX_Core.h>
24 
25 #include <cmodule.h>
26 #include <componentbase.h>
27 
28 #define LOG_TAG "cmodule"
29 #include <log.h>
30 
31 /*
32  * constructor / deconstructor
33  */
CModule(const OMX_STRING lname)34 CModule::CModule(const OMX_STRING lname)
35 {
36     module = NULL;
37     wrs_omxil_cmodule = NULL;
38 
39     roles = NULL;
40     nr_roles = 0;
41 
42     memset(cname, 0, OMX_MAX_STRINGNAME_SIZE);
43 
44     memset(this->lname, 0, OMX_MAX_STRINGNAME_SIZE);
45    // strncpy(this->name, name, OMX_MAX_STRINGNAME_SIZE);
46     strncpy(this->lname, lname, (strlen(lname) < OMX_MAX_STRINGNAME_SIZE) ? strlen(lname) : (OMX_MAX_STRINGNAME_SIZE-1));
47     this->lname[OMX_MAX_STRINGNAME_SIZE-1] = '\0';
48 }
49 
~CModule()50 CModule::~CModule()
51 {
52     if (module) {
53         int ref_count;
54 
55         while ((ref_count = Unload()));
56     }
57 
58     if (roles) {
59         if (roles[0])
60             free(roles[0]);
61         free(roles);
62     }
63 }
64 
65 /* end of constructor / deconstructor */
66 
67 /*
68  * library loading / unloading
69  */
Load(int flag)70 OMX_ERRORTYPE CModule::Load(int flag)
71 {
72     struct module *m;
73 
74     m = module_open(lname, flag);
75     if (!m) {
76         LOGE("module not founded (%s)\n", lname);
77         return OMX_ErrorComponentNotFound;
78     }
79 
80     if (m == module)
81         return OMX_ErrorNone;
82 
83     wrs_omxil_cmodule = (struct wrs_omxil_cmodule_s *)
84         module_symbol(m, WRS_OMXIL_CMODULE_SYMBOL_STRING);
85     if (!wrs_omxil_cmodule) {
86         LOGE("module %s symbol not founded (%s)\n",
87              lname, WRS_OMXIL_CMODULE_SYMBOL_STRING);
88 
89         module_close(m);
90         return OMX_ErrorInvalidComponent;
91     }
92 
93     if (module)
94         LOGE("module %s will be overwrite",module->name);
95     module = m;
96     LOGI("module %s successfully loaded\n", lname);
97 
98     return OMX_ErrorNone;
99 }
100 
Unload(void)101 OMX_U32 CModule::Unload(void)
102 {
103     int ref_count;
104 
105     ref_count = module_close(module);
106     if (!ref_count) {
107         module = NULL;
108         wrs_omxil_cmodule = NULL;
109 
110         LOGI("module %s successfully unloaded\n", lname);
111     }
112 
113     return ref_count;
114 }
115 
116 /* end of library loading / unloading */
117 
118 /*
119  * accessor
120  */
GetLibraryName(void)121 OMX_STRING CModule::GetLibraryName(void)
122 {
123     return lname;
124 }
125 
GetComponentName(void)126 OMX_STRING CModule::GetComponentName(void)
127 {
128     return cname;
129 }
130 
GetComponentRoles(OMX_U32 * nr_roles,OMX_U8 ** roles)131 OMX_ERRORTYPE CModule::GetComponentRoles(OMX_U32 *nr_roles, OMX_U8 **roles)
132 {
133     OMX_U32 i;
134     OMX_U32 this_nr_roles = this->nr_roles;
135 
136     if (!roles) {
137         *nr_roles = this_nr_roles;
138         return OMX_ErrorNone;
139     }
140 
141     if (!nr_roles || (*nr_roles != this_nr_roles))
142         return OMX_ErrorBadParameter;
143 
144     for (i = 0; i < this_nr_roles; i++) {
145         if (!roles[i])
146             break;
147 
148         if (roles && roles[i])
149             strncpy((OMX_STRING)&roles[i][0],
150                     (const OMX_STRING)&this->roles[i][0],
151                     OMX_MAX_STRINGNAME_SIZE);
152     }
153 
154     if (i != this_nr_roles)
155         return OMX_ErrorBadParameter;
156 
157     *nr_roles = this_nr_roles;
158     return OMX_ErrorNone;
159 }
160 
QueryHavingThisRole(const OMX_STRING role)161 bool CModule::QueryHavingThisRole(const OMX_STRING role)
162 {
163     OMX_U32 i;
164 
165     if (!roles || !role)
166         return false;
167 
168     for (i = 0; i < nr_roles; i++) {
169         if (!strcmp((OMX_STRING)&roles[i][0], role))
170             return true;
171     }
172 
173     return false;
174 }
175 
176 /* end of accessor */
177 
178 /*
179  * library symbol method and helpers
180  */
InstantiateComponent(ComponentBase ** instance)181 OMX_ERRORTYPE CModule::InstantiateComponent(ComponentBase **instance)
182 {
183     ComponentBase *cbase;
184     OMX_ERRORTYPE ret;
185 
186     if (!instance)
187         return OMX_ErrorBadParameter;
188     *instance = NULL;
189 
190     if (!wrs_omxil_cmodule)
191         return OMX_ErrorUndefined;
192 
193     ret = wrs_omxil_cmodule->ops->instantiate((void **)&cbase);
194     if (ret != OMX_ErrorNone) {
195         LOGE("%s failed to instantiate()\n", lname);
196         return ret;
197     }
198 
199     cbase->SetCModule(this);
200     cbase->SetName(cname);
201     ret = cbase->SetRolesOfComponent(nr_roles, (const OMX_U8 **)roles);
202     if (ret != OMX_ErrorNone) {
203         delete cbase;
204         return ret;
205     }
206 
207     *instance = cbase;
208     return OMX_ErrorNone;
209 }
210 
QueryComponentNameAndRoles(void)211 OMX_ERRORTYPE CModule::QueryComponentNameAndRoles(void)
212 {
213     const char *name;
214     OMX_U32 name_len;
215     OMX_U32 copy_name_len;
216 
217     const OMX_U8 **roles;
218     OMX_U32 nr_roles;
219     OMX_U32 role_len;
220     OMX_U32 copy_role_len;
221     OMX_U8 **this_roles;
222 
223     OMX_U32 i;
224 
225     if (this->roles)
226         return OMX_ErrorNone;
227 
228     if (!wrs_omxil_cmodule)
229         return OMX_ErrorUndefined;
230 
231     roles = (const OMX_U8 **)wrs_omxil_cmodule->roles;
232     nr_roles = wrs_omxil_cmodule->nr_roles;
233 
234     this_roles = (OMX_U8 **)malloc(sizeof(OMX_STRING) * nr_roles);
235     if (!this_roles)
236         return OMX_ErrorInsufficientResources;
237 
238     this_roles[0] = (OMX_U8 *)malloc(OMX_MAX_STRINGNAME_SIZE * nr_roles);
239     if (!this_roles[0]) {
240         free(this_roles);
241         return OMX_ErrorInsufficientResources;
242     }
243 
244     for (i = 0; i < nr_roles; i++) {
245         if (i < nr_roles - 1)
246             this_roles[i+1] = this_roles[i] + OMX_MAX_STRINGNAME_SIZE;
247 
248         role_len = strlen((const OMX_STRING)&roles[i][0]);
249         copy_role_len = role_len > OMX_MAX_STRINGNAME_SIZE-1 ?
250             OMX_MAX_STRINGNAME_SIZE-1 : role_len;
251 
252         strncpy((OMX_STRING)&this_roles[i][0],
253                 (const OMX_STRING)&roles[i][0], copy_role_len);
254         this_roles[i][copy_role_len] = '\0';
255     }
256 
257     this->roles = this_roles;
258     this->nr_roles = nr_roles;
259 
260     name = wrs_omxil_cmodule->name;
261     name_len = strlen(name);
262     copy_name_len = name_len > OMX_MAX_STRINGNAME_SIZE-1 ?
263         OMX_MAX_STRINGNAME_SIZE-1 : name_len;
264 
265     strncpy(&cname[0], name, copy_name_len);
266     cname[copy_name_len] = '\0';
267 
268     return OMX_ErrorNone;
269 }
270 
271 /* end of library symbol method and helpers */
272