#include "Decoder_OMX.h" #include "OMX_Core.h" #include "OMX_Types.h" #include "OMX_Other.h" #include "OMX_Component.h" #include #include "logjam.h" #include #include #include #include #include #include #define OMX_MAX_STRINGNAME_SIZE 128 // why isn't this defined in OMX_Core.h ??? /*static OMX_BUFFERHEADERTYPE **omx_buffers_out; static OMX_BUFFERHEADERTYPE **omx_buffers_in;*/ static int buffer_out_mask;//, buffer_out_nb; static int buffer_in_mask;//, buffer_in_nb, buffer_in_size; typedef OMX_ERRORTYPE OMX_APIENTRY(*OMX_Init_FPTR) (void); OMX_Init_FPTR my_OMX_Init = NULL; typedef OMX_ERRORTYPE OMX_APIENTRY(*OMX_ComponentNameEnum_FPTR) ( OMX_OUT OMX_STRING cComponentName, OMX_IN OMX_U32 nNameLength, OMX_IN OMX_U32 nIndex); OMX_ComponentNameEnum_FPTR my_OMX_ComponentNameEnum = NULL; typedef OMX_ERRORTYPE (*OMX_GetRolesOfComponent_FPTR)(OMX_IN OMX_STRING compName, OMX_INOUT OMX_U32 *pNumRoles, OMX_OUT OMX_U8 **roles); OMX_GetRolesOfComponent_FPTR my_OMX_GetRolesOfComponent = NULL; typedef OMX_ERRORTYPE (*OMX_GetHandle_FPTR)( OMX_OUT OMX_HANDLETYPE* pHandle, OMX_IN OMX_STRING cComponentName, OMX_IN OMX_PTR pAppData, OMX_IN OMX_CALLBACKTYPE* pCallBacks); OMX_GetHandle_FPTR my_OMX_GetHandle = NULL; OMX_HANDLETYPE decoder_handle; int input_port = -1; int output_port = -1; int input_buffer_count = -1; int input_buffer_size = -1; // this is hardcoded !!! // remember to make this dynamic #define PICTURE_BUFFERS_NUM_INPUT 10 #define PICTURE_BUFFERS_NUM_OUTPUT 8 OMX_BUFFERHEADERTYPE* g_BuffersIn[PICTURE_BUFFERS_NUM_INPUT]; OMX_BUFFERHEADERTYPE* g_BuffersOut[PICTURE_BUFFERS_NUM_OUTPUT]; int g_iCurrentInput = 0; int g_iCurrentOutput = 0; FILE* g_pVidFile = NULL; /*********************/ // Callbacks /*********************/ void Print_Event_Type(OMX_EVENTTYPE event) { //LOGI("blah=%d",OMX_EventPortSettingsChanged); switch (event) { case OMX_EventCmdComplete: LOGI("event=OMX_EventCmdComplete"); break; case OMX_EventError: LOGI("event=OMX_EventError"); break; case OMX_EventMark: LOGI("event=OMX_EventMark"); break; case OMX_EventPortSettingsChanged: LOGI("Oevent=MX_EventPortSettingsChanged"); break; case OMX_EventBufferFlag: LOGI("event=OMX_EventBufferFlag"); break; case OMX_EventResourcesAcquired: LOGI("event=OMX_EventResourcesAcquired"); break; case OMX_EventComponentResumed: LOGI("event=OMX_EventComponentResumed"); break; case OMX_EventDynamicResourcesAvailable: LOGI("event=OMX_EventDynamicResourcesAvailable"); break; case OMX_EventPortFormatDetected: LOGI("event=OMX_EventPortFormatDetected"); break; default: LOGI("[Unkown OMX_EVENTTYPE!]"); break; } } void OnOutputPortEnabled() { LOGI("<>"); int err = OMX_FillThisBuffer(decoder_handle, g_BuffersOut[g_iCurrentOutput]); if (err != OMX_ErrorNone) LOGE("1 OMX_FillThisBuffer on output %d failed!! [0x%X]", g_iCurrentOutput, err); else LOGI("1 OMX_FillThisBuffer on output %d ok.", g_iCurrentOutput); g_iCurrentOutput++; g_iCurrentOutput %= PICTURE_BUFFERS_NUM_OUTPUT; } void OnInputPortEnabled() { LOGI("<>"); OMX_BUFFERHEADERTYPE *buf = g_BuffersIn[g_iCurrentInput]; int read_len = fread(buf->pBuffer, 1, input_buffer_size, g_pVidFile); LOGI("read from file: %d bytes\n", read_len); buf->nFilledLen = read_len; int err = OMX_EmptyThisBuffer(decoder_handle, buf); if (err == OMX_ErrorNotReady) { LOGI("OMX_EmptyThisBuffer input %d! - Error=OMX_ErrorNotReady", g_iCurrentInput); } else if (err != OMX_ErrorNone) { LOGE("Error on OMX_EmptyThisBuffer input %d! - Error=%X!!!", g_iCurrentInput, err); } else { LOGI("OMX_EmptyThisBuffer input %d ok.", g_iCurrentInput); } g_iCurrentInput++; g_iCurrentInput %= PICTURE_BUFFERS_NUM_INPUT; } OMX_ERRORTYPE decoder_event_handler( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_EVENTTYPE eEvent, OMX_IN OMX_U32 nData1, OMX_IN OMX_U32 nData2, OMX_IN OMX_PTR pEventData) { LOGI("[[decoder_event_handler]]: Got event %x %x %x\n", eEvent, (unsigned int)nData1, (unsigned int)nData2); //LOGI("Event="); Print_Event_Type(eEvent); OMX_COMMANDTYPE cmd_type; switch(eEvent) { case OMX_EventCmdComplete: switch (nData1) { case OMX_CommandPortDisable: LOGI("-- OMX_CommandPortDisable"); //DCHECK_EQ(data2, output_port_); //OnOutputPortDisabled(); return; case OMX_CommandPortEnable: LOGI("-- OMX_CommandPortEnable on port %d",nData2); if (nData2 == output_port) { //OnOutputPortEnabled(); } else if (nData2 == input_port) { //OnInputPortEnabled(); } else LOGE("Unkown port!!!"); //DCHECK_EQ(data2, output_port_); //OnOutputPortEnabled(); return; case OMX_CommandStateSet: LOGI("-- OMX_CommandStateSet"); //DispatchStateReached(static_cast(data2)); return; case OMX_CommandFlush: LOGI("-- OMX_CommandFlush"); /*if (current_state_change_ == DESTROYING) return; DCHECK(current_state_change_ == RESETTING); if (data2 == input_port_) InputPortFlushDone(); else if (data2 == output_port_) OutputPortFlushDone(); else NOTREACHED() << "Unexpected port flushed: " << data2;*/ return; default: LOGE("Unknown command completed: %d",nData1); } return; case OMX_EventPortSettingsChanged: // i got a reference for this LOGI("OMX_EventPortSettingsChanged ou~\n"); break; case OMX_EventBufferFlag: LOGI("OMX_EventBufferFlag\n"); break; case OMX_EventError: LOGE("fail\n"); break; default: LOGI("Unkown event."); } return OMX_ErrorNone; } OMX_ERRORTYPE decoder_empty_buffer_done( OMX_IN OMX_HANDLETYPE hComponent, OMX_IN OMX_PTR pAppData, OMX_IN OMX_BUFFERHEADERTYPE* pBuffer) { LOGI("[[decoder_empty_buffer_done]]: %x\n", pBuffer->pPlatformPrivate); /*if(pBuffer->pPlatformPrivate < 102400) exit(1); buffer_in_mask |= 1<<*(short*)pBuffer->pPlatformPrivate; sem_post(&wait_buff); return 0; */ return OMX_ErrorNone; } OMX_ERRORTYPE decoder_fill_buffer_done( OMX_OUT OMX_HANDLETYPE hComponent, OMX_OUT OMX_PTR pAppData, OMX_OUT OMX_BUFFERHEADERTYPE* pBuffer) { static int got = 0, times=0; times++; LOGI("[[decoder_fill_buffer_done]]: (%d)",times); /* got += pBuffer->nFilledLen, printf("filled %x %d %d %d\n", pBuffer, pBuffer->nFilledLen, got, times ); #ifdef DUMP write(dumper, pBuffer->pBuffer, pBuffer->nFilledLen); fsync(dumper); printf("sync...\n"); #endif buffer_out_mask |= 1<<*(short*)pBuffer->pPlatformPrivate; sem_post(&wait_buff); #if 0 int i; printf("dump: ->"); for(i=0;inFilledLen;i++) printf("%02x ", *(pBuffer->pBuffer+i)); printf("<-\n"); #endif return 0; */ return OMX_ErrorNone; } /*********************/ /*********************/ static void setHeader(OMX_PTR header, OMX_U32 size) { memset(header, 0, size); OMX_VERSIONTYPE* ver = (OMX_VERSIONTYPE*) (header + sizeof(OMX_U32)); *((OMX_U32*) header) = size; ver->s.nVersionMajor = 1; ver->s.nVersionMinor = 1; ver->s.nRevision = 0; ver->s.nStep = 0; } // This is to initialize the OMX data structures to default values. /*template static void InitParam(const OmxVideoDecodeAccelerator& dec, T* param) { memset(param, 0, sizeof(T)); param->nVersion.nVersion = 0x00000101; param->nSize = sizeof(T); }*/ void Print_CurrentState(OMX_HANDLETYPE h) { OMX_STATETYPE curr_state = -1; int err = OMX_GetState(h, &curr_state); if (err != OMX_ErrorNone) { LOGE("ERROR OMX_GetState - Error=%X!!!", err); } else { //LOGI("OMX_GetState ok. curr_state is %d",curr_state); switch (curr_state) { case OMX_StateInvalid: LOGI("OMX_StateInvalid."); break; case OMX_StateLoaded: LOGI("OMX_StateLoaded."); break; case OMX_StateIdle: LOGI("OMX_StateIdle."); break; case OMX_StateExecuting: LOGI("OMX_StateExecuting."); break; case OMX_StatePause: LOGI("OMX_StatePause."); break; case OMX_StateWaitForResources: LOGI("OMX_StateWaitForResources."); break; default: LOGE("Unkown state."); break; }; } } void Print_OMX_BUFFERHEADERTYPE(struct OMX_BUFFERHEADERTYPE* pVal) { LOGI("****** OMX_BUFFERHEADERTYPE = 0x%8X ******", pVal); LOGI("pVal->nSize = %u", pVal->nSize); LOGI("pVal->nVersion = 0x%X", pVal->nVersion); LOGI("pVal->pBuffer = 0x%X", pVal->pBuffer); LOGI("pVal->nAllocLen = %u", pVal->nAllocLen); LOGI("pVal->nFilledLen = %u", pVal->nFilledLen); LOGI("pVal->nOffset = %u", pVal->nOffset); LOGI("pVal->pAppPrivate = 0x%X", pVal->pAppPrivate); LOGI("pVal->nFlags = %u", pVal->nFlags); LOGI("pVal->nOutputPortIndex = %u", pVal->nOutputPortIndex); LOGI("pVal->nInputPortIndex = %u", pVal->nInputPortIndex); LOGI("******************"); } void Print_OMX_PORT_PARAM_TYPE(struct OMX_PORT_PARAM_TYPE* pVal) { LOGI("****** OMX_PORT_PARAM_TYPE = 0x%8X ******", pVal); LOGI("pVal->nSize = %u", pVal->nSize); LOGI("pVal->nVersion = 0x%X", pVal->nVersion); LOGI("pVal->nPorts = %u", pVal->nPorts); LOGI("pVal->nStartPortNumber = %u", pVal->nStartPortNumber); LOGI("******************"); } void Print_OMX_PARAM_PORTDEFINITIONTYPE( struct OMX_PARAM_PORTDEFINITIONTYPE* port_def) { LOGI("****** port_def = 0x%8X ******", port_def); LOGI("nSize = %u", port_def->nSize); LOGI("nVersion = %X", port_def->nVersion); LOGI("nPortIndex = %u", port_def->nPortIndex); LOGI("eDir = %u", port_def->eDir); LOGI("nBufferCountActual = %u", port_def->nBufferCountActual); LOGI("nBufferCountMin = %u", port_def->nBufferCountMin); LOGI("nBufferSize = %u", port_def->nBufferSize); LOGI("bEnabled = %u", port_def->bEnabled); LOGI("bPopulated = %u", port_def->bPopulated); LOGI("eDomain = %u", port_def->eDomain); LOGI("format.video.cMIMEType = %s", port_def->format.video.cMIMEType); LOGI("format.video.pNativeRender = %u", port_def->format.video.pNativeRender); LOGI("format.video.nFrameWidth = %u", port_def->format.video.nFrameWidth); LOGI("format.video.nFrameHeight = %u", port_def->format.video.nFrameHeight); LOGI("format.video.nStride = %u", port_def->format.video.nStride); LOGI("format.video.nSliceHeight = %u", port_def->format.video.nSliceHeight); LOGI("format.video.nBitrate = %u", port_def->format.video.nBitrate); LOGI("format.video.xFramerate = %u", port_def->format.video.xFramerate); LOGI("format.video.bFlagErrorConcealment = %u", port_def->format.video.bFlagErrorConcealment); LOGI("format.video.eCompressionFormat = %u", port_def->format.video.eCompressionFormat); LOGI("format.video.eColorFormat = %u", port_def->format.video.eColorFormat); LOGI("******************************"); } struct Decoder_OMX* CreateDecoder_OMX() { if (g_pVidFile == NULL) { g_pVidFile = fopen("/sdcard/out.yuv", "rb"); LOGI("Opened video file - got file handle %X", (unsigned int) g_pVidFile); //fclose(g_pVideoFile); } else { LOGE("Failed trying to open video file."); } struct Decoder_OMX *instance = (struct Decoder_OMX *) malloc( sizeof(struct Decoder_OMX)); void* hModule; hModule = dlopen("/system/lib/libnvomx.so", RTLD_NOW);//dlopen("libpvnvomx.so",RTLD_NOW); if (hModule == NULL) { LOGE("libnvomx.so Load Fails\n"); return NULL; } LOGI("libnvomx.so Load Success\n"); my_OMX_Init = (OMX_Init_FPTR) dlsym(hModule, "OMX_Init"); LOGI("my_OMX_Init=0x%8X", my_OMX_Init); OMX_ERRORTYPE err; int i; char ComponentName[128]; OMX_STRING str = ComponentName; err = my_OMX_Init(); if (err != OMX_ErrorNone) { LOGE("OMX_Init Failed! [%d]", err); return NULL; } LOGI("OMX_Init ok."); my_OMX_ComponentNameEnum = (OMX_ComponentNameEnum_FPTR) dlsym(hModule, "OMX_ComponentNameEnum"); LOGI("my_OMX_ComponentNameEnum=0x%8X", my_OMX_ComponentNameEnum); err = OMX_ErrorNone; for (i = 0; err != OMX_ErrorNoMore; i++) { err = my_OMX_ComponentNameEnum(str, 128, i); if (err == OMX_ErrorNone) { //LOGI("The %dth ComponentName is %s\n", i, str); } } my_OMX_GetRolesOfComponent = (OMX_GetRolesOfComponent_FPTR) dlsym(hModule, "OMX_GetRolesOfComponent"); LOGI("my_OMX_GetRolesOfComponent=0x%8X", my_OMX_GetRolesOfComponent); OMX_U32 NumRoles; OMX_U8 **roles; my_OMX_GetRolesOfComponent("OMX.Nvidia.h264.decode", &NumRoles, NULL); // get number of roles LOGI("%d Roles found.", NumRoles); roles = (OMX_U8**) malloc(NumRoles * sizeof(OMX_U8*)); for (i = 0; i < NumRoles; i++) { roles[i] = (OMX_U8*) malloc(OMX_MAX_STRINGNAME_SIZE); } my_OMX_GetRolesOfComponent("OMX.Nvidia.h264.decode", &NumRoles, roles); for (i = 0; i < NumRoles; i++) { LOGI("H.264 Decoder Roles:%s\n", roles[i]); } for (i = 0; i < NumRoles; i++) { free(roles[i]); roles[i] = NULL; } free(roles); roles = NULL; FILE* pVidFile = fopen("/sdcard/out.yuv", "rb"); LOGI("pVidFile=0x%X", pVidFile); my_OMX_GetHandle = (OMX_GetHandle_FPTR) dlsym(hModule, "OMX_GetHandle"); OMX_CALLBACKTYPE decoder_callbacks = { decoder_event_handler, decoder_empty_buffer_done, decoder_fill_buffer_done }; err = my_OMX_GetHandle(&decoder_handle, "OMX.Nvidia.h264ext.decode", NULL, &decoder_callbacks); if (err != OMX_ErrorNone) { LOGE("GetHandle Fails - [0x%x]\n", err); return NULL; } LOGI("GetHandle ok."); // Get the port information. This will obtain information about the number of // ports and index of the first port. OMX_PORT_PARAM_TYPE port_param; setHeader(&port_param, sizeof(port_param)); err = OMX_GetParameter(decoder_handle, OMX_IndexParamVideoInit, &port_param); if (err != OMX_ErrorNone) LOGE("1 OMX_GetParameter on OMX_IndexParamVideoInit failed! [0x%X]", err); else LOGI("1 OMX_GetParameter on OMX_IndexParamVideoInit ok."); input_port = port_param.nStartPortNumber; output_port = input_port + 1; Print_OMX_PORT_PARAM_TYPE(&port_param); // Set role for the component because components can have multiple roles. // skip it for now (seems like there's only one role in this component) // Populate input-buffer-related members based on input port data. OMX_PARAM_PORTDEFINITIONTYPE port_format; setHeader(&port_format, sizeof(port_format)); LOGI("-- Before get parameter --"); Print_OMX_PARAM_PORTDEFINITIONTYPE(&port_format); port_format.nPortIndex = input_port + 0; err = OMX_GetParameter(decoder_handle, OMX_IndexParamPortDefinition, &port_format); if (err != OMX_ErrorNone) LOGE( "2 OMX_GetParameter on OMX_IndexParamPortDefinition port 0 failed! [0x%X]", err); else LOGI("2 OMX_GetParameter on OMX_IndexParamPortDefinition port 0 ok."); input_buffer_count = port_format.nBufferCountActual; input_buffer_size = port_format.nBufferSize; Print_OMX_PARAM_PORTDEFINITIONTYPE(&port_format); // Verify output port conforms to our expectations. setHeader(&port_format, sizeof(port_format)); port_format.nPortIndex = output_port; err = OMX_GetParameter(decoder_handle, OMX_IndexParamPortDefinition, &port_format); if (err != OMX_ErrorNone) LOGE( "3 OMX_GetParameter on OMX_IndexParamPortDefinition port 1 failed! [0x%X]", err); else LOGI("3 OMX_GetParameter on OMX_IndexParamPortDefinition port 1 ok."); if (OMX_DirOutput != port_format.eDir) { LOGE("Expected output port eDir to be of type, well ... OMX_DirOutput!"); } else { LOGI("Output port eDir is ok."); } Print_OMX_PARAM_PORTDEFINITIONTYPE(&port_format); // Set output port parameters. port_format.nBufferCountActual = PICTURE_BUFFERS_NUM_OUTPUT; //it wanted 10 originally, so look at this later as well! port_format.nBufferCountMin = PICTURE_BUFFERS_NUM_OUTPUT; //it wanted 10 originally, so look at this later as well! if (PICTURE_BUFFERS_NUM_OUTPUT != port_format.nBufferCountMin) { LOGE( "ERROR - PICTURE_BUFFERS_NUM_OUTPUT != port_format.nBufferCountMin - nBufferCountMin=%d ", port_format.nBufferCountMin); } // Force an OMX_EventPortSettingsChanged event to be sent once we know the // stream's real dimensions (which can only happen once some Decode() work has // been done). port_format.format.video.nFrameWidth = -1;//640; port_format.format.video.nFrameHeight = -1;//480; //port_format.nBufferSize=640*480*3/2; int output_buff_size = port_format.nBufferSize; err = OMX_SetParameter(decoder_handle, OMX_IndexParamPortDefinition, &port_format); if (err != OMX_ErrorNone) LOGE( "4 OMX_SetParameter on OMX_IndexParamPortDefinition port 1 failed! [0x%X]", err); else LOGI("4 OMX_SetParameter on OMX_IndexParamPortDefinition port 1 ok."); // allocate output buffers /* LOGI("--- Starting to allocate output buffers --- "); for(i=0;ipPlatformPrivate = count; //*count = i; //count++; //LOGI("buf_out[%d]=%p\n", i, g_BuffersOut[i]); } */ setHeader(&port_format, sizeof(port_format)); port_format.nPortIndex = input_port; err = OMX_GetParameter(decoder_handle, OMX_IndexParamPortDefinition, &port_format); if (err != OMX_ErrorNone) LOGE( "5 OMX_GetParameter on OMX_IndexParamPortDefinition port 0 failed! [0x%X]", err); else LOGI("5 OMX_GetParameter on OMX_IndexParamPortDefinition port 0 ok."); LOGI("*** Input port: ***"); Print_OMX_PARAM_PORTDEFINITIONTYPE(&port_format); if (PICTURE_BUFFERS_NUM_INPUT != port_format.nBufferCountMin) { LOGE( "input port_format.nBufferCountMin != PICTURE_BUFFERS_NUM !! it equals %d", port_format.nBufferCountMin); } /*LOGI("--- Starting to allocate input buffers --- "); for(i=0;ipPlatformPrivate = count; //*count = i; //count++; LOGI("buf_in[%d]=%p\n", i, g_BuffersIn[i]); } */ // Fill the component with fake output buffers. This seems to be required for // the component to move from Loaded to Idle. How bogus. for (i = 0; i < PICTURE_BUFFERS_NUM_OUTPUT; ++i) { OMX_BUFFERHEADERTYPE* buffer; err = OMX_UseBuffer(decoder_handle, &buffer, output_port, NULL, 0, (OMX_U8*) (0x1)); //err = OMX_UseBuffer(decoder_handle, &buffer, output_port, // NULL, 0, (OMX_U8*)(0x1)); if (err != OMX_ErrorNone) { LOGE("Error on OMX_UseBuffer output %d! - Error=%X!!!", i, err); } else { LOGI("OMX_UseBuffer output %d ok.", i); } buffer->pAppPrivate = NULL; buffer->nTimeStamp = -1; buffer->nOutputPortIndex = output_port; //CHECK(fake_output_buffers_.insert(buffer).second); } //1. add OMX_CommandPortEnable on both ports !!! (needed to move to state idle) //2. consider removing the fake use buffer if it's not needed. /*LOGI("Activating output port..."); err = OMX_SendCommand(decoder_handle, OMX_CommandPortEnable, output_port, 0); if (err!=OMX_ErrorNone) { LOGE("ERROR OMX_SendCommand - OMX_CommandPortEnable Error=%X port=%d!!!",err,output_port); } else { LOGI("OMX_SendCommand OMX_CommandPortEnable ok - port=%d.",output_port); }*/ /*LOGI("Activating input port..."); err = OMX_SendCommand(decoder_handle, OMX_CommandPortEnable, input_port, 0); if (err!=OMX_ErrorNone) { LOGE("ERROR OMX_SendCommand - OMX_CommandPortEnable Error=%X port=%d!!!",err,input_port); } else { LOGI("OMX_SendCommand OMX_CommandPortEnable ok - port=%d.",input_port); }*/ sleep(2); LOGI("Changing State..."); // change state into OMX_Idle Print_CurrentState(decoder_handle); err = OMX_SendCommand(decoder_handle, OMX_CommandStateSet, OMX_StateIdle, 0); if (err != OMX_ErrorNone) { LOGE("ERROR OMX_SendCommand - OMX_CommandStateSet Error=%X!!!", err); } else { LOGI("OMX_SendCommand OMX_StateIdle ok."); } for (i = 0; i < PICTURE_BUFFERS_NUM_INPUT; ++i) { OMX_BUFFERHEADERTYPE* buffer; // While registering the buffer header we use fake buffer information // (length 0, at memory address 0x1) to fake out the "safety" check in // OMX_UseBuffer. When it comes time to actually use this header in Decode // we set these fields to their real values (for the duration of that // Decode). OMX_ERRORTYPE result = OMX_UseBuffer(decoder_handle, &buffer, input_port, NULL, /* pAppPrivate gets set in Decode(). */ 0, (OMX_U8*) (0x1)); if (err != OMX_ErrorNone) { LOGE("Error on OMX_UseBuffer input %d! - Error=%X!!!", i, err); } else { LOGI("OMX_UseBuffer input %d ok.", i); } buffer->nInputPortIndex = input_port; buffer->nOffset = 0; buffer->nFlags = 0; //free_input_buffers_.push(buffer); } err = OMX_SendCommand(decoder_handle, OMX_CommandStateSet, OMX_StateExecuting, 0); if (err != OMX_ErrorNone) { LOGE("ERROR OMX_SendCommand - OMX_StateExecuting Error=%X!!!", err); } else { LOGI("OMX_SendCommand OMX_StateExecuting ok."); } while (1) { Print_CurrentState(decoder_handle); sleep(1); } LOGI("Starting to decode..."); //for (nt i=0;i<5000) int j = 0; //while (1) for (j = 0; j < 10; j++) { LOGI("Itearation (%d)", j); // Decode OMX_BUFFERHEADERTYPE *buf; int read_len; for (i = 0; i < PICTURE_BUFFERS_NUM_INPUT; i++) { buf = g_BuffersIn[i]; if (!((1 << i) & buffer_in_mask)) continue; //read_len = read(g_pVidFile, buf->pBuffer, input_buffer_size/4); read_len = fread(buf->pBuffer, 1, input_buffer_size, g_pVidFile); LOGI("read from file: %d bytes\n", read_len); buf->nFilledLen = read_len; err = OMX_EmptyThisBuffer(decoder_handle, buf); if (err == OMX_ErrorNotReady) { LOGI("OMX_EmptyThisBuffer input %d! - Error=OMX_ErrorNotReady", i); } else if (err != OMX_ErrorNone) { LOGE("Error on OMX_EmptyThisBuffer input %d! - Error=%X!!!", i, err); } else { LOGI("OMX_EmptyThisBuffer input %d ok.", i); buffer_in_mask &= (1 << i) ^ 0xFFFFFFFF; } } for (i = 0; i < PICTURE_BUFFERS_NUM_OUTPUT; i++) { if (!((1 << i) & buffer_out_mask)) continue; err = OMX_FillThisBuffer(decoder_handle, g_BuffersOut[i]); if (err == OMX_ErrorNotReady) { LOGI("OMX_FillThisBuffer output %d! - Error=OMX_ErrorNotReady", i); } else if (err != OMX_ErrorNone) { LOGE("Error on OMX_FillThisBuffer output %d! - Error=%X!!!", i, err); } else { LOGI("OMX_FillThisBuffer output %d ok.", i); buffer_out_mask &= (1 << i) ^ 0xFFFFFFFF; } } } return instance; }