Hi I’m New to omxIL. I’m trying to decode a sample .264 content on FSL imx_51 platorm running on Android 2.0 ,
After calling OMX_GetHandle, the component is created and moves to OMX_StateLoaded.
But after OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateIdle, 0)
The same component is not moving to OMX_StateIdle.
Also OMX_AllocateBuffer is failing.
Anyone please go through my below code. Help me out.
Here is code,
#include “test.h”
appPrivateType* appPriv;
int main()
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
int i;
bool present = false;
char szCompName[256];
OMX_U32 no_of_roles;
OMX_U8 **string_of_roles;
int index;
pAppData = (OMX_PTR) malloc(sizeof(OMX_PTR));
eError = OMX_Init(); //Step 1
check_err(eError,"OMX_Init");
for (i=0; OMX_ErrorNoMore != eError; i++)
{
eError = OMX_ComponentNameEnum((OMX_STRING)szCompName, 256, i);
if (OMX_ErrorNone == eError)
fprintf(stderr,"Component %d: %s
",i,(OMX_STRING) szCompName);
else
fprintf(stderr,"OMX_ComponentNameEnum Component ERROR
");
if(strstr((const char*) szCompName,"video_decoder.avc"))
{
fprintf(stderr,"Found h/w decoder for avc
");
present = true;
}
}
eError = OMX_GetRolesOfComponent(CompName, &no_of_roles, NULL); //Step 2 Call the OMX Init API OMX_Init
check_err(eError,"OMX_GetRolesOfComponent");
if(no_of_roles == 0) {
fprintf(stderr, "The Number or roles is 0.
The component selected is not correct for the purpose of this test.
Exiting…
");
}
else {
string_of_roles = (OMX_U8**)malloc(no_of_roles * sizeof(OMX_STRING));
for (index = 0; index < no_of_roles; index++) {
(string_of_roles + index) =(OMX_U8) malloc(no_of_roles * OMX_MAX_STRINGNAME_SIZE);
}
eError = OMX_GetRolesOfComponent(CompName, &no_of_roles, string_of_roles);
check_err(eError,"OMX_GetRolesOfComponent");
if(string_of_roles != NULL) {
for (index = 0; index < no_of_roles; index++)
{
fprintf(stderr, "The role %i for the component: %s
", (index + 1), *(string_of_roles+index));
}
}
else
{
fprintf(stderr, "role string is NULL!!! Exiting...
");
}
}
videodeccallbacks.EventHandler = videodecEventHandler;
videodeccallbacks.EmptyBufferDone = videodecEmptyBufferDone; //Assign CallBack Functions
videodeccallbacks.FillBufferDone = videodecFillBufferDone;
if(present == true)
{
eError = OMX_ErrorNone;
appPriv = (appPrivateType*) malloc(sizeof(appPrivateType));
if(appPriv == NULL)
{
fprintf(stderr,"malloc failed for appPriv
");
cleanup(appPriv->videodechandle);
}
eError = OMX_GetHandle(&appPriv->videodechandle, CompName,pAppData , &videodeccallbacks); //step3 try to create Required OMX Component
check_err(eError,"OMX_GetHandle");
setHeader(¶mRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
eError = OMX_GetParameter(appPriv->videodechandle, OMX_IndexParamStandardComponentRole, ¶mRole);
check_err(eError,"OMX_GetParameter");
fprintf(stderr, "The role currently set is %s
", paramRole.cRole);
buffer_out_size = out_width * out_height * 3/2; //yuv420 format -- bpp = 12
pInBuffer1 = pInBuffer2 = NULL;
pOutBuffer1 = pOutBuffer2 = NULL;
fprintf(stderr,"buffer_insize = %d buffer_outsize = %d
",(int)buffer_in_size,(int)buffer_in_size);
//eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateLoaded, NULL);
//check_err(eError,"OMX_SendCommand OMX_StateLoaded");
OMX_STATETYPE eState;
OMX_GetState(appPriv->videodechandle, &eState);
GetState(eState);
eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateIdle, 0); //step 4 Send state change command to OMX component to OMX_StateIdle
check_err(eError,"OMX_SendCommand OMX_StateIdle");
OMX_GetState(appPriv->videodechandle, &eState);
GetState(eState);
eError = OMX_AllocateBuffer(appPriv->videodechandle, &pInBuffer1, 0, NULL, buffer_in_size); // Allocate Buffer
check_err(eError,"OMX_AllocateBuffer P1");
eError = OMX_AllocateBuffer(appPriv->videodechandle, &pInBuffer2, 0, NULL, buffer_in_size);
check_err(eError,"OMX_AllocateBuffer P2");
eError = OMX_AllocateBuffer(appPriv->videodechandle, &pOutBuffer1, 1, NULL, buffer_out_size);
check_err(eError,"OMX_AllocateBuffer P3");
eError = OMX_AllocateBuffer(appPriv->videodechandle, &pOutBuffer2, 1, NULL, buffer_out_size);
check_err(eError,"OMX_AllocateBuffer P4");
eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateIdle, 0); //step 4 Send state change command to OMX component to OMX_StateIdle
check_err(eError,"OMX_SendCommand OMX_StateIdle");
//eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateLoaded, NULL);
// check_err(eError,“OMX_SendCommand OMX_StateLoaded”);
#if 0
#endif
// eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateIdle, NULL);
// eError = OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateExecuting, NULL);
// check_err(eError,“OMX_SendCommand OMX_StateExecuting”);
#if 0
eError = OMX_FillThisBuffer(appPriv->videodechandle, pOutBuffer1);
check_err(eError,“OMX_FillThisBuffer”);
eError = OMX_FillThisBuffer(appPriv->videodechandle, pOutBuffer2);
check_err(eError,"OMX_FillThisBuffer");
#endif
free(appPriv);
cleanup(appPriv->videodechandle);
}
return 0;
}
static void setHeader(OMX_PTR header, OMX_U32 size) {
OMX_VERSIONTYPE* ver = (OMX_VERSIONTYPE*)(header + sizeof(OMX_U32));
fprintf(stderr,"%s:%s",FILE,func);
((OMX_U32)header) = size;
ver->s.nVersionMajor = VERSIONMAJOR;
ver->s.nVersionMinor = VERSIONMINOR;
ver->s.nRevision = VERSIONREVISION;
ver->s.nStep = VERSIONSTEP;
}
void check_err(OMX_ERRORTYPE eError, const char* notification)
{
if(eError!=OMX_ErrorNone)
{
fprintf(stderr,"Error Due to %s
",notification);
OMX_Deinit();
}
else
fprintf(stderr,"successfull %s
",notification);
}
void cleanup(OMX_HANDLETYPE videodechandle)
{
fprintf(stderr,"%s:%s",FILE,func);
OMX_FreeHandle(videodechandle);
OMX_Deinit();
}
void GetState(OMX_STATETYPE state)
{
switch ((int)state)
{
case OMX_StateInvalid:
fprintf(stderr,"%s:%s:State changed OMX_StateInvalid
“,func,FILE);
break;
case OMX_StateLoaded:
fprintf(stderr,”%s:%s:State changed OMX_StateLoaded
“,func,FILE);
break;
case OMX_StateIdle:
fprintf(stderr,”%s:%s:State changed OMX_StateIdle
“,func,FILE);
break;
case OMX_StateExecuting:
fprintf(stderr,”%s:%s:State changed OMX_StateExecuting
“,func,FILE);
break;
case OMX_StatePause:
fprintf(stderr,”%s:%s:State changed OMX_StatePause
“,func,FILE);
break;
case OMX_StateWaitForResources:
fprintf(stderr,”%s:%s:State changed OMX_StateWaitForResources
“,func,FILE);
break;
default :
fprintf(stderr,”%s:%s:State changed Unknwon State
",func,FILE);
}
}
OMX_ERRORTYPE videodecEventHandler( OMX_OUT OMX_HANDLETYPE hComponent,OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_EVENTTYPE eEvent, OMX_OUT OMX_U32 Data1, OMX_OUT OMX_U32 Data2, OMX_OUT OMX_PTR pEventData) {
fprintf(stderr,"%s:%s:Event count = %d
",func,FILE,++event_count);
OMX_ERRORTYPE eError = OMX_ErrorNone;
switch(eEvent){
case OMX_EventCmdComplete:
fprintf(stderr,"OMX_EventCmdComplete
");
break;
case OMX_EventError:
fprintf(stderr,"OMX_EventError
");
break;
case OMX_EventMark:
fprintf(stderr,"OMX_EventMark
");
break;
case OMX_EventPortSettingsChanged:
fprintf(stderr,"OMX_EventPortSettingsChanged
");
break;
case OMX_EventBufferFlag:
fprintf(stderr,"OMX_EventBufferFlag
");
break;
case OMX_EventResourcesAcquired:
fprintf(stderr,"OMX_EventResourcesAcquired
");
break;
case OMX_EventComponentResumed:
fprintf(stderr,"OMX_EventComponentResumed
");
break;
case OMX_EventDynamicResourcesAvailable:
fprintf(stderr,"OMX_EventDynamicResourcesAvailable
");
break;
case OMX_EventPortFormatDetected:
fprintf(stderr,"OMX_EventPortFormatDetected
");
break;
case OMX_EventKhronosExtensions:
fprintf(stderr,"OMX_EventKhronosExtensions
");
break;
case OMX_EventMax:
fprintf(stderr,"OMX_EventMax
");
break;
case OMX_EventVendorStartUnused:
fprintf(stderr,"OMX_EventVendorStartUnused
");
break;
default :
fprintf(stderr,"Unknown EVENT
");
}
if(eEvent == OMX_EventCmdComplete)
{
fprintf(stderr,"%s:%s:State changed
",func,FILE);
if (Data1 == OMX_CommandStateSet)
{
fprintf(stderr,"%s:%s:State changed
",func,FILE);
switch ((int)Data2)
{
case OMX_StateInvalid:
fprintf(stderr,"%s:%s:State changed OMX_StateInvalid
“,func,FILE);
break;
case OMX_StateLoaded:
fprintf(stderr,”%s:%s:State changed OMX_StateLoaded
“,func,FILE);
break;
case OMX_StateIdle:
fprintf(stderr,”%s:%s:State changed OMX_StateIdle
“,func,FILE);
break;
case OMX_StateExecuting:
fprintf(stderr,”%s:%s:State changed OMX_StateExecuting
“,func,FILE);
break;
case OMX_StatePause:
fprintf(stderr,”%s:%s:State changed OMX_StatePause
“,func,FILE);
break;
case OMX_StateWaitForResources:
fprintf(stderr,”%s:%s:State changed OMX_StateWaitForResources
",func,FILE);
break;
}
// tsem_up(appPriv->decoderEventSem);
}
#if 0
else if(OMX_CommandPortEnable || OMX_CommandPortDisable)
{
fprintf(stderr, "In %s Received Port Enable/Disable Event
",func);
// tsem_up(appPriv->decoderEventSem);
}
#endif
}
else if(eEvent == OMX_EventPortSettingsChanged)
{
fprintf(stderr, "
port settings change event handler in %s
", func);
if(Data2 == 0)
{
setPortParameters();
}
}
else if(eEvent == OMX_EventBufferFlag) {
fprintf(stderr,"Buffer Event
");
}
return OMX_ErrorNone;
}
int setPortParameters()
{
OMX_ERRORTYPE eError = OMX_ErrorNone;
fprintf(stderr,"%s:%s
",FILE,func);
paramPort.nPortIndex = 1;
setHeader(¶mPort, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
eError = OMX_GetParameter(appPriv->videodechandle, OMX_IndexParamPortDefinition, ¶mPort);
new_out_width = paramPort.format.video.nFrameWidth;
new_out_height = paramPort.format.video.nFrameHeight;
fprintf(stderr, "input picture width : %d height : %d
", (int)new_out_width, (int)new_out_height);
return eError;
}
OMX_ERRORTYPE videodecEmptyBufferDone( OMX_OUT OMX_HANDLETYPE hComponent,OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
{
fprintf(stderr,"%s:%s",__func__,__FILE__);
return OMX_ErrorNone;
}
OMX_ERRORTYPE videodecFillBufferDone(OMX_OUT OMX_HANDLETYPE hComponent,OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer)
{
fprintf(stderr,"%s:%s",func,FILE);
return OMX_ErrorNone;
}