OpenMAXBellagio  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 
36 static int globalTimestamp = 0;
37 
43  int i;
44  DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
45  globalIndex = 0;
47  for (i = 0; i<MAX_COMPONENTS_TYPES_HANDLED; i++) {
50  }
51  globalComponentList = malloc(sizeof(ComponentListType*) * MAX_COMPONENTS_TYPES_HANDLED);
52  globalWaitingComponentList = malloc(sizeof(ComponentListType*) * MAX_COMPONENTS_TYPES_HANDLED);
53  memset(globalComponentList, '\0', sizeof(ComponentListType*) * MAX_COMPONENTS_TYPES_HANDLED);
54  memset(globalWaitingComponentList, '\0', sizeof(ComponentListType*) * MAX_COMPONENTS_TYPES_HANDLED);
55  DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
56  return OMX_ErrorNone;
57 }
58 
62 OMX_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;
80  globalIndex++;
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 
109 OMX_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 
246 void 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 
277 int 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  int indexComponent = -1;
489 
490  DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
491  omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
492 
493  while(listOfcomponentRegistered[i].component_name != NULL ) {
494  if (!strcmp(listOfcomponentRegistered[i].component_name, omx_base_component_Private->name)) {
495  // found component in the list of the resource manager
496  removeElemFromList(&globalComponentList[indexComponent], openmaxStandComp);
497  break;
498  }
499  i++;
500  }
501  if (indexComponent <0) {
502  // No resource to be handled
503  DEBUG(DEB_LEV_ERR, "In %s No resource to be handled\n", __func__);
504  return OMX_ErrorNone;
505  }
506  DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s\n", __func__);
507  return OMX_ErrorNone;
508 }
OMX_ERRORTYPE clearList(ComponentListType **list)
#define DEB_LEV_SIMPLE_SEQ
#define RM_SHOW_ADDRESS
NameIndexType * listOfcomponentRegistered
#define DEBUG(n, fmt, args...)
ComponentListType ** globalWaitingComponentList
OMX_BOOL
Definition: OMX_Types.h:189
#define RM_SHOW_NAME
#define DEB_LEV_ERR
OMX_ERRORTYPE(* EventHandler)(OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData)
Definition: OMX_Core.h:530
OMX_ERRORTYPE RM_Init()
OMX_ERRORTYPE RM_RegisterComponent(char *name, int max_components)
#define OMX_SendCommand(hComponent,Cmd,nParam,pCmdData)
Definition: OMX_Core.h:745
OMX_ERRORTYPE preemptComponent(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE addElemToList(ComponentListType **list, OMX_COMPONENTTYPE *openmaxStandComp, int index, OMX_BOOL bIsWaiting)
#define OMX_MAX_STRINGNAME_SIZE
Definition: OMX_Core.h:281
OMX_ERRORTYPE err
OMX_ERRORTYPE RM_getResource(OMX_COMPONENTTYPE *openmaxStandComp)
ComponentListType ** globalComponentList
OMX_ERRORTYPE RM_removeFromWaitForResource(OMX_COMPONENTTYPE *openmaxStandComp)
OMX_ERRORTYPE RM_Deinit()
OMX_PTR pComponentPrivate
#define DEB_LEV_FUNCTION_NAME
OMX_COMPONENTTYPE * openmaxStandComp
OMX_ERRORTYPE RM_waitForResource(OMX_COMPONENTTYPE *openmaxStandComp)
void RM_printList(ComponentListType *list, int viewFlag)
int numElemInList(ComponentListType *list)
OMX_ERRORTYPE RM_releaseResource(OMX_COMPONENTTYPE *openmaxStandComp)
#define MAX_COMPONENTS_TYPES_HANDLED
int searchLowerPriority(ComponentListType *list, int current_priority, ComponentListType **oldest_component_preemptable)
OMX_ERRORTYPE
Definition: OMX_Core.h:126
OMX_ERRORTYPE removeElemFromList(ComponentListType **list, OMX_COMPONENTTYPE *openmaxStandComp)

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