|
OpenMAXBellagio 0.9.3
|
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