OMX_AllocateBuffer failing

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 &lt; 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-&gt;videodechandle, CompName,pAppData  , &videodeccallbacks); //step3 try to create Required OMX Component
	check_err(eError,"OMX_GetHandle");
	
	setHeader(&paramRole, sizeof(OMX_PARAM_COMPONENTROLETYPE));
	eError = OMX_GetParameter(appPriv-&gt;videodechandle, OMX_IndexParamStandardComponentRole, &paramRole);
	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-&gt;videodechandle, OMX_CommandStateSet, OMX_StateLoaded, NULL);
	//check_err(eError,"OMX_SendCommand OMX_StateLoaded");

	OMX_STATETYPE eState;
	OMX_GetState(appPriv-&gt;videodechandle, &eState);
	GetState(eState);
	eError = OMX_SendCommand(appPriv-&gt;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-&gt;videodechandle, &eState);
	GetState(eState);

	eError = OMX_AllocateBuffer(appPriv-&gt;videodechandle, &pInBuffer1, 0, NULL, buffer_in_size); // Allocate Buffer
	check_err(eError,"OMX_AllocateBuffer P1");

	eError = OMX_AllocateBuffer(appPriv-&gt;videodechandle, &pInBuffer2, 0, NULL, buffer_in_size);
	check_err(eError,"OMX_AllocateBuffer P2");

	eError = OMX_AllocateBuffer(appPriv-&gt;videodechandle, &pOutBuffer1, 1, NULL, buffer_out_size);
	check_err(eError,"OMX_AllocateBuffer P3");

	eError = OMX_AllocateBuffer(appPriv-&gt;videodechandle, &pOutBuffer2, 1, NULL, buffer_out_size);
	check_err(eError,"OMX_AllocateBuffer P4");

	eError = OMX_SendCommand(appPriv-&gt;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-&gt;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-&gt;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(&paramPort, sizeof(OMX_PARAM_PORTDEFINITIONTYPE));
eError = OMX_GetParameter(appPriv->videodechandle, OMX_IndexParamPortDefinition, &paramPort);
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;

}

But after OMX_SendCommand(appPriv->videodechandle, OMX_CommandStateSet, OMX_StateIdle, 0)
The same component is not moving to OMX_StateIdle.

The component will only move to idle once all its (enabled) ports are populated.

Also OMX_AllocateBuffer is failing.

What’s the error that’s being returned?

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);

The OMX_GetState() calls around the OMX_SendCommand() call may indicate that you think that the state will change during the call. This is not guaranteed, as OMX_SendCommand() is defined as asynhronous - a callback will be received when the command completes. Depending upon the implementation, in general, this may or may not be before you return from OMX_SendCommand().

As you haven’t disabled the component’s ports, you’re guaranteed that the state will still be idle after the above call to OMX_SendCommand(), as the ports are not yet populated.

Its because of the state is not changing to idle.

I think you are getting the error: 80001000, Insufficient Resources.

With Android app, it doesn’t have the system privilege. So it doesn’t get the resources as it needs.

I am looking for a solution. how to use omx with android?