multimedia/device/mpp/sample/hifb/sample_hifb.c

1444 lines
40 KiB
C

/******************************************************************************
Copyright (C), 2011-2021, Hisilicon Tech. Co., Ltd.
******************************************************************************
File Name : sample_hifb.c
Version : Initial Draft
Author : Hisilicon multimedia software group
Created : 2013/7/1
Description :
History :
1.Date : 2013/7/1
Author :
Modification: Created file
******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/poll.h>
#include <sys/time.h>
#include <fcntl.h>
#include <errno.h>
#include <pthread.h>
#include <math.h>
#include <unistd.h>
#include <signal.h>
#include <sys/mman.h>
#include "sample_comm.h"
#include <linux/fb.h>
#include "hifb.h"
#include "loadbmp.h"
#include "hi_tde_api.h"
#include "hi_tde_type.h"
#include "hi_tde_errcode.h"
static VO_DEV VoDev = SAMPLE_VO_DEV_DSD0;
static HI_CHAR gs_cExitFlag = 0;
VO_INTF_TYPE_E g_enVoIntfType = VO_INTF_BT656;
static struct fb_bitfield s_r16 = {10, 5, 0};
static struct fb_bitfield s_g16 = {5, 5, 0};
static struct fb_bitfield s_b16 = {0, 5, 0};
static struct fb_bitfield s_a16 = {15, 1, 0};
#define WIDTH_720 720
#define HEIGHT_576 576
#define SAMPLE_IMAGE_WIDTH 300
#define SAMPLE_IMAGE_HEIGHT 150
#define SAMPLE_IMAGE_NUM 20
#define HIFB_RED_1555 0xFC00
#define GRAPHICS_LAYER_G0 0
#define SAMPLE_IMAGE1_PATH "./res/%d.bmp"
typedef struct hiPTHREAD_HIFB_SAMPLE
{
HI_S32 fd;
HI_S32 layer;
HI_S32 ctrlkey;
} PTHREAD_HIFB_SAMPLE_INFO;
HI_S32 SAMPLE_HIFB_LoadBmp(const char* filename, HI_U8* pAddr)
{
OSD_SURFACE_S Surface;
OSD_BITMAPFILEHEADER bmpFileHeader;
OSD_BITMAPINFO bmpInfo;
if (GetBmpInfo(filename, &bmpFileHeader, &bmpInfo) < 0)
{
SAMPLE_PRT("GetBmpInfo err!\n");
return HI_FAILURE;
}
Surface.enColorFmt = OSD_COLOR_FMT_RGB1555;
CreateSurfaceByBitMap(filename, &Surface, pAddr);
return HI_SUCCESS;
}
HI_VOID* SAMPLE_HIFB_PANDISPLAY(void* pData)
{
HI_S32 i, x, y, s32Ret;
TDE_HANDLE s32Handle;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
HI_U32 u32FixScreenStride = 0;
HI_U8* pShowScreen;
HI_U8* pHideScreen;
HI_U32 u32HideScreenPhy = 0;
HI_U16* pShowLine;
HI_U16* ptemp = NULL;
HIFB_ALPHA_S stAlpha;
HIFB_POINT_S stPoint = {0, 0};
HI_CHAR file[12] = "/dev/fb0";
HI_CHAR image_name[128];
HI_U8* pDst = NULL;
HI_BOOL bShow;
PTHREAD_HIFB_SAMPLE_INFO* pstInfo;
HIFB_COLORKEY_S stColorKey;
TDE2_RECT_S stSrcRect, stDstRect;
TDE2_SURFACE_S stSrc, stDst;
HI_U32 Phyaddr;
HI_VOID* Viraddr;
HI_U32 u32Width;
HI_U32 u32Height;
if (VO_INTF_BT656 == g_enVoIntfType)
{
u32Width = WIDTH_720;
u32Height = HEIGHT_576;
}
else
{
u32Width = WIDTH_LCD;
u32Height = HEIGHT_LCD;
}
if (HI_NULL == pData)
{
return HI_NULL;
}
pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData;
switch (pstInfo->layer)
{
case GRAPHICS_LAYER_G0 :
strcpy(file, "/dev/fb0");
break;
default:
strcpy(file, "/dev/fb0");
break;
}
/* 1. open framebuffer device overlay 0 */
pstInfo->fd = open(file, O_RDWR, 0);
if (pstInfo->fd < 0)
{
SAMPLE_PRT("open %s failed!\n", file);
return HI_NULL;
}
bShow = HI_FALSE;
if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
{
SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
return HI_NULL;
}
/* 2. set the screen original position */
switch (pstInfo->layer)
{
case GRAPHICS_LAYER_G0:
{
stPoint.s32XPos = 0;
stPoint.s32YPos = 0;
}
break;
default:
break;
}
if (ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)
{
SAMPLE_PRT("set screen original show position failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
/* 3. get the variable screen info */
if (ioctl(pstInfo->fd, FBIOGET_VSCREENINFO, &var) < 0)
{
SAMPLE_PRT("Get variable screen info failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
/* 4. 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
*/
usleep(4 * 1000 * 1000);
switch (pstInfo->layer)
{
case GRAPHICS_LAYER_G0:
{
var.xres_virtual = u32Width;
var.yres_virtual = u32Height * 2;
var.xres = u32Width;
var.yres = u32Height;
}
break;
default:
break;
}
var.transp = s_a16;
var.red = s_r16;
var.green = s_g16;
var.blue = s_b16;
var.bits_per_pixel = 16;
var.activate = FB_ACTIVATE_NOW;
/* 5. set the variable screeninfo */
if (ioctl(pstInfo->fd, FBIOPUT_VSCREENINFO, &var) < 0)
{
SAMPLE_PRT("Put variable screen info failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
/* 6. get the fix screen info */
if (ioctl(pstInfo->fd, FBIOGET_FSCREENINFO, &fix) < 0)
{
SAMPLE_PRT("Get fix screen info failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
u32FixScreenStride = fix.line_length; /*fix screen stride*/
/* 7. map the physical video memory for user use */
pShowScreen = mmap(HI_NULL, fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, pstInfo->fd, 0);
if (MAP_FAILED == pShowScreen)
{
SAMPLE_PRT("mmap framebuffer failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
memset(pShowScreen, 0x00, fix.smem_len);
/* time to play*/
bShow = HI_TRUE;
if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
{
SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
munmap(pShowScreen, fix.smem_len);
close(pstInfo->fd);
return HI_NULL;
}
if (GRAPHICS_LAYER_G0 == pstInfo->layer)
{
for (i = 0; i < 1; i++)
{
if (i % 2)
{
var.yoffset = var.yres;
}
else
{
var.yoffset = 0;
}
ptemp = (HI_U16*)(pShowScreen + var.yres * u32FixScreenStride * (i % 2));
for (y = 10; y < 200; y++)
{
for (x = 10; x < 200; x++)
{
*(ptemp + y * var.xres + x) = HIFB_RED_1555;
}
}
SAMPLE_PRT("expected: the red box will appear!\n");
sleep(2);
stAlpha.bAlphaEnable = HI_TRUE;
stAlpha.u8Alpha0 = 0x0;
stAlpha.u8Alpha1 = 0x0;
if (ioctl(pstInfo->fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0)
{
SAMPLE_PRT("Set alpha failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
SAMPLE_PRT("expected: after set alpha = 0, the red box will disappear!\n");
sleep(2);
stAlpha.u8Alpha0 = 0;
stAlpha.u8Alpha1 = 0xFF;
if (ioctl(pstInfo->fd, FBIOPUT_ALPHA_HIFB, &stAlpha) < 0)
{
SAMPLE_PRT("Set alpha failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
SAMPLE_PRT("expected:after set set alpha = 0xFF, the red box will appear again!\n");
sleep(2);
SAMPLE_PRT("expected: the red box will erased by colorkey!\n");
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = HIFB_RED_1555;
s32Ret = ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey);
if (s32Ret < 0)
{
SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
sleep(2);
SAMPLE_PRT("expected: the red box will appear again!\n");
stColorKey.bKeyEnable = HI_FALSE;
s32Ret = ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey);
if (s32Ret < 0)
{
SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
sleep(2);
}
}
/* show bitmap */
switch (pstInfo->ctrlkey)
{
case 2:
{
/*change bmp*/
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr, ((void**)&Viraddr),
NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2))
{
SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n");
close(pstInfo->fd);
return HI_NULL;
}
s32Ret = HI_TDE2_Open();
if (s32Ret < 0)
{
SAMPLE_PRT("HI_TDE2_Open failed :%d!\n", s32Ret);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
SAMPLE_PRT("expected:two red line!\n");
for (i = 0; i < SAMPLE_IMAGE_NUM; i++)
{
if ('q' == gs_cExitFlag)
{
printf("process exit...\n");
break;
}
/* step1: draw two red line*/
if (i % 2)
{
var.yoffset = var.yres;
}
else
{
var.yoffset = 0;
}
pHideScreen = pShowScreen + (u32FixScreenStride * var.yres) * (i % 2);
memset(pHideScreen, 0x00, u32FixScreenStride * var.yres);
u32HideScreenPhy = fix.smem_start + (i % 2) * u32FixScreenStride * var.yres;
pShowLine = (HI_U16*)pHideScreen;
for (y = (u32Height / 2 - 2); y < (u32Height / 2 + 2); y++)
{
for (x = 0; x < u32Width; x++)
{
*(pShowLine + y * var.xres + x) = HIFB_RED_1555;
}
}
for (y = 0; y < u32Height; y++)
{
for (x = (u32Width / 2 - 2); x < (u32Width / 2 + 2); x++)
{
*(pShowLine + y * var.xres + x) = HIFB_RED_1555;
}
}
if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0)
{
SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
/* step2: draw gui picture*/
sprintf(image_name, SAMPLE_IMAGE1_PATH, i % 2);
pDst = (HI_U8*)Viraddr;
SAMPLE_HIFB_LoadBmp(image_name, pDst);
/* 0. open tde */
stSrcRect.s32Xpos = 0;
stSrcRect.s32Ypos = 0;
stSrcRect.u32Height = SAMPLE_IMAGE_HEIGHT;
stSrcRect.u32Width = SAMPLE_IMAGE_WIDTH;
stDstRect.s32Xpos = 0;
stDstRect.s32Ypos = 0;
stDstRect.u32Height = stSrcRect.u32Height;
stDstRect.u32Width = stSrcRect.u32Width;
stDst.enColorFmt = TDE2_COLOR_FMT_ARGB1555;
stDst.u32Width = u32Width;
stDst.u32Height = u32Height;
stDst.u32Stride = u32FixScreenStride;
stDst.u32PhyAddr = u32HideScreenPhy;
stSrc.enColorFmt = TDE2_COLOR_FMT_ARGB1555;
stSrc.u32Width = SAMPLE_IMAGE_WIDTH;
stSrc.u32Height = SAMPLE_IMAGE_HEIGHT;
stSrc.u32Stride = 2 * SAMPLE_IMAGE_WIDTH;
stSrc.u32PhyAddr = Phyaddr;
stSrc.bAlphaExt1555 = HI_TRUE;
stSrc.bAlphaMax255 = HI_TRUE;
stSrc.u8Alpha0 = 0XFF;
stSrc.u8Alpha1 = 0XFF;
/* 1. start job */
s32Handle = HI_TDE2_BeginJob();
if (HI_ERR_TDE_INVALID_HANDLE == s32Handle)
{
SAMPLE_PRT("start job failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
s32Ret = HI_TDE2_QuickCopy(s32Handle, &stSrc, &stSrcRect, &stDst, &stDstRect);
if (s32Ret < 0)
{
SAMPLE_PRT("HI_TDE2_QuickCopy:%d failed,ret=0x%x!\n", __LINE__, s32Ret);
HI_TDE2_CancelJob(s32Handle);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
/* 3. submit job */
s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10);
if (s32Ret < 0)
{
SAMPLE_PRT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret);
HI_TDE2_CancelJob(s32Handle);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0)
{
SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
close(pstInfo->fd);
return HI_NULL;
}
sleep(1);
}
HI_TDE2_Close();
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
}
break;
default:
{
}
}
/* unmap the physical memory */
munmap(pShowScreen, fix.smem_len);
bShow = HI_FALSE;
if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
{
SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
close(pstInfo->fd);
return HI_NULL;
}
HI_VOID* SAMPLE_HIFB_REFRESH(void* pData)
{
HI_S32 s32Ret = HI_SUCCESS;
HIFB_LAYER_INFO_S stLayerInfo = {0};
HIFB_BUFFER_S stCanvasBuf;
HI_U16* pBuf;
HI_U8* pDst = NULL;
HI_U32 x;
HI_U32 y;
HI_U32 i;
HI_CHAR image_name[128];
HI_BOOL bShow;
HIFB_POINT_S stPoint = {0};
struct fb_var_screeninfo stVarInfo;
HI_CHAR file[12] = "/dev/fb0";
HI_U32 maxW;
HI_U32 maxH;
PTHREAD_HIFB_SAMPLE_INFO* pstInfo;
HIFB_COLORKEY_S stColorKey;
TDE2_RECT_S stSrcRect, stDstRect;
TDE2_SURFACE_S stSrc, stDst;
HI_U32 Phyaddr;
HI_VOID* Viraddr;
TDE_HANDLE s32Handle;
if (HI_NULL == pData)
{
return HI_NULL;
}
pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData;
switch (pstInfo->layer)
{
case GRAPHICS_LAYER_G0:
strcpy(file, "/dev/fb0");
break;
default:
strcpy(file, "/dev/fb0");
break;
}
/* 1. open framebuffer device overlay 0 */
pstInfo->fd = open(file, O_RDWR, 0);
if (pstInfo->fd < 0)
{
SAMPLE_PRT("open %s failed!\n", file);
return HI_NULL;
}
/*all layer surport colorkey*/
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = 0x0;
if (ioctl(pstInfo->fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
{
SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB!\n");
close(pstInfo->fd);
return HI_NULL;
}
s32Ret = ioctl(pstInfo->fd, FBIOGET_VSCREENINFO, &stVarInfo);
if (s32Ret < 0)
{
SAMPLE_PRT("GET_VSCREENINFO failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
if (ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)
{
SAMPLE_PRT("set screen original show position failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
if (VO_INTF_BT656== g_enVoIntfType)
{
maxW = WIDTH_720;
maxH = HEIGHT_576;
}
else
{
maxW = WIDTH_LCD;
maxH = HEIGHT_LCD;
}
stVarInfo.transp = s_a16;
stVarInfo.red = s_r16;
stVarInfo.green = s_g16;
stVarInfo.blue = s_b16;
stVarInfo.bits_per_pixel = 16;
stVarInfo.activate = FB_ACTIVATE_NOW;
stVarInfo.xres = stVarInfo.xres_virtual = maxW;
stVarInfo.yres = stVarInfo.yres_virtual = maxH;
s32Ret = ioctl(pstInfo->fd, FBIOPUT_VSCREENINFO, &stVarInfo);
if (s32Ret < 0)
{
SAMPLE_PRT("PUT_VSCREENINFO failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
switch (pstInfo->ctrlkey)
{
case 0 :
{
stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;
break;
}
case 1 :
{
stLayerInfo.BufMode = HIFB_LAYER_BUF_DOUBLE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;
break;
}
default:
{
stLayerInfo.BufMode = HIFB_LAYER_BUF_NONE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;
}
}
s32Ret = ioctl(pstInfo->fd, FBIOPUT_LAYER_INFO, &stLayerInfo);
if (s32Ret < 0)
{
SAMPLE_PRT("PUT_LAYER_INFO failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
bShow = HI_TRUE;
if (ioctl(pstInfo->fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
{
SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
close(pstInfo->fd);
return HI_NULL;
}
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pBuf),
NULL, NULL, maxW * maxH * 2))
{
SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n");
close(pstInfo->fd);
return HI_NULL;
}
stCanvasBuf.stCanvas.u32Height = maxH;
stCanvasBuf.stCanvas.u32Width = maxW;
stCanvasBuf.stCanvas.u32Pitch = maxW * 2;
stCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;
memset(pBuf, 0x00, stCanvasBuf.stCanvas.u32Pitch * stCanvasBuf.stCanvas.u32Height);
/*change bmp*/
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr, ((void**)&Viraddr),
NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2))
{
SAMPLE_PRT("allocate memory failed\n");
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
s32Ret = HI_TDE2_Open();
if (s32Ret < 0)
{
SAMPLE_PRT("HI_TDE2_Open failed :%d!\n", s32Ret);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
SAMPLE_PRT("expected:two red line!\n");
/*time to play*/
for (i = 0; i < SAMPLE_IMAGE_NUM; i++)
{
if ('q' == gs_cExitFlag)
{
printf("process exit...\n");
break;
}
for (y = (maxH / 2 - 2); y < (maxH / 2 + 2); y++)
{
for (x = 0; x < maxW; x++)
{
*(pBuf + y * maxW + x) = HIFB_RED_1555;
}
}
for (y = 0; y < maxH; y++)
{
for (x = (maxW / 2 - 2); x < (maxW / 2 + 2); x++)
{
*(pBuf + y * maxW + x) = HIFB_RED_1555;
}
}
stCanvasBuf.UpdateRect.x = 0;
stCanvasBuf.UpdateRect.y = 0;
stCanvasBuf.UpdateRect.w = maxW;
stCanvasBuf.UpdateRect.h = maxH;
s32Ret = ioctl(pstInfo->fd, FBIO_REFRESH, &stCanvasBuf);
if (s32Ret < 0)
{
SAMPLE_PRT("REFRESH failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
sleep(2);
sprintf(image_name, SAMPLE_IMAGE1_PATH, i % 2);
pDst = (HI_U8*)Viraddr;
SAMPLE_HIFB_LoadBmp(image_name, pDst);
/* 0. open tde */
stSrcRect.s32Xpos = 0;
stSrcRect.s32Ypos = 0;
stSrcRect.u32Height = SAMPLE_IMAGE_HEIGHT;
stSrcRect.u32Width = SAMPLE_IMAGE_WIDTH;
stDstRect.s32Xpos = 0;
stDstRect.s32Ypos = 0;
stDstRect.u32Height = stSrcRect.u32Width;
stDstRect.u32Width = stSrcRect.u32Width;
stDst.enColorFmt = TDE2_COLOR_FMT_ARGB1555;
stDst.u32Width = maxW;
stDst.u32Height = maxH;
stDst.u32Stride = maxW * 2;
stDst.u32PhyAddr = stCanvasBuf.stCanvas.u32PhyAddr;
stSrc.enColorFmt = TDE2_COLOR_FMT_ARGB1555;
stSrc.u32Width = SAMPLE_IMAGE_WIDTH;
stSrc.u32Height = SAMPLE_IMAGE_HEIGHT;
stSrc.u32Stride = 2 * SAMPLE_IMAGE_WIDTH;
stSrc.u32PhyAddr = Phyaddr;
stSrc.bAlphaExt1555 = HI_TRUE;
stSrc.bAlphaMax255 = HI_TRUE;
stSrc.u8Alpha0 = 0XFF;
stSrc.u8Alpha1 = 0XFF;
/* 1. start job */
s32Handle = HI_TDE2_BeginJob();
if (HI_ERR_TDE_INVALID_HANDLE == s32Handle)
{
SAMPLE_PRT("start job failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
s32Ret = HI_TDE2_QuickCopy(s32Handle, &stSrc, &stSrcRect, &stDst, &stDstRect);
if (s32Ret < 0)
{
SAMPLE_PRT("HI_TDE2_QuickCopy:%d failed,ret=0x%x!\n", __LINE__, s32Ret);
HI_TDE2_CancelJob(s32Handle);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
/* 3. submit job */
s32Ret = HI_TDE2_EndJob(s32Handle, HI_FALSE, HI_TRUE, 10);
if (s32Ret < 0)
{
SAMPLE_PRT("Line:%d,HI_TDE2_EndJob failed,ret=0x%x!\n", __LINE__, s32Ret);
HI_TDE2_CancelJob(s32Handle);
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
stCanvasBuf.UpdateRect.x = 0;
stCanvasBuf.UpdateRect.y = 0;
stCanvasBuf.UpdateRect.w = maxW;
stCanvasBuf.UpdateRect.h = maxH;
s32Ret = ioctl(pstInfo->fd, FBIO_REFRESH, &stCanvasBuf);
if (s32Ret < 0)
{
SAMPLE_PRT("REFRESH failed!\n");
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
sleep(2);
}
HI_MPI_SYS_MmzFree(Phyaddr, Viraddr);
HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
close(pstInfo->fd);
return HI_NULL;
}
HI_VOID SAMPLE_HIFB_HandleSig(HI_S32 signo)
{
if (SIGINT == signo || SIGTSTP == signo)
{
SAMPLE_COMM_SYS_Exit();
printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
}
exit(0);
}
HI_VOID SAMPLE_HIFB_Usage1(HI_CHAR* sPrgNm)
{
printf("Usage : %s <intf>\n", sPrgNm);
printf("intf:\n");
printf("\t 0) vo BT656 output, default.\n");
printf("\t 1) vo LCD output.\n");
return;
}
HI_VOID SAMPLE_HIFB_Usage2(HI_VOID)
{
printf("\n\n/************************************/\n");
printf("please choose the case which you want to run:\n");
printf("\t0: ARGB1555 standard mode\n");
printf("\t1: ARGB1555 BUF_DOUBLE mode\n");
printf("\t2: ARGB1555 BUF_ONE mode\n");
printf("\t3: ARGB1555 BUF_NONE mode\n");
printf("\tq: quit the whole sample\n");
printf("sample command:");
return;
}
HI_S32 SAMPLE_HIFB_StandardMode(HI_VOID)
{
HI_S32 s32Ret = HI_SUCCESS;
pthread_t phifb0 = -1;
PTHREAD_HIFB_SAMPLE_INFO stInfo0;
HI_U32 u32PicWidth;
HI_U32 u32PicHeight;
SIZE_S stSize;
VO_LAYER VoLayer = 0;
VO_PUB_ATTR_S stPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_U32 u32VoFrmRate;
VB_CONF_S stVbConf;
HI_U32 u32BlkSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf, 0, sizeof(VB_CONF_S));
if (VO_INTF_BT656 == g_enVoIntfType)
{
u32PicWidth = WIDTH_720;
u32PicHeight = HEIGHT_576;
}
else
{
u32PicWidth = WIDTH_LCD;
u32PicHeight = HEIGHT_LCD;
}
u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\
* CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2;
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 6;
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
/******************************************
step 3: start vo dev.
*****************************************/
if (VO_INTF_BT656 == g_enVoIntfType)
{
stPubAttr.enIntfSync = VO_OUTPUT_PAL;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
else
{
stPubAttr.enIntfSync = SYNC_LCD;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
stLayerAttr.bClusterMode = HI_FALSE;
stLayerAttr.bDoubleFrame = HI_FALSE;
stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \
&stSize.u32Height, &u32VoFrmRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize));
stLayerAttr.u32DispFrmRt = 30 ;
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.stDispRect.u32Width = stSize.u32Width;
stLayerAttr.stDispRect.u32Height = stSize.u32Height;
s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_1;
}
/******************************************
step 4: start hifb.
*****************************************/
stInfo0.layer = 0;
stInfo0.fd = -1;
stInfo0.ctrlkey = 2;
pthread_create(&phifb0, 0, SAMPLE_HIFB_PANDISPLAY, (void*)(&stInfo0));
while (1)
{
HI_CHAR ch;
printf("press 'q' to exit this sample.\n");
ch = (char)getchar();
getchar();
if ('q' == ch)
{
gs_cExitFlag = ch;
break;
}
else
{
printf("input invaild! please try again.\n");
}
}
if (-1 != phifb0)
{
pthread_join(phifb0, 0);
}
SAMPLE_COMM_VO_StopLayer(VoLayer);
SAMPLE_HIFB_NoneBufMode_1:
SAMPLE_COMM_VO_StopDev(VoDev);
SAMPLE_HIFB_NoneBufMode_0:
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
HI_S32 SAMPLE_HIFB_DoubleBufMode(HI_VOID)
{
HI_S32 s32Ret = HI_SUCCESS;
pthread_t phifb0 = -1;
PTHREAD_HIFB_SAMPLE_INFO stInfo0;
HI_U32 u32PicWidth;
HI_U32 u32PicHeight;
SIZE_S stSize;
VO_LAYER VoLayer = 0;
VO_PUB_ATTR_S stPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_U32 u32VoFrmRate;
VB_CONF_S stVbConf;
HI_U32 u32BlkSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf, 0, sizeof(VB_CONF_S));
if (VO_INTF_BT656 == g_enVoIntfType)
{
u32PicWidth = WIDTH_720;
u32PicHeight = HEIGHT_576;
}
else
{
u32PicWidth = WIDTH_LCD;
u32PicHeight = HEIGHT_LCD;
}
u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\
* CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2;
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 6;
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_DoubleBufMode_0;
}
/******************************************
step 3: start vo dev.
*****************************************/
if (VO_INTF_BT656 == g_enVoIntfType)
{
stPubAttr.enIntfSync = VO_OUTPUT_PAL;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
else
{
stPubAttr.enIntfSync = SYNC_LCD;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
stLayerAttr.bClusterMode = HI_FALSE;
stLayerAttr.bDoubleFrame = HI_FALSE;
stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \
&stSize.u32Height, &u32VoFrmRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_DoubleBufMode_0;
}
memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize));
stLayerAttr.u32DispFrmRt = 30 ;
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.stDispRect.u32Width = stSize.u32Width;
stLayerAttr.stDispRect.u32Height = stSize.u32Height;
s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_DoubleBufMode_0;
}
s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_DoubleBufMode_1;
}
/******************************************
step 4: start hifb.
*****************************************/
stInfo0.layer = 0;
stInfo0.fd = -1;
stInfo0.ctrlkey = 1;
pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0));
while (1)
{
HI_CHAR ch;
printf("press 'q' to exit this sample.\n");
ch = (char)getchar();
getchar();
if ('q' == ch)
{
gs_cExitFlag = ch;
break;
}
else
{
printf("input invaild! please try again.\n");
}
}
if (-1 != phifb0)
{
pthread_join(phifb0, 0);
}
SAMPLE_COMM_VO_StopLayer(VoLayer);
SAMPLE_HIFB_DoubleBufMode_1:
HI_MPI_VO_Disable(VoDev);
SAMPLE_HIFB_DoubleBufMode_0:
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
HI_S32 SAMPLE_HIFB_OneBufMode(HI_VOID)
{
HI_S32 s32Ret = HI_SUCCESS;
pthread_t phifb0 = -1;
PTHREAD_HIFB_SAMPLE_INFO stInfo0;
HI_U32 u32PicWidth;
HI_U32 u32PicHeight;
SIZE_S stSize;
VO_LAYER VoLayer = 0;
VO_PUB_ATTR_S stPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_U32 u32VoFrmRate;
VB_CONF_S stVbConf;
HI_U32 u32BlkSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf, 0, sizeof(VB_CONF_S));
if (VO_INTF_BT656 == g_enVoIntfType)
{
u32PicWidth = WIDTH_720;
u32PicHeight = HEIGHT_576;
}
else
{
u32PicWidth = WIDTH_LCD;
u32PicHeight = HEIGHT_LCD;
}
u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\
* CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2;
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 6;
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_OneBufMode_0;
}
/******************************************
step 3: start vo dev.
*****************************************/
if (VO_INTF_BT656 == g_enVoIntfType)
{
stPubAttr.enIntfSync = VO_OUTPUT_PAL;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
else
{
stPubAttr.enIntfSync = SYNC_LCD;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
stLayerAttr.bClusterMode = HI_FALSE;
stLayerAttr.bDoubleFrame = HI_FALSE;
stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \
&stSize.u32Height, &u32VoFrmRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_OneBufMode_0;
}
memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize));
stLayerAttr.u32DispFrmRt = 30 ;
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.stDispRect.u32Width = stSize.u32Width;
stLayerAttr.stDispRect.u32Height = stSize.u32Height;
s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_OneBufMode_0;
}
s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_OneBufMode_1;
}
/******************************************
step 4: start hifb.
*****************************************/
stInfo0.layer = 0;
stInfo0.fd = -1;
stInfo0.ctrlkey = 0;
pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0));
while (1)
{
HI_CHAR ch;
printf("press 'q' to exit this sample.\n");
ch = (char)getchar();
getchar();
if ('q' == ch)
{
gs_cExitFlag = ch;
break;
}
else
{
printf("input invaild! please try again.\n");
}
}
if (-1 != phifb0)
{
pthread_join(phifb0, 0);
}
SAMPLE_COMM_VO_StopLayer(VoLayer);
SAMPLE_HIFB_OneBufMode_1:
HI_MPI_VO_Disable(VoDev);
SAMPLE_HIFB_OneBufMode_0:
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
HI_S32 SAMPLE_HIFB_NoneBufMode(HI_VOID)
{
HI_S32 s32Ret = HI_SUCCESS;
pthread_t phifb0 = -1;
PTHREAD_HIFB_SAMPLE_INFO stInfo0;
HI_U32 u32PicWidth;
HI_U32 u32PicHeight;
SIZE_S stSize;
VO_LAYER VoLayer = 0;
VO_PUB_ATTR_S stPubAttr;
VO_VIDEO_LAYER_ATTR_S stLayerAttr;
HI_U32 u32VoFrmRate;
VB_CONF_S stVbConf;
HI_U32 u32BlkSize;
/******************************************
step 1: init variable
******************************************/
memset(&stVbConf, 0, sizeof(VB_CONF_S));
if (VO_INTF_BT656 == g_enVoIntfType)
{
u32PicWidth = WIDTH_720;
u32PicHeight = HEIGHT_576;
}
else
{
u32PicWidth = WIDTH_LCD;
u32PicHeight = HEIGHT_LCD;
}
u32BlkSize = CEILING_2_POWER(u32PicWidth, SAMPLE_SYS_ALIGN_WIDTH)\
* CEILING_2_POWER(u32PicHeight, SAMPLE_SYS_ALIGN_WIDTH) * 2;
stVbConf.u32MaxPoolCnt = 128;
stVbConf.astCommPool[0].u32BlkSize = u32BlkSize;
stVbConf.astCommPool[0].u32BlkCnt = 6;
/******************************************
step 2: mpp system init.
******************************************/
s32Ret = SAMPLE_COMM_SYS_Init(&stVbConf);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("system init failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
/******************************************
step 3: start vo dev.
*****************************************/
if (VO_INTF_BT656 == g_enVoIntfType)
{
stPubAttr.enIntfSync = VO_OUTPUT_PAL;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
else
{
stPubAttr.enIntfSync = SYNC_LCD;
stPubAttr.enIntfType = g_enVoIntfType;
stPubAttr.u32BgColor = 0x0000FF;
}
stLayerAttr.bClusterMode = HI_FALSE;
stLayerAttr.bDoubleFrame = HI_FALSE;
stLayerAttr.enPixFormat = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \
&stSize.u32Height, &u32VoFrmRate);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("get vo wh failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
memcpy(&stLayerAttr.stImageSize, &stSize, sizeof(stSize));
stLayerAttr.u32DispFrmRt = 30 ;
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = 0;
stLayerAttr.stDispRect.u32Width = stSize.u32Width;
stLayerAttr.stDispRect.u32Height = stSize.u32Height;
s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo dev failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_0;
}
s32Ret = SAMPLE_COMM_VO_StartLayer(VoLayer, &stLayerAttr, HI_TRUE);
if (HI_SUCCESS != s32Ret)
{
SAMPLE_PRT("start vo layer failed with %d!\n", s32Ret);
goto SAMPLE_HIFB_NoneBufMode_1;
}
/******************************************
step 4: start hifb.
*****************************************/
stInfo0.layer = 0;
stInfo0.fd = -1;
stInfo0.ctrlkey = 3;
pthread_create(&phifb0, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0));
while (1)
{
HI_CHAR ch;
printf("press 'q' to exit this sample.\n");
ch = (char)getchar();
getchar();
if ('q' == ch)
{
gs_cExitFlag = ch;
break;
}
else
{
printf("input invaild! please try again.\n");
}
}
if (-1 != phifb0)
{
pthread_join(phifb0, 0);
}
SAMPLE_COMM_VO_StopLayer(VoLayer);
SAMPLE_HIFB_NoneBufMode_1:
HI_MPI_VO_Disable(VoDev);
SAMPLE_HIFB_NoneBufMode_0:
SAMPLE_COMM_SYS_Exit();
return s32Ret;
}
int main(int argc, char* argv[])
{
HI_S32 s32Ret = HI_SUCCESS;
HI_CHAR ch;
HI_BOOL bExit = HI_FALSE;
if ( (argc < 2) || (1 != strlen(argv[1])))
{
SAMPLE_HIFB_Usage1(argv[0]);
return HI_FAILURE;
}
signal(SIGINT, SAMPLE_HIFB_HandleSig);
signal(SIGTERM, SAMPLE_HIFB_HandleSig);
if ((argc > 1) && *argv[1] == '1') /* '0': VO_INTF_CVBS, else: BT1120 */
{
g_enVoIntfType = INTF_LCD;
}
/******************************************
1 choose the case
******************************************/
while (1)
{
SAMPLE_HIFB_Usage2();
gs_cExitFlag = 0;
ch = (char)getchar();
getchar();
switch (ch)
{
case '0':
{
SAMPLE_HIFB_StandardMode();
break;
}
case '1':
{
SAMPLE_HIFB_DoubleBufMode();
break;
}
case '2':
{
SAMPLE_HIFB_OneBufMode();
break;
}
case '3':
{
SAMPLE_HIFB_NoneBufMode();
break;
}
case 'q':
case 'Q':
{
bExit = HI_TRUE;
break;
}
default :
{
printf("input invaild! please try again.\n");
break;
}
}
if (bExit)
{
break;
}
}
return s32Ret;
}