OpenMAXBellagio 0.9.3
omx_base_component.c
Go to the documentation of this file.
00001 
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030 
00031 #include <OMX_Core.h>
00032 #include <OMX_Component.h>
00033 
00034 #include "omx_base_component.h"
00035 #include <omx_reference_resource_manager.h>
00036 
00037 #include "tsemaphore.h"
00038 #include "queue.h"
00039 
00044 void base_constructor_remove_garbage_collected(omx_base_component_PrivateType* omx_base_component_Private) {
00045     if (omx_base_component_Private->flush_condition) {
00046         tsem_deinit(omx_base_component_Private->flush_condition);
00047         free(omx_base_component_Private->flush_condition);
00048     }
00049     if (omx_base_component_Private->flush_all_condition) {
00050         tsem_deinit(omx_base_component_Private->flush_all_condition);
00051         free(omx_base_component_Private->flush_all_condition);
00052     }
00053     if (omx_base_component_Private->bellagioThreads) {
00054         free(omx_base_component_Private->bellagioThreads);
00055     }
00056     if (omx_base_component_Private->name) {
00057         free(omx_base_component_Private->name);
00058     }
00059     if (omx_base_component_Private->bStateSem) {
00060         tsem_deinit(omx_base_component_Private->bStateSem);
00061         free(omx_base_component_Private->bStateSem);
00062     }
00063     if (omx_base_component_Private->bMgmtSem) {
00064         tsem_deinit(omx_base_component_Private->bMgmtSem);
00065         free(omx_base_component_Private->bMgmtSem);
00066     }
00067     if (omx_base_component_Private->messageSem) {
00068         tsem_deinit(omx_base_component_Private->messageSem);
00069         free(omx_base_component_Private->messageSem);
00070     }
00071     if (omx_base_component_Private->messageQueue) {
00072         queue_deinit(omx_base_component_Private->messageQueue);
00073         free(omx_base_component_Private->messageQueue);
00074     }
00075     if (omx_base_component_Private) {
00076         free(omx_base_component_Private);
00077     }
00078 }
00095 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_Constructor(OMX_COMPONENTTYPE *openmaxStandComp,OMX_STRING cComponentName) {
00096     omx_base_component_PrivateType* omx_base_component_Private;
00097     OMX_U32 i;
00098     int err;
00099 
00100     DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, openmaxStandComp);
00101 
00102     if (openmaxStandComp->pComponentPrivate) {
00103         omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
00104     } else {
00105         omx_base_component_Private = calloc(1,sizeof(omx_base_component_PrivateType));
00106         if (!omx_base_component_Private) {
00107             return OMX_ErrorInsufficientResources;
00108         }
00109     }
00110 
00111     if(!omx_base_component_Private->messageQueue) {
00112         omx_base_component_Private->messageQueue = calloc(1,sizeof(queue_t));
00113         if (!omx_base_component_Private->messageQueue) {
00114             base_constructor_remove_garbage_collected(omx_base_component_Private);
00115             return OMX_ErrorInsufficientResources;
00116         }
00117         err = queue_init(omx_base_component_Private->messageQueue);
00118         if (err != 0) {
00119             base_constructor_remove_garbage_collected(omx_base_component_Private);
00120             return OMX_ErrorInsufficientResources;
00121         }
00122     }
00123 
00124     if(!omx_base_component_Private->messageSem) {
00125         omx_base_component_Private->messageSem = calloc(1,sizeof(tsem_t));
00126         if (!omx_base_component_Private->messageSem) {
00127             base_constructor_remove_garbage_collected(omx_base_component_Private);
00128             return OMX_ErrorInsufficientResources;
00129         }
00130         err = tsem_init(omx_base_component_Private->messageSem, 0);
00131         if (err != 0) {
00132             base_constructor_remove_garbage_collected(omx_base_component_Private);
00133             return OMX_ErrorInsufficientResources;
00134         }
00135     }
00136     if(!omx_base_component_Private->bMgmtSem) {
00137         omx_base_component_Private->bMgmtSem = calloc(1,sizeof(tsem_t));
00138         if (!omx_base_component_Private->bMgmtSem) {
00139             base_constructor_remove_garbage_collected(omx_base_component_Private);
00140             return OMX_ErrorInsufficientResources;
00141         }
00142         err = tsem_init(omx_base_component_Private->bMgmtSem, 0);
00143         if (err != 0) {
00144             base_constructor_remove_garbage_collected(omx_base_component_Private);
00145             return OMX_ErrorInsufficientResources;
00146         }
00147     }
00148 
00149     if(!omx_base_component_Private->bStateSem) {
00150         omx_base_component_Private->bStateSem = calloc(1,sizeof(tsem_t));
00151         if (!omx_base_component_Private->bStateSem) {
00152             base_constructor_remove_garbage_collected(omx_base_component_Private);
00153             return OMX_ErrorInsufficientResources;
00154         }
00155         err = tsem_init(omx_base_component_Private->bStateSem, 0);
00156         if (err != 0) {
00157             base_constructor_remove_garbage_collected(omx_base_component_Private);
00158             return OMX_ErrorInsufficientResources;
00159         }
00160     }
00161 
00162     openmaxStandComp->nSize = sizeof(OMX_COMPONENTTYPE);
00163     openmaxStandComp->pApplicationPrivate = NULL;
00164     openmaxStandComp->GetComponentVersion = omx_base_component_GetComponentVersion;
00165     openmaxStandComp->SendCommand = omx_base_component_SendCommand;
00166     openmaxStandComp->GetParameter = omx_base_component_GetParameter;
00167     openmaxStandComp->SetParameter = omx_base_component_SetParameter;
00168     openmaxStandComp->GetConfig = omx_base_component_GetConfig;
00169     openmaxStandComp->SetConfig = omx_base_component_SetConfig;
00170     openmaxStandComp->GetExtensionIndex = omx_base_component_GetExtensionIndex;
00171     openmaxStandComp->GetState = omx_base_component_GetState;
00172     openmaxStandComp->SetCallbacks = omx_base_component_SetCallbacks;
00173     openmaxStandComp->ComponentDeInit = omx_base_component_ComponentDeInit;
00174     openmaxStandComp->ComponentRoleEnum = omx_base_component_ComponentRoleEnum;
00175     openmaxStandComp->ComponentTunnelRequest =omx_base_component_ComponentTunnelRequest;
00176 
00177     /*Will make Specific port Allocate buffer call*/
00178     openmaxStandComp->AllocateBuffer = omx_base_component_AllocateBuffer;
00179     openmaxStandComp->UseBuffer = omx_base_component_UseBuffer;
00180     openmaxStandComp->UseEGLImage = omx_base_component_UseEGLImage;
00181     openmaxStandComp->FreeBuffer = omx_base_component_FreeBuffer;
00182     openmaxStandComp->EmptyThisBuffer = omx_base_component_EmptyThisBuffer;
00183     openmaxStandComp->FillThisBuffer = omx_base_component_FillThisBuffer;
00184 
00185     openmaxStandComp->nVersion.s.nVersionMajor = SPECVERSIONMAJOR;
00186     openmaxStandComp->nVersion.s.nVersionMinor = SPECVERSIONMINOR;
00187     openmaxStandComp->nVersion.s.nRevision = SPECREVISION;
00188     openmaxStandComp->nVersion.s.nStep = SPECSTEP;
00189 
00190     omx_base_component_Private->name = calloc(1,OMX_MAX_STRINGNAME_SIZE);
00191     if (!omx_base_component_Private->name) {
00192         base_constructor_remove_garbage_collected(omx_base_component_Private);
00193         return OMX_ErrorInsufficientResources;
00194     }
00195     strcpy(omx_base_component_Private->name,cComponentName);
00196     omx_base_component_Private->state = OMX_StateLoaded;
00197     omx_base_component_Private->transientState = OMX_TransStateMax;
00198     omx_base_component_Private->callbacks = NULL;
00199     omx_base_component_Private->callbackData = NULL;
00200     omx_base_component_Private->nGroupPriority = 100;
00201     omx_base_component_Private->nGroupID = 0;
00202     omx_base_component_Private->pMark.hMarkTargetComponent = NULL;
00203     omx_base_component_Private->pMark.pMarkData            = NULL;
00204     omx_base_component_Private->openmaxStandComp = openmaxStandComp;
00205     omx_base_component_Private->DoStateSet = &omx_base_component_DoStateSet;
00206     omx_base_component_Private->messageHandler = omx_base_component_MessageHandler;
00207     omx_base_component_Private->destructor = omx_base_component_Destructor;
00208     omx_base_component_Private->getQualityLevel = omx_base_getQualityLevel;
00209     omx_base_component_Private->setQualityLevel = omx_base_setQualityLevel;
00210     omx_base_component_Private->currentQualityLevel = 0;
00211     omx_base_component_Private->nqualitylevels = 0;
00212     omx_base_component_Private->bufferMgmtThreadID = -1;
00213     omx_base_component_Private->bellagioThreads = calloc(1, sizeof(OMX_PARAM_BELLAGIOTHREADS_ID));
00214     if (omx_base_component_Private->bellagioThreads == NULL) {
00215         base_constructor_remove_garbage_collected(omx_base_component_Private);
00216         return OMX_ErrorInsufficientResources;
00217     }
00218     omx_base_component_Private->bellagioThreads->nThreadBufferMngtID = 0;
00219     omx_base_component_Private->bellagioThreads->nThreadMessageID = 0;
00220     omx_base_component_Private->bIsEOSReached = OMX_FALSE;
00221 
00222     pthread_mutex_init(&omx_base_component_Private->flush_mutex, NULL);
00223 
00224     if(!omx_base_component_Private->flush_all_condition) {
00225         omx_base_component_Private->flush_all_condition = calloc(1,sizeof(tsem_t));
00226         if(!omx_base_component_Private->flush_all_condition) {
00227             base_constructor_remove_garbage_collected(omx_base_component_Private);
00228             return OMX_ErrorInsufficientResources;
00229         }
00230         err = tsem_init(omx_base_component_Private->flush_all_condition, 0);
00231         if (err != 0) {
00232             base_constructor_remove_garbage_collected(omx_base_component_Private);
00233             return OMX_ErrorInsufficientResources;
00234         }
00235     }
00236 
00237     if(!omx_base_component_Private->flush_condition) {
00238         omx_base_component_Private->flush_condition = calloc(1,sizeof(tsem_t));
00239         if(!omx_base_component_Private->flush_condition) {
00240             base_constructor_remove_garbage_collected(omx_base_component_Private);
00241             return OMX_ErrorInsufficientResources;
00242         }
00243         err = tsem_init(omx_base_component_Private->flush_condition, 0);
00244         if (err != 0) {
00245             base_constructor_remove_garbage_collected(omx_base_component_Private);
00246             return OMX_ErrorInsufficientResources;
00247         }
00248     }
00249 
00250     for(i=0;i<NUM_DOMAINS;i++) {
00251         memset(&omx_base_component_Private->sPortTypesParam[i], 0, sizeof(OMX_PORT_PARAM_TYPE));
00252         setHeader(&omx_base_component_Private->sPortTypesParam[i], sizeof(OMX_PORT_PARAM_TYPE));
00253     }
00254 
00255     err = pthread_create(&omx_base_component_Private->messageHandlerThread, NULL, compMessageHandlerFunction, openmaxStandComp);
00256     if (err) {
00257         base_constructor_remove_garbage_collected(omx_base_component_Private);
00258         return OMX_ErrorInsufficientResources;
00259     }
00260     DEBUG(DEB_LEV_FUNCTION_NAME,"Out of %s for component %p\n", __func__, openmaxStandComp);
00261     return OMX_ErrorNone;
00262 }
00263 
00271 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) {
00272   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
00273   int err;
00274   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, openmaxStandComp);
00275   omx_base_component_Private->state = OMX_StateInvalid;
00276   omx_base_component_Private->callbacks=NULL;
00277 
00278   /*Send Dummy signal to Component Message handler to exit*/
00279   tsem_up(omx_base_component_Private->messageSem);
00280 
00281   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s before pthread_detach\n", __func__);
00282   err = pthread_detach(omx_base_component_Private->messageHandlerThread);
00283   if(err!=0) {
00284     DEBUG(DEB_LEV_FUNCTION_NAME,"In %s pthread_detach returned err=%d\n", __func__, err);
00285   }
00286   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s after pthread_detach\n", __func__);
00287   /*Deinitialize and free message queue*/
00288   if(omx_base_component_Private->messageQueue) {
00289     queue_deinit(omx_base_component_Private->messageQueue);
00290     free(omx_base_component_Private->messageQueue);
00291     omx_base_component_Private->messageQueue=NULL;
00292   }
00293 
00294 
00295   /*Deinitialize and free buffer management semaphore*/
00296   if(omx_base_component_Private->bMgmtSem){
00297     tsem_deinit(omx_base_component_Private->bMgmtSem);
00298     free(omx_base_component_Private->bMgmtSem);
00299     omx_base_component_Private->bMgmtSem=NULL;
00300   }
00301 
00302   /*Deinitialize and free message semaphore*/
00303   if(omx_base_component_Private->messageSem) {
00304     tsem_deinit(omx_base_component_Private->messageSem);
00305     free(omx_base_component_Private->messageSem);
00306     omx_base_component_Private->messageSem=NULL;
00307   }
00308 
00309   if(omx_base_component_Private->bStateSem){
00310     tsem_deinit(omx_base_component_Private->bStateSem);
00311     free(omx_base_component_Private->bStateSem);
00312     omx_base_component_Private->bStateSem=NULL;
00313   }
00314 
00315   if(omx_base_component_Private->name){
00316     free(omx_base_component_Private->name);
00317     omx_base_component_Private->name=NULL;
00318   }
00319 
00320   pthread_mutex_destroy(&omx_base_component_Private->flush_mutex);
00321 
00322   if(omx_base_component_Private->flush_all_condition){
00323     tsem_deinit(omx_base_component_Private->flush_all_condition);
00324     free(omx_base_component_Private->flush_all_condition);
00325     omx_base_component_Private->flush_all_condition=NULL;
00326   }
00327 
00328   if(omx_base_component_Private->flush_condition){
00329     tsem_deinit(omx_base_component_Private->flush_condition);
00330     free(omx_base_component_Private->flush_condition);
00331     omx_base_component_Private->flush_condition=NULL;
00332   }
00333 
00334   DEBUG(DEB_LEV_FUNCTION_NAME,"Out of %s for component %p\n", __func__, openmaxStandComp);
00335   return OMX_ErrorNone;
00336 }
00337 
00346 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_ComponentDeInit(
00347   OMX_HANDLETYPE hComponent) {
00348   OMX_COMPONENTTYPE *openmaxStandComp = (OMX_COMPONENTTYPE *)hComponent;
00349   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
00350   DEBUG(DEB_LEV_FUNCTION_NAME,"In %s for component %p\n", __func__, openmaxStandComp);
00351 
00352   omx_base_component_Private->destructor(openmaxStandComp);
00353 
00354   free(openmaxStandComp->pComponentPrivate);
00355   openmaxStandComp->pComponentPrivate=NULL;
00356   DEBUG(DEB_LEV_FUNCTION_NAME,"Out of %s for component %p\n", __func__, openmaxStandComp);
00357   return OMX_ErrorNone;
00358 }
00359 
00370 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_DoStateSet(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32 destinationState) {
00371   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
00372   omx_base_PortType *pPort;
00373   OMX_U32 i,j,k;
00374   OMX_ERRORTYPE err=OMX_ErrorNone;
00375   OMX_BOOL bExit = OMX_FALSE;
00376 
00377   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, openmaxStandComp);
00378   DEBUG(DEB_LEV_PARAMS, "Changing state from %i to %i\n", omx_base_component_Private->state, (int)destinationState);
00379 
00380   if (omx_base_component_Private->state == OMX_StateLoaded && destinationState == OMX_StateIdle) {
00381       err = RM_getResource(openmaxStandComp);
00382       if (err != OMX_ErrorNone) {
00383           return OMX_ErrorInsufficientResources;
00384       }
00385   }
00386   if (omx_base_component_Private->state == OMX_StateIdle && destinationState == OMX_StateLoaded) {
00387       RM_releaseResource(openmaxStandComp);
00388   }
00389 
00390   if(destinationState == OMX_StateLoaded){
00391     switch(omx_base_component_Private->state){
00392     case OMX_StateInvalid:
00393       err = OMX_ErrorInvalidState;
00394       break;
00395     case OMX_StateWaitForResources:
00396       /* return back from wait for resources */
00397         RM_removeFromWaitForResource(openmaxStandComp);
00398       omx_base_component_Private->state = OMX_StateLoaded;
00399       break;
00400     case OMX_StateLoaded:
00401       err = OMX_ErrorSameState;
00402       break;
00403     case OMX_StateIdle:
00404       /* for all ports */
00405       for(j = 0; j < NUM_DOMAINS; j++) {
00406         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00407           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00408             omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00409 
00410           pPort = omx_base_component_Private->ports[i];
00411           if (PORT_IS_TUNNELED(pPort) && PORT_IS_BUFFER_SUPPLIER(pPort)) {
00412             while(pPort->pBufferQueue->nelem > 0) {
00413               DEBUG(DEB_LEV_PARAMS, "In %s Buffer %d remained in the port %d queue of comp%s\n",
00414                    __func__,(int)pPort->pBufferQueue->nelem,(int)i,omx_base_component_Private->name);
00415               dequeue(pPort->pBufferQueue);
00416             }
00417             /* Freeing here the buffers allocated for the tunneling:*/
00418             err = pPort->Port_FreeTunnelBuffer(pPort,i);
00419             if(err!=OMX_ErrorNone) {
00420               DEBUG(DEB_LEV_ERR, "In %s Freeing Tunnel Buffer Error=%x\n",__func__,err);
00421               return err;
00422             }
00423           } else {
00424             DEBUG(DEB_LEV_FULL_SEQ, "In %s nPortIndex=%d pAllocSem Semval=%x\n", __func__,(int)i,(int)pPort->pAllocSem->semval);
00425 
00426             /*If ports are enabled then wait till all buffers are freed*/
00427             if(PORT_IS_ENABLED(pPort)) {
00428               tsem_down(pPort->pAllocSem);
00429             }
00430           }
00431           pPort->sPortParam.bPopulated = OMX_FALSE;
00432 
00433           if(pPort->pInternalBufferStorage != NULL) {
00434             free(pPort->pInternalBufferStorage);
00435             pPort->pInternalBufferStorage=NULL;
00436           }
00437 
00438           if(pPort->bBufferStateAllocated != NULL) {
00439             free(pPort->bBufferStateAllocated);
00440             pPort->bBufferStateAllocated=NULL;
00441           }
00442         }
00443       }
00444       omx_base_component_Private->state = OMX_StateLoaded;
00445 
00446       if(omx_base_component_Private->bufferMgmtThreadID == 0 ){
00447         /*Signal Buffer Management thread to exit*/
00448         tsem_up(omx_base_component_Private->bMgmtSem);
00449         pthread_join(omx_base_component_Private->bufferMgmtThread, NULL);
00450         omx_base_component_Private->bufferMgmtThreadID = -1;
00451         if(err != 0) {
00452           DEBUG(DEB_LEV_ERR,"In %s pthread_join returned err=%d\n",__func__,err);
00453         }
00454       }
00455 
00456       break;
00457     default:
00458         DEBUG(DEB_LEV_ERR, "In %s: state transition not allowed\n", __func__);
00459         err = OMX_ErrorIncorrectStateTransition;
00460       break;
00461     }
00462     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00463     return err;
00464   }
00465 
00466   if(destinationState == OMX_StateWaitForResources){
00467     switch(omx_base_component_Private->state){
00468     case OMX_StateInvalid:
00469         err = OMX_ErrorInvalidState;
00470       break;
00471     case OMX_StateLoaded:
00472         omx_base_component_Private->state = OMX_StateWaitForResources;
00473         err = RM_waitForResource(openmaxStandComp);
00474       break;
00475     case OMX_StateWaitForResources:
00476         err = OMX_ErrorSameState;
00477       break;
00478     default:
00479         DEBUG(DEB_LEV_ERR, "In %s: state transition not allowed\n", __func__);
00480         err = OMX_ErrorIncorrectStateTransition;
00481       break;
00482     }
00483     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00484     return err;
00485   }
00486 
00487   if(destinationState == OMX_StateIdle){
00488     switch(omx_base_component_Private->state){
00489     case OMX_StateInvalid:
00490       err = OMX_ErrorInvalidState;
00491       break;
00492     case OMX_StateWaitForResources:
00493       omx_base_component_Private->state = OMX_StateIdle;
00494       break;
00495     case OMX_StateLoaded:
00496       /* for all ports */
00497       for(j = 0; j < NUM_DOMAINS; j++) {
00498         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00499             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00500               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00501         pPort = omx_base_component_Private->ports[i];
00502         if (PORT_IS_TUNNELED(pPort) && PORT_IS_BUFFER_SUPPLIER(pPort)) {
00503           if(PORT_IS_ENABLED(pPort)) {
00505               err= pPort->Port_AllocateTunnelBuffer(pPort, i);
00506               if(err!=OMX_ErrorNone) {
00507                   DEBUG(DEB_LEV_ERR, "In %s Allocating Tunnel Buffer Error=%x\n",__func__,err);
00508                   return err;
00509               }
00510           }
00511         } else {
00512           if(PORT_IS_ENABLED(pPort)) {
00513             DEBUG(DEB_LEV_FULL_SEQ, "In %s: wait for buffers. port enabled %i,  port populated %i\n",
00514               __func__, pPort->sPortParam.bEnabled,pPort->sPortParam.bPopulated);
00515             if (pPort->sPortParam.nBufferCountActual > 0) {
00516                 tsem_down(pPort->pAllocSem);
00517                 pthread_mutex_lock(&pPort->exitMutex);
00518                 if (pPort->bIsDestroying) {
00519                     bExit = OMX_TRUE;
00520                     pthread_mutex_unlock(&pPort->exitMutex);
00521                     continue;
00522                 }
00523                 pthread_mutex_unlock(&pPort->exitMutex);
00524             }
00525             pPort->sPortParam.bPopulated = OMX_TRUE;
00526           }
00527           else {
00528             DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s: Port %i Disabled So no wait\n",__func__,(int)i);
00529           }
00530         }
00531         DEBUG(DEB_LEV_SIMPLE_SEQ, "Tunnel status : port %d flags  0x%x\n",(int)i, (int)pPort->nTunnelFlags);
00532         }
00533       }
00534       if (bExit) {
00535           break;
00536       }
00537       omx_base_component_Private->state = OMX_StateIdle;
00539       omx_base_component_Private->bufferMgmtThreadID = pthread_create(&omx_base_component_Private->bufferMgmtThread,
00540                                                                         NULL,
00541                                                                         omx_base_component_Private->BufferMgmtFunction,
00542                                                                         openmaxStandComp);
00543       if(omx_base_component_Private->bufferMgmtThreadID < 0){
00544         DEBUG(DEB_LEV_ERR, "Starting buffer management thread failed\n");
00545         return OMX_ErrorUndefined;
00546       }
00547       break;
00548     case OMX_StateIdle:
00549       err = OMX_ErrorSameState;
00550       break;
00551     case OMX_StateExecuting:
00552       /*Flush Ports*/
00553       /* for all ports */
00554       for(j = 0; j < NUM_DOMAINS; j++) {
00555         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00556         i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00557         omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00558           DEBUG(DEB_LEV_FULL_SEQ, "Flushing Port %i\n",(int)i);
00559           pPort = omx_base_component_Private->ports[i];
00560           if(PORT_IS_ENABLED(pPort)) {
00561             pPort->FlushProcessingBuffers(pPort);
00562           }
00563         }
00564       }
00565       omx_base_component_Private->state = OMX_StateIdle;
00566       break;
00567       case OMX_StatePause:
00568       /*Flush Ports*/
00569       /* for all ports */
00570       for(j = 0; j < NUM_DOMAINS; j++) {
00571         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00572         i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00573         omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00574           DEBUG(DEB_LEV_FULL_SEQ, "Flushing Port %i\n",(int)i);
00575           pPort = omx_base_component_Private->ports[i];
00576           if(PORT_IS_ENABLED(pPort)) {
00577             pPort->FlushProcessingBuffers(pPort);
00578           }
00579         }
00580       }
00581       omx_base_component_Private->state = OMX_StateIdle;
00582       /*Signal buffer management thread if waiting at paused state*/
00583       tsem_signal(omx_base_component_Private->bStateSem);
00584       break;
00585     default:
00586       DEBUG(DEB_LEV_ERR, "In %s: state transition not allowed\n", __func__);
00587       err = OMX_ErrorIncorrectStateTransition;
00588       break;
00589     }
00590     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00591     return err;
00592   }
00593 
00594   if(destinationState == OMX_StatePause) {
00595   switch(omx_base_component_Private->state) {
00596     case OMX_StateInvalid:
00597       err = OMX_ErrorInvalidState;
00598       break;
00599     case OMX_StatePause:
00600       err = OMX_ErrorSameState;
00601       break;
00602     case OMX_StateIdle:
00603       omx_base_component_Private->bIsEOSReached = OMX_FALSE;
00604     case OMX_StateExecuting:
00605       omx_base_component_Private->state = OMX_StatePause;
00606       break;
00607     default:
00608       DEBUG(DEB_LEV_ERR, "In %s: state transition not allowed\n", __func__);
00609       err = OMX_ErrorIncorrectStateTransition;
00610       break;
00611     }
00612   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00613     return err;
00614   }
00615 
00616   if(destinationState == OMX_StateExecuting) {
00617     switch(omx_base_component_Private->state) {
00618     case OMX_StateInvalid:
00619       err = OMX_ErrorInvalidState;
00620       break;
00621     case OMX_StateIdle:
00622       omx_base_component_Private->state = OMX_StateExecuting;
00623       omx_base_component_Private->bIsEOSReached = OMX_FALSE;
00624       /*Send Tunneled Buffer to the Neighbouring Components*/
00625       /* for all ports */
00626       for(j = 0; j < NUM_DOMAINS; j++) {
00627         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00628         i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00629           omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00630           pPort = omx_base_component_Private->ports[i];
00631           if (PORT_IS_TUNNELED(pPort) && PORT_IS_BUFFER_SUPPLIER(pPort) && PORT_IS_ENABLED(pPort)) {
00632             for(k=0;k<pPort->nNumTunnelBuffer;k++) {
00633               tsem_up(pPort->pBufferSem);
00634               /*signal buffer management thread availability of buffers*/
00635               tsem_up(omx_base_component_Private->bMgmtSem);
00636             }
00637           }
00638         }
00639       }
00640       omx_base_component_Private->transientState = OMX_TransStateMax;
00641       err = OMX_ErrorNone;
00642       break;
00643     case OMX_StatePause:
00644       omx_base_component_Private->state=OMX_StateExecuting;
00645 
00646       /* Tunneled Supplier Ports were enabled in paused state. So signal buffer managment thread*/
00647       /* for all ports */
00648       for(j = 0; j < NUM_DOMAINS; j++) {
00649          for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00650           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00651           omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00652 
00653           pPort=omx_base_component_Private->ports[i];
00654           DEBUG(DEB_LEV_PARAMS, "In %s: state transition Paused 2 Executing, nelem=%d,semval=%d,Buf Count Actual=%d\n", __func__,
00655             pPort->pBufferQueue->nelem,pPort->pBufferSem->semval,(int)pPort->sPortParam.nBufferCountActual);
00656 
00657           if (PORT_IS_TUNNELED_N_BUFFER_SUPPLIER(pPort) &&
00658             (pPort->pBufferQueue->nelem == (pPort->pBufferSem->semval + pPort->sPortParam.nBufferCountActual))) {
00659             for(k=0; k < pPort->sPortParam.nBufferCountActual;k++) {
00660               tsem_up(pPort->pBufferSem);
00661               tsem_up(omx_base_component_Private->bMgmtSem);
00662             }
00663           }
00664         }
00665       }
00666       /*Signal buffer management thread if waiting at paused state*/
00667       tsem_signal(omx_base_component_Private->bStateSem);
00668       break;
00669     case OMX_StateExecuting:
00670       err = OMX_ErrorSameState;
00671       break;
00672     default:
00673       DEBUG(DEB_LEV_ERR, "In %s: state transition not allowed\n", __func__);
00674       err = OMX_ErrorIncorrectStateTransition;
00675       break;
00676     }
00677     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00678     return err;
00679   }
00680 
00681   if(destinationState == OMX_StateInvalid) {
00682     switch(omx_base_component_Private->state) {
00683     case OMX_StateInvalid:
00684       err = OMX_ErrorInvalidState;
00685       break;
00686     default:
00687       omx_base_component_Private->state = OMX_StateInvalid;
00688 
00689       if(omx_base_component_Private->bufferMgmtThreadID == 0 ){
00690         tsem_signal(omx_base_component_Private->bStateSem);
00691         /*Signal Buffer Management Thread to Exit*/
00692         tsem_up(omx_base_component_Private->bMgmtSem);
00693         pthread_join(omx_base_component_Private->bufferMgmtThread, NULL);
00694         omx_base_component_Private->bufferMgmtThreadID = -1;
00695         if(err!=0) {
00696           DEBUG(DEB_LEV_FUNCTION_NAME,"In %s pthread_join returned err=%d\n",__func__,err);
00697         }
00698       }
00699       err = OMX_ErrorInvalidState;
00700       break;
00701     }
00702     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p with err %i\n", __func__, openmaxStandComp, err);
00703     return err;
00704   }
00705   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, openmaxStandComp);
00706   return OMX_ErrorNone;
00707 }
00708 
00720 OSCL_EXPORT_REF OMX_ERRORTYPE checkHeader(OMX_PTR header, OMX_U32 size) {
00721   OMX_VERSIONTYPE* ver;
00722   if (header == NULL) {
00723     DEBUG(DEB_LEV_ERR, "In %s the header is null\n",__func__);
00724     return OMX_ErrorBadParameter;
00725   }
00726   ver = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32));
00727   if(*((OMX_U32*)header) != size) {
00728     DEBUG(DEB_LEV_ERR, "In %s the header has a wrong size %i should be %i\n",__func__,(int)*((OMX_U32*)header),(int)size);
00729     return OMX_ErrorBadParameter;
00730   }
00731   if(ver->s.nVersionMajor != SPECVERSIONMAJOR ||
00732     ver->s.nVersionMinor != SPECVERSIONMINOR) {
00733     DEBUG(DEB_LEV_ERR, "The version does not match\n");
00734     return OMX_ErrorVersionMismatch;
00735   }
00736   return OMX_ErrorNone;
00737 }
00738 
00746 void setHeader(OMX_PTR header, OMX_U32 size) {
00747   OMX_VERSIONTYPE* ver = (OMX_VERSIONTYPE*)((char*)header + sizeof(OMX_U32));
00748   *((OMX_U32*)header) = size;
00749 
00750   ver->s.nVersionMajor = SPECVERSIONMAJOR;
00751   ver->s.nVersionMinor = SPECVERSIONMINOR;
00752   ver->s.nRevision = SPECREVISION;
00753   ver->s.nStep = SPECSTEP;
00754 }
00755 
00759 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_ParameterSanityCheck(OMX_HANDLETYPE hComponent,
00760   OMX_U32 nPortIndex,
00761   OMX_PTR pStructure,
00762   size_t size) {
00763   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)(((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate);
00764   omx_base_PortType *pPort;
00765   int nNumPorts;
00766   OMX_ERRORTYPE err;
00767 
00768   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
00769   nNumPorts = omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
00770               omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
00771               omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
00772               omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts;
00773 
00774   if (nPortIndex >= nNumPorts) {
00775     DEBUG(DEB_LEV_ERR, "Bad Port index %i when the component has %i ports\n", (int)nPortIndex, (int)nNumPorts);
00776     return OMX_ErrorBadPortIndex;
00777   }
00778 
00779   pPort = omx_base_component_Private->ports[nPortIndex];
00780 
00781   if (omx_base_component_Private->state != OMX_StateLoaded && omx_base_component_Private->state != OMX_StateWaitForResources) {
00782     if(PORT_IS_ENABLED(pPort) && !pPort->bIsTransientToEnabled) {
00783       DEBUG(DEB_LEV_ERR, "In %s Incorrect State=%x lineno=%d\n",__func__,omx_base_component_Private->state,__LINE__);
00784       return OMX_ErrorIncorrectStateOperation;
00785     }
00786   }
00787 
00788   err = checkHeader(pStructure, size);
00789   if (err != OMX_ErrorNone) {
00790       DEBUG(DEB_LEV_ERR, "In %s failing the checkHeader with err %i\n", __func__, (int)err);
00791       return err;
00792   }
00793   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
00794   return OMX_ErrorNone;
00795 }
00796 
00801 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_GetComponentVersion(OMX_HANDLETYPE hComponent,
00802   OMX_STRING pComponentName,
00803   OMX_VERSIONTYPE* pComponentVersion,
00804   OMX_VERSIONTYPE* pSpecVersion,
00805   OMX_UUIDTYPE* pComponentUUID) {
00806 
00807   OMX_COMPONENTTYPE* omx_component = (OMX_COMPONENTTYPE*)hComponent;
00808   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omx_component->pComponentPrivate;
00809 
00810   OMX_U32 uuid[3];
00811 
00812   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
00813   /* Fill component name */
00814   strcpy(pComponentName, omx_base_component_Private->name);
00815 
00816   /* Fill component version */
00817   pComponentVersion->s.nVersionMajor = SPECVERSIONMAJOR;
00818   pComponentVersion->s.nVersionMinor = SPECVERSIONMINOR;
00819   pComponentVersion->s.nRevision = SPECREVISION;
00820   pComponentVersion->s.nStep = SPECSTEP;
00821 
00822   /* Fill spec version (copy from component field) */
00823   memcpy(pSpecVersion, &omx_component->nVersion, sizeof(OMX_VERSIONTYPE));
00824 
00825   /* Fill UUID with handle address, PID and UID.
00826    * This should guarantee uiniqness */
00827   uuid[0] = (OMX_U32)omx_component;
00828   uuid[1] = getpid();
00829   uuid[2] = getuid();
00830   memcpy(*pComponentUUID, uuid, 3*sizeof(uuid));
00831 
00832   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
00833   return OMX_ErrorNone;
00834 }
00835 
00844 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_ComponentRoleEnum(
00845   OMX_HANDLETYPE hComponent,
00846   OMX_U8 *cRole,
00847   OMX_U32 nIndex) {
00848   strcat((char*)cRole, "\0");
00849   return OMX_ErrorNoMore;
00850 }
00851 
00857 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_SetCallbacks(
00858   OMX_HANDLETYPE hComponent,
00859   OMX_CALLBACKTYPE* pCallbacks,
00860   OMX_PTR pAppData) {
00861 
00862   OMX_COMPONENTTYPE *omxcomponent = (OMX_COMPONENTTYPE*)hComponent;
00863   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omxcomponent->pComponentPrivate;
00864   omx_base_PortType *pPort;
00865   OMX_U32 i,j;
00866 
00867   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
00868   omx_base_component_Private->callbacks = pCallbacks;
00869   omx_base_component_Private->callbackData = pAppData;
00870 
00871   /* for all ports */
00872   for(j = 0; j < NUM_DOMAINS; j++) {
00873     for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
00874     i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
00875       omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
00876       pPort = omx_base_component_Private->ports[i];
00877       if (pPort->sPortParam.eDir == OMX_DirInput) {
00878         pPort->BufferProcessedCallback = omx_base_component_Private->callbacks->EmptyBufferDone;
00879       } else {
00880         pPort->BufferProcessedCallback = omx_base_component_Private->callbacks->FillBufferDone;
00881       }
00882     }
00883   }
00884   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
00885   return OMX_ErrorNone;
00886 }
00887 
00896 OSCL_EXPORT_REF OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_GetParameter(
00897   OMX_HANDLETYPE hComponent,
00898   OMX_INDEXTYPE nParamIndex,
00899   OMX_PTR ComponentParameterStructure) {
00900 
00901   OMX_COMPONENTTYPE *omxcomponent = (OMX_COMPONENTTYPE*)hComponent;
00902   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omxcomponent->pComponentPrivate;
00903   OMX_PRIORITYMGMTTYPE* pPrioMgmt;
00904   OMX_PARAM_PORTDEFINITIONTYPE *pPortDef;
00905   OMX_PARAM_BUFFERSUPPLIERTYPE *pBufferSupplier;
00906   omx_base_PortType *pPort;
00907   OMX_PORT_PARAM_TYPE* pPortDomains;
00908   OMX_ERRORTYPE err = OMX_ErrorNone;
00909   OMX_VENDOR_PROP_TUNNELSETUPTYPE *pPropTunnelSetup;
00910   OMX_PARAM_BELLAGIOTHREADS_ID *threadID;
00911 
00912   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
00913   DEBUG(DEB_LEV_PARAMS, "Getting parameter %i\n", nParamIndex);
00914   if (ComponentParameterStructure == NULL) {
00915     return OMX_ErrorBadParameter;
00916   }
00917   switch((int) nParamIndex) {
00918   case OMX_IndexParameterThreadsID:
00919         if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PARAM_BELLAGIOTHREADS_ID))) != OMX_ErrorNone) {
00920           break;
00921         }
00922       threadID = (OMX_PARAM_BELLAGIOTHREADS_ID *)ComponentParameterStructure;
00923       threadID->nThreadBufferMngtID = omx_base_component_Private->bellagioThreads->nThreadBufferMngtID;
00924       threadID->nThreadMessageID = omx_base_component_Private->bellagioThreads->nThreadMessageID;
00925       break;
00926   case OMX_IndexParamAudioInit:
00927   case OMX_IndexParamVideoInit:
00928   case OMX_IndexParamImageInit:
00929   case OMX_IndexParamOtherInit:
00930     pPortDomains = (OMX_PORT_PARAM_TYPE*)ComponentParameterStructure;
00931     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PORT_PARAM_TYPE))) != OMX_ErrorNone) {
00932       break;
00933     }
00934     pPortDomains->nPorts = 0;
00935     pPortDomains->nStartPortNumber = 0;
00936     break;
00937   case OMX_IndexParamPortDefinition:
00938     pPortDef  = (OMX_PARAM_PORTDEFINITIONTYPE*) ComponentParameterStructure;
00939     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PARAM_PORTDEFINITIONTYPE))) != OMX_ErrorNone) {
00940       break;
00941     }
00942     if (pPortDef->nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
00943                                  omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
00944                                  omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
00945                                  omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
00946       return OMX_ErrorBadPortIndex;
00947     }
00948 
00949     memcpy(pPortDef, &omx_base_component_Private->ports[pPortDef->nPortIndex]->sPortParam, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
00950     break;
00951   case OMX_IndexParamPriorityMgmt:
00952     pPrioMgmt = (OMX_PRIORITYMGMTTYPE*)ComponentParameterStructure;
00953     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PRIORITYMGMTTYPE))) != OMX_ErrorNone) {
00954       break;
00955     }
00956     pPrioMgmt->nGroupPriority = omx_base_component_Private->nGroupPriority;
00957     pPrioMgmt->nGroupID = omx_base_component_Private->nGroupID;
00958     break;
00959   case OMX_IndexParamCompBufferSupplier:
00960     pBufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE*)ComponentParameterStructure;
00961     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE))) != OMX_ErrorNone) {
00962       break;
00963     }
00964     if (pBufferSupplier->nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
00965                                         omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
00966                                         omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
00967                                         omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
00968       return OMX_ErrorBadPortIndex;
00969     }
00970 
00971     pPort = omx_base_component_Private->ports[pBufferSupplier->nPortIndex];
00972 
00973     if (pPort->sPortParam.eDir == OMX_DirInput) {
00974       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
00975         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
00976       } else if (PORT_IS_TUNNELED(pPort)) {
00977         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
00978       } else {
00979         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
00980       }
00981     } else {
00982       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
00983         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyOutput;
00984       } else if (PORT_IS_TUNNELED(pPort)) {
00985         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyInput;
00986       } else {
00987         pBufferSupplier->eBufferSupplier = OMX_BufferSupplyUnspecified;
00988       }
00989     }
00990     break;
00991   case OMX_IndexVendorCompPropTunnelFlags:
00992     pPropTunnelSetup = (OMX_VENDOR_PROP_TUNNELSETUPTYPE*)ComponentParameterStructure;
00993 
00994     if (pPropTunnelSetup->nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
00995                                          omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
00996                                          omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
00997                                          omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
00998 
00999       DEBUG(DEB_LEV_ERR,"In %s OMX_IndexVendorCompPropTunnelFlags nPortIndex=%d Line=%d \n",
01000           __func__,(int)pPropTunnelSetup->nPortIndex,__LINE__);
01001 
01002       return OMX_ErrorBadPortIndex;
01003     }
01004 
01005     pPort = omx_base_component_Private->ports[pPropTunnelSetup->nPortIndex];
01006 
01007     pPropTunnelSetup->nTunnelSetup.nTunnelFlags  = pPort->nTunnelFlags;
01008     pPropTunnelSetup->nTunnelSetup.eSupplier     = pPort->eBufferSupplier;
01009     break;
01010   default:
01011     err = OMX_ErrorUnsupportedIndex;
01012     break;
01013   }
01014   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01015   return err;
01016 }
01017 
01026 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_SetParameter(
01027   OMX_HANDLETYPE hComponent,
01028   OMX_INDEXTYPE nParamIndex,
01029   OMX_PTR ComponentParameterStructure) {
01030 
01031   OMX_PRIORITYMGMTTYPE* pPrioMgmt;
01032   OMX_PARAM_PORTDEFINITIONTYPE *pPortDef;
01033   OMX_ERRORTYPE err = OMX_ErrorNone;
01034   OMX_COMPONENTTYPE *omxcomponent = (OMX_COMPONENTTYPE*)hComponent;
01035   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omxcomponent->pComponentPrivate;
01036   OMX_PARAM_BUFFERSUPPLIERTYPE *pBufferSupplier;
01037   omx_base_PortType *pPort;
01038 
01039   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01040   DEBUG(DEB_LEV_PARAMS, "Setting parameter %x\n", nParamIndex);
01041   if (ComponentParameterStructure == NULL) {
01042     DEBUG(DEB_LEV_ERR, "In %s parameter provided is null! err = %x\n", __func__, err);
01043     return OMX_ErrorBadParameter;
01044   }
01045 
01046   switch(nParamIndex) {
01047   case OMX_IndexParamAudioInit:
01048   case OMX_IndexParamVideoInit:
01049   case OMX_IndexParamImageInit:
01050   case OMX_IndexParamOtherInit:
01051     /* pPortParam  = (OMX_PORT_PARAM_TYPE* ) ComponentParameterStructure;*/
01052     if (omx_base_component_Private->state != OMX_StateLoaded &&
01053       omx_base_component_Private->state != OMX_StateWaitForResources) {
01054       return OMX_ErrorIncorrectStateOperation;
01055     }
01056     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PORT_PARAM_TYPE))) != OMX_ErrorNone) {
01057       break;
01058     }
01059     err = OMX_ErrorUndefined;
01060     break;
01061   case OMX_IndexParamPortDefinition:
01062     pPortDef  = (OMX_PARAM_PORTDEFINITIONTYPE*) ComponentParameterStructure;
01063     err = omx_base_component_ParameterSanityCheck(hComponent, pPortDef->nPortIndex, pPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
01064     if(err!=OMX_ErrorNone) {
01065       DEBUG(DEB_LEV_ERR, "In %s Parameter Check Error=%x\n",__func__,err);
01066       break;
01067     }
01068     {
01069       OMX_PARAM_PORTDEFINITIONTYPE *pPortParam;
01070       OMX_U32 j,old_nBufferCountActual=0;
01071       pPortParam = &omx_base_component_Private->ports[pPortDef->nPortIndex]->sPortParam;
01072       if(pPortDef->nBufferCountActual < pPortParam->nBufferCountMin) {
01073         DEBUG(DEB_LEV_ERR, "In %s nBufferCountActual of param (%i) is < of nBufferCountMin of port(%i)\n",__func__, (int)pPortDef->nBufferCountActual, (int)pPortParam->nBufferCountMin);
01074         err = OMX_ErrorBadParameter;
01075         break;
01076       }
01077       old_nBufferCountActual         = pPortParam->nBufferCountActual;
01078       pPortParam->nBufferCountActual = pPortDef->nBufferCountActual;
01079 
01080       switch(pPortDef->eDomain) {
01081       case OMX_PortDomainAudio:
01082         memcpy(&pPortParam->format.audio, &pPortDef->format.audio, sizeof(OMX_AUDIO_PORTDEFINITIONTYPE));
01083         break;
01084       case OMX_PortDomainVideo:
01085         pPortParam->format.video.pNativeRender          = pPortDef->format.video.pNativeRender;
01086         pPortParam->format.video.nFrameWidth            = pPortDef->format.video.nFrameWidth;
01087         pPortParam->format.video.nFrameHeight           = pPortDef->format.video.nFrameHeight;
01088         pPortParam->format.video.nStride                = pPortDef->format.video.nStride;
01089         pPortParam->format.video.xFramerate             = pPortDef->format.video.xFramerate;
01090         pPortParam->format.video.bFlagErrorConcealment  = pPortDef->format.video.bFlagErrorConcealment;
01091         pPortParam->format.video.eCompressionFormat     = pPortDef->format.video.eCompressionFormat;
01092         pPortParam->format.video.eColorFormat           = pPortDef->format.video.eColorFormat;
01093         pPortParam->format.video.pNativeWindow          = pPortDef->format.video.pNativeWindow;
01094         break;
01095       case OMX_PortDomainImage:
01096         pPortParam->format.image.nFrameWidth            = pPortDef->format.image.nFrameWidth;
01097         pPortParam->format.image.nFrameHeight           = pPortDef->format.image.nFrameHeight;
01098         pPortParam->format.image.nStride                = pPortDef->format.image.nStride;
01099         pPortParam->format.image.bFlagErrorConcealment  = pPortDef->format.image.bFlagErrorConcealment;
01100         pPortParam->format.image.eCompressionFormat     = pPortDef->format.image.eCompressionFormat;
01101         pPortParam->format.image.eColorFormat           = pPortDef->format.image.eColorFormat;
01102         pPortParam->format.image.pNativeWindow          = pPortDef->format.image.pNativeWindow;
01103         break;
01104       case OMX_PortDomainOther:
01105         memcpy(&pPortParam->format.other, &pPortDef->format.other, sizeof(OMX_OTHER_PORTDEFINITIONTYPE));
01106         break;
01107       default:
01108         DEBUG(DEB_LEV_ERR, "In %s wrong port domain. Out of OpenMAX scope\n",__func__);
01109         err = OMX_ErrorBadParameter;
01110         break;
01111       }
01112 
01113       /*If component state Idle/Pause/Executing and re-alloc the following private variables */
01114       if ((omx_base_component_Private->state == OMX_StateIdle ||
01115         omx_base_component_Private->state == OMX_StatePause  ||
01116         omx_base_component_Private->state == OMX_StateExecuting) &&
01117         (pPortParam->nBufferCountActual > old_nBufferCountActual)) {
01118 // todo check if here it is not better != instead of >
01119         pPort = omx_base_component_Private->ports[pPortDef->nPortIndex];
01120         if(pPort->pInternalBufferStorage) {
01121           pPort->pInternalBufferStorage = realloc(pPort->pInternalBufferStorage,pPort->sPortParam.nBufferCountActual*sizeof(OMX_BUFFERHEADERTYPE *));
01122         }
01123 
01124         if(pPort->bBufferStateAllocated) {
01125           pPort->bBufferStateAllocated = realloc(pPort->bBufferStateAllocated,pPort->sPortParam.nBufferCountActual*sizeof(BUFFER_STATUS_FLAG));
01126           for(j=0; j < pPort->sPortParam.nBufferCountActual; j++) {
01127             pPort->bBufferStateAllocated[j] = BUFFER_FREE;
01128           }
01129         }
01130       }
01131     }
01132     break;
01133   case OMX_IndexParamPriorityMgmt:
01134     if (omx_base_component_Private->state != OMX_StateLoaded &&
01135       omx_base_component_Private->state != OMX_StateWaitForResources) {
01136       return OMX_ErrorIncorrectStateOperation;
01137     }
01138     pPrioMgmt = (OMX_PRIORITYMGMTTYPE*)ComponentParameterStructure;
01139     if ((err = checkHeader(ComponentParameterStructure, sizeof(OMX_PRIORITYMGMTTYPE))) != OMX_ErrorNone) {
01140       break;
01141     }
01142     omx_base_component_Private->nGroupPriority = pPrioMgmt->nGroupPriority;
01143     omx_base_component_Private->nGroupID = pPrioMgmt->nGroupID;
01144     break;
01145   case OMX_IndexParamCompBufferSupplier:
01146     pBufferSupplier = (OMX_PARAM_BUFFERSUPPLIERTYPE*)ComponentParameterStructure;
01147 
01148     DEBUG(DEB_LEV_PARAMS, "In %s Buf Sup Port index=%d\n", __func__,(int)pBufferSupplier->nPortIndex);
01149 
01150     if(pBufferSupplier == NULL) {
01151       DEBUG(DEB_LEV_ERR, "In %s pBufferSupplier is null!\n",__func__);
01152       return OMX_ErrorBadParameter;
01153     }
01154     if(pBufferSupplier->nPortIndex > (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01155                                       omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01156                                       omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01157                                       omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01158       return OMX_ErrorBadPortIndex;
01159     }
01160     err = omx_base_component_ParameterSanityCheck(hComponent, pBufferSupplier->nPortIndex, pBufferSupplier, sizeof(OMX_PARAM_BUFFERSUPPLIERTYPE));
01161     if(err==OMX_ErrorIncorrectStateOperation) {
01162       if (PORT_IS_ENABLED(omx_base_component_Private->ports[pBufferSupplier->nPortIndex])) {
01163         DEBUG(DEB_LEV_ERR, "In %s Incorrect State=%x\n",__func__,omx_base_component_Private->state);
01164         return OMX_ErrorIncorrectStateOperation;
01165       }
01166     } else if (err != OMX_ErrorNone) {
01167       break;
01168     }
01169 
01170     if (pBufferSupplier->eBufferSupplier == OMX_BufferSupplyUnspecified) {
01171       DEBUG(DEB_LEV_PARAMS, "In %s: port is already buffer supplier unspecified\n", __func__);
01172       return OMX_ErrorNone;
01173     }
01174     if ((PORT_IS_TUNNELED(omx_base_component_Private->ports[pBufferSupplier->nPortIndex])) == 0) {
01175       return OMX_ErrorNone;
01176     }
01177 
01178     pPort = omx_base_component_Private->ports[pBufferSupplier->nPortIndex];
01179 
01180     if ((pBufferSupplier->eBufferSupplier == OMX_BufferSupplyInput) &&
01181         (pPort->sPortParam.eDir == OMX_DirInput)) {
01183       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01184         err = OMX_ErrorNone;
01185       }
01186       pPort->nTunnelFlags |= TUNNEL_IS_SUPPLIER;
01187       pBufferSupplier->nPortIndex = pPort->nTunneledPort;
01188       err = OMX_SetParameter(pPort->hTunneledComponent, OMX_IndexParamCompBufferSupplier, pBufferSupplier);
01189     } else if ((pBufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) &&
01190                (pPort->sPortParam.eDir == OMX_DirInput)) {
01191       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01192         pPort->nTunnelFlags &= ~TUNNEL_IS_SUPPLIER;
01193         pBufferSupplier->nPortIndex = pPort->nTunneledPort;
01194         err = OMX_SetParameter(pPort->hTunneledComponent, OMX_IndexParamCompBufferSupplier, pBufferSupplier);
01195       }
01196       err = OMX_ErrorNone;
01197     } else if ((pBufferSupplier->eBufferSupplier == OMX_BufferSupplyOutput) &&
01198                (pPort->sPortParam.eDir == OMX_DirOutput)) {
01200       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01201         err = OMX_ErrorNone;
01202       }
01203       pPort->nTunnelFlags |= TUNNEL_IS_SUPPLIER;
01204     } else {
01205       if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01206         pPort->nTunnelFlags &= ~TUNNEL_IS_SUPPLIER;
01207         err = OMX_ErrorNone;
01208       }
01209       err = OMX_ErrorNone;
01210     }
01211     DEBUG(DEB_LEV_PARAMS, "In %s port %d Tunnel flag=%x \n", __func__,(int)pBufferSupplier->nPortIndex, (int)pPort->nTunnelFlags);
01212     break;
01213   default:
01214     err = OMX_ErrorUnsupportedIndex;
01215     break;
01216   }
01217   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01218   return err;
01219 }
01220 
01228 OSCL_EXPORT_REF OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_GetConfig(
01229   OMX_HANDLETYPE hComponent,
01230   OMX_INDEXTYPE nIndex,
01231   OMX_PTR pComponentConfigStructure) {
01232   return OMX_ErrorNone;
01233 }
01234 
01242 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_SetConfig(
01243   OMX_HANDLETYPE hComponent,
01244   OMX_INDEXTYPE nIndex,
01245   OMX_PTR pComponentConfigStructure) {
01246   return OMX_ErrorNone;
01247 }
01248 
01254 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_GetExtensionIndex(
01255   OMX_HANDLETYPE hComponent,
01256   OMX_STRING cParameterName,
01257   OMX_INDEXTYPE* pIndexType) {
01258 
01259     DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01260     if(strcmp(cParameterName,"OMX.st.index.param.BellagioThreadsID") == 0) {
01261         *pIndexType = OMX_IndexParameterThreadsID;
01262     } else {
01263         return OMX_ErrorBadParameter;
01264     }
01265     DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01266     return OMX_ErrorNone;
01267 }
01268 
01273 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_GetState(
01274   OMX_HANDLETYPE hComponent,
01275   OMX_STATETYPE* pState) {
01276   OMX_COMPONENTTYPE *omxcomponent = (OMX_COMPONENTTYPE*)hComponent;
01277   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omxcomponent->pComponentPrivate;
01278   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01279   *pState = omx_base_component_Private->state;
01280   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01281   return OMX_ErrorNone;
01282 }
01283 
01289 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_SendCommand(
01290   OMX_HANDLETYPE hComponent,
01291   OMX_COMMANDTYPE Cmd,
01292   OMX_U32 nParam,
01293   OMX_PTR pCmdData) {
01294   OMX_COMPONENTTYPE* omxComponent = (OMX_COMPONENTTYPE*)hComponent;
01295   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)omxComponent->pComponentPrivate;
01296   internalRequestMessageType *message;
01297   queue_t* messageQueue;
01298   tsem_t* messageSem;
01299   OMX_U32 i,j,k;
01300   omx_base_PortType *pPort;
01301   OMX_ERRORTYPE err = OMX_ErrorNone;
01302   int errQue;
01303   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01304 
01305   messageQueue = omx_base_component_Private->messageQueue;
01306   messageSem = omx_base_component_Private->messageSem;
01307 
01308   if (omx_base_component_Private->state == OMX_StateInvalid) {
01309     return OMX_ErrorInvalidState;
01310   }
01311 
01312   message = calloc(1,sizeof(internalRequestMessageType));
01313   message->messageParam = nParam;
01314   message->pCmdData=pCmdData;
01316   switch (Cmd) {
01317   case OMX_CommandStateSet:
01318     message->messageType = OMX_CommandStateSet;
01319     if ((nParam == OMX_StateIdle) && (omx_base_component_Private->state == OMX_StateLoaded)) {
01320       /*Allocate Internal Buffer Storage and Buffer Allocation State flags*/
01321        /* for all ports */
01322       for(j = 0; j < NUM_DOMAINS; j++) {
01323         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01324             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01325               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01326 
01327           pPort = omx_base_component_Private->ports[i];
01328 
01329           if(pPort->pInternalBufferStorage == NULL) {
01330             pPort->pInternalBufferStorage = calloc(pPort->sPortParam.nBufferCountActual,sizeof(OMX_BUFFERHEADERTYPE *));
01331           }
01332 
01333           if(pPort->bBufferStateAllocated == NULL) {
01334             pPort->bBufferStateAllocated = calloc(pPort->sPortParam.nBufferCountActual,sizeof(BUFFER_STATUS_FLAG));
01335           }
01336 
01337           for(k=0; k < pPort->sPortParam.nBufferCountActual; k++) {
01338             pPort->bBufferStateAllocated[k] = BUFFER_FREE;
01339           }
01340         }
01341       }
01342 
01343       omx_base_component_Private->transientState = OMX_TransStateLoadedToIdle;
01344     } else if ((nParam == OMX_StateLoaded) && (omx_base_component_Private->state == OMX_StateIdle)) {
01345       omx_base_component_Private->transientState = OMX_TransStateIdleToLoaded;
01346     } else if ((nParam == OMX_StateIdle) && (omx_base_component_Private->state == OMX_StateExecuting)) {
01347       omx_base_component_Private->transientState = OMX_TransStateExecutingToIdle;
01348     } else if ((nParam == OMX_StateIdle) && (omx_base_component_Private->state == OMX_StatePause)) {
01349       omx_base_component_Private->transientState = OMX_TransStatePauseToIdle;
01350     }
01351     break;
01352   case OMX_CommandFlush:
01353     if (nParam >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01354                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01355                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01356                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts) && nParam != OMX_ALL) {
01357       return OMX_ErrorBadPortIndex;
01358     }
01359     message->messageType = OMX_CommandFlush;
01360     break;
01361   case OMX_CommandPortDisable:
01362     if (nParam >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01363                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01364                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01365                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts) && nParam != OMX_ALL) {
01366       return OMX_ErrorBadPortIndex;
01367     }
01368     message->messageType = OMX_CommandPortDisable;
01369     if(message->messageParam == OMX_ALL) {
01370        /* for all ports */
01371       for(j = 0; j < NUM_DOMAINS; j++) {
01372         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01373             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01374               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01375           omx_base_component_Private->ports[i]->bIsTransientToDisabled = OMX_TRUE;
01376         }
01377       }
01378     } else {
01379       omx_base_component_Private->ports[message->messageParam]->bIsTransientToDisabled = OMX_TRUE;
01380     }
01381     break;
01382   case OMX_CommandPortEnable:
01383     if (nParam >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01384                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01385                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01386                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts) && nParam != OMX_ALL) {
01387       return OMX_ErrorBadPortIndex;
01388     }
01389     message->messageType = OMX_CommandPortEnable;
01390     if(message->messageParam == OMX_ALL) {
01391        /* for all ports */
01392       for(j = 0; j < NUM_DOMAINS; j++) {
01393         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01394             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01395               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01396           omx_base_component_Private->ports[i]->bIsTransientToEnabled = OMX_TRUE;
01397         }
01398       }
01399     } else {
01400       omx_base_component_Private->ports[message->messageParam]->bIsTransientToEnabled = OMX_TRUE;
01401     }
01402     break;
01403   case OMX_CommandMarkBuffer:
01404     if (nParam >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01405                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01406                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01407                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts) && nParam != OMX_ALL) {
01408       return OMX_ErrorBadPortIndex;
01409     }
01410     message->messageType = OMX_CommandMarkBuffer;
01411     break;
01412   default:
01413     err = OMX_ErrorUnsupportedIndex;
01414     break;
01415   }
01416 
01417   if (err == OMX_ErrorNone) {
01418       errQue = queue(messageQueue, message);
01419       if (errQue) {
01420           /* /TODO the queue is full. This can be handled in a fine way with
01421            * some retrials, or other checking. For the moment this is a critical error
01422            * and simply causes the failure of this call
01423            */
01424           return OMX_ErrorInsufficientResources;
01425       }
01426       tsem_up(messageSem);
01427   }
01428   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01429   return err;
01430 }
01431 
01438 void* compMessageHandlerFunction(void* param) {
01439   OMX_COMPONENTTYPE *openmaxStandComp = (OMX_COMPONENTTYPE *)param;
01440   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)openmaxStandComp->pComponentPrivate;
01441   internalRequestMessageType *message;
01442 
01443   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, openmaxStandComp);
01444   omx_base_component_Private->bellagioThreads->nThreadMessageID = (long int)syscall(__NR_gettid);
01445   DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s the thread ID is %i\n", __func__, (int)omx_base_component_Private->bellagioThreads->nThreadMessageID);
01446 
01447   while(1){
01448     /* Wait for an incoming message */
01449     if (omx_base_component_Private == NULL) {
01450       break;
01451     }
01452     tsem_down(omx_base_component_Private->messageSem);
01453     DEBUG(DEB_LEV_FUNCTION_NAME, "In %s new message\n", __func__);
01454     /*Destructor has been called. So exit from the loop*/
01455     if(omx_base_component_Private->state == OMX_StateInvalid) {
01456         DEBUG(DEB_LEV_FUNCTION_NAME, "In %s Destructor has been called. So exit from the loop\n", __func__);
01457       break;
01458     }
01459     /* Dequeue it */
01460     message = dequeue(omx_base_component_Private->messageQueue);
01461     if(message == NULL){
01462       DEBUG(DEB_LEV_ERR, "In %s: ouch!! had null message!\n", __func__);
01463       break;
01464     }
01465     /* Process it by calling component's message handler method */
01466     omx_base_component_Private->messageHandler(openmaxStandComp, message);
01467     /* Message ownership has been transferred to us
01468     * so we gonna free it when finished.
01469     */
01470     free(message);
01471     message = NULL;
01472   }
01473   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, openmaxStandComp);
01474   return NULL;
01475 }
01476 
01488 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_MessageHandler(OMX_COMPONENTTYPE *openmaxStandComp,internalRequestMessageType* message) {
01489   omx_base_component_PrivateType* omx_base_component_Private=openmaxStandComp->pComponentPrivate;
01490   OMX_U32                         i,j,k;
01491   OMX_ERRORTYPE                   err = OMX_ErrorNone;
01492   omx_base_PortType*              pPort;
01493 
01494   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p with message %i\n", __func__, openmaxStandComp, message->messageType);
01495 
01496   /* Dealing with a SendCommand call.
01497   * -messageType contains the command to execute
01498   * -messageParam contains the parameter of the command
01499   *  (destination state in case of a state change command).
01500   */
01501   switch(message->messageType){
01502   case OMX_CommandStateSet: {
01503     /* Do the actual state change */
01504     err = (*(omx_base_component_Private->DoStateSet))(openmaxStandComp, message->messageParam);
01505     if (err != OMX_ErrorNone) {
01506       (*(omx_base_component_Private->callbacks->EventHandler))
01507       (openmaxStandComp,
01508       omx_base_component_Private->callbackData,
01509       OMX_EventError, /* The command was completed */
01510       err, /* The commands was a OMX_CommandStateSet */
01511       0, /* The state has been changed in message->messageParam */
01512       NULL);
01513     } else {
01514       /* And run the callback */
01515         if (omx_base_component_Private->callbacks) {
01516             DEBUG(DEB_LEV_SIMPLE_SEQ, "running callback in %s\n", __func__);
01517             (*(omx_base_component_Private->callbacks->EventHandler))
01518             (openmaxStandComp,
01519                     omx_base_component_Private->callbackData,
01520                     OMX_EventCmdComplete, /* The command was completed */
01521                     OMX_CommandStateSet, /* The commands was a OMX_CommandStateSet */
01522                     message->messageParam, /* The state has been changed in message->messageParam */
01523                     NULL);
01524         }
01525     }
01526   }
01527   break;
01528   case OMX_CommandFlush: {
01529     /*Flush port/s*/
01530     if(message->messageParam == OMX_ALL) {
01531        /* for all ports */
01532       for(j = 0; j < NUM_DOMAINS; j++) {
01533         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01534             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01535               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01536           omx_base_component_Private->ports[i]->bIsPortFlushed = OMX_TRUE;
01537         }
01538       }
01539       /* for all ports */
01540       for(j = 0; j < NUM_DOMAINS; j++) {
01541         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01542         i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01543           omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01544           pPort=omx_base_component_Private->ports[i];
01545           err = pPort->FlushProcessingBuffers(pPort);
01546         }
01547       }
01548     }
01549     else {
01550       pPort=omx_base_component_Private->ports[message->messageParam];
01551       err = pPort->FlushProcessingBuffers(pPort);
01552     }
01553     if (err != OMX_ErrorNone) {
01554       (*(omx_base_component_Private->callbacks->EventHandler))
01555       (openmaxStandComp,
01556       omx_base_component_Private->callbackData,
01557       OMX_EventError, /* The command was completed */
01558       err, /* The commands was a OMX_CommandStateSet */
01559       0, /* The state has been changed in message->messageParam */
01560       NULL);
01561     } else {
01562       if(message->messageParam == OMX_ALL){ /*Flush all port*/
01563         /* for all ports */
01564         for(j = 0; j < NUM_DOMAINS; j++) {
01565           for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01566           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01567             omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01568             (*(omx_base_component_Private->callbacks->EventHandler))
01569             (openmaxStandComp,
01570             omx_base_component_Private->callbackData,
01571             OMX_EventCmdComplete, /* The command was completed */
01572             OMX_CommandFlush, /* The commands was a OMX_CommandStateSet */
01573             i, /* The state has been changed in message->messageParam */
01574             NULL);
01575 
01576             pPort=omx_base_component_Private->ports[i];
01577             /* Signal the buffer Semaphore and the buffer managment semaphore, to restart the exchange of buffers after flush */
01578             if (PORT_IS_TUNNELED(pPort) && PORT_IS_BUFFER_SUPPLIER(pPort)) {
01579               for(k=0;k<pPort->nNumTunnelBuffer;k++) {
01580                 tsem_up(pPort->pBufferSem);
01581                 /*signal buffer management thread availability of buffers*/
01582                 tsem_up(omx_base_component_Private->bMgmtSem);
01583               }
01584             }
01585           }
01586         }
01587       } else {/*Flush input/output port*/
01588         (*(omx_base_component_Private->callbacks->EventHandler))
01589         (openmaxStandComp,
01590         omx_base_component_Private->callbackData,
01591         OMX_EventCmdComplete, /* The command was completed */
01592         OMX_CommandFlush, /* The commands was a OMX_CommandStateSet */
01593         message->messageParam, /* The state has been changed in message->messageParam */
01594         NULL);
01595         /* Signal the buffer Semaphore and the buffer managment semaphore, to restart the exchange of buffers after flush */
01596         if (PORT_IS_TUNNELED(omx_base_component_Private->ports[message->messageParam])
01597              && PORT_IS_BUFFER_SUPPLIER(omx_base_component_Private->ports[message->messageParam])) {
01598             for(j=0;j<omx_base_component_Private->ports[message->messageParam]->nNumTunnelBuffer;j++) {
01599               tsem_up(omx_base_component_Private->ports[message->messageParam]->pBufferSem);
01600               /*signal buffer management thread availability of buffers*/
01601               tsem_up(omx_base_component_Private->bMgmtSem);
01602             }
01603           }
01604       }
01605     }
01606   }
01607   break;
01608   case OMX_CommandPortDisable: {
01609     /*Flush port/s*/
01610     if(message->messageParam == OMX_ALL) {
01611       /*If Component is not in loaded state,then First Flush all buffers then disable the port*/
01612       if(omx_base_component_Private->state!=OMX_StateLoaded) {
01613         /* for all ports */
01614         for(j = 0; j < NUM_DOMAINS; j++) {
01615           for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01616           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01617             omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01618           pPort=omx_base_component_Private->ports[i];
01619           err = pPort->FlushProcessingBuffers(pPort);
01620           }
01621         }
01622       }
01623       /* for all ports */
01624       for(j = 0; j < NUM_DOMAINS; j++) {
01625         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01626         i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01627           omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01628           pPort=omx_base_component_Private->ports[i];
01629           err = pPort->Port_DisablePort(pPort);
01630         }
01631       }
01632     }
01633     else {
01634       pPort=omx_base_component_Private->ports[message->messageParam];
01635       if(omx_base_component_Private->state!=OMX_StateLoaded) {
01636         err = pPort->FlushProcessingBuffers(pPort);
01637         DEBUG(DEB_LEV_FULL_SEQ, "In %s: Port Flush completed for Comp %s\n",__func__,omx_base_component_Private->name);
01638       }
01639       err = pPort->Port_DisablePort(pPort);
01640     }
01642     if (err != OMX_ErrorNone) {
01643       (*(omx_base_component_Private->callbacks->EventHandler))
01644       (openmaxStandComp,
01645       omx_base_component_Private->callbackData,
01646       OMX_EventError, /* The command was completed */
01647       err, /* The commands was a OMX_CommandStateSet */
01648       0, /* The state has been changed in message->messageParam */
01649       NULL);
01650     } else {
01651       if(message->messageParam == OMX_ALL){ /*Disable all ports*/
01652         /* for all ports */
01653         for(j = 0; j < NUM_DOMAINS; j++) {
01654           for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01655             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01656               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01657             (*(omx_base_component_Private->callbacks->EventHandler))
01658             (openmaxStandComp,
01659             omx_base_component_Private->callbackData,
01660             OMX_EventCmdComplete, /* The command was completed */
01661             OMX_CommandPortDisable, /* The commands was a OMX_CommandStateSet */
01662             i, /* The state has been changed in message->messageParam */
01663             NULL);
01664           }
01665         }
01666       } else {
01667         (*(omx_base_component_Private->callbacks->EventHandler))
01668         (openmaxStandComp,
01669         omx_base_component_Private->callbackData,
01670         OMX_EventCmdComplete, /* The command was completed */
01671         OMX_CommandPortDisable, /* The commands was a OMX_CommandStateSet */
01672         message->messageParam, /* The state has been changed in message->messageParam */
01673         NULL);
01674       }
01675     }
01676   }
01677   break;
01678   case OMX_CommandPortEnable:{
01679     /*Flush port/s*/
01680     if(message->messageParam == OMX_ALL) {
01681       /* for all ports */
01682       for(j = 0; j < NUM_DOMAINS; j++) {
01683         for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01684           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01685             omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01686           pPort=omx_base_component_Private->ports[i];
01687           err = pPort->Port_EnablePort(pPort);
01688           }
01689         }
01690     } else {
01691       pPort=omx_base_component_Private->ports[message->messageParam];
01692       err = pPort->Port_EnablePort(pPort);
01693     }
01694     if (err != OMX_ErrorNone) {
01695       (*(omx_base_component_Private->callbacks->EventHandler))
01696       (openmaxStandComp,
01697       omx_base_component_Private->callbackData,
01698       OMX_EventError, /* The command was completed */
01699       err, /* The commands was a OMX_CommandStateSet */
01700       0, /* The state has been changed in message->messageParam */
01701       NULL);
01702     } else {
01703       if(message->messageParam != OMX_ALL) {
01704         (*(omx_base_component_Private->callbacks->EventHandler))
01705         (openmaxStandComp,
01706         omx_base_component_Private->callbackData,
01707         OMX_EventCmdComplete, /* The command was completed */
01708         OMX_CommandPortEnable, /* The commands was a OMX_CommandStateSet */
01709         message->messageParam, /* The state has been changed in message->messageParam */
01710         NULL);
01711 
01712         if (omx_base_component_Private->state==OMX_StateExecuting) {
01713           pPort=omx_base_component_Private->ports[message->messageParam];
01714           if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01715             for(i=0; i < pPort->sPortParam.nBufferCountActual;i++) {
01716               tsem_up(pPort->pBufferSem);
01717               tsem_up(omx_base_component_Private->bMgmtSem);
01718             }
01719           }
01720         }
01721 
01722       } else {
01723         /* for all ports */
01724         for(j = 0; j < NUM_DOMAINS; j++) {
01725           for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01726           i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01727             omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01728           (*(omx_base_component_Private->callbacks->EventHandler))
01729           (openmaxStandComp,
01730           omx_base_component_Private->callbackData,
01731           OMX_EventCmdComplete, /* The command was completed */
01732           OMX_CommandPortEnable, /* The commands was a OMX_CommandStateSet */
01733           i, /* The state has been changed in message->messageParam */
01734           NULL);
01735           }
01736         }
01737 
01738         if (omx_base_component_Private->state==OMX_StateExecuting) {
01739           /* for all ports */
01740           for(j = 0; j < NUM_DOMAINS; j++) {
01741             for(i = omx_base_component_Private->sPortTypesParam[j].nStartPortNumber;
01742             i < omx_base_component_Private->sPortTypesParam[j].nStartPortNumber +
01743               omx_base_component_Private->sPortTypesParam[j].nPorts; i++) {
01744               pPort=omx_base_component_Private->ports[i];
01745               if (PORT_IS_BUFFER_SUPPLIER(pPort)) {
01746                 for(k=0; k < pPort->sPortParam.nBufferCountActual;k++) {
01747                   tsem_up(pPort->pBufferSem);
01748                   tsem_up(omx_base_component_Private->bMgmtSem);
01749                 }
01750               }
01751             }
01752           }
01753         }
01754       }
01755     }
01756   }
01757   break;
01758   case OMX_CommandMarkBuffer: {
01759     omx_base_component_Private->pMark.hMarkTargetComponent = ((OMX_MARKTYPE *)message->pCmdData)->hMarkTargetComponent;
01760     omx_base_component_Private->pMark.pMarkData            = ((OMX_MARKTYPE *)message->pCmdData)->pMarkData;
01761   }
01762   break;
01763   default:
01764     DEBUG(DEB_LEV_ERR, "In %s: Unrecognized command %i\n", __func__, message->messageType);
01765   break;
01766   }
01767   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, openmaxStandComp);
01768   return OMX_ErrorNone;
01769 }
01770 
01771 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_AllocateBuffer(
01772             OMX_HANDLETYPE hComponent,
01773             OMX_BUFFERHEADERTYPE** ppBuffer,
01774             OMX_U32 nPortIndex,
01775             OMX_PTR pAppPrivate,
01776             OMX_U32 nSizeBytes) {
01777   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01778   omx_base_PortType *pPort;
01779   OMX_ERRORTYPE err;
01780 
01781   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01782 
01783   if (nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01784                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01785                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01786                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01787     DEBUG(DEB_LEV_ERR, "In %s: wrong port index\n", __func__);
01788     return OMX_ErrorBadPortIndex;
01789   }
01790   pPort = omx_base_component_Private->ports[nPortIndex];
01791   err = pPort->Port_AllocateBuffer(pPort, ppBuffer, nPortIndex, pAppPrivate, nSizeBytes);
01792   if (err != OMX_ErrorNone) {
01793       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %i\n", __func__, hComponent, (int)err);
01794       return err;
01795   }
01796   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p buffer %p\n", __func__, hComponent, ppBuffer);
01797   return OMX_ErrorNone;
01798 }
01799 
01800 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_UseBuffer(
01801             OMX_HANDLETYPE hComponent,
01802             OMX_BUFFERHEADERTYPE** ppBufferHdr,
01803             OMX_U32 nPortIndex,
01804             OMX_PTR pAppPrivate,
01805             OMX_U32 nSizeBytes,
01806             OMX_U8* pBuffer) {
01807   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01808   omx_base_PortType *pPort;
01809   OMX_ERRORTYPE err;
01810 
01811   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01812   if (nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01813                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01814                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01815                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01816     DEBUG(DEB_LEV_ERR, "In %s: wrong port index\n", __func__);
01817     return OMX_ErrorBadPortIndex;
01818   }
01819   pPort = omx_base_component_Private->ports[nPortIndex];
01820   err = pPort->Port_UseBuffer(pPort, ppBufferHdr, nPortIndex, pAppPrivate, nSizeBytes, pBuffer);
01821   if (err != OMX_ErrorNone) {
01822       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %i\n", __func__, hComponent, (int)err);
01823       return err;
01824   }
01825   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01826   return OMX_ErrorNone;
01827 }
01828 
01829 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_UseEGLImage (
01830         OMX_HANDLETYPE hComponent,
01831         OMX_BUFFERHEADERTYPE** ppBufferHdr,
01832         OMX_U32 nPortIndex,
01833         OMX_PTR pAppPrivate,
01834         void* eglImage) {
01835   return OMX_ErrorNotImplemented;
01836 }
01837 
01838 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_FreeBuffer(
01839             OMX_HANDLETYPE hComponent,
01840             OMX_U32 nPortIndex,
01841             OMX_BUFFERHEADERTYPE* pBuffer) {
01842   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01843   omx_base_PortType *pPort;
01844   OMX_ERRORTYPE err;
01845 
01846   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01847   if (nPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01848                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01849                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01850                      omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01851     DEBUG(DEB_LEV_ERR, "In %s: wrong port index\n", __func__);
01852     return OMX_ErrorBadPortIndex;
01853   }
01854 
01855   pPort = omx_base_component_Private->ports[nPortIndex];
01856   err = pPort->Port_FreeBuffer(pPort, nPortIndex, pBuffer);
01857   if (err != OMX_ErrorNone) {
01858       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %i\n", __func__, hComponent, (int)err);
01859       return err;
01860   }
01861   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01862   return OMX_ErrorNone;
01863 }
01864 
01865 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_EmptyThisBuffer(
01866         OMX_HANDLETYPE hComponent,
01867         OMX_BUFFERHEADERTYPE* pBuffer) {
01868   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01869   omx_base_PortType *pPort;
01870   OMX_ERRORTYPE err;
01871 
01872   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01873 
01874   if (pBuffer->nInputPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01875                                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01876                                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01877                                    omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01878     DEBUG(DEB_LEV_ERR, "In %s: wrong port index\n", __func__);
01879     return OMX_ErrorBadPortIndex;
01880   }
01881   pPort = omx_base_component_Private->ports[pBuffer->nInputPortIndex];
01882   if (pPort->sPortParam.eDir != OMX_DirInput) {
01883     DEBUG(DEB_LEV_ERR, "In %s: wrong port direction in Component %s\n", __func__,omx_base_component_Private->name);
01884     return OMX_ErrorBadPortIndex;
01885   }
01886   err = pPort->Port_SendBufferFunction(pPort, pBuffer);
01887   if (err != OMX_ErrorNone) {
01888       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %s\n", __func__, hComponent, errorName(err));
01889       return err;
01890   }
01891   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01892   return OMX_ErrorNone;
01893 }
01894 
01895 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_FillThisBuffer(
01896   OMX_HANDLETYPE hComponent,
01897   OMX_BUFFERHEADERTYPE* pBuffer) {
01898 
01899   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01900   omx_base_PortType *pPort;
01901   OMX_ERRORTYPE err;
01902 
01903   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01904   if (pBuffer->nOutputPortIndex >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01905                                     omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01906                                     omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01907                                     omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01908     DEBUG(DEB_LEV_ERR, "In %s: wrong port index\n", __func__);
01909     return OMX_ErrorBadPortIndex;
01910   }
01911   pPort = omx_base_component_Private->ports[pBuffer->nOutputPortIndex];
01912   if (pPort->sPortParam.eDir != OMX_DirOutput) {
01913       DEBUG(DEB_LEV_ERR, "In %s: wrong port(%d) direction(%x) pBuffer=%p in Component %s\n", __func__,
01914               (int)pBuffer->nOutputPortIndex, (int)pPort->sPortParam.eDir, pBuffer, omx_base_component_Private->name);
01915     return OMX_ErrorBadPortIndex;
01916   }
01917   err = pPort->Port_SendBufferFunction(pPort,  pBuffer);
01918   if (err != OMX_ErrorNone) {
01919       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %s\n", __func__, hComponent, errorName(err));
01920       return err;
01921   }
01922   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01923   return OMX_ErrorNone;
01924 }
01925 
01926 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_component_ComponentTunnelRequest(
01927   OMX_HANDLETYPE hComponent,
01928   OMX_U32 nPort,
01929   OMX_HANDLETYPE hTunneledComp,
01930   OMX_U32 nTunneledPort,
01931   OMX_TUNNELSETUPTYPE* pTunnelSetup) {
01932 
01933   omx_base_component_PrivateType* omx_base_component_Private = (omx_base_component_PrivateType*)((OMX_COMPONENTTYPE*)hComponent)->pComponentPrivate;
01934   omx_base_PortType *pPort;
01935   OMX_ERRORTYPE err;
01936 
01937   DEBUG(DEB_LEV_FUNCTION_NAME, "In %s for component %p\n", __func__, hComponent);
01938   if (nPort >= (omx_base_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts +
01939                 omx_base_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts +
01940                 omx_base_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts +
01941                 omx_base_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts)) {
01942     return OMX_ErrorBadPortIndex;
01943   }
01944 
01945   pPort = omx_base_component_Private->ports[nPort];
01946   err = pPort->ComponentTunnelRequest(pPort, hTunneledComp, nTunneledPort, pTunnelSetup);
01947   if (err != OMX_ErrorNone) {
01948       DEBUG(DEB_LEV_ERR, "Out of %s for component %p with err %i\n", __func__, hComponent, (int)err);
01949       return err;
01950   }
01951   DEBUG(DEB_LEV_FUNCTION_NAME, "Out of %s for component %p\n", __func__, hComponent);
01952   return OMX_ErrorNone;
01953 }
01954 
01955 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_getQualityLevel(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32* pQualityLevel) {
01956     omx_base_component_PrivateType* omx_base_component_Private = openmaxStandComp->pComponentPrivate;
01957     DEBUG(DEB_LEV_FUNCTION_NAME, "In %s\n", __func__);
01958     *pQualityLevel = omx_base_component_Private->currentQualityLevel;
01959     return OMX_ErrorNone;
01960 }
01961 
01962 OSCL_EXPORT_REF OMX_ERRORTYPE omx_base_setQualityLevel(OMX_COMPONENTTYPE *openmaxStandComp, OMX_U32 nQualityLevel) {
01963     omx_base_component_PrivateType* omx_base_component_Private = openmaxStandComp->pComponentPrivate;
01964     /* this change is done regardless to the state. When the way to change effectively quality in a component is known
01965      * change this function adding state checks
01966      */
01967     DEBUG(DEB_LEV_SIMPLE_SEQ, "In %s setting %i of %i\n", __func__, (int)nQualityLevel, (int)omx_base_component_Private->nqualitylevels);
01968     if ((nQualityLevel > 0) && (nQualityLevel <= omx_base_component_Private->nqualitylevels)) {
01969         omx_base_component_Private->currentQualityLevel = nQualityLevel;
01970         return OMX_ErrorNone;
01971     } else {
01972         return OMX_ErrorBadParameter;
01973     }
01974 }
01975 
01976 #ifdef __cplusplus
01977 }
01978 #endif
01979