OMX_ERRORTYPE IpulibRender::StartDeviceInPause() { OMX_ERRORTYPE ret = OMX_ErrorNone; if(bInitDev != OMX_FALSE) return OMX_ErrorNone; if(pShowFrame == NULL) return OMX_ErrorBadParameter; OMX_PTR pFrame = NULL; GetHwBuffer(pShowFrame, &pFrame); ret = Init(); if(ret != OMX_ErrorNone) return ret; bInitDev = OMX_TRUE; ret = RenderFrame(pFrame); if(ret != OMX_ErrorNone) return ret; return OMX_ErrorNone; }
OMX_ERRORTYPE IpulibRender::StartDeviceInPause() { OMX_ERRORTYPE ret = OMX_ErrorNone; if(bInitDev != OMX_FALSE) return OMX_ErrorNone; if(pShowFrame == NULL) return OMX_ErrorBadParameter; OMX_PTR pFrame = NULL; GetHwBuffer(pShowFrame, &pFrame); ret = IpulibInit(pFrame); if(ret != OMX_ErrorNone) return ret; bInitDev = OMX_TRUE; if(pFrame == NULL) fsl_osal_memcpy(ipu_handle.inbuf_start[0], pShowFrame, ipu_handle.ifr_size); ret = IpulibRenderFrame(pFrame); if(ret != OMX_ErrorNone) return ret; return OMX_ErrorNone; }
OMX_ERRORTYPE VideoSource::ProcessPreviewPort() { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_BUFFERHEADERTYPE *pPreviewBufferHdr; if (ports[PREVIEW_PORT]->IsEnabled() != OMX_TRUE) return ret; if (ports[PREVIEW_PORT]->BufferNum() > 0) { ports[PREVIEW_PORT]->GetBuffer(&pPreviewBufferHdr); if(pPreviewBufferHdr != NULL) { OMX_PTR pFrame = NULL; GetHwBuffer(pPreviewBufferHdr->pBuffer, &pFrame); if(pFrame == NULL) fsl_osal_memcpy(pPreviewBufferHdr->pBuffer, pOutBufferHdr->pBuffer, pOutBufferHdr->nFilledLen); pPreviewBufferHdr->nFilledLen = pOutBufferHdr->nFilledLen; pPreviewBufferHdr->nFlags = pOutBufferHdr->nFlags; ports[PREVIEW_PORT]->SendBuffer(pPreviewBufferHdr); } } return ret; }
OMX_ERRORTYPE IpulibRender::WriteDevice( OMX_BUFFERHEADERTYPE *pBufferHdr) { OMX_ERRORTYPE ret = OMX_ErrorNone; fsl_osal_mutex_lock(lock); if(sCapture.eType == CAP_THUMBNAL) { fsl_osal_memcpy(sCapture.pBuffer, pBufferHdr->pBuffer, pBufferHdr->nFilledLen); sCapture.nFilledLen = pBufferHdr->nFilledLen; bCaptureFrameDone = OMX_TRUE; ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return OMX_ErrorNone; } if(pBufferHdr->nFilledLen == 0) { ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return OMX_ErrorNone; } pShowFrame = pBufferHdr->pBuffer; nFrameLen = pBufferHdr->nFilledLen; if(bSuspend == OMX_TRUE) { ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return OMX_ErrorNone; } OMX_PTR pFrame = NULL; GetHwBuffer(pBufferHdr->pBuffer, &pFrame); if(bInitDev != OMX_TRUE) { ret = Init(); if(ret != OMX_ErrorNone) { ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return ret; } bInitDev = OMX_TRUE; } ret = RenderFrame(pFrame); if(ret != OMX_ErrorNone) { ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return ret; } ports[0]->SendBuffer(pBufferHdr); fsl_osal_mutex_unlock(lock); return OMX_ErrorNone; }
OMX_ERRORTYPE VideoProcessorComponent::ProcessDataBuffer() { OMX_ERRORTYPE eRetVal = OMX_ErrorNone; OMX_BUFFERHEADERTYPE *pBufHdr; if(bReset == OMX_TRUE) { VideoProcessor_DeInit(); bStarted = OMX_FALSE; bReset = OMX_FALSE; } if(bStarted == OMX_FALSE) { /* ipu lib task init after get 2 frames */ OMX_U32 nInBufCntMin =2, nOutBufCntMin = 1; if(bUseEGLImage == OMX_TRUE) { nOutBufCntMin =2; } if(ports[VP_IN_PORT]->BufferNum() >= nInBufCntMin && ports[VP_OUT_PORT]->BufferNum() >= nOutBufCntMin) { eRetVal = VideoProcessor_init(); if(eRetVal != OMX_ErrorNone) { SendEvent(OMX_EventError, eRetVal, 0, NULL); return eRetVal; } eRetVal = VideoProcessor_ProcessData(NULL); bStarted = OMX_TRUE; } else eRetVal = OMX_ErrorNoMore; } else { if(ports[VP_IN_PORT]->BufferNum() > 0 && ports[VP_OUT_PORT]->BufferNum() > 0) { ports[VP_IN_PORT]->GetBuffer( &pBufHdr); pInBufHdr[1] = pBufHdr; nInFrames++; if(bUseEGLImage == OMX_TRUE) { ports[VP_OUT_PORT]->GetBuffer( &pBufHdr); pOutBufHdr[1] = pBufHdr; } /* check if need to flush previous frame */ if(pInBufHdr[1]->nFlags & OMX_BUFFERFLAG_STARTTIME) bFlush = OMX_TRUE; OMX_PTR pPhyAddr; GetHwBuffer(pInBufHdr[1]->pBuffer, &pPhyAddr); eRetVal = VideoProcessor_ProcessData(pPhyAddr); } else eRetVal = OMX_ErrorNoMore; } return eRetVal; }
OMX_ERRORTYPE VideoProcessorComponent::VideoProcessor_init( ) { OMX_ERRORTYPE eRetVal = OMX_ErrorNone; OMX_PARAM_PORTDEFINITIONTYPE sPortDef; OMX_BUFFERHEADERTYPE *pBufHdr; OMX_U32 nEGLImageWidth, nEGLImageHeight; int mode, ret; VP_DEBUG(" Begin Init\n"); /* Get In/Out port format */ omxSetHeader(&sPortDef,sizeof(OMX_PARAM_PORTDEFINITIONTYPE)); sPortDef.nPortIndex = VP_IN_PORT; ports[VP_IN_PORT]->GetPortDefinition( &sPortDef); nInWidth = sPortDef.format.video.nFrameWidth; nInHeight = sPortDef.format.video.nFrameHeight; eInColorFmt = sPortDef.format.video.eColorFormat; sPortDef.nPortIndex = VP_OUT_PORT; ports[VP_OUT_PORT]->GetPortDefinition(&sPortDef); nOutWidth = sPortDef.format.video.nFrameWidth; nOutHeight = sPortDef.format.video.nFrameHeight; eOutColorFmt = sPortDef.format.video.eColorFormat; if(sInRect.nWidth==0 && sInRect.nHeight==0) { sInRect.nWidth = nInWidth; sInRect.nHeight = nInHeight; } if( nOutWidth == 0 ||nOutHeight ==0 ) { nOutWidth = 1024; sPortDef.format.video.nFrameWidth = nOutWidth; nOutHeight = 768; sPortDef.format.video.nFrameHeight = nOutHeight; eOutColorFmt = OMX_COLOR_Format16bitRGB565; sPortDef.format.video.eColorFormat = eOutColorFmt; ports[VP_OUT_PORT]->SetPortDefinition(&sPortDef); } /* set ipu task in parameter */ sInParam.width = nInWidth; sInParam.height = nInHeight; sInParam.fmt = omx2ipu_pxlfmt(eInColorFmt); sInParam.input_crop_win.pos.x = (sInRect.nLeft + 7)/8*8; sInParam.input_crop_win.pos.y = sInRect.nTop; sInParam.input_crop_win.win_w = (sInRect.nWidth - (sInParam.input_crop_win.pos.x - sInRect.nLeft))/8*8; sInParam.input_crop_win.win_h = sInRect.nHeight; OMX_PTR pPhyAddr; ports[VP_IN_PORT]->GetBuffer( &pBufHdr); GetHwBuffer(pBufHdr->pBuffer, &pPhyAddr); sInParam.user_def_paddr[0] = (int)pPhyAddr; pInBufHdr[0] = pBufHdr; VP_DEBUG("VP Inbuffer 0 %p, offset %p\n",pBufHdr,pPhyAddr); ports[VP_IN_PORT]->GetBuffer( &pBufHdr); GetHwBuffer(pBufHdr->pBuffer, &pPhyAddr); sInParam.user_def_paddr[1] = (int)pPhyAddr; pInBufHdr[1] = pBufHdr; VP_DEBUG("VP Inbuffer 1 %p, offset %p\n",pBufHdr,pPhyAddr); VP_DEBUG("VP sInParam width %d, height %d,crop x %d, y %d, w %d, h %d, color %d\n", sInParam.width,sInParam.height , sInParam.input_crop_win.pos.x,sInParam.input_crop_win.pos.y, sInParam.input_crop_win.win_w,sInParam.input_crop_win.win_h, sInParam.fmt ); if(bUseEGLImage == OMX_TRUE) { ports[VP_OUT_PORT]->GetBuffer( &pBufHdr); EGLImageKHRInternal * eglImage = (EGLImageKHRInternal *)pBufHdr->pPlatformPrivate; sOutParam.user_def_paddr[0] = (int)eglImage->phyAddr; pOutBufHdr[0] = pBufHdr; nEGLImageWidth = eglImage->width; nEGLImageHeight = eglImage->height; OMX_S32 nImageSize = nEGLImageWidth * nEGLImageHeight * eglImage->bitsPerPixel / 8; fsl_osal_memset(eglImage->virtAddr, 0, nImageSize); ports[VP_OUT_PORT]->GetBuffer( &pBufHdr); eglImage = (EGLImageKHRInternal *)pBufHdr->pPlatformPrivate; sOutParam.user_def_paddr[1] = (int)eglImage->phyAddr; pOutBufHdr[1] = pBufHdr; fsl_osal_memset(eglImage->virtAddr,0,nImageSize); } /* set ipu task out parameter */ sOutParam.width = nOutWidth; sOutParam.height = nOutHeight; sOutParam.fmt = omx2ipu_pxlfmt(eOutColorFmt); if(sOutRect.nWidth==0 && sOutRect.nHeight==0) { sOutRect.nWidth = nOutWidth; sOutRect.nHeight = nOutHeight; } /* calc out pos according to in fmt*/ if(sInParam.input_crop_win.win_w * sOutRect.nHeight >= sInParam.input_crop_win.win_h * sOutRect.nWidth) { /* keep target width*/ OMX_U32 height = sOutRect.nWidth * sInParam.input_crop_win.win_h / sInParam.input_crop_win.win_w; sOutParam.output_win.win_w = sOutRect.nWidth; sOutParam.output_win.win_h = height; sOutParam.output_win.pos.x = 0; sOutParam.output_win.pos.y = (sOutRect.nHeight - height)/2; } else { /* keep target height*/ OMX_U32 width = sOutRect.nHeight * sInParam.input_crop_win.win_w / sInParam.input_crop_win.win_h; sOutParam.output_win.win_w = width; sOutParam.output_win.win_h = sOutRect.nHeight; sOutParam.output_win.pos.x = (( sOutRect.nWidth - width)/2 + 7)/8*8; sOutParam.output_win.pos.y = 0; } if(bUseEGLImage == OMX_TRUE) { sOutParam.width = nEGLImageWidth; sOutParam.height = nEGLImageHeight; } VP_DEBUG("VP sOutParam width %d, height %d,crop x %d, y %d, w %d, h %d,color %d\n", sOutParam.width,sOutParam.height , sOutParam.output_win.pos.x,sOutParam.output_win.pos.y, sOutParam.output_win.win_w,sOutParam.output_win.win_h, sOutParam.fmt ); /* ipu lib task init */ mode = OP_STREAM_MODE; ret = mxc_ipu_lib_task_init(&sInParam, NULL, &sOutParam, mode, &ipu_handle); if(ret < 0) { VP_ERROR("mxc_ipu_lib_task_init failed!\n"); return OMX_ErrorHardware; } nInFrames = 0; nOutFrames = 0; VP_DEBUG(" Exit Init\n"); return eRetVal; }