OpenMAX Bellagio 0.9.3
omx_reference_resource_manager.c
Go to the documentation of this file.
1
28#include <string.h>
31#include "queue.h"
32
36static int globalTimestamp = 0;
37
58
62OMX_ERRORTYPE RM_RegisterComponent(char *name, int max_components) {
63 int i = 0;
64 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
65 while (listOfcomponentRegistered[i].component_name != NULL) {
66 if (!strcmp(listOfcomponentRegistered[i].component_name, name)) {
67 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s component already registered\n", __func__);
68 return OMX_ErrorNone;
69 }
70 i++;
71 }
73 if (listOfcomponentRegistered[i].component_name == NULL) {
75 }
76 strcpy(listOfcomponentRegistered[i].component_name, name);
77 listOfcomponentRegistered[i].component_name[strlen(name)] = '\0';
79 listOfcomponentRegistered[i].max_components = max_components;
81 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
82 return OMX_ErrorNone;
83}
84
94 int i = 0;
95 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
96 while(globalComponentList[i] != NULL) {
99 i++;
100 }
101 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
102 return OMX_ErrorNone;
103}
104
109OMX_ERRORTYPE addElemToList(ComponentListType **list, OMX_COMPONENTTYPE *openmaxStandComp, int index, OMX_BOOL bIsWaiting) {
110 ComponentListType *componentTemp;
111 ComponentListType *componentNext;
112 omx_base_component_PrivateType* omx_base_component_Private;
113 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s is waiting %i\n", __func__, bIsWaiting);
114 omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
115 if (!*list) {
116 *list = malloc(sizeof(ComponentListType));
117 if (!bIsWaiting) {
118 globalComponentList[index] = *list;
119 } else {
120 globalWaitingComponentList[index] = *list;
121 }
122 if (!*list) {
123 DEBUG(DEB_LEV_ERR, "In %s OMX_ErrorInsufficientResources\n", __func__);
125 }
126 (*list)->openmaxStandComp = openmaxStandComp;
127 (*list)->timestamp = globalTimestamp;
128 globalTimestamp++;
129 (*list)->nGroupPriority = omx_base_component_Private->nGroupPriority;
130 (*list)->next = NULL;
131 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
132 return OMX_ErrorNone;
133 }
134 componentTemp = *list;
135 while(componentTemp->next) {
136 componentTemp = componentTemp->next;
137 }
138 componentNext = malloc(sizeof(ComponentListType));
139 if (!componentNext) {
140 DEBUG(DEB_LEV_ERR, "In %s OMX_ErrorInsufficientResources\n", __func__);
142 }
143 componentTemp->next = componentNext;
144 componentNext->next = NULL;
145 componentNext->openmaxStandComp = openmaxStandComp;
146 componentNext->timestamp = globalTimestamp;
147 globalTimestamp++;
148 componentNext->nGroupPriority = omx_base_component_Private->nGroupPriority;
149 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
150 return OMX_ErrorNone;
151}
152
158 ComponentListType *componentTemp;
159 ComponentListType *componentPrev;
160 OMX_BOOL bFound = OMX_FALSE;
161
162 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s list %p\n", __func__, *list);
163 if (!*list) {
164 DEBUG(DEB_LEV_ERR, "In %s, the resource manager is not initialized\n", __func__);
165 return OMX_ErrorUndefined;
166 }
167 componentTemp = *list;
168 componentPrev = *list;
169 while(componentTemp) {
170 if (componentTemp->openmaxStandComp == openmaxStandComp) {
171 if (componentTemp == *list) {
172 *list = (*list)->next;
173 free(componentTemp);
174 } else {
175 componentPrev->next = componentTemp->next;
176 free(componentTemp);
177 }
178 bFound = OMX_TRUE;
179 break;
180 } else {
181 if (componentTemp != *list) {
182 componentPrev = componentPrev->next;
183 }
184 componentTemp = componentTemp->next;
185 }
186 }
187 if(!bFound) {
188 DEBUG(DEB_LEV_ERR, "In %s, the specified component does not exist\n", __func__);
190 }
191 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
192 return OMX_ErrorNone;
193
194}
195
196
203 ComponentListType *componentTemp;
204 int numElem = 0;
205 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
206 if (!list) {
207 DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s, no list no elements\n", __func__);
208 return 0;
209 }
210 componentTemp = list;
211 while(componentTemp) {
212 numElem++;
213 componentTemp = componentTemp->next;
214 }
215 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
216 return numElem;
217}
218
224 ComponentListType *componentTemp;
225 ComponentListType *componentPrev;
226 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
227 if (!*list) {
228 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s, no list no elements\n", __func__);
229 return OMX_ErrorNone;
230 }
231 componentTemp = *list;
232 while(componentTemp) {
233 componentPrev = componentTemp;
234 componentTemp = componentTemp->next;
235 free(componentPrev);
236 }
237 *list = NULL;
238 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
239 return OMX_ErrorNone;
240}
241
246void RM_printList(ComponentListType *list, int viewFlag) {
247 ComponentListType *componentTemp = list;
248 omx_base_component_PrivateType* omx_base_component_Private;
249 int index;
250
251 if (!list) {
252 printf("The list is empty\n");
253 return;
254 }
255 index = 0;
256 while (componentTemp) {
257 omx_base_component_Private = (omx_base_component_PrivateType*)componentTemp->openmaxStandComp->pComponentPrivate;
258 if ((viewFlag & RM_SHOW_NAME) == RM_SHOW_NAME) {
259 printf("Name %s ", omx_base_component_Private->name);
260 }
261 if ((viewFlag & RM_SHOW_ADDRESS) == RM_SHOW_ADDRESS) {
262 printf("Address %p ", componentTemp->openmaxStandComp);
263 }
264 printf("\n");
265 index++;
266 componentTemp = componentTemp->next;
267 }
268}
269
277int searchLowerPriority(ComponentListType *list, int current_priority, ComponentListType **oldest_component_preemptable) {
278 ComponentListType *componentTemp;
279 ComponentListType *componentCandidate;
280 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
281 int nComp = 0;
282 if (!list) {
283 DEBUG(DEB_LEV_ERR, "In %s no list\n", __func__);
284 return OMX_ErrorUndefined;
285 }
286 componentTemp = list;
287 componentCandidate = NULL;
288 while (componentTemp) {
289 if (componentTemp->nGroupPriority > current_priority) {
290 nComp++;
291 }
292 if (nComp>0) {
293 if (componentCandidate) {
294 if (componentCandidate->timestamp > componentTemp->timestamp) {
295 componentCandidate = componentTemp;
296 }
297 } else {
298 componentCandidate = componentTemp;
299 }
300 }
301 componentTemp = componentTemp->next;
302 }
303 *oldest_component_preemptable = componentCandidate;
304 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
305 return nComp;
306}
307
314 omx_base_component_PrivateType* omx_base_component_Private = openmaxStandComp->pComponentPrivate;
315
316 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
317
318 if (omx_base_component_Private->state == OMX_StateIdle) {
319 (*(omx_base_component_Private->callbacks->EventHandler))
320 (openmaxStandComp, omx_base_component_Private->callbackData,
322 err = OMX_SendCommand(openmaxStandComp, OMX_CommandStateSet, OMX_StateLoaded, NULL);
323 if (err != OMX_ErrorNone) {
324 DEBUG(DEB_LEV_ERR, "In %s, the state cannot be changed\n", __func__);
325 return OMX_ErrorUndefined;
326 }
327 } else if ((omx_base_component_Private->state == OMX_StateExecuting) || (omx_base_component_Private->state == OMX_StatePause)) {
328 // TODO fill also this section that cover the preemption of a running component
329 // send OMX_ErrorResourcesPreempted
330 // change state to Idle
331 // send OMX_ErrorResourcesLost
332 // change state to Loaded
333 }
334 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
335 return OMX_ErrorNone;
336}
337
345 ComponentListType *componentCandidate;
346 omx_base_component_PrivateType* omx_base_component_Private;
347 int candidates;
349 int i = 0;
350 int indexComponent = -1;
351
352 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
353 omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
354 while(listOfcomponentRegistered[i].component_name != NULL ) {
355 if (!strcmp(listOfcomponentRegistered[i].component_name, omx_base_component_Private->name)) {
356 // found component in the list of the resource manager
357 indexComponent = listOfcomponentRegistered[i].index;
358 break;
359 }
360 i++;
361 }
362 if (indexComponent <0) {
363 // No resource to be handled
364 DEBUG(DEB_LEV_ERR, "In %s No resource to be handled\n", __func__);
365 return OMX_ErrorNone;
366 }
367 if (numElemInList(globalComponentList[indexComponent]) >= listOfcomponentRegistered[i].max_components) {
368 candidates = searchLowerPriority(globalComponentList[indexComponent], omx_base_component_Private->nGroupPriority, &componentCandidate);
369 if (candidates) {
370 DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s candidates %i winner %p\n", __func__, candidates, componentCandidate->openmaxStandComp);
371 err = preemptComponent(componentCandidate->openmaxStandComp);
372 if (err != OMX_ErrorNone) {
373 DEBUG(DEB_LEV_ERR, "In %s the component cannot be preempted\n", __func__);
375 } else {
376 err = removeElemFromList(&globalComponentList[indexComponent], componentCandidate->openmaxStandComp);
377 err = addElemToList(&globalComponentList[indexComponent], openmaxStandComp, indexComponent, OMX_FALSE);
378 if (err != OMX_ErrorNone) {
379 DEBUG(DEB_LEV_ERR, "In %s memory error\n", __func__);
381 }
382 }
383 } else {
384 DEBUG(DEB_LEV_SIMPLE_SEQ, "Out of %s with insufficient resources\n", __func__);
386 }
387
388 } else {
389 err = addElemToList(&globalComponentList[indexComponent], openmaxStandComp, indexComponent, OMX_FALSE);
390 }
391 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
392 return OMX_ErrorNone;
393}
394
400 omx_base_component_PrivateType* omx_base_component_Private;
401 OMX_COMPONENTTYPE *openmaxWaitingComp;
403
404 int i = 0;
405 int indexComponent = -1;
406
407 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
408 omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
409
410 while(listOfcomponentRegistered[i].component_name != NULL ) {
411 if (!strcmp(listOfcomponentRegistered[i].component_name, omx_base_component_Private->name)) {
412 // found component in the list of the resource manager
413 indexComponent = listOfcomponentRegistered[i].index;
414 break;
415 }
416 i++;
417 }
418 if (indexComponent <0) {
419 // No resource to be handled
420 DEBUG(DEB_LEV_ERR, "In %s No resource to be handled\n", __func__);
421 return OMX_ErrorNone;
422 }
423 if (!globalComponentList[indexComponent]) {
424 DEBUG(DEB_LEV_ERR, "In %s, the resource manager is not initialized\n", __func__);
425 return OMX_ErrorUndefined;
426 }
427 err = removeElemFromList(&globalComponentList[indexComponent], openmaxStandComp);
428 if (err != OMX_ErrorNone) {
429 DEBUG(DEB_LEV_ERR, "In %s, the resource cannot be released\n", __func__);
430 return OMX_ErrorUndefined;
431 }
432 if(numElemInList(globalWaitingComponentList[indexComponent])) {
433 openmaxWaitingComp = globalWaitingComponentList[indexComponent]->openmaxStandComp;
434 removeElemFromList(&globalWaitingComponentList[indexComponent], openmaxWaitingComp);
435 err = OMX_SendCommand(openmaxWaitingComp, OMX_CommandStateSet, OMX_StateIdle, NULL);
436 if (err != OMX_ErrorNone) {
437 DEBUG(DEB_LEV_ERR, "In %s, the state cannot be changed\n", __func__);
438 }
439 }
440
441 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
442 return OMX_ErrorNone;
443}
444
452 omx_base_component_PrivateType* omx_base_component_Private;
453
454 int i = 0;
455 int indexComponent = -1;
456
457 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
458 omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
459
460 while(listOfcomponentRegistered[i].component_name != NULL ) {
461 if (!strcmp(listOfcomponentRegistered[i].component_name, omx_base_component_Private->name)) {
462 // found component in the list of the resource manager
463 indexComponent = listOfcomponentRegistered[i].index;
464 break;
465 }
466 i++;
467 }
468 if (indexComponent <0) {
469 // No resource to be handled
470 DEBUG(DEB_LEV_ERR, "In %s No resource to be handled\n", __func__);
471 return OMX_ErrorNone;
472 }
473
474 addElemToList(&globalWaitingComponentList[indexComponent], openmaxStandComp, listOfcomponentRegistered[i].index, OMX_TRUE);
475
476 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
477 return OMX_ErrorNone;
478}
479
486 omx_base_component_PrivateType* omx_base_component_Private;
487 int i = 0;
488
489 DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
490 omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
491
492 while(listOfcomponentRegistered[i].component_name != NULL ) {
493 if (!strcmp(listOfcomponentRegistered[i].component_name, omx_base_component_Private->name)) {
494 // found component in the list of the resource manager
495 removeElemFromList(&globalComponentList[i], openmaxStandComp);
496 DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
497 return OMX_ErrorNone;
498 }
499 i++;
500 }
501 // No resource to be handled
502 DEBUG(DEB_LEV_ERR, "In %s No resource to be handled\n", __func__);
503 return OMX_ErrorNone;
504}
#define OMX_MAX_STRINGNAME_SIZE
Definition OMX_Core.h:281
OMX_ERRORTYPE
Definition OMX_Core.h:127
@ OMX_ErrorInsufficientResources
Definition OMX_Core.h:131
@ OMX_ErrorNone
Definition OMX_Core.h:128
@ OMX_ErrorUndefined
Definition OMX_Core.h:134
@ OMX_ErrorComponentNotFound
Definition OMX_Core.h:140
@ OMX_ErrorResourcesLost
Definition OMX_Core.h:172
OMX_BOOL
Definition OMX_Types.h:189
@ OMX_TRUE
Definition OMX_Types.h:191
@ OMX_FALSE
Definition OMX_Types.h:190
#define OMX_SendCommand( hComponent, Cmd, nParam, pCmdData)
Definition OMX_Core.h:745
@ OMX_StateExecuting
Definition OMX_Core.h:105
@ OMX_StateLoaded
Definition OMX_Core.h:97
@ OMX_StateIdle
Definition OMX_Core.h:102
@ OMX_StatePause
Definition OMX_Core.h:107
@ OMX_EventError
Definition OMX_Core.h:482
@ OMX_CommandStateSet
Definition OMX_Core.h:51
#define DEB_LEV_FUNCTION_NAME
#define DEB_LEV_ERR
#define DEB_LEV_SIMPLE_SEQ
#define DEBUG(n, fmt, args...)
OMX_ERRORTYPE addElemToList(ComponentListType **list, OMX_COMPONENTTYPE *openmaxStandComp, int index, OMX_BOOL bIsWaiting)
OMX_ERRORTYPE RM_RegisterComponent(char *name, int max_components)
int searchLowerPriority(ComponentListType *list, int current_priority, ComponentListType **oldest_component_preemptable)
OMX_ERRORTYPE RM_removeFromWaitForResource(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE RM_getResource(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE clearList(ComponentListType **list)
OMX_ERRORTYPE RM_Init()
OMX_ERRORTYPE RM_releaseResource(OMX_COMPONENTTYPE *openmaxStandComp)
void RM_printList(ComponentListType *list, int viewFlag)
int numElemInList(ComponentListType *list)
OMX_ERRORTYPE removeElemFromList(ComponentListType **list, OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE preemptComponent(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE RM_Deinit()
OMX_ERRORTYPE RM_waitForResource(OMX_COMPONENTTYPE *openmaxStandComp)
ComponentListType ** globalComponentList
#define MAX_COMPONENTS_TYPES_HANDLED
#define RM_SHOW_ADDRESS
ComponentListType ** globalWaitingComponentList
NameIndexType * listOfcomponentRegistered
OMX_ERRORTYPE err
OMX_COMPONENTTYPE * openmaxStandComp
OMX_ERRORTYPE(* EventHandler)(OMX_HANDLETYPE hComponent, OMX_PTR pAppData, OMX_EVENTTYPE eEvent, OMX_U32 nData1, OMX_U32 nData2, OMX_PTR pEventData)
Definition OMX_Core.h:530

Generated for OpenMAX Bellagio rel. 0.9.3 by  doxygen 1.5.1
SourceForge.net Logo