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;
}
Exemplo n.º 3
0
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;
}