Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Decoder_OMX.h"
- #include "OMX_Core.h"
- #include "OMX_Types.h"
- #include "OMX_Other.h"
- #include "OMX_Component.h"
- #include <stdlib.h>
- #include "logjam.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <dlfcn.h>
- #include <unistd.h>
- #include <time.h>
- #include <unistd.h>
- #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("<<OnOutputPortEnabled>>");
- 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("<<OnInputPortEnabled>>");
- 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<OMX_STATETYPE>(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;i<pBuffer->nFilledLen;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 <typename T>
- 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;i<PICTURE_BUFFERS_NUM_OUTPUT;++i)
- {
- err = OMX_AllocateBuffer(decoder_handle, &g_BuffersOut[i], output_port, NULL, port_format.nBufferSize);
- if (err!=OMX_ErrorNone)
- {
- LOGE("Error on OMX_AllocateBuffer output %d! - Error=%X!!!",i,err);
- } else
- {
- //LOGI("OMX_AllocateBuffer output %d ok.",i);
- //Print_OMX_BUFFERHEADERTYPE(g_BuffersOut[i]);
- }
- buffer_out_mask |= 1<<i;
- //g_BuffersOut[i]->pPlatformPrivate = 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;i<PICTURE_BUFFERS_NUM_INPUT;++i)
- {
- err = OMX_AllocateBuffer(decoder_handle, &g_BuffersIn[i], input_port, NULL, port_format.nBufferSize);
- if (err!=OMX_ErrorNone)
- {
- LOGE("Error on OMX_AllocateBuffer input %d! - Error=%X!!!",i,err);
- } else
- {
- //LOGI("OMX_AllocateBuffer input %d ok.",i);
- //Print_OMX_BUFFERHEADERTYPE(g_BuffersIn[i]);
- }
- buffer_in_mask |= 1<<i;
- //g_BuffersIn[i]->pPlatformPrivate = 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;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement