int portSettingsChangedAgain(OPENMAX_JPEG_DECODER * decoder) { printf("Port settings changed again\n"); ilclient_disable_port(decoder->imageDecoder->component, decoder->imageDecoder->outPort); OMX_PARAM_PORTDEFINITIONTYPE portdef; // need to setup the input for the render with the output of the // decoder portdef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); portdef.nVersion.nVersion = OMX_VERSION; portdef.nPortIndex = decoder->imageDecoder->outPort; OMX_GetParameter(decoder->imageDecoder->handle, OMX_IndexParamPortDefinition, &portdef); // enable output of decoder and input of render (ie enable tunnel) ilclient_enable_port(decoder->imageDecoder->component, decoder->imageDecoder->outPort); // need to wait for this event ilclient_wait_for_event(decoder->imageDecoder->component, OMX_EventPortSettingsChanged, decoder->imageDecoder->outPort, 1, 0, 0, 0, TIMEOUT_MS); return OMXJPEG_OK; }
int main(int argc, char **argv) { int i; char *decodeComponentName; char *renderComponentName; int err; ILCLIENT_T *handle; COMPONENT_T *decodeComponent; COMPONENT_T *renderComponent; COMPONENT_T *fxComponent; int do_deinterlace = 0; if (argc >= 2) { IMG = argv[1]; } if (argc >= 3) { if (strcmp(argv[2],"d")==0) do_deinterlace = 1; } FILE *fp = fopen(IMG, "r"); int toread = get_file_size(IMG); OMX_BUFFERHEADERTYPE *buff_header; decodeComponentName = "video_decode"; renderComponentName = "video_render"; bcm_host_init(); handle = ilclient_init(); if (handle == NULL) { fprintf(stderr, "IL client init failed\n"); exit(1); } if (OMX_Init() != OMX_ErrorNone) { ilclient_destroy(handle); fprintf(stderr, "OMX init failed\n"); exit(1); } ilclient_set_error_callback(handle, error_callback, NULL); ilclient_set_eos_callback(handle, eos_callback, NULL); setup_decodeComponent(handle, decodeComponentName, &decodeComponent); setup_renderComponent(handle, renderComponentName, &renderComponent); if (do_deinterlace) setup_fxComponent(handle, "image_fx", &fxComponent); // both components now in Idle state, no buffers, ports disabled // input port ilclient_enable_port_buffers(decodeComponent, 130, NULL, NULL, NULL); ilclient_enable_port(decodeComponent, 130); err = ilclient_change_component_state(decodeComponent, OMX_StateExecuting); if (err < 0) { fprintf(stderr, "Couldn't change state to Executing\n"); exit(1); } printState(ilclient_get_handle(decodeComponent)); // Read the first block so that the decodeComponent can get // the dimensions of the video and call port settings // changed on the output port to configure it while (toread > 0) { buff_header = ilclient_get_input_buffer(decodeComponent, 130, 1 /* block */); if (buff_header != NULL) { read_into_buffer_and_empty(fp, decodeComponent, buff_header, &toread); // If all the file has been read in, then // we have to re-read this first block. // Broadcom bug? if (toread <= 0) { printf("Rewinding\n"); // wind back to start and repeat fp = freopen(IMG, "r", fp); toread = get_file_size(IMG); } } if (toread > 0 && ilclient_remove_event(decodeComponent, OMX_EventPortSettingsChanged, 131, 0, 0, 1) == 0) { printf("Removed port settings event\n"); break; } else { printf("No port setting seen yet\n"); } // wait for first input block to set params for output port if (toread == 0) { // wait for first input block to set params for output port err = ilclient_wait_for_event(decodeComponent, OMX_EventPortSettingsChanged, 131, 0, 0, 1, ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 2000); if (err < 0) { fprintf(stderr, "No port settings change\n"); //exit(1); } else { printf("Port settings changed\n"); break; } } } // set the decode component to idle and disable its ports err = ilclient_change_component_state(decodeComponent, OMX_StateIdle); if (err < 0) { fprintf(stderr, "Couldn't change state to Idle\n"); exit(1); } ilclient_disable_port(decodeComponent, 131); ilclient_disable_port_buffers(decodeComponent, 131, NULL, NULL, NULL); if (do_deinterlace) { // set up the tunnel between decode and fx ports err = OMX_SetupTunnel(ilclient_get_handle(decodeComponent), 131, ilclient_get_handle(fxComponent), 190); if (err != OMX_ErrorNone) { fprintf(stderr, "Error setting up tunnel 1 %X\n", err); exit(1); } else { printf("Tunnel 1 set up ok\n"); } // set up the tunnel between fx and render ports err = OMX_SetupTunnel(ilclient_get_handle(fxComponent), 191, ilclient_get_handle(renderComponent), 90); if (err != OMX_ErrorNone) { fprintf(stderr, "Error setting up tunnel 2 %X\n", err); exit(1); } else { printf("Tunnel 2 set up ok\n"); } } else { // set up the tunnel between decode and render ports err = OMX_SetupTunnel(ilclient_get_handle(decodeComponent), 131, ilclient_get_handle(renderComponent), 90); if (err != OMX_ErrorNone) { fprintf(stderr, "Error setting up tunnel %X\n", err); exit(1); } else { printf("Tunnel set up ok\n"); } } // Okay to go back to processing data // enable the decode output ports //UNNECESSARY?? PGB OMX_SendCommand(ilclient_get_handle(decodeComponent), //UNNECESSARY?? PGB OMX_CommandPortEnable, 131, NULL); ilclient_enable_port(decodeComponent, 131); if (do_deinterlace) { setup_shared_buffer_format(decodeComponent, 131, fxComponent, 191); // enable fx ports ilclient_enable_port(fxComponent, 190); ilclient_enable_port(fxComponent, 191); //UNNECESSARY?? PGB OMX_SendCommand(ilclient_get_handle(renderComponent), //UNNECESSARY?? PGB OMX_CommandPortEnable, 90, NULL); // setup_shared_buffer_format(fxComponent, renderComponent); } // enable the render output ports ilclient_enable_port(renderComponent, 90); // set all components to executing state err = ilclient_change_component_state(decodeComponent, OMX_StateExecuting); if (err < 0) { fprintf(stderr, "Couldn't change decode to Executing\n"); exit(1); } if (do_deinterlace) { err = ilclient_change_component_state(fxComponent, OMX_StateExecuting); if (err < 0) { fprintf(stderr, "Couldn't change fx to Executing\n"); exit(1); } } err = ilclient_change_component_state(renderComponent, OMX_StateExecuting); if (err < 0) { fprintf(stderr, "Couldn't change render to Executing\n"); exit(1); } print_port_info(ilclient_get_handle(decodeComponent), 131); if (do_deinterlace) { print_port_info(ilclient_get_handle(fxComponent), 190); print_port_info(ilclient_get_handle(fxComponent), 191); } print_port_info(ilclient_get_handle(renderComponent), 90); // now work through the file while (toread > 0) { OMX_ERRORTYPE r; // do we have a decode input buffer we can fill and empty? buff_header = ilclient_get_input_buffer(decodeComponent, 130, 1 /* block */); if (buff_header != NULL) { read_into_buffer_and_empty(fp, decodeComponent, buff_header, &toread); } usleep(100000); // print_port_info(ilclient_get_handle(renderComponent), 90); } ilclient_wait_for_event(renderComponent, OMX_EventBufferFlag, 90, 0, OMX_BUFFERFLAG_EOS, 0, ILCLIENT_BUFFER_FLAG_EOS, 10000); printf("EOS on render\n"); sleep(100); exit(0); }
static int brcm_omx_vc03_play_init(void) { OMX_ERRORTYPE error; OMX_PARAM_PORTDEFINITIONTYPE param; OMX_AUDIO_PARAM_PCMMODETYPE param1; int size; DEBUG("\n %lx:brcm_omx_vc03_play_init\n",jiffies); g_brcm_alsa_chip->pcm_ptr[0] = 0; // playback stuff memset(&st_play,0,sizeof(COMPONENT_T)); error = ilclient_create_component(client, &st_play, "audio_render", 0, 1, 1); ERROR_RETURN("ilclient_create_component",error); ilclient_disable_port(&st_play,101); // memset(¶m, 0, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); param.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); param.nVersion.nVersion = OMX_VERSION; param.nPortIndex = 100; param.nBufferCountActual = 1; param.nBufferSize = g_brcm_alsa_chip->period_bytes[0];//20*AUDIO_SAMPLE*2; param.eDir = OMX_DirInput; param.eDomain = OMX_PortDomainAudio; param.format.audio.eEncoding = OMX_AUDIO_CodingPCM; error = OMX_SetParameter(st_play.comp, OMX_IndexParamPortDefinition, ¶m); ERROR_RETURN("OMX_SetParameter",error); // memset(¶m1, 0, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); param1.nSize = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE); param1.nVersion.nVersion = OMX_VERSION; param1.nPortIndex = 100; param1.nChannels = 2; param1.eEndian = OMX_EndianLittle; param1.bInterleaved = OMX_TRUE; param1.nBitPerSample = 16; //32 param1.nSamplingRate = g_brcm_alsa_chip->rate[0];//8000;//44100; param1.eNumData = OMX_NumericalDataSigned; param1.ePCMMode = OMX_AUDIO_PCMModeLinear; error = OMX_SetParameter(st_play.comp, OMX_IndexParamAudioPcm, ¶m1); ERROR_RETURN("OMX_SetParameter",error); // error = OMX_SendCommand(st_play.comp, OMX_CommandStateSet, OMX_StateIdle, NULL); ERROR_RETURN("OMX_SendCommand",error); // size = g_brcm_alsa_chip->period_bytes[0]; //for(i=0; i<param.nBufferCountActual; i++) //is one enough? { error = OMX_UseBuffer(st_play.comp, &st_play.out_list, 100, st_play.out_list, size, NULL); ERROR_RETURN("OMX_UseBuffer",error); DEBUG("\n playback %lx:st.out_list=%x st.out_list->private=%x\n",jiffies, (int)st_play.out_list,(int)st_play.out_list->pAppPrivate); } // error = ilclient_wait_for_event(&st_play, OMX_EventCmdComplete, OMX_CommandStateSet, 0, OMX_StateIdle, 0, ILCLIENT_STATE_CHANGED, PLATFORM_EVENTGROUP_SUSPEND); ERROR_RETURN("ilclient_wait_for_event",error); // if (alsa_pcm_event & PCM_EVENT_PLAY_START ) { error = ilclient_change_component_state(&st_play, OMX_StateExecuting); ERROR_RETURN("ilclient_change_component_state",error); } return 0; }
static int brcm_omx_vc03_recd_init(void) { OMX_ERRORTYPE error; OMX_PARAM_PORTDEFINITIONTYPE param; OMX_AUDIO_PARAM_PCMMODETYPE param1; int i,size; DEBUG("\n %lx:brcm_omx_vc03_recd_init\n",jiffies); g_brcm_alsa_chip->pcm_ptr[1] = 0; //recorder stuff memset(&st_recd,0,sizeof(COMPONENT_T)); error = ilclient_create_component(client, &st_recd, "audio_record", 0, 1, 1); ERROR_RETURN("ilclient_create_component record",error); ilclient_disable_port(&st_recd,181); // memset(¶m, 0, sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); param.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); param.nVersion.nVersion = OMX_VERSION; param.nPortIndex = 180; error = OMX_GetParameter(st_recd.comp, OMX_IndexParamPortDefinition, ¶m); ERROR_RETURN("OMX_GetParameter record param",error); DEBUG("\n brcm_omx_vc03_recd_init:nBufferCountActual=%d\n", (int)param.nBufferCountActual); param.nBufferSize = g_brcm_alsa_chip->period_bytes[1]; error = OMX_SetParameter(st_recd.comp, OMX_IndexParamPortDefinition, ¶m); ERROR_RETURN("OMX_SetParameter record param",error); // memset(¶m1, 0, sizeof(OMX_AUDIO_PARAM_PCMMODETYPE)); param1.nSize = sizeof(OMX_AUDIO_PARAM_PCMMODETYPE); param1.nVersion.nVersion = OMX_VERSION; param1.nPortIndex = 180; error = OMX_GetParameter(st_recd.comp, OMX_IndexParamAudioPcm, ¶m1); ERROR_RETURN("OMX_GetParameter record param",error); param1.nSamplingRate = 16000;//support 16000 only? error = OMX_SetParameter(st_recd.comp, OMX_IndexParamAudioPcm, ¶m1); ERROR_RETURN("OMX_SetParameter record param1",error); // error = OMX_SendCommand(st_recd.comp, OMX_CommandStateSet, OMX_StateIdle, NULL); ERROR_RETURN("OMX_SendCommand",error); // size = g_brcm_alsa_chip->period_bytes[1]; for(i=0; i<param.nBufferCountActual; i++) { error = OMX_UseBuffer(st_recd.comp, &st_recd.out_list, 180, st_recd.out_list, size, NULL); ERROR_RETURN("OMX_UseBuffer",error); DEBUG("\n record %lx:st.out_list=%x st.out_list->private=%x\n",jiffies, (unsigned int)st_recd.out_list,(unsigned int)st_recd.out_list->pAppPrivate); } recd_buffer = st_recd.out_list; error = ilclient_wait_for_event(&st_recd, OMX_EventCmdComplete, OMX_CommandStateSet, 0, OMX_StateIdle, 0, ILCLIENT_STATE_CHANGED, PLATFORM_EVENTGROUP_SUSPEND); ERROR_RETURN("ilclient_wait_for_event record",error); if (alsa_pcm_event & PCM_EVENT_RECD_START) { error = ilclient_change_component_state(&st_recd, OMX_StateExecuting); ERROR_RETURN("ilclient_change_component_state record",error); } return 0; }
int portSettingsChanged(OPENMAX_JPEG_DECODER * decoder) { OMX_PARAM_PORTDEFINITIONTYPE portdef; // need to setup the input for the resizer with the output of the // decoder portdef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); portdef.nVersion.nVersion = OMX_VERSION; portdef.nPortIndex = decoder->imageDecoder->outPort; OMX_GetParameter(decoder->imageDecoder->handle, OMX_IndexParamPortDefinition, &portdef); unsigned int uWidth = (unsigned int) portdef.format.image.nFrameWidth; unsigned int uHeight = (unsigned int) portdef.format.image.nFrameHeight; // tell resizer input what the decoder output will be providing portdef.nPortIndex = decoder->imageResizer->inPort; OMX_SetParameter(decoder->imageResizer->handle, OMX_IndexParamPortDefinition, &portdef); // establish tunnel between decoder output and resizer input OMX_SetupTunnel(decoder->imageDecoder->handle, decoder->imageDecoder->outPort, decoder->imageResizer->handle, decoder->imageResizer->inPort); // enable ports OMX_SendCommand(decoder->imageDecoder->handle, OMX_CommandPortEnable, decoder->imageDecoder->outPort, NULL); OMX_SendCommand(decoder->imageResizer->handle, OMX_CommandPortEnable, decoder->imageResizer->inPort, NULL); // put resizer in idle state (this allows the outport of the decoder // to become enabled) OMX_SendCommand(decoder->imageResizer->handle, OMX_CommandStateSet, OMX_StateIdle, NULL); // wait for state change complete ilclient_wait_for_event(decoder->imageResizer->component, OMX_EventCmdComplete, OMX_CommandStateSet, 1, OMX_StateIdle, 1, 0, TIMEOUT_MS); // once the state changes, both ports should become enabled and the // resizer // output should generate a settings changed event ilclient_wait_for_event(decoder->imageDecoder->component, OMX_EventCmdComplete, OMX_CommandPortEnable, 1, decoder->imageDecoder->outPort, 1, 0, TIMEOUT_MS); ilclient_wait_for_event(decoder->imageResizer->component, OMX_EventCmdComplete, OMX_CommandPortEnable, 1, decoder->imageResizer->inPort, 1, 0, TIMEOUT_MS); ilclient_wait_for_event(decoder->imageResizer->component, OMX_EventPortSettingsChanged, decoder->imageResizer->outPort, 1, 0, 1, 0, TIMEOUT_MS); ilclient_disable_port(decoder->imageResizer->component, decoder->imageResizer->outPort); // query output buffer requirements for resizer portdef.nSize = sizeof(OMX_PARAM_PORTDEFINITIONTYPE); portdef.nVersion.nVersion = OMX_VERSION; portdef.nPortIndex = decoder->imageResizer->outPort; OMX_GetParameter(decoder->imageResizer->handle, OMX_IndexParamPortDefinition, &portdef); // change output color format and dimensions to match input portdef.format.image.eCompressionFormat = OMX_IMAGE_CodingUnused; portdef.format.image.eColorFormat = OMX_COLOR_Format32bitABGR8888; portdef.format.image.nFrameWidth = uWidth; portdef.format.image.nFrameHeight = uHeight; portdef.format.image.nStride = 0; portdef.format.image.nSliceHeight = 0; portdef.format.image.bFlagErrorConcealment = OMX_FALSE; OMX_SetParameter(decoder->imageResizer->handle, OMX_IndexParamPortDefinition, &portdef); // grab output requirements again to get actual buffer size // requirement (and buffer count requirement!) OMX_GetParameter(decoder->imageResizer->handle, OMX_IndexParamPortDefinition, &portdef); // move resizer into executing state ilclient_change_component_state(decoder->imageResizer->component, OMX_StateExecuting); // show some logging so user knows it's working printf ("Width: %u Height: %u Output Color Format: 0x%x Buffer Size: %u\n", (unsigned int) portdef.format.image.nFrameWidth, (unsigned int) portdef.format.image.nFrameHeight, (unsigned int) portdef.format.image.eColorFormat, (unsigned int) portdef.nBufferSize); fflush(stdout); // enable output port of resizer OMX_SendCommand(decoder->imageResizer->handle, OMX_CommandPortEnable, decoder->imageResizer->outPort, NULL); // allocate the buffer // void* outputBuffer = 0; // if (posix_memalign(&outputBuffer, portdef.nBufferAlignment, // portdef.nBufferSize) != 0) // { // perror("Allocating output buffer"); // return OMXJPEG_ERROR_MEMORY; // } // set the buffer // int ret = OMX_UseBuffer(decoder->imageResizer->handle, // &decoder->pOutputBufferHeader, // decoder->imageResizer->outPort, NULL, // portdef.nBufferSize, // (OMX_U8 *) outputBuffer); int ret = OMX_AllocateBuffer(decoder->imageResizer->handle, &decoder->pOutputBufferHeader, decoder->imageResizer-> outPort, NULL, portdef.nBufferSize); if (ret != OMX_ErrorNone) { perror("Eror allocating buffer"); fprintf(stderr, "OMX_AllocateBuffer returned 0x%x allocating buffer size 0x%x\n", ret, portdef.nBufferSize); return OMXJPEG_ERROR_MEMORY; } ilclient_wait_for_event(decoder->imageResizer->component, OMX_EventCmdComplete, OMX_CommandPortEnable, 1, decoder->imageResizer->outPort, 1, 0, TIMEOUT_MS); return OMXJPEG_OK; }