Cleanup OpenMAX C code

This commit is contained in:
Iwan Timmer
2014-01-07 01:44:29 +01:00
parent d69a384a5c
commit bd2c7416bc

View File

@@ -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. 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 <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
@@ -71,46 +72,17 @@ int nv_omx_init(void) {
// create video_decode // create video_decode
if(ilclient_create_component(client, &video_decode, "video_decode", ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS) != 0) if(ilclient_create_component(client, &video_decode, "video_decode", ILCLIENT_DISABLE_ALL_PORTS | ILCLIENT_ENABLE_INPUT_BUFFERS) != 0)
status = -14; status = -14;
list[0] = video_decode; list[0] = video_decode;
// create video_render // create video_render
if(status == 0 && ilclient_create_component(client, &video_render, "video_render", ILCLIENT_DISABLE_ALL_PORTS) != 0) if(status == 0 && ilclient_create_component(client, &video_render, "video_render", ILCLIENT_DISABLE_ALL_PORTS) != 0)
status = -14; status = -14;
list[1] = video_render; 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); 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) if(status == 0)
ilclient_change_component_state(video_decode, OMX_StateIdle); ilclient_change_component_state(video_decode, OMX_StateIdle);
@@ -120,19 +92,18 @@ int nv_omx_init(void) {
format.nPortIndex = 130; format.nPortIndex = 130;
format.eCompressionFormat = OMX_VIDEO_CodingAVC; format.eCompressionFormat = OMX_VIDEO_CodingAVC;
OMX_PARAM_DATAUNITTYPE unit; OMX_PARAM_DATAUNITTYPE unit;
memset(&unit, 0, sizeof(OMX_PARAM_DATAUNITTYPE)); memset(&unit, 0, sizeof(OMX_PARAM_DATAUNITTYPE));
unit.nSize = sizeof(OMX_PARAM_DATAUNITTYPE); unit.nSize = sizeof(OMX_PARAM_DATAUNITTYPE);
unit.nVersion.nVersion = OMX_VERSION; unit.nVersion.nVersion = OMX_VERSION;
unit.nPortIndex = 130; unit.nPortIndex = 130;
unit.eUnitType = OMX_DataUnitCodedPicture; unit.eUnitType = OMX_DataUnitCodedPicture;
unit.eEncapsulationType = OMX_DataEncapsulationElementaryStream; unit.eEncapsulationType = OMX_DataEncapsulationElementaryStream;
if(status == 0 && if(status == 0 &&
OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamVideoPortFormat, &format) == OMX_ErrorNone && 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_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) { ilclient_enable_port_buffers(video_decode, 130, NULL, NULL, NULL) == 0) {
port_settings_changed = 0; port_settings_changed = 0;
@@ -141,7 +112,7 @@ int nv_omx_init(void) {
ilclient_change_component_state(video_decode, OMX_StateExecuting); ilclient_change_component_state(video_decode, OMX_StateExecuting);
} else } else
status = -14; status = -15;
return status; 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) if((buf = ilclient_get_input_buffer(video_decode, 130, 1)) == NULL)
return -22; return -22;
// feed data and wait until we get port settings changed // feed data and wait until we get port settings changed
dest = buf->pBuffer; 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) { if(first_packet) {
buf->nFlags = OMX_BUFFERFLAG_STARTTIME; buf->nFlags = OMX_BUFFERFLAG_STARTTIME;
first_packet = 0; first_packet = 0;
} }
} }
memcpy(dest, indata, data_len); memcpy(dest, indata, data_len);
buf->nFilledLen += data_len; buf->nFilledLen += data_len;
dest += data_len; dest += data_len;
if (last) { 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; i<buf->nFilledLen; i++) {
printf("%02x ", buf->pBuffer[i]);
}
printf("\n");
}
if(port_settings_changed == 0 && if(port_settings_changed == 0 &&
((data_len > 0 && ilclient_remove_event(video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1) == 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, (data_len == 0 && ilclient_wait_for_event(video_decode, OMX_EventPortSettingsChanged, 131, 0, 0, 1,
ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 10000) == 0))) { ILCLIENT_EVENT_ERROR | ILCLIENT_PARAMETER_CHANGED, 10000) == 0))) {
port_settings_changed = 1; port_settings_changed = 1;
//OMX_SetParameter(ILC_GET_HANDLE(video_decode), OMX_IndexParamBrcmDataUnit, OMX_DataUnitCodedPicture);
if(ilclient_setup_tunnel(tunnel, 0, 0) != 0) if(ilclient_setup_tunnel(tunnel, 0, 0) != 0)
return -7; 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); ilclient_change_component_state(video_render, OMX_StateExecuting);
printf("Port changed\n");
} }
last_packet = last; last_packet = last;
@@ -226,10 +172,6 @@ void nv_omx_stop(void) {
if(OMX_EmptyThisBuffer(ILC_GET_HANDLE(list[0]), buf) != OMX_ErrorNone) if(OMX_EmptyThisBuffer(ILC_GET_HANDLE(list[0]), buf) != OMX_ErrorNone)
status = -20; 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 // need to flush the renderer to allow video_decode to disable its input port
ilclient_flush_tunnels(tunnel, 0); ilclient_flush_tunnels(tunnel, 0);
@@ -238,8 +180,6 @@ void nv_omx_stop(void) {
void nv_omx_destroy(void) { void nv_omx_destroy(void) {
ilclient_disable_tunnel(tunnel); ilclient_disable_tunnel(tunnel);
// ilclient_disable_tunnel(tunnel+1);
// ilclient_disable_tunnel(tunnel+2);
ilclient_teardown_tunnels(tunnel); ilclient_teardown_tunnels(tunnel);
ilclient_state_transition(list, OMX_StateIdle); ilclient_state_transition(list, OMX_StateIdle);