From d54efa0a003a045cc72d96689b99e3fc9afbda5c Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Tue, 7 Jan 2014 01:44:29 +0100 Subject: [PATCH] Cleanup OpenMAX C code --- jni/nv_omx_dec/nv_omx_dec.c | 104 ++++++++---------------------------- 1 file changed, 22 insertions(+), 82 deletions(-) diff --git a/jni/nv_omx_dec/nv_omx_dec.c b/jni/nv_omx_dec/nv_omx_dec.c index dd67457..1a1151a 100644 --- a/jni/nv_omx_dec/nv_omx_dec.c +++ b/jni/nv_omx_dec/nv_omx_dec.c @@ -25,7 +25,8 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -// Video deocode demo using OpenMAX IL though the ilcient helper library +// Video decode on Raspberry Pi using OpenMAX IL though the ilcient helper library +// Based upon video decode example from the Raspberry Pi firmware #include #include @@ -71,46 +72,17 @@ int nv_omx_init(void) { // create video_decode if(ilclient_create_component(client, &video_decode, "video_decode", ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS) != 0) status = -14; + list[0] = video_decode; // create video_render if(status == 0 && ilclient_create_component(client, &video_render, "video_render", ILCLIENT_DISABLE_ALL_PORTS) != 0) status = -14; + list[1] = video_render; -/* - // create clock - if(status == 0 && ilclient_create_component(client, &clock, "clock", ILCLIENT_DISABLE_ALL_PORTS) != 0) - status = -14; - list[2] = clock; -*/ - -// memset(&cstate, 0, sizeof(cstate)); -// cstate.nSize = sizeof(cstate); -// cstate.nVersion.nVersion = OMX_VERSION; -// cstate.eState = OMX_TIME_ClockStateWaitingForStartTime; -// cstate.nWaitMask = 1; -// if(clock != NULL && OMX_SetParameter(ILC_GET_HANDLE(clock), OMX_IndexConfigTimeClockState, &cstate) != OMX_ErrorNone) -// status = -13; - - // create video_scheduler -// if(status == 0 && ilclient_create_component(client, &video_scheduler, "video_scheduler", ILCLIENT_DISABLE_ALL_PORTS) != 0) -// status = -14; -// list[3] = video_scheduler; - -// set_tunnel(tunnel, video_decode, 131, video_scheduler, 10); -// set_tunnel(tunnel+1, video_scheduler, 11, video_render, 90); -// set_tunnel(tunnel+2, clock, 80, video_scheduler, 12); set_tunnel(tunnel, video_decode, 131, video_render, 90); - // setup clock tunnel first -/* - if(status == 0 && ilclient_setup_tunnel(tunnel+2, 0, 0) != 0) - status = -15; - else - ilclient_change_component_state(clock, OMX_StateExecuting); -*/ - if(status == 0) ilclient_change_component_state(video_decode, OMX_StateIdle); @@ -120,19 +92,18 @@ int nv_omx_init(void) { format.nPortIndex = 130; format.eCompressionFormat = OMX_VIDEO_CodingAVC; - OMX_PARAM_DATAUNITTYPE unit; + OMX_PARAM_DATAUNITTYPE unit; - memset(&unit, 0, sizeof(OMX_PARAM_DATAUNITTYPE)); - unit.nSize = sizeof(OMX_PARAM_DATAUNITTYPE); - unit.nVersion.nVersion = OMX_VERSION; - unit.nPortIndex = 130; - unit.eUnitType = OMX_DataUnitCodedPicture; - unit.eEncapsulationType = OMX_DataEncapsulationElementaryStream; + memset(&unit, 0, sizeof(OMX_PARAM_DATAUNITTYPE)); + unit.nSize = sizeof(OMX_PARAM_DATAUNITTYPE); + unit.nVersion.nVersion = OMX_VERSION; + unit.nPortIndex = 130; + unit.eUnitType = OMX_DataUnitCodedPicture; + unit.eEncapsulationType = OMX_DataEncapsulationElementaryStream; if(status == 0 && OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamVideoPortFormat, &format) == OMX_ErrorNone && OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamBrcmDataUnit, &unit) == OMX_ErrorNone && -/* OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamBrcmExtraBuffers, 2) == OMX_ErrorNone && */ ilclient_enable_port_buffers(video_decode, 130, NULL, NULL, NULL) == 0) { port_settings_changed = 0; @@ -141,7 +112,7 @@ int nv_omx_init(void) { ilclient_change_component_state(video_decode, OMX_StateExecuting); } else - status = -14; + status = -15; return status; } @@ -153,61 +124,36 @@ int nv_omx_decode(const unsigned char* indata, int data_len, int last) { if((buf = ilclient_get_input_buffer(video_decode, 130, 1)) == NULL) return -22; - // feed data and wait until we get port settings changed - dest = buf->pBuffer; + // feed data and wait until we get port settings changed + dest = buf->pBuffer; - buf->nFilledLen = 0; + buf->nFilledLen = 0; - buf->nOffset = 0; + buf->nOffset = 0; - buf->nFlags = OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_EOS; + buf->nFlags = OMX_BUFFERFLAG_ENDOFFRAME | OMX_BUFFERFLAG_EOS; - if(first_packet) { - buf->nFlags = OMX_BUFFERFLAG_STARTTIME; - first_packet = 0; - } + if(first_packet) { + buf->nFlags = OMX_BUFFERFLAG_STARTTIME; + first_packet = 0; + } } - memcpy(dest, indata, data_len); + memcpy(dest, indata, data_len); buf->nFilledLen += data_len; dest += data_len; if (last) { - if (buf->nFilledLen == 26) { - buf->nFilledLen += 2; - buf->pBuffer[24] = 0x11; - buf->pBuffer[25] = 0xe3; - buf->pBuffer[26] = 0x06; - buf->pBuffer[27] = 0x50; - } - - if (buf->nFilledLen <=28) { - int i; - for (i=0; inFilledLen; i++) { - printf("%02x ", buf->pBuffer[i]); - } - printf("\n"); - } - if(port_settings_changed == 0 && ((data_len > 0 && ilclient_remove_event(video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1) == 0) || (data_len == 0 && ilclient_wait_for_event(video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1, ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 10000) == 0))) { port_settings_changed = 1; - //OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamBrcmDataUnit, OMX_DataUnitCodedPicture); - if(ilclient_setup_tunnel(tunnel, 0, 0) != 0) return -7; - //ilclient_change_component_state(video_scheduler, OMX_StateExecuting); - - // now setup tunnel to video_render - //if(ilclient_setup_tunnel(tunnel+1, 0, 1000) != 0) - // return -12; - ilclient_change_component_state(video_render, OMX_StateExecuting); - printf("Port changed\n"); } last_packet = last; @@ -226,10 +172,6 @@ void nv_omx_stop(void) { if(OMX_EmptyThisBuffer(ILC_GET_HANDLE(list[0]), buf) != OMX_ErrorNone) status = -20; - // wait for EOS from render -// ilclient_wait_for_event(list[1], OMX_EventBufferFlag, 90, 0, OMX_BUFFERFLAG_EOS, 0, -// ILCLIENT_BUFFER_FLAG_EOS, 10000); - // need to flush the renderer to allow video_decode to disable its input port ilclient_flush_tunnels(tunnel, 0); @@ -238,8 +180,6 @@ void nv_omx_stop(void) { void nv_omx_destroy(void) { ilclient_disable_tunnel(tunnel); -// ilclient_disable_tunnel(tunnel+1); -// ilclient_disable_tunnel(tunnel+2); ilclient_teardown_tunnels(tunnel); ilclient_state_transition(list, OMX_StateIdle);