OMX_ERRORTYPE omxil_comp::GetComponentVersion(OMX_STRING pComponentName, OMX_VERSIONTYPE *pComponentVersion, OMX_VERSIONTYPE *pSpecVersion, OMX_UUIDTYPE *pComponentUUID) const { OMX_ERRORTYPE result; result = OMX_GetComponentVersion(comp, pComponentName, pComponentVersion, pSpecVersion, pComponentUUID); if (result != OMX_ErrorNone) { fprintf(stderr, "OMX_GetComponentVersion failed.\n"); } return result; }
int main(int argc, char** argv) { OMX_PORT_PARAM_TYPE param; OMX_PARAM_PORTDEFINITIONTYPE sPortDef; OMX_AUDIO_PORTDEFINITIONTYPE sAudioPortDef; OMX_AUDIO_PARAM_PORTFORMATTYPE sAudioPortFormat; OMX_AUDIO_PARAM_PCMMODETYPE sPCMMode; OMX_BUFFERHEADERTYPE **inBuffers[2]; char *componentName = "OMX.broadcom.video_render"; unsigned char name[OMX_MAX_STRINGNAME_SIZE]; OMX_UUIDTYPE uid; int startPortNumber; int nPorts; int i, n; bcm_host_init(); fprintf(stderr, "Thread id is %p\n", pthread_self()); if(argc < 2){ display_help(argv); exit(1); } fd = open(argv[1], O_RDONLY); if(fd < 0){ perror("Error opening input file\n"); exit(1); } filesize = getFileSize(fd); err = OMX_Init(); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_Init() failed\n", 0); exit(1); } /** Ask the core for a handle to the audio render component */ err = OMX_GetHandle(&handle, componentName, NULL /*app private data */, &callbacks); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetHandle failed\n", 0); exit(1); } err = OMX_GetComponentVersion(handle, name, &compVersion, &specVersion, &uid); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetComponentVersion failed\n", 0); exit(1); } /** disable other ports */ disablePort(OMX_IndexParamOtherInit); /** Get audio port information */ setHeader(¶m, sizeof(OMX_PORT_PARAM_TYPE)); err = OMX_GetParameter(handle, OMX_IndexParamVideoInit, ¶m); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in getting OMX_PORT_PARAM_TYPE parameter\n", 0); exit(1); } startPortNumber = ((OMX_PORT_PARAM_TYPE)param).nStartPortNumber; nPorts = ((OMX_PORT_PARAM_TYPE)param).nPorts; if (nPorts > 2) { fprintf(stderr, "Image device has more than one port\n"); exit(1); } for (i = 0; i < nPorts; i++) { /* Get and check port information */ setHeader(&sPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sPortDef.nPortIndex = startPortNumber + i; err = OMX_GetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); if(err != OMX_ErrorNone) { fprintf(stderr, "Error in getting OMX_PORT_DEFINITION_TYPE parameter\n", 0); exit(1); } if (sPortDef.eDomain != OMX_PortDomainVideo) { fprintf(stderr, "Port %d is not a video port\n", sPortDef.nPortIndex); exit(1); } if (sPortDef.eDir == OMX_DirInput) fprintf(stdout, "Port %d is an input port\n", sPortDef.nPortIndex); else fprintf(stdout, "Port %d is an output port\n", sPortDef.nPortIndex); if (sPortDef.format.video.eColorFormat == OMX_COLOR_FormatYUV420PackedPlanar) fprintf(stderr, "Port color Format is YUV420PackedPlanar\n"); else fprintf(stderr, "Port has unknown color format\n"); /* Set Image Format -- FIXME: hardcoded */ sPortDef.format.video.nFrameWidth = 1920; sPortDef.format.video.nFrameHeight = 1080; sPortDef.format.video.nStride = ALIGN(sPortDef.format.video.nFrameWidth, 32); sPortDef.format.image.nSliceHeight = ALIGN(sPortDef.format.video.nFrameHeight, 16); sPortDef.nBufferSize = sPortDef.format.image.nStride * sPortDef.format.image.nSliceHeight * 3 / 2; /* Create minimum number of buffers for the port */ nBuffers = sPortDef.nBufferCountActual = sPortDef.nBufferCountMin; fprintf(stderr, "Number of bufers is %d\n", nBuffers); err = OMX_SetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in setting OMX_PORT_PARAM_TYPE parameter\n", 0); exit(1); } if (sPortDef.bEnabled) { fprintf(stderr, "Port %d is enabled\n", sPortDef.nPortIndex); } else { fprintf(stderr, "Port %d is not enabled\n", sPortDef.nPortIndex); } } /* call to put state into idle before allocating buffers */ printf("OMX_CommandStateSet, OMX_StateIdle\n"); err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateIdle, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting state to idle\n"); exit(1); } for (i = 0; i < nPorts; i++) { /* Get and check port information */ setHeader(&sPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sPortDef.nPortIndex = startPortNumber + i; err = OMX_GetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); if(err != OMX_ErrorNone) { fprintf(stderr, "Error in getting OMX_PORT_DEFINITION_TYPE parameter\n", 0); exit(1); } if (!sPortDef.bEnabled) { printf("OMX_CommandPortEnable, %d\n", startPortNumber); err = OMX_SendCommand(handle, OMX_CommandPortEnable, startPortNumber, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting port to enabled\n"); exit(1); } } } /* Configure buffers for the port */ for (i = 0; i < nPorts; i++) { setHeader(&sPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sPortDef.nPortIndex = startPortNumber + i; err = OMX_GetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); nBufferSize = sPortDef.nBufferSize; fprintf(stderr, "Port %d has %d buffers of size %d\n", sPortDef.nPortIndex, nBuffers, nBufferSize); inBuffers[i] = malloc(nBuffers * sizeof(OMX_BUFFERHEADERTYPE *)); if (inBuffers[i] == NULL) { fprintf(stderr, "Can't allocate buffers\n"); exit(1); } for (n = 0; n < nBuffers; n++) { err = OMX_AllocateBuffer(handle, inBuffers[i] + n, startPortNumber + i, NULL, nBufferSize); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on AllocateBuffer in 1%i\n", err); exit(1); } } } printf("Transition to Idle\n"); /* Make sure we've reached Idle state */ waitFor(OMX_StateIdle); printf("Transition to Executing\n"); /* Now try to switch to Executing state */ err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); if(err != OMX_ErrorNone){ exit(1); } /* One buffer is the minimum for Broadcom component, so use that */ pEmptyBuffer = inBuffers[0][0]; emptyState = 1; /* Fill and empty buffer */ for (;;) { int data_read = read(fd, pEmptyBuffer->pBuffer, nBufferSize); pEmptyBuffer->nFilledLen = data_read; pEmptyBuffer->nOffset = 0; filesize -= data_read; if (filesize <= 0) { pEmptyBuffer->nFlags = OMX_BUFFERFLAG_EOS; } fprintf(stderr, "Emptying again buffer %p %d bytes, %d to go\n", pEmptyBuffer, data_read, filesize); err = OMX_EmptyThisBuffer(handle, pEmptyBuffer); waitForEmpty(); fprintf(stderr, "Waited for empty\n"); if (bEOS) { fprintf(stderr, "Exiting loop\n"); break; } } fprintf(stderr, "Buffers emptied\n"); exit(0); }
int jpege_main(void *Param) { OMX_PARAM_PORTDEFINITIONTYPE asPortDefinition[2]; OMX_PORT_PARAM_TYPE sImageInit; OMX_IMAGE_PARAM_PORTFORMATTYPE sImageParamPortformatType; OMX_CALLBACKTYPE sCallbacks; OMX_IMAGE_PARAM_QFACTORTYPE sImageParamQFacttype; int i = 0, j = 0; OMX_ERRORTYPE err = OMX_ErrorNone; OMX_STATETYPE state = OMX_StateMax; OMX_U32 nQFactor = 0; OMX_S8 **cName; OMX_U32 numComp; char ConfigFileName[256]; OMX_S8 componentName[256]; OMX_VERSIONTYPE componentVer; OMX_VERSIONTYPE specVer; OMX_UUIDTYPE componentUUID; void *InputPortRet, *OutputPortRet, *OutputDataRet; memset(asPortDefinition, 0, sizeof(asPortDefinition)); memset(&sImageInit, 0, sizeof(sImageInit)); memset(&sImageParamPortformatType, 0, sizeof(sImageParamPortformatType)); memset(&sCallbacks, 0, sizeof(sCallbacks)); output_mode = ((VIDEODECFUNCPARAMTYPE *) Param)->Mode; nFrameWidth = ((VIDEODECFUNCPARAMTYPE *) Param)->nFrameWidth; nFrameHeight = ((VIDEODECFUNCPARAMTYPE *) Param)->nFrameHeight; eColorFormat = ((VIDEODECFUNCPARAMTYPE *) Param)->eColorFormat; nQFactor = ((VIDEODECFUNCPARAMTYPE *) Param)->nQFactor; int ret = 0, hasHandle = 0, commandValue = 0, hasNoWait = 1; /* */ ef = ff = 0; if ((frameSize = yuv_framesize(nFrameWidth, nFrameHeight, eColorFormat)) <= 0) { FILE_DBG1("[emxx_jpeglib][%d] yuv_init\n", __LINE__); return -1; } strcpy(ConfigFileName, AV_CODEC_CONFIG_FILE_NAME); err = OMF_SetLogMode(0x00000001); if (err != OMX_ErrorNone) { FILE_DBG1("[emxx_jpeglib] Can't set log mode! error code = 0x%08x\n", err); goto jpege_end; } err = OMF_SetConfiguration(ConfigFileName); if (err != OMX_ErrorNone) { FILE_DBG1("[emxx_jpeglib] Can't set configuration file! error code = 0x%08x\n", err); goto jpege_end; } err = OMX_Init(); if (err != OMX_ErrorNone) { FILE_DBG("can't initialize OMX LIb, exit\n"); goto jpege_end; } /* Get MC Name */ cName = (OMX_U8 **) malloc(sizeof(OMX_U8 *)); cName[0] = (OMX_U8 *) malloc(128 * sizeof(OMX_U8)); numComp = 1; err = OMX_GetComponentsOfRole(JPEGE_ROLE, &numComp, cName); if (err != OMX_ErrorNone) { FILE_DBG1("[emxx_jpeglib] Can't get component name! error code = 0x%8x\n", err); } else { FILE_DBG1("OMF Name = %s\n", cName[0]); } /* Get Media Component handle. */ sCallbacks.EventHandler = event_handler; sCallbacks.EmptyBufferDone = empty_buffer_done; sCallbacks.FillBufferDone = fill_buffer_done; err = OMX_GetHandle(&Video_hComponent, cName[0], NULL, &sCallbacks); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't get handle! erro code = 0x%08x\n", __LINE__, err); free(cName[0]); free(cName); ret = -1; goto jpege_end; } hasHandle = 1; free(cName[0]); free(cName); /* GetComponentVersion */ err = OMX_GetComponentVersion(Video_hComponent, componentName, &componentVer, &specVer, &componentUUID); if (err != OMX_ErrorNone) { FILE_DBG2( "[emxx_jpeglib][%d] Can't get component version! error code = 0x%08x\n", __LINE__, err); return -1; } else { printf("Component Version = 0x%08x\n", componentVer); printf("Spec Version = 0x%08x\n", specVer); } /* Get OMX_IndexParamImageInit. */ sImageInit.nSize = sizeof(OMX_PORT_PARAM_TYPE); err = OMX_GetParameter(Video_hComponent, OMX_IndexParamImageInit, &sImageInit); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't get parameter! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } /* Get & Set OMX_IndexParamPortDefinition. */ for (i = 0; i < sImageInit.nPorts; i++) { asPortDefinition[i].nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); asPortDefinition[i].nPortIndex = sImageInit.nStartPortNumber + i; err = OMX_GetParameter(Video_hComponent, OMX_IndexParamPortDefinition, &asPortDefinition[i]); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't get parameter! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } if (i == PORT_OFFSET_INPUT) /* VPB+0 */ { asPortDefinition[PORT_OFFSET_INPUT].format.image.nFrameWidth = nFrameWidth; asPortDefinition[PORT_OFFSET_INPUT].format.image.nFrameHeight = nFrameHeight; asPortDefinition[PORT_OFFSET_INPUT].format.image.eColorFormat = eColorFormat; err = OMX_SetParameter(Video_hComponent, OMX_IndexParamPortDefinition, &asPortDefinition[PORT_OFFSET_INPUT]); if (err != OMX_ErrorNone) { extern int end_flag; printf( "[emxx_jpeglib][%d] Can't set parameter! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } } } nVideoPortIndex[PORT_OFFSET_INPUT] = asPortDefinition[PORT_OFFSET_INPUT].nPortIndex; nVideoPortIndex[PORT_OFFSET_OUTPUT] = asPortDefinition[PORT_OFFSET_OUTPUT].nPortIndex; VideoInputBuffNum = asPortDefinition[PORT_OFFSET_INPUT].nBufferCountActual; VideoOutputBuffNum = asPortDefinition[PORT_OFFSET_OUTPUT].nBufferCountActual; printf("VideoInputBuffNum, %d VideoOutputBuffNum, %d\n", VideoInputBuffNum, VideoOutputBuffNum); /* Get & Set OMX_IndexParamImagePortFormat. */ sImageParamPortformatType.nSize = sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE); sImageParamPortformatType.nPortIndex = PORT_OFFSET_INPUT; sImageParamPortformatType.nIndex = nVideoPortIndex[PORT_OFFSET_INPUT]; err = OMX_GetParameter(Video_hComponent, OMX_IndexParamImagePortFormat, &sImageParamPortformatType); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't get parameter! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } sImageParamPortformatType.nSize = sizeof(OMX_IMAGE_PARAM_PORTFORMATTYPE); sImageParamPortformatType.eColorFormat = eColorFormat; err = OMX_SetParameter(Video_hComponent, OMX_IndexParamImagePortFormat, &sImageParamPortformatType); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't get parameter! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } /* Change state to OMX_StateIdle from OMX_StateLoaded. */ pthread_mutex_lock(&VideoMutex); err = OMX_SendCommand(Video_hComponent, OMX_CommandStateSet, OMX_StateIdle, NULL); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't send command! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } /* Allocate stream buffer. */ for (i = 0; i < sImageInit.nPorts; i++) { for (j = 0; j < asPortDefinition[i].nBufferCountActual; j++) { err = OMX_AllocateBuffer(Video_hComponent, &apsVideoBuffer[i][j], asPortDefinition[i].nPortIndex, NULL, asPortDefinition[i].nBufferSize); if (err != OMX_ErrorNone) { FILE_DBG2( "[emxx_jpeglib][%d] Can't allocate buffer! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } FILE_DBG2("[%d][%d] allocated\n", i, j); } } /* Complete state transition. */ pthread_cond_wait(&VideoCond, &VideoMutex); pthread_mutex_unlock(&VideoMutex); semaphore_init(CODEC_VIDEO, output_mode); #if 1 /* Create data input thread. */ if (pthread_create(&VideoInputThreadId, NULL, (void*) jpeg_input_port_thread, NULL) != 0) { FILE_DBG1("[emxx_jpeglib][%d] failed pthread_create input_port_thread\n", __LINE__); ret = -1; goto jpege_end; } /* Create data output thread. */ if (pthread_create(&VideoOutputThreadId, NULL, (void*) jpeg_output_port_thread, NULL) != 0) { FILE_DBG1("[emxx_jpeglib][%d] failed output_port_thread\n", __LINE__); ret = -1; goto jpege_end; } /* Create data output thread */ if (pthread_create(&VideoOutputDataThreadId, NULL, (void*) jpeg_output_data_thread, NULL) != 0) { FILE_DBG1("[emxx_jpeglib][%d] pthread_create output_data_thread\n", __LINE__); ret = -1; goto jpege_end; } #endif /* Change state to OMX_StateExecuting form OMX_StateIdle. */ pthread_mutex_lock(&VideoMutex); err = OMX_SendCommand(Video_hComponent, OMX_CommandStateSet, OMX_StateExecuting, NULL); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't send command! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } /* Complete state transition. */ pthread_cond_wait(&VideoCond, &VideoMutex); pthread_mutex_unlock(&VideoMutex); FILE_DBG("state has been changed to executing\n"); VideoOutputPortThreadLoopFlag = 1; while (!ef || !ff) { printf("."); } FILE_DBG("start close OMX\n"); hasNoWait = 0; VideoOutputPortThreadLoopFlag = 0; pthread_mutex_lock(&VideoMutex); err = OMX_SendCommand(Video_hComponent, OMX_CommandStateSet, OMX_StateIdle, NULL); if (err != OMX_ErrorNone) { FILE_DBG("can't send command\n"); ret = -1; goto jpege_end; } pthread_cond_wait(&VideoCond, &VideoMutex); pthread_mutex_unlock(&VideoMutex); /* Change state to OMX_StateLoaded from OMX_StateIdle. */ pthread_mutex_lock(&VideoMutex); err = OMX_SendCommand(Video_hComponent, OMX_CommandStateSet,OMX_StateLoaded, NULL); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't send command! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } FILE_DBG("changed to loaded state\n"); /* Free buffer. */ for (i = 0; i < sImageInit.nPorts; i++) { for (j = 0; j < asPortDefinition[i].nBufferCountActual; j++) { err = OMX_FreeBuffer(Video_hComponent, asPortDefinition[i].nPortIndex, apsVideoBuffer[i][j]); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't free buffer! erro code = 0x%08x\n", __LINE__, err); ret = -1; goto jpege_end; } } } /* Complete state transition. */ pthread_cond_wait(&VideoCond, &VideoMutex); pthread_mutex_unlock(&VideoMutex); jpege_end: FILE_DBG("free buffer\n"); /* Free JPEG Media Component handle. */ if (hasHandle) { err = OMX_FreeHandle(Video_hComponent); if (err != OMX_ErrorNone) { FILE_DBG2("[emxx_jpeglib][%d] Can't free handle! erro code = 0x%08x\n", __LINE__, err); ret = -1; } } semaphore_deinit(CODEC_VIDEO, output_mode); FILE_DBG("close debug file"); FILE_DBG_CLOSE(); return 0; }
int main(int argc, char** argv) { OMX_PORT_PARAM_TYPE param; OMX_PARAM_PORTDEFINITIONTYPE sPortDef; OMX_AUDIO_PORTDEFINITIONTYPE sAudioPortDef; OMX_AUDIO_PARAM_PORTFORMATTYPE sAudioPortFormat; OMX_AUDIO_PARAM_PCMMODETYPE sPCMMode; OMX_BUFFERHEADERTYPE **inBuffers; OMX_BUFFERHEADERTYPE **outBuffers; OMX_AUDIO_PARAM_MP3TYPE sMP3Mode; unsigned char name[OMX_MAX_STRINGNAME_SIZE]; OMX_UUIDTYPE uid; int startPortNumber; int nPorts; int n; fprintf(stderr, "Thread id is %p\n", pthread_self()); if(argc < 2){ display_help(); exit(1); } inFd = open(argv[1], O_RDONLY); if(inFd < 0){ perror("Error opening input file\n"); exit(1); } filesize = getFileSize(inFd); outFd = open(argv[2], (O_WRONLY | O_CREAT), 0644); if(outFd < 0){ perror("Error opening output file\n"); exit(1); } err = OMX_Init(); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_Init() failed\n", 0); exit(1); } /** Ask the core for a handle to the audio render component */ err = OMX_GetHandle(&handle, componentName, NULL /*app private data */, &callbacks); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetHandle failed\n", 0); exit(1); } err = OMX_GetComponentVersion(handle, name, &compVersion, &specVersion, &uid); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetComponentVersion failed\n", 0); exit(1); } /** no other ports to disable */ /** Get audio port information */ setHeader(¶m, sizeof(OMX_PORT_PARAM_TYPE)); err = OMX_GetParameter(handle, OMX_IndexParamAudioInit, ¶m); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in getting OMX_PORT_PARAM_TYPE parameter\n", 0); exit(1); } startPortNumber = ((OMX_PORT_PARAM_TYPE)param).nStartPortNumber; nPorts = ((OMX_PORT_PARAM_TYPE)param).nPorts; if (nPorts != 2) { fprintf(stderr, "Decode device has wrong number of ports: %d\n", nPorts); exit(1); } setEncoding(startPortNumber, OMX_AUDIO_CodingVORBIS); setEncoding(startPortNumber+1, OMX_AUDIO_CodingPCM); printState();; numInBuffers = setNumBuffers(startPortNumber); numOutBuffers = setNumBuffers(startPortNumber+1); /* call to put state into idle before allocating buffers */ err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateIdle, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting state to idle\n"); exit(1); } err = OMX_SendCommand(handle, OMX_CommandPortEnable, startPortNumber, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting port to enabled\n"); exit(1); } err = OMX_SendCommand(handle, OMX_CommandPortEnable, startPortNumber+1, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting port to enabled\n"); exit(1); } createMinBuffers(startPortNumber, &inBufferSize, &inBuffers); createMinBuffers(startPortNumber+1, &outBufferSize, &outBuffers); /* Make sure we've reached Idle state */ waitFor(OMX_StateIdle); fprintf(stderr, "Reached Idle state\n"); //exit(0); /* Now try to switch to Executing state */ err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); if(err != OMX_ErrorNone){ exit(1); } /* no buffers emptied yet */ pEmptyBuffer = NULL; /* fill and empty the input buffers */ for (n = 0; n < numInBuffers; n++) { int data_read = read(inFd, inBuffers[n]->pBuffer, inBufferSize); inBuffers[n]->nFilledLen = data_read; printf("Read %d into buffer\n", data_read); if (data_read <= 0) { printf(stderr, "In the %s no more input data available\n", __func__); inBuffers[n]->nFilledLen = 0; inBuffers[n]->nFlags = OMX_BUFFERFLAG_EOS; bEOS=OMX_TRUE; } } /* empty and fill the output buffers */ for (n = 0; n < numOutBuffers; n++) { outBuffers[n]->nFilledLen = 0; err = OMX_FillThisBuffer(handle, outBuffers[n]); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on filling buffer\n"); exit(1); } } for (n = 0; n < numInBuffers; n++) { err = OMX_EmptyThisBuffer(handle, inBuffers[n]); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on emptying buffer\n"); exit(1); } } pEmptyBuffer = inBuffers[0]; emptyState = 1; waitFor(OMX_StateLoaded); fprintf(stderr, "Buffers emptied\n"); exit(0); }
int main(int argc, char** argv) { OMX_PORT_PARAM_TYPE param; OMX_PARAM_PORTDEFINITIONTYPE sPortDef; OMX_AUDIO_PORTDEFINITIONTYPE sAudioPortDef; OMX_AUDIO_PARAM_PORTFORMATTYPE sAudioPortFormat; OMX_AUDIO_PARAM_PCMMODETYPE sPCMMode; OMX_BUFFERHEADERTYPE **inBuffers; char *componentName = "OMX.broadcom.audio_render"; unsigned char name[OMX_MAX_STRINGNAME_SIZE]; OMX_UUIDTYPE uid; int startPortNumber; int nPorts; int n; bcm_host_init(); fprintf(stderr, "Thread id is %p\n", pthread_self()); if(argc < 2){ display_help(argv); exit(1); } fd = open(argv[1], O_RDONLY); if(fd < 0){ perror("Error opening input file\n"); exit(1); } filesize = getFileSize(fd); err = OMX_Init(); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_Init() failed\n", 0); exit(1); } /** Ask the core for a handle to the audio render component */ err = OMX_GetHandle(&handle, componentName, NULL /*app private data */, &callbacks); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetHandle failed\n", 0); exit(1); } err = OMX_GetComponentVersion(handle, name, &compVersion, &specVersion, &uid); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetComponentVersion failed\n", 0); exit(1); } /** disable other ports */ disablePort(OMX_IndexParamOtherInit); /** Get audio port information */ setHeader(¶m, sizeof(OMX_PORT_PARAM_TYPE)); err = OMX_GetParameter(handle, OMX_IndexParamAudioInit, ¶m); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in getting OMX_PORT_PARAM_TYPE parameter\n", 0); exit(1); } startPortNumber = ((OMX_PORT_PARAM_TYPE)param).nStartPortNumber; nPorts = ((OMX_PORT_PARAM_TYPE)param).nPorts; if (nPorts > 1) { fprintf(stderr, "Render device has more than one port\n"); exit(1); } /* Get and check port information */ setHeader(&sPortDef, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sPortDef.nPortIndex = startPortNumber; err = OMX_GetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in getting OMX_PORT_DEFINITION_TYPE parameter\n", 0); exit(1); } if (sPortDef.eDomain != OMX_PortDomainAudio) { fprintf(stderr, "Port %d is not an audio port\n", startPortNumber); exit(1); } if (sPortDef.eDir != OMX_DirInput) { fprintf(stderr, "Port is not an input port\n"); exit(1); } if (sPortDef.format.audio.eEncoding == OMX_AUDIO_CodingPCM) { fprintf(stderr, "Port encoding is PCM\n"); } else { fprintf(stderr, "Port has unknown encoding\n"); } /* Create minimum number of buffers for the port */ nBuffers = sPortDef.nBufferCountActual = sPortDef.nBufferCountMin; fprintf(stderr, "Number of bufers is %d\n", nBuffers); err = OMX_SetParameter(handle, OMX_IndexParamPortDefinition, &sPortDef); if(err != OMX_ErrorNone){ fprintf(stderr, "Error in setting OMX_PORT_PARAM_TYPE parameter\n", 0); exit(1); } if (sPortDef.bEnabled) { fprintf(stderr, "Port is enabled\n"); } else { fprintf(stderr, "Port is not enabled\n"); } /* call to put state into idle before allocating buffers */ err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateIdle, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting state to idle\n"); exit(1); } err = OMX_SendCommand(handle, OMX_CommandPortEnable, startPortNumber, NULL); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on setting port to enabled\n"); exit(1); } /* Configure buffers for the port */ nBufferSize = sPortDef.nBufferSize; fprintf(stderr, "%d buffers of size is %d\n", nBuffers, nBufferSize); inBuffers = malloc(nBuffers * sizeof(OMX_BUFFERHEADERTYPE *)); if (inBuffers == NULL) { fprintf(stderr, "Can't allocate buffers\n"); exit(1); } for (n = 0; n < nBuffers; n++) { err = OMX_AllocateBuffer(handle, inBuffers+n, startPortNumber, NULL, nBufferSize); if (err != OMX_ErrorNone) { fprintf(stderr, "Error on AllocateBuffer in 1%i\n", err); exit(1); } } /* Make sure we've reached Idle state */ waitFor(OMX_StateIdle); /* Now try to switch to Executing state */ err = OMX_SendCommand(handle, OMX_CommandStateSet, OMX_StateExecuting, NULL); if(err != OMX_ErrorNone){ exit(1); } /* One buffer is the minimum for Broadcom component, so use that */ pEmptyBuffer = inBuffers[0]; emptyState = 1; /* Fill and empty buffer */ for (;;) { int data_read = read(fd, pEmptyBuffer->pBuffer, nBufferSize); pEmptyBuffer->nFilledLen = data_read; pEmptyBuffer->nOffset = 0; filesize -= data_read; if (data_read <= 0) { fprintf(stderr, "In the %s no more input data available\n", __func__); pEmptyBuffer->nFilledLen=0; pEmptyBuffer->nFlags = OMX_BUFFERFLAG_EOS; bEOS=OMX_TRUE; } fprintf(stderr, "Emptying again buffer %p %d bytes, %d to go\n", pEmptyBuffer, data_read, filesize); err = OMX_EmptyThisBuffer(handle, pEmptyBuffer); waitForEmpty(); fprintf(stderr, "Waited for empty\n"); if (bEOS) { fprintf(stderr, "Exiting loop\n"); break; } } fprintf(stderr, "Buffers emptied\n"); exit(0); }
int main(int argc, char** argv) { OMX_PORT_PARAM_TYPE param; OMX_PARAM_PORTDEFINITIONTYPE sPortDef; OMX_AUDIO_PORTDEFINITIONTYPE sAudioPortDef; OMX_AUDIO_PARAM_PORTFORMATTYPE sAudioPortFormat; OMX_AUDIO_PARAM_PCMMODETYPE sPCMMode; #ifdef RASPBERRY_PI char *componentName = "OMX.broadcom.audio_mixer"; #endif #ifdef LIM char *componentName = "OMX.limoi.alsa_sink"; #else char *componentName = "OMX.st.volume.component"; #endif unsigned char name[128]; /* spec says 128 is max name length */ OMX_UUIDTYPE uid; int startPortNumber; int nPorts; int n; /* ovveride component name by command line argument */ if (argc == 2) { componentName = argv[1]; } # ifdef RASPBERRY_PI bcm_host_init(); # endif err = OMX_Init(); if(err != OMX_ErrorNone) { fprintf(stderr, "OMX_Init() failed\n", 0); exit(1); } /** Ask the core for a handle to the volume control component */ err = OMX_GetHandle(&handle, componentName, NULL /*app private data */, &callbacks); if (err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetHandle failed\n", 0); exit(1); } err = OMX_GetComponentVersion(handle, name, &compVersion, &specVersion, &uid); if (err != OMX_ErrorNone) { fprintf(stderr, "OMX_GetComponentVersion failed\n", 0); exit(1); } printf("Component name: %s version %d.%d, Spec version %d.%d\n", name, compVersion.s.nVersionMajor, compVersion.s.nVersionMinor, specVersion.s.nVersionMajor, specVersion.s.nVersionMinor); /** Get ports information */ getAllAudioPortsInformation(0); getAllVideoPortsInformation(0); getAllImagePortsInformation(0); getAllOtherPortsInformation(0); exit(0); }