OMX_ERRORTYPE Component::freeInputBuffers() { if(!handle) { ofLogError(__func__) << getName() << " NO HANDLE"; return OMX_ErrorNone; } OMX_ERRORTYPE error = OMX_ErrorNone; if(inputBuffers.empty()) { return OMX_ErrorNone; } //m_flush_input = true; pthread_mutex_lock(&m_omx_input_mutex); pthread_cond_broadcast(&m_input_buffer_cond); error = disablePort(inputPort); OMX_TRACE(error); for (size_t i = 0; i < inputBuffers.size(); i++) { error = OMX_FreeBuffer(handle, inputPort, inputBuffers[i]); OMX_TRACE(error); } inputBuffers.clear(); //error = waitForCommand(OMX_CommandPortDisable, inputPort); //OMX_TRACE(error); while (!inputBuffersAvailable.empty()) { inputBuffersAvailable.pop(); } pthread_mutex_unlock(&m_omx_input_mutex); return error; }
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); }
/** ** Process the port list. ** ** This configuration is a list of valid ports and is ended by a ** delimiter. ** ** @param ErrorString error string buffer ** @param ErrStrLen the length of the error string buffer ** ** @return an error code integer ** (0 = success, >0 = non-fatal error, <0 = fatal error) ** ** @retval 0 successs ** @retval -1 generic fatal error ** @retval 1 generic non-fatal error */ static int ProcessPorts(IMAPConfig *config, char *ErrorString, int ErrStrLen) { char *pcToken; char *pcEnd; int iPort; int iEndPorts = 0; int num_ports = 0; if (config == NULL) { snprintf(ErrorString, ErrStrLen, "IMAP config is NULL.\n"); return -1; } pcToken = strtok(NULL, CONF_SEPARATORS); if(!pcToken) { snprintf(ErrorString, ErrStrLen, "Invalid port list format."); return -1; } if(strcmp(CONF_START_LIST, pcToken)) { snprintf(ErrorString, ErrStrLen, "Must start a port list with the '%s' token.", CONF_START_LIST); return -1; } /* Since ports are specified, clear default ports */ disablePort( config->ports, IMAP_DEFAULT_SERVER_PORT ); while ((pcToken = strtok(NULL, CONF_SEPARATORS)) != NULL) { if(!strcmp(CONF_END_LIST, pcToken)) { iEndPorts = 1; break; } iPort = strtol(pcToken, &pcEnd, 10); /* ** Validity check for port */ if(*pcEnd) { snprintf(ErrorString, ErrStrLen, "Invalid port number."); return -1; } if(iPort < 0 || iPort > MAXPORTS-1) { snprintf(ErrorString, ErrStrLen, "Invalid port number. Must be between 0 and 65535."); return -1; } enablePort( config->ports, iPort ); num_ports++; } if(!iEndPorts) { snprintf(ErrorString, ErrStrLen, "Must end '%s' configuration with '%s'.", CONF_PORTS, CONF_END_LIST); return -1; } else if(!num_ports) { snprintf(ErrorString, ErrStrLen, "IMAP: Empty port list not allowed."); return -1; } 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; 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); }
/** ** ** xlink2state { <enable/disable> <drop> } ** ** @param ErrorString error string buffer ** @param ErrStrLen the length of the error string buffer ** ** @return an error code integer ** (0 = success, >0 = non-fatal error, <0 = fatal error) ** ** @retval 0 successs ** @retval -1 generic fatal error */ static int ProcessXlink2State(SMTPConfig *config, char *ErrorString, int ErrStrLen) { char *pcToken; int iEnd = 0; if (config == NULL) { snprintf(ErrorString, ErrStrLen, "SMTP config is NULL.\n"); return -1; } pcToken = strtok(NULL, CONF_SEPARATORS); if(!pcToken) { snprintf(ErrorString, ErrStrLen, "Invalid xlink2state argument format."); return -1; } if(strcmp(CONF_START_LIST, pcToken)) { snprintf(ErrorString, ErrStrLen, "Must start xlink2state arguments with the '%s' token.", CONF_START_LIST); return -1; } while ((pcToken = strtok(NULL, CONF_SEPARATORS)) != NULL) { if(!strcmp(CONF_END_LIST, pcToken)) { iEnd = 1; break; } if ( !strcasecmp(CONF_DISABLE, pcToken) ) { config->alert_xlink2state = 0; disablePort( config->ports, XLINK2STATE_DEFAULT_PORT ); } else if ( !strcasecmp(CONF_ENABLE, pcToken) ) { config->alert_xlink2state = 1; disablePort( config->ports, XLINK2STATE_DEFAULT_PORT ); } else if ( !strcasecmp(CONF_INLINE_DROP, pcToken) ) { if (!config->alert_xlink2state) { snprintf(ErrorString, ErrStrLen, "Alerting on X-LINK2STATE must be enabled to drop."); return -1; } config->drop_xlink2state = 1; } } if(!iEnd) { snprintf(ErrorString, ErrStrLen, "Must end '%s' configuration with '%s'.", CONF_XLINK2STATE, CONF_END_LIST); return -1; } return 0; }