예제 #1
0
파일: avd_hifb.c 프로젝트: 119/myimpsrc2
IMP_S32 RunAVDHiFBTde(IMP_S32 layer)
{
    IMP_S32 fd;
    IMP_S32 i;
	IMP_S32 j;
    struct fb_fix_screeninfo fix;
    struct fb_var_screeninfo var;
    HIFB_CAPABILITY_S cap;
	HI_U32 u32FixScreenStride = 0;
    unsigned char *pShowScreen;
    unsigned char *pHideScreen;
	HIFB_ALPHA_S stAlpha;
    HIFB_POINT_S stPoIMP_S32 = {0, 0};
    FILE *fp;
    char file[12] = "/dev/fb0";
    char image_name[128];
	HI_CHAR *pDst = NULL;
    TDE2_OPT_S pstOpt;
    HI_U32 u32PhyAddr;
    HI_U32 u32Size;
    HI_U32 u32CurOnShow = 0;
    HI_U32 u32NextOnShow = 1;

    TDE2_RECT_S stSrcRect;
    TDE2_RECT_S stDstRect;
    HI_S32 s32Ret;
    /* 1. open tde device */
    HI_TDE2_Open();

    /* 1. open framebuffer device overlay 0 */
    //fd = open(file, O_RDWR, 0);
    /* 2. framebuffer operation */
    fd = open("/dev/fb0", O_RDWR);
    if(fd < 0)
    {
        printf("open %s failed!\n",file);
        return -1;
    }

    /* 2. set the screen original position */
    if (ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoIMP_S32) < 0)
    {
        printf("set screen original show position failed!\n");
        close(fd);
        return -1;
    }
#if 1
	SetTrasValueBydevPath(fd);
#else
	/* 3.set alpha */
	stAlpha.bAlphaEnable = HI_FALSE;
	stAlpha.bAlphaChannel = HI_FALSE;
	stAlpha.u8Alpha0 = 0xff;
	stAlpha.u8Alpha1 = 0x8f;
    stAlpha.u8GlobalAlpha = 0x80;

	if (ioctl(fd, FBIOPUT_ALPHA_HIFB,  &stAlpha) < 0)
	{
	    printf("Set alpha failed!\n");
        close(fd);
        return -1;
	}

#endif
    /* 4. get the variable screen info */
    if (ioctl(fd, FBIOGET_VSCREENINFO, &var) < 0)
    {
   	    printf("Get variable screen info failed!\n");
        close(fd);
        return -1;
    }

    /* 5. modify the variable screen info
          the screen size: IMAGE_WIDTH*IMAGE_HEIGHT
          the virtual screen size: VIR_SCREEN_WIDTH*VIR_SCREEN_HEIGHT
          (which equals to VIR_SCREEN_WIDTH*(IMAGE_HEIGHT*2))
          the pixel format: ARGB1555
    */

    var.xres_virtual = AVD_VIR_SCREEN_WIDTH;
	var.yres_virtual = AVD_VIR_SCREEN_HEIGHT;
	var.xres = AVD_IMAGE_WIDTH;
    var.yres = AVD_IMAGE_HEIGHT;

    var.transp= g_a16;
    var.red = g_r16;
    var.green = g_g16;
    var.blue = g_b16;
    var.bits_per_pixel = 16;
    var.activate = FB_ACTIVATE_FORCE;
    /* 6. set the variable screeninfo */
    if (ioctl(fd, FBIOPUT_VSCREENINFO, &var) < 0)
    {
   	    printf("Put variable screen info failed!\n");
        close(fd);
        return -1;
    }

    /* 7. get the fix screen info */
    if (ioctl(fd, FBIOGET_FSCREENINFO, &fix) < 0)
    {
   	    printf("Get fix screen info failed!\n");
        close(fd);
        return -1;
    }
	u32FixScreenStride = fix.line_length;	/*fix screen stride*/

    /* 8. map the physical video memory for user use */
    u32Size 	= fix.smem_len;
    u32PhyAddr  = fix.smem_start;
    pShowScreen = mmap(NULL, fix.smem_len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if(MAP_FAILED == pShowScreen)
    {
   	    printf("mmap framebuffer failed!\n");
        close(fd);
        return -1;
    }

    pHideScreen = pShowScreen + u32FixScreenStride*AVD_IMAGE_HEIGHT;
    memset(pShowScreen, 0x0000, u32FixScreenStride*AVD_IMAGE_HEIGHT);

    /* 9. create surface */
    g_AVDstScreen[0].enColorFmt = PIXFMT;
    g_AVDstScreen[0].u32PhyAddr = u32PhyAddr;
    g_AVDstScreen[0].u32Width = AVD_VIR_SCREEN_WIDTH;
    g_AVDstScreen[0].u32Height = AVD_IMAGE_HEIGHT;
    g_AVDstScreen[0].u32Stride = fix.line_length;
    g_AVDstScreen[0].bAlphaMax255 = HI_TRUE;
    g_AVDstScreen[1] = g_AVDstScreen[0];
    g_AVDstScreen[1].u32PhyAddr = g_AVDstScreen[0].u32PhyAddr + g_AVDstScreen[0].u32Stride * g_AVDstScreen[0].u32Height;

    g_stBackGround = g_AVDstScreen[1];
    g_stBackGround.u32PhyAddr = g_AVDstScreen[1].u32PhyAddr + g_AVDstScreen[1].u32Stride * g_AVDstScreen[1].u32Height;
    //g_stBackGround = g_stScreen[0];

    g_AVDstPingBuf = g_AVDstScreen[0];
    g_AVDstPangBuf = g_AVDstScreen[1];

 //   printf("g_AVDstPingBuf:%d\n",g_AVDstPingBuf.u32Stride);
 //   printf("g_AVDstPangBuf:%d\n",g_AVDstPangBuf.u32Stride);
    //g_stBackGround.u32PhyAddr = g_stScreen[1].u32PhyAddr + g_stScreen[1].u32Stride * g_stScreen[1].u32Height;

        // var.yoffset = (i%2)?0:1024;
         //var.yoffset = 0;
        /*set frame buffer start position*/

    i = 0;
    while(1)
    {
        IMP_S32 target_num = 0;
        i++;
        u32CurOnShow = i%2;
        u32NextOnShow = !u32CurOnShow;
        if(u32CurOnShow == 1)
        {
            g_AVDpstBackGround = &g_AVDstPingBuf;
        }
        else
        {
            g_AVDpstBackGround = &g_AVDstPangBuf;
        }
        TDE_HANDLE s32Handle;
        TDE2_OPT_S stOpt = {0};
        HI_FLOAT eXMid, eYMid;
        HI_FLOAT eRadius;
        HI_U32 i;
        HI_FLOAT f;
        HI_U32 u32NextOnShow;


        HI_U32 u32FillData = 0x8010;

        {printf("TDE2_BeginJob!\n");
        /* 1. start job */
        s32Handle = HI_TDE2_BeginJob();
        if(HI_ERR_TDE_INVALID_HANDLE == s32Handle)
        {
        //    TDE_PRINT("start job failed!\n");
            printf("start job failed!\n");
            return ;
        }

        //memset(pShowScreen, 0x0000, u32FixScreenStride*IMAGE_HEIGHT);
        stDstRect.s32Xpos = 0;
        stDstRect.s32Ypos = 0;
        stDstRect.u32Width = AVD_VIR_SCREEN_WIDTH;
        stDstRect.u32Height = AVD_IMAGE_HEIGHT;
        s32Ret = HI_TDE2_QuickFill( s32Handle, g_AVDpstBackGround,&stDstRect, 0);



        printf("TDE2_BeginJob2!\n");
        stDstRect.s32Xpos = 0;
        stDstRect.s32Ypos = 0;
        stDstRect.u32Width = 120;
        stDstRect.u32Height = 120;
        stSrcRect.s32Xpos = 0;
        stSrcRect.s32Ypos = 0;
        stSrcRect.u32Width = g_AVDpstBackGround->u32Width;
        stSrcRect.u32Height = g_AVDpstBackGround->u32Height;


        //TDE_OUTPUT_PEA_RESULT(s32Handle, g_pstBackGround,&g_IP_Result);//,&stDstRect);
        printf("TDE_OUTPUT_AVD_RESULT start!\n");
        TDE_OUTPUT_AVD_RESULT(s32Handle, g_AVDpstBackGround,&g_AVD_Reslut);//,&stDstRect);
        printf("TDE_OUTPUT_AVD_RESULT end!\n");
        memset(&pstOpt,0,sizeof(pstOpt));
        pstOpt.bDeflicker = HI_TRUE;

        /* {
            TDE_CreateSurfaceByFile(PIC_PEA_IMAGE_PATH6, g_AVDpstBackGround, pShowScreen + ((HI_U32)g_AVDpstBackGround->u32PhyAddr - u32PhyAddr));
            stSrcRect.s32Xpos = 0;
            stSrcRect.s32Ypos = 0;
            stSrcRect.u32Width = 79;
            stSrcRect.u32Height = g_AVDpstBackGround->u32Height;
            stDstRect.s32Xpos = 2;
            stDstRect.s32Ypos = 35;
            stDstRect.u32Width = 79;
            stDstRect.u32Height = g_AVDpstBackGround->u32Height;
            s32Ret = HI_TDE2_QuickCopy(s32Handle, g_AVDpstBackGround, &stSrcRect, g_AVDpstBackGround, &stDstRect);
        }*/
        /*TDE_CreateSurfaceByFile(AVD_IMAGE_PATH, g_AVDpstBackGround, pShowScreen + ((HI_U32)g_AVDpstBackGround->u32PhyAddr - u32PhyAddr));
        stDstRect.s32Xpos = 0;
        stDstRect.s32Ypos = 0;
        stDstRect.u32Width = 720;
        stDstRect.u32Height = 576;
        s32Ret = HI_TDE2_QuickCopy(s32Handle, g_AVDpstBackGround, &stDstRect, g_AVDpstBackGround, &stDstRect);
        */
        /* 4. bitblt image to screen */
        //s32Ret = HI_TDE2_Bitblit(s32Handle, NULL, &stDstRect, g_AVDpstBackGround, &stSrcRect, g_AVDpstBackGround , &stDstRect, &pstOpt);
        if(s32Ret < 0)
        {
            printf("Line:%d,HI_TDE2_QuickFill failed,ret=0x%x!\n", __LINE__, s32Ret);
            return ;
        }
         printf("TDE2_BeginJob3!\n");

        /* 5. submit job */
        s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10);
        if(s32Ret < 0)
        {
          //  TDE_PRINT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret);
            HI_TDE2_CancelJob(s32Handle);
            return ;
        }
        printf("TDE2_EndJob5!\n");
        }
        var.yoffset = (u32CurOnShow==1) ? 0 : AVD_IMAGE_HEIGHT;
        if (ioctl(fd, FBIOPAN_DISPLAY, &var) < 0)
        {
             //TDE_PRINT("process frame buffer device error\n");
             printf("process frame buffer device error\n");
             //goto FB_PROCESS_ERROR1;
        }
        usleep(40000);
    }


    printf("Enter to quit!\n");
    getchar();

    /* 10.unmap the physical memory */
    munmap(pShowScreen, fix.smem_len);

    /* 11. close the framebuffer device */
    close(fd);

    HI_TDE2_Close();
    return 0;
}
예제 #2
0
static HI_VOID circumrotate (HI_U32 u32CurOnShow)
{
    TDE_HANDLE s32Handle;
	TDE2_OPT_S stOpt = {0};
	TDE2_RECT_S stSrcRect;
	TDE2_RECT_S stDstRect;
	HI_U32 u32NextOnShow;
	u32NextOnShow = !u32CurOnShow;
	HI_U32 s32Ret;
	HI_U32 u32FillData = 0x8000;
	TDE2_RECT_S pstScreenRect;
	/* 1. start job */
	s32Handle = HI_TDE2_BeginJob();
	if(HI_ERR_TDE_INVALID_HANDLE == s32Handle)
	{
		TDE_PRINT("start job failed!\n");
		return ;
	}   
	pstScreenRect.s32Xpos = 0;
	pstScreenRect.s32Ypos = 0;
	pstScreenRect.u32Width = SCREEN_WIDTH;
	pstScreenRect.u32Height = SCREEN_HEIGHT;
	
	s32Ret = HI_TDE2_QuickFill(s32Handle, &g_stScreen[u32NextOnShow], &pstScreenRect, u32FillData);
	if(s32Ret < 0)
	{
		TDE_PRINT("Line:%d,HI_TDE2_QuickFill failed,ret=0x%x!\n", __LINE__, s32Ret);
		HI_TDE2_CancelJob(s32Handle);
		return ;
	}	
	stOpt.enColorKeyMode = TDE2_COLORKEY_MODE_FOREGROUND;
    stOpt.unColorKeyValue.struCkARGB.stBlue.bCompIgnore = HI_FALSE;
    stOpt.unColorKeyValue.struCkARGB.stBlue.bCompOut = HI_FALSE;
    stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMin = 0xff;
    stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMax = 0xff;
    stOpt.unColorKeyValue.struCkARGB.stBlue.u8CompMask = 0xff;

    stOpt.unColorKeyValue.struCkARGB.stGreen.bCompIgnore = HI_TRUE;
    stOpt.unColorKeyValue.struCkARGB.stRed.bCompIgnore = HI_TRUE;    
    stOpt.unColorKeyValue.struCkARGB.stAlpha.bCompIgnore = HI_TRUE;
	
    stSrcRect.s32Xpos = 0;
    stSrcRect.s32Ypos = 0;
    stSrcRect.u32Width = g_stImgSur.u32Width;
    stSrcRect.u32Height = g_stImgSur.u32Height;

    stDstRect.s32Xpos = 100;
    stDstRect.s32Ypos = 100;
    stDstRect.u32Width = g_stImgSur.u32Width;
    stDstRect.u32Height = g_stImgSur.u32Height;

    /* 4. bitblt image to screen */
    s32Ret = HI_TDE2_Bitblit(s32Handle, &g_stScreen[u32NextOnShow], &stDstRect, 
        &g_stImgSur, &stSrcRect, &g_stScreen[u32NextOnShow], &stDstRect, &stOpt);
	if(s32Ret < 0)
	{
		TDE_PRINT("Line:%d,HI_TDE2_Bitblit failed,ret=0x%x!\n", __LINE__, s32Ret);
		HI_TDE2_CancelJob(s32Handle);
		return ;
	}
    /* 5. submit job */
    s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10);
	if(s32Ret < 0)
	{
		TDE_PRINT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret);
		HI_TDE2_CancelJob(s32Handle);
		return ;
	}


    return;
}