/** The destructor */ OMX_ERRORTYPE omx_jpegdec_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_jpegdec_component_PrivateType* omx_jpegdec_component_Private = openmaxStandComp->pComponentPrivate; OMX_U32 i; if(omx_jpegdec_component_Private->jpegdecSyncSem) { tsem_deinit(omx_jpegdec_component_Private->jpegdecSyncSem); free(omx_jpegdec_component_Private->jpegdecSyncSem); omx_jpegdec_component_Private->jpegdecSyncSem = NULL; } if(omx_jpegdec_component_Private->jpegdecSyncSem1) { tsem_deinit(omx_jpegdec_component_Private->jpegdecSyncSem1); free(omx_jpegdec_component_Private->jpegdecSyncSem1); omx_jpegdec_component_Private->jpegdecSyncSem1 = NULL; } /* frees port/s */ if (omx_jpegdec_component_Private->ports) { for (i=0; i < omx_jpegdec_component_Private->sPortTypesParam[OMX_PortDomainImage].nPorts; i++) { if(omx_jpegdec_component_Private->ports[i]) { omx_jpegdec_component_Private->ports[i]->PortDestructor(omx_jpegdec_component_Private->ports[i]); } } free(omx_jpegdec_component_Private->ports); omx_jpegdec_component_Private->ports=NULL; } DEBUG(DEB_LEV_FUNCTION_NAME, "Destructor of mad decoder component is called\n"); omx_base_filter_Destructor(openmaxStandComp); // nojpegdecInstance--; return OMX_ErrorNone; }
/** The Destructor */ OMX_ERRORTYPE omx_clocksrc_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_clocksrc_component_PrivateType* omx_clocksrc_component_Private = openmaxStandComp->pComponentPrivate; OMX_U32 i; omx_clocksrc_component_Private->sClockState.eState = OMX_TIME_ClockStateMax; /*Deinitialize and free message semaphore*/ if(omx_clocksrc_component_Private->clockEventSem) { tsem_deinit(omx_clocksrc_component_Private->clockEventSem); free(omx_clocksrc_component_Private->clockEventSem); omx_clocksrc_component_Private->clockEventSem=NULL; } if(omx_clocksrc_component_Private->clockEventCompleteSem) { tsem_deinit(omx_clocksrc_component_Private->clockEventCompleteSem); free(omx_clocksrc_component_Private->clockEventCompleteSem); omx_clocksrc_component_Private->clockEventCompleteSem=NULL; } /* frees port/s */ if (omx_clocksrc_component_Private->ports) { for (i=0; i < omx_clocksrc_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts; i++) { if(omx_clocksrc_component_Private->ports[i]) omx_clocksrc_component_Private->ports[i]->PortDestructor(omx_clocksrc_component_Private->ports[i]); } free(omx_clocksrc_component_Private->ports); omx_clocksrc_component_Private->ports=NULL; } return omx_base_source_Destructor(openmaxStandComp); }
/** The Destructor */ OMX_ERRORTYPE omx_videosrc_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_videosrc_component_PrivateType* omx_videosrc_component_Private = openmaxStandComp->pComponentPrivate; OMX_ERRORTYPE err = OMX_ErrorNone; OMX_U32 i; if(omx_videosrc_component_Private->videoSyncSem) { tsem_deinit(omx_videosrc_component_Private->videoSyncSem); free(omx_videosrc_component_Private->videoSyncSem); omx_videosrc_component_Private->videoSyncSem=NULL; } err = uninit_device(omx_videosrc_component_Private); if(omx_videosrc_component_Private->deviceHandle != -1) { if(-1 == close(omx_videosrc_component_Private->deviceHandle)) { DEBUG(DEB_LEV_ERR, "In %s Closing video capture device failed \n",__func__); } omx_videosrc_component_Private->deviceHandle = -1; } /* frees port/s */ if (omx_videosrc_component_Private->ports) { for (i=0; i < omx_videosrc_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts; i++) { if(omx_videosrc_component_Private->ports[i]) omx_videosrc_component_Private->ports[i]->PortDestructor(omx_videosrc_component_Private->ports[i]); } free(omx_videosrc_component_Private->ports); omx_videosrc_component_Private->ports=NULL; } noViderSrcInstance--; DEBUG(DEB_LEV_FUNCTION_NAME,"In %s \n",__func__); return omx_base_source_Destructor(openmaxStandComp); }
/** The Destructor */ OMX_ERRORTYPE omx_xvideo_sink_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_xvideo_sink_component_PrivateType* omx_xvideo_sink_component_Private = openmaxStandComp->pComponentPrivate; OMX_U32 i; /* frees port/s */ if (omx_xvideo_sink_component_Private->ports) { for (i=0; i < (omx_xvideo_sink_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts); i++) { if(omx_xvideo_sink_component_Private->ports[i]) omx_xvideo_sink_component_Private->ports[i]->PortDestructor(omx_xvideo_sink_component_Private->ports[i]); } free(omx_xvideo_sink_component_Private->ports); omx_xvideo_sink_component_Private->ports=NULL; } if(omx_xvideo_sink_component_Private->xvideoSyncSem) { tsem_deinit(omx_xvideo_sink_component_Private->xvideoSyncSem); free(omx_xvideo_sink_component_Private->xvideoSyncSem); omx_xvideo_sink_component_Private->xvideoSyncSem = NULL; } omx_base_sink_Destructor(openmaxStandComp); noxvideo_sinkInstance--; return OMX_ErrorNone; }
/** The destructor of the video decoder component */ OMX_ERRORTYPE omx_shvpudec_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_shvpudec_component_PrivateType* omx_shvpudec_component_Private = openmaxStandComp->pComponentPrivate; OMX_U32 i; #if 0 if(omx_shvpudec_component_Private->extradata) { free(omx_shvpudec_component_Private->extradata); omx_shvpudec_component_Private->extradata=NULL; } #endif if(omx_shvpudec_component_Private->avCodecSyncSem) { tsem_deinit(omx_shvpudec_component_Private->avCodecSyncSem); free(omx_shvpudec_component_Private->avCodecSyncSem); omx_shvpudec_component_Private->avCodecSyncSem = NULL; } /* frees port/s */ if (omx_shvpudec_component_Private->ports) { for (i=0; i < omx_shvpudec_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts; i++) { if(omx_shvpudec_component_Private->ports[i]) omx_shvpudec_component_Private->ports[i]->PortDestructor(omx_shvpudec_component_Private->ports[i]); } free(omx_shvpudec_component_Private->ports); omx_shvpudec_component_Private->ports=NULL; } DEBUG(DEB_LEV_FUNCTION_NAME, "Destructor of video decoder component is called\n"); omx_base_filter_Destructor(openmaxStandComp); noVideoDecInstance--; return OMX_ErrorNone; }
/* The Destructor */ OMX_ERRORTYPE omx_parser3gp_component_Destructor(OMX_COMPONENTTYPE *openmaxStandComp) { omx_parser3gp_component_PrivateType* omx_parser3gp_component_Private = openmaxStandComp->pComponentPrivate; OMX_U32 i; if(omx_parser3gp_component_Private->avformatSyncSem) { tsem_deinit(omx_parser3gp_component_Private->avformatSyncSem); free(omx_parser3gp_component_Private->avformatSyncSem); omx_parser3gp_component_Private->avformatSyncSem=NULL; } if(omx_parser3gp_component_Private->sInputFileName) { free(omx_parser3gp_component_Private->sInputFileName); omx_parser3gp_component_Private->sInputFileName = NULL; } if(omx_parser3gp_component_Private->pTmpOutputBuffer) { free(omx_parser3gp_component_Private->pTmpOutputBuffer); } /* frees port/s */ if (omx_parser3gp_component_Private->ports) { for (i=0; i < (omx_parser3gp_component_Private->sPortTypesParam[OMX_PortDomainAudio].nPorts + omx_parser3gp_component_Private->sPortTypesParam[OMX_PortDomainVideo].nPorts + omx_parser3gp_component_Private->sPortTypesParam[OMX_PortDomainOther].nPorts ); i++) { if(omx_parser3gp_component_Private->ports[i]) omx_parser3gp_component_Private->ports[i]->PortDestructor(omx_parser3gp_component_Private->ports[i]); } free(omx_parser3gp_component_Private->ports); omx_parser3gp_component_Private->ports=NULL; } noParser3gpInstance--; DEBUG(DEB_LEV_FUNCTION_NAME,"In %s \n",__func__); return omx_base_source_Destructor(openmaxStandComp); }
int useBufTest() { OMX_ERRORTYPE err = OMX_ErrorNone; OMX_BOOL bOmxInitialized = OMX_FALSE; OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition; OMX_CONFIG_BOOLEANTYPE sOmxCapturing; OMX_CONFIG_BOOLEANTYPE sOmxAutoPause; OMX_STATETYPE sOmxState; OMX_U32 nBufferCount; OMX_U32 nBufferSize; OMX_U32 nPortIndex; OMX_U32 i; unsigned int nPreviewTime = 5;/* By default, running for 5 sec for preview */ unsigned int nCaptureTime = 5;/* By default, running for 5 sec for video capture */ OMX_BOOL bCameraStillImageMode = OMX_FALSE; /* By default, the camera is running in video capture mode */ OMX_BOOL bCameraAutoPause = OMX_FALSE; /* By default, the camera is not running in autopause mode */ unsigned int nMaxRunCount = 1;/* By default, running once */ unsigned int nRunCount = 0; OMX_U8 *buf = NULL; surface_display_main_init(DEFAULT_FRAME_WIDTH, DEFAULT_FRAME_HEIGHT); /* Init the Omx core */ DEBUG(DEB_LEV_SIMPLE_SEQ, "Init the OMX core\n"); if ((err = OMX_Init()) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "The OpenMAX core can not be initialized. Exiting...\n"); goto EXIT; } bOmxInitialized = OMX_TRUE; /* Initialize application private data */ appPriv = malloc(sizeof(appPrivateType)); if (appPriv == NULL) { DEBUG(DEB_LEV_ERR, "Allocate app private data failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } memset(appPriv, 0, sizeof(appPrivateType)); memset(&sCameraPortBufferList, 0, NUM_CAMERAPORTS * sizeof(OMX_PORTBUFFERCTXT)); /* Getting camera component handle */ if ((err = OMX_GetHandle(&appPriv->camerahandle, "OMX.Action.Camera.Yuv", appPriv, &camera_source_callbacks)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Getting camera component handle failed!Exiting...\n"); goto EXIT; } /* Setting parameters for camera component */ if ((err = setCameraParameters(bCameraStillImageMode)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set camera parameters failed! Use default settings...\n"); /* Do not exit! */ } /* Allocate and init semaphores */ appPriv->cameraSourceEventSem = malloc(sizeof(tsem_t)); if (appPriv->cameraSourceEventSem == NULL) { DEBUG(DEB_LEV_ERR, "Allocate camera event semaphore failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } tsem_init(appPriv->cameraSourceEventSem, 0); RUN_AGAIN: for (nPortIndex = OMX_CAMPORT_INDEX_VF; nPortIndex <= OMX_CAMPORT_INDEX_CP; nPortIndex++) { if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandPortEnable, nPortIndex, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n"); goto EXIT; } tsem_down(appPriv->cameraSourceEventSem); } /* Transition camera component Loaded-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Loaded-->Idle failed!Exiting...\n"); goto EXIT; } /* Allocate port buffers for camera component */ for (nPortIndex = OMX_CAMPORT_INDEX_VF; nPortIndex <= OMX_CAMPORT_INDEX_CP; nPortIndex++) { setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sOmxPortDefinition.nPortIndex = nPortIndex; if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) { DEBUG( DEB_LEV_ERR, "OMX_GetParameter for camera on OMX_IndexParamPortDefinition index failed!Exiting...\n"); goto EXIT; } nBufferCount = sOmxPortDefinition.nBufferCountActual; nBufferSize = sOmxPortDefinition.nBufferSize; DEBUG( DEB_LEV_SIMPLE_SEQ, "Camera port[%ld] needs %ld buffers each of which is %ld bytes\n", nPortIndex, nBufferCount, nBufferSize); for (i = 0; i < nBufferCount; i++) { buf = (OMX_U8 *)malloc(nBufferSize); if(buf == NULL){ DEBUG(DEB_LEV_ERR, "Allocate port buffer for camera failed!Exiting...\n"); goto EXIT; } if ((err = OMX_UseBuffer(appPriv->camerahandle, &sCameraPortBufferList[nPortIndex].pBufHeaderList[i], nPortIndex, NULL, nBufferSize, buf)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Allocate port buffer for camera failed!Exiting...\n"); goto EXIT; } sCameraPortBufferList[nPortIndex].nBufferCountActual++; } } /* Wait camera (Loaded-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Transition camera component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Idle-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Fill buffers to camera preview port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG( DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32) sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]); } /* Fill buffers to camera capture port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG( DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32) sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]); } fprintf(stdout, "Start preview, for %d sec...\n", nPreviewTime); sleep(nPreviewTime); /* Set up autopause mode */ setHeader(&sOmxAutoPause, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxAutoPause.bEnabled = bCameraAutoPause; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexAutoPauseAfterCapture, &sOmxAutoPause)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set autopause mode failed!Use default settings...\n"); /* Do not exit */ } /* Start capturing */ setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxCapturing.bEnabled = OMX_TRUE; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Start capturing failed!Exiting...\n"); goto EXIT; } fprintf(stdout, "Start capturing, for %d sec...\n", nCaptureTime); sleep(nCaptureTime); /* Stop capturing */ if (!bCameraStillImageMode) { setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxCapturing.bEnabled = OMX_FALSE; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Stop capturing failed!Exiting...\n"); goto EXIT; } fprintf(stdout, "Stop capturing...\n"); } /* If in autopause mode, stay for a while before exit */ if (bCameraAutoPause) { fprintf( stdout,"pause state for capture, sleep(%d)\n",5); sleep(5); /* Stop autopause mode */ if ((err = OMX_GetState(appPriv->camerahandle, &sOmxState)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Get camera state failed!Exiting...\n"); goto EXIT; } if (sOmxState == OMX_StatePause) { if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, 0)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Pause-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Pause-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); fprintf( stdout, "Now the camera is out of autopause mode, wait for %d sec before exit...\n", 5); sleep(5); } else { DEBUG(DEB_LEV_ERR, "The camera is not in Pause state in autopause mode, ignore...\n"); } } #if 1 /* Transition camera component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Wait camera (Exec-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Transition camera component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Idle-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Fill buffers to camera preview port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG( DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32) sCameraPortBufferList[OMX_CAMPORT_INDEX_VF].pBufHeaderList[i]); } /* Fill buffers to camera capture port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG( DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32) sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]); } fprintf(stdout, "Continue to preview, for %d sec...\n", nPreviewTime); sleep(nPreviewTime); #endif /* Transition camera component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Wait camera (Exec-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Transition camera component Idle-->Loaded */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Loaded failed!Exiting...\n"); goto EXIT; } #if 1 /* Free bufers for each non-tunneled port of camera component */ for (nPortIndex = OMX_CAMPORT_INDEX_VF; nPortIndex <= OMX_CAMPORT_INDEX_CP; nPortIndex++) { for (i = 0; i < sCameraPortBufferList[nPortIndex].nBufferCountActual; i++) { if (sCameraPortBufferList[nPortIndex].pBufHeaderList[i] != NULL) { buf = sCameraPortBufferList[nPortIndex].pBufHeaderList[i]->pBuffer; OMX_FreeBuffer(appPriv->camerahandle, nPortIndex, sCameraPortBufferList[nPortIndex].pBufHeaderList[i]); if(buf){ free(buf); } sCameraPortBufferList[nPortIndex].pBufHeaderList[i]=NULL; } } sCameraPortBufferList[nPortIndex].nBufferCountActual = 0; } #endif /* Wait camera (Idle-->Loaded) to complete */ tsem_down(appPriv->cameraSourceEventSem); nRunCount++; if (nRunCount < nMaxRunCount) { goto RUN_AGAIN; } EXIT: for (nPortIndex = OMX_CAMPORT_INDEX_VF; nPortIndex <= OMX_CAMPORT_INDEX_CP; nPortIndex++) { for (i = 0; i < sCameraPortBufferList[nPortIndex].nBufferCountActual; i++) { if (sCameraPortBufferList[nPortIndex].pBufHeaderList[i] != NULL) { buf = sCameraPortBufferList[nPortIndex].pBufHeaderList[i]->pBuffer; OMX_FreeBuffer(appPriv->camerahandle, nPortIndex, sCameraPortBufferList[nPortIndex].pBufHeaderList[i]); if(buf){ free(buf); } sCameraPortBufferList[nPortIndex].pBufHeaderList[i]=NULL; } } sCameraPortBufferList[nPortIndex].nBufferCountActual = 0; } /* Free app private data */ if (appPriv != NULL) { /* Free semaphores */ if (appPriv->cameraSourceEventSem != NULL) { tsem_deinit(appPriv->cameraSourceEventSem); free(appPriv->cameraSourceEventSem); } /* Free camera component handle */ if (appPriv->camerahandle != NULL) { OMX_FreeHandle(appPriv->camerahandle); } free(appPriv); } /* Deinit the Omx core */ if (bOmxInitialized) { OMX_Deinit(); } return (int) err; }
int main(int argc, char** argv) { OMX_ERRORTYPE err = OMX_ErrorNone; OMX_BOOL bOmxInitialized = OMX_FALSE; OMX_PARAM_PORTDEFINITIONTYPE sOmxPortDefinition; OMX_CONFIG_BOOLEANTYPE sOmxCapturing; OMX_CONFIG_BOOLEANTYPE sOmxAutoPause; OMX_STATETYPE sOmxState; OMX_U32 nBufferCount; OMX_U32 nBufferSize; OMX_U32 nPortIndex; OMX_U32 i; unsigned int nPreviewTime = 5;/* By default, running for 5 sec for preview */ unsigned int nCaptureTime = 5;/* By default, running for 5 sec for video capture */ char *cCaptureFileName = g_DefaultCaptureFileName; char *cThumbnailFileName = g_DefaultThumbnailFileName; OMX_BOOL bCameraStillImageMode = OMX_FALSE; /* By default, the camera is running in video capture mode */ OMX_BOOL bCameraAutoPause = OMX_FALSE; /* By default, the camera is not running in autopause mode */ unsigned int nMaxRunCount = 1;/* By default, running once */ unsigned int nRunCount = 0; /* Parse arguments */ for ( i = 1; i < argc && argv[i][0] == '-'; i++) { switch (argv[i][1]) { case 'i': bCameraStillImageMode = OMX_TRUE; break; case 'p': bCameraAutoPause = OMX_TRUE; break; case 't': i++; if (i>=argc ||argv[i][0] == '-') { DEBUG(DEB_LEV_ERR, "preview_time expected!\n"); display_help(argv[0]); exit(-1); } nPreviewTime = (unsigned int)atoi(argv[i]); break; case 's': i++; if (i>=argc ||argv[i][0] == '-') { DEBUG(DEB_LEV_ERR, "capture_time expected!\n"); display_help(argv[0]); exit(-1); } nCaptureTime = (unsigned int)atoi(argv[i]); break; case 'c': i++; if (i>=argc ||argv[i][0] == '-') { DEBUG(DEB_LEV_ERR, "capture_file expected!\n"); display_help(argv[0]); exit(-1); } cCaptureFileName = argv[i]; break; case 'm': i++; if (i>=argc ||argv[i][0] == '-') { DEBUG(DEB_LEV_ERR, "thumbnail_file expected!\n"); display_help(argv[0]); exit(-1); } cThumbnailFileName = argv[i]; break; case 'n': i++; if (i>=argc ||argv[i][0] == '-') { DEBUG(DEB_LEV_ERR, "run_count expected!\n"); display_help(argv[0]); exit(-1); } nMaxRunCount = (unsigned int)atoi(argv[i]); break; case 'h': display_help(argv[0]); exit(0); break; default: DEBUG(DEB_LEV_ERR, "Unrecognized option -%c!\n", argv[i][1]); display_help(argv[0]); exit(-1); } } /* Init the Omx core */ DEBUG(DEB_LEV_SIMPLE_SEQ, "Init the OMX core\n"); if ((err = OMX_Init()) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "The OpenMAX core can not be initialized. Exiting...\n"); goto EXIT; } bOmxInitialized = OMX_TRUE; /* Initialize application private data */ appPriv = malloc(sizeof(appPrivateType)); if (appPriv == NULL) { DEBUG(DEB_LEV_ERR, "Allocate app private data failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } memset(appPriv, 0, sizeof(appPrivateType)); memset(&sCameraPortBufferList, 0, NUM_CAMERAPORTS*sizeof(OMX_PORTBUFFERCTXT)); /* Open output file for camera capture and thumbnail port */ fCapture=fopen(cCaptureFileName, "wb"); fThumbnail=fopen(cThumbnailFileName, "wb"); /* Getting camera component handle */ if ((err = OMX_GetHandle(&appPriv->camerahandle, "OMX.st.v4l.camera_source", appPriv, &camera_source_callbacks)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Getting camera component handle failed!Exiting...\n"); goto EXIT; } /* Getting fbsink component handle */ if ((err = OMX_GetHandle(&appPriv->colorconvhandle, "OMX.st.video_colorconv.ffmpeg", appPriv, &colorconv_callbacks)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Getting color conv component handle failed!Exiting...\n"); goto EXIT; } /* Getting fbsink component handle */ if ((err = OMX_GetHandle(&appPriv->fbsinkhandle, "OMX.st.fbdev.fbdev_sink", appPriv, &fbsink_callbacks)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Getting fbsink component handle failed!Exiting...\n"); goto EXIT; } /* Setting parameters for camera component */ if ((err = setCameraParameters(bCameraStillImageMode)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set camera parameters failed! Use default settings...\n"); /* Do not exit! */ } /* Setting parameters for color converter component */ if ((err = setColorConvParameters()) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n"); /* Do not exit! */ } /* Setting parameters for fbsink component */ if ((err = setFbsinkParameters()) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set fbsink parameters failed! Use default settings...\n"); /* Do not exit! */ } /* Allocate and init semaphores */ appPriv->cameraSourceEventSem = malloc(sizeof(tsem_t)); if (appPriv->cameraSourceEventSem == NULL) { DEBUG(DEB_LEV_ERR, "Allocate camera event semaphore failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } tsem_init(appPriv->cameraSourceEventSem, 0); appPriv->fbsinkEventSem = malloc(sizeof(tsem_t)); if (appPriv->fbsinkEventSem == NULL) { DEBUG(DEB_LEV_ERR, "Allocate fbsink event semaphore failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } tsem_init(appPriv->fbsinkEventSem, 0); appPriv->colorconvEventSem = malloc(sizeof(tsem_t)); if (appPriv->colorconvEventSem == NULL) { DEBUG(DEB_LEV_ERR, "Allocate colorconv event semaphore failed!Exiting...\n"); err = OMX_ErrorInsufficientResources; goto EXIT; } tsem_init(appPriv->colorconvEventSem, 0); /* Setup tunnel between camera preview port, color converter and fbsink */ if ((err = OMX_SetupTunnel(appPriv->camerahandle, OMX_CAMPORT_INDEX_VF, appPriv->colorconvhandle, 0)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Setup tunnel between camera preview port and color converter failed!Exiting...\n"); goto EXIT; } if ((err = OMX_SetupTunnel(appPriv->colorconvhandle, 1, appPriv->fbsinkhandle, 0)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Setup tunnel between color conv port and fbsink failed!Exiting...\n"); goto EXIT; } RUN_AGAIN: /* Transition camera component Loaded-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Loaded-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition color conv component Loaded-->Idle */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Color Conv Loaded-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Loaded-->Idle */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Loaded-->Idle failed!Exiting...\n"); goto EXIT; } /* Allocate port buffers for camera component */ for (nPortIndex = OMX_CAMPORT_INDEX_CP; nPortIndex <= OMX_CAMPORT_INDEX_CP_T; nPortIndex++) { setHeader(&sOmxPortDefinition, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sOmxPortDefinition.nPortIndex = nPortIndex; if ((err = OMX_GetParameter(appPriv->camerahandle, OMX_IndexParamPortDefinition, &sOmxPortDefinition)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "OMX_GetParameter for camera on OMX_IndexParamPortDefinition index failed!Exiting...\n"); goto EXIT; } nBufferCount = sOmxPortDefinition.nBufferCountActual; nBufferSize = sOmxPortDefinition.nBufferSize; DEBUG(DEB_LEV_SIMPLE_SEQ, "Camera port[%ld] needs %ld buffers each of which is %ld bytes\n", nPortIndex, nBufferCount, nBufferSize); for (i = 0; i < nBufferCount; i++) { if ((err = OMX_AllocateBuffer(appPriv->camerahandle, &sCameraPortBufferList[nPortIndex].pBufHeaderList[i], nPortIndex, NULL, nBufferSize)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Allocate port buffer for camera failed!Exiting...\n"); goto EXIT; } sCameraPortBufferList[nPortIndex].nBufferCountActual++; } } /* Wait camera (Loaded-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait fbsink (Loaded-->Idle) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Loaded-->Idle) to complete */ tsem_down(appPriv->fbsinkEventSem); /* Transition camera component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Transition color conv component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Colorconv Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Idle-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait color conv (Idle-->Exec) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Idle-->Exec) to complete */ tsem_down(appPriv->fbsinkEventSem); fprintf(stdout, "Start preview, for %d sec...\n", nPreviewTime); sleep(nPreviewTime); /* Fill buffers to camera capture port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32)sCameraPortBufferList[OMX_CAMPORT_INDEX_CP].pBufHeaderList[i]); } /* Fill buffers to camera thumbnail port */ for (i = 0; i < sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].nBufferCountActual; i++) { sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]->nFilledLen = 0; sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]->nOffset = 0; if ((err = OMX_FillThisBuffer(appPriv->camerahandle, sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i])) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fill buffer to camera capture port failed!Exiting...\n"); goto EXIT; } DEBUG(DEB_LEV_SIMPLE_SEQ, "%s: Fill buffer[%ld] (0x%lX) to camera capture port\n", __func__, i, (OMX_U32)sCameraPortBufferList[OMX_CAMPORT_INDEX_CP_T].pBufHeaderList[i]); } /* Set up autopause mode */ setHeader(&sOmxAutoPause, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxAutoPause.bEnabled = bCameraAutoPause; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexAutoPauseAfterCapture, &sOmxAutoPause)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Set autopause mode failed!Use default settings...\n"); /* Do not exit */ } /* Start capturing */ setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxCapturing.bEnabled = OMX_TRUE; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Start capturing failed!Exiting...\n"); goto EXIT; } fprintf(stdout, "Start capturing, for %d sec...\n", nCaptureTime); sleep(nCaptureTime); /* Stop capturing */ if (!bCameraStillImageMode) { setHeader(&sOmxCapturing, sizeof(OMX_CONFIG_BOOLEANTYPE)); sOmxCapturing.bEnabled = OMX_FALSE; if ((err = OMX_SetConfig(appPriv->camerahandle, OMX_IndexConfigCapturing, &sOmxCapturing)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Stop capturing failed!Exiting...\n"); goto EXIT; } fprintf(stdout, "Stop capturing...\n"); } /* If in autopause mode, stay for a while before exit */ if (bCameraAutoPause) { fprintf(stdout, "Now the camera is in autopause mode, wait for %d sec before out of this mode...\n", 5); sleep(5); /* Stop autopause mode */ if ((err = OMX_GetState(appPriv->camerahandle,&sOmxState)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Get camera state failed!Exiting...\n"); goto EXIT; } if (sOmxState == OMX_StatePause) { if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, 0 )) != OMX_ErrorNone ) { DEBUG(DEB_LEV_ERR, "Pause-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Pause-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); fprintf(stdout, "Now the camera is out of autopause mode, wait for %d sec before exit...\n", 5); sleep(5); } else { DEBUG(DEB_LEV_ERR, "The camera is not in Pause state in autopause mode, ignore...\n"); } } /* Transition camera component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition colorconv component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Wait camera (Exec-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait color conv (Exec-->Idle) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Exec-->Idle) to complete */ tsem_down(appPriv->fbsinkEventSem); /* Transition camera component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Transition color conv component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Colorconv Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Idle-->Exec */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateExecuting, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Exec failed!Exiting...\n"); goto EXIT; } /* Wait camera (Idle-->Exec) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait color conv (Exec-->Idle) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Idle-->Exec) to complete */ tsem_down(appPriv->fbsinkEventSem); fprintf(stdout, "Continue to preview, for %d sec...\n", nPreviewTime); sleep(nPreviewTime); /* Transition camera component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition color conv component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Exec-->Idle */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateIdle, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Wait camera (Exec-->Idle) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait color conv (Exec-->Idle) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Exec-->Idle) to complete */ tsem_down(appPriv->fbsinkEventSem); /* Transition camera component Idle-->Loaded */ if ((err = OMX_SendCommand(appPriv->camerahandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Camera Idle-->Loaded failed!Exiting...\n"); goto EXIT; } /* Transition color conv component Idle-->Loaded */ if ((err = OMX_SendCommand(appPriv->colorconvhandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Color conv Exec-->Idle failed!Exiting...\n"); goto EXIT; } /* Transition fbsink component Idle-->Loaded */ if ((err = OMX_SendCommand(appPriv->fbsinkhandle, OMX_CommandStateSet, OMX_StateLoaded, NULL)) != OMX_ErrorNone) { DEBUG(DEB_LEV_ERR, "Fbsink Idle-->Loaded failed!Exiting...\n"); goto EXIT; } /* Free bufers for each non-tunneled port of camera component */ for (nPortIndex = OMX_CAMPORT_INDEX_CP; nPortIndex <= OMX_CAMPORT_INDEX_CP_T; nPortIndex++) { for (i = 0; i < sCameraPortBufferList[nPortIndex].nBufferCountActual; i++) { if (sCameraPortBufferList[nPortIndex].pBufHeaderList[i] != NULL) { OMX_FreeBuffer(appPriv->camerahandle, nPortIndex, sCameraPortBufferList[nPortIndex].pBufHeaderList[i]); } } sCameraPortBufferList[nPortIndex].nBufferCountActual = 0; } /* Wait camera (Idle-->Loaded) to complete */ tsem_down(appPriv->cameraSourceEventSem); /* Wait color conv (Exec-->Idle) to complete */ tsem_down(appPriv->colorconvEventSem); /* Wait fbsink (Idle-->Loaded) to complete */ tsem_down(appPriv->fbsinkEventSem); nRunCount++; if (nRunCount < nMaxRunCount) { goto RUN_AGAIN; } fprintf(stdout, "The captured videos are saved in file \"%s\"\n", cCaptureFileName); fprintf(stdout, "The thumbnail image is saved in file \"%s\"\n", cThumbnailFileName); EXIT: if (fCapture != NULL) { fclose(fCapture); } if (fThumbnail != NULL) { fclose(fThumbnail); } /* Free app private data */ if (appPriv != NULL) { /* Free semaphores */ if (appPriv->cameraSourceEventSem != NULL) { tsem_deinit(appPriv->cameraSourceEventSem); free(appPriv->cameraSourceEventSem); } if (appPriv->colorconvEventSem != NULL) { tsem_deinit(appPriv->colorconvEventSem); free(appPriv->colorconvEventSem); } if (appPriv->fbsinkEventSem != NULL) { tsem_deinit(appPriv->fbsinkEventSem); free(appPriv->fbsinkEventSem); } /* Free camera component handle */ if (appPriv->camerahandle != NULL) { OMX_FreeHandle(appPriv->camerahandle); } /* Free Color conv component handle */ if (appPriv->colorconvhandle != NULL) { OMX_FreeHandle(appPriv->colorconvhandle); } /* Free fbsink component handle */ if (appPriv->fbsinkhandle != NULL) { OMX_FreeHandle(appPriv->fbsinkhandle); } free(appPriv); } /* Deinit the Omx core */ if (bOmxInitialized) { OMX_Deinit(); } return (int) err; }
void stop(void) { tsem_deinit(&initSem); return; }