Qt4.8.6移植到hi3559(四)
我这边使用的显示器分辨率是1080P,通过HDMI与hi3559相连
sample_hifb.c修改后为:
#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 <sys/prctl.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"#include "hi_math.h"static HI_CHAR gs_cExitFlag = 0;VO_INTF_TYPE_E g_enVoIntfType = VO_INTF_BT1120;OSD_COLOR_FMT_E g_osdColorFmt = OSD_COLOR_FMT_RGB1555;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};static struct fb_bitfield s_a32 = {24, 8, 0};static struct fb_bitfield s_r32 = {16, 8, 0};static struct fb_bitfield s_g32 = {8, 8, 0};static struct fb_bitfield s_b32 = {0, 8, 0};#define SAMPLE_IMAGE_WIDTH 300#define SAMPLE_IMAGE_HEIGHT 150#define SAMPLE_IMAGE_NUM 20#define HIFB_RED_1555 0xFC00#define HIFB_RED_8888 0xFFff0000#define GRAPHICS_LAYER_G0 0#define GRAPHICS_LAYER_G1 1#define GRAPHICS_LAYER_G3 2#define SAMPLE_IMAGE1_PATH "./res/%d.bmp"#define SAMPLE_IMAGE2_PATH "./res/1280_720.bits"#define SAMPLE_CURSOR_PATH "./res/cursor.bmp"pthread_t g_stHifbThread = 0;pthread_t g_stHifbThread1= 0;HI_U64 g_Phyaddr = 0;HI_U64 g_CanvasAddr = 0;#if (defined(CONFIG_HI_HIFB_SUPPORT) && defined(CONFIG_HI_VO_SUPPORT))#define HIFB_BE_WITH_VO 1#else#define HIFB_BE_WITH_VO 0#endiftypedef struct hiPTHREAD_HIFB_SAMPLE{HI_S32 fd; /* fb's file describ */HI_S32 layer; /* which graphic layer */HI_S32 ctrlkey; /* {0,1,2,3}={1buffer, 2buffer, 0buffer pan display, 0buffer refresh} */HI_BOOL bCompress; /* image compressed or not */HIFB_COLOR_FMT_E enColorFmt; /* color format. */} PTHREAD_HIFB_SAMPLE_INFO;typedef struct hiVO_DEVICE_INFO{VO_DEV VoDev;VO_INTF_TYPE_E enVoIntfType;}VO_DEVICE_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 = g_osdColorFmt;CreateSurfaceByBitMap(filename, &Surface, pAddr);return HI_SUCCESS;}HI_VOID SAMPLE_HIFB_TO_EXIT(HI_VOID){HI_CHAR ch;while (1){printf("\npress 'q' to exit this sample.\n");while('\n' == (ch = (char)getchar()));getchar();if ('q' == ch){gs_cExitFlag = ch;break;}else{printf("input invaild! please try again.\n");}}if (0 != g_stHifbThread){pthread_join(g_stHifbThread, 0);g_stHifbThread = 0;}}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_U64 u64HideScreenPhy = 0;HI_VOID* pShowLine;HI_VOID* ptemp = NULL;HIFB_ALPHA_S stAlpha = {0};HIFB_POINT_S stPoint = {0, 0};HI_CHAR file[12] = {0};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={0}, stDstRect={0};TDE2_SURFACE_S stSrc={0}, stDst={0};HI_VOID* Viraddr = NULL;HI_U32 u32Width;HI_U32 u32Height;HI_U32 u32BytePerPixel = 2;HIFB_COLOR_FMT_E enClrFmt;TDE2_COLOR_FMT_E enTdeClrFmt = TDE2_COLOR_FMT_ARGB1555;HI_U32 u32Color = HIFB_RED_1555;HI_CHAR thdname[64];if (HI_NULL == pData){return HI_NULL;}pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData;snprintf(thdname,sizeof(thdname), "HIFB%d_PANDISPLAY",pstInfo->layer);prctl(PR_SET_NAME, thdname, 0,0,0);if (VO_INTF_HDMI == g_enVoIntfType){u32Width = 1920;u32Height = 1080;}else{u32Width = 1920;u32Height = 1080;}switch (pstInfo->layer){case GRAPHICS_LAYER_G0 :strncpy(file, "/dev/fb0", 12);break;case GRAPHICS_LAYER_G1 :strncpy(file, "/dev/fb1", 12);break;case GRAPHICS_LAYER_G3:strncpy(file, "/dev/fb2", 12);break;default:strncpy(file, "/dev/fb0", 12);break;}/********************************* Step 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;}/********************************* Step 2. set the screen original position**********************************//* 2. set the screen original position */switch(pstInfo->ctrlkey){case 3:{stPoint.s32XPos = 150;stPoint.s32YPos = 150;}break;default:{stPoint.s32XPos = 0;stPoint.s32YPos = 0;}}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;}/********************************* Step 3. get the variable screen information**********************************/if (ioctl(pstInfo->fd, FBIOGET_VSCREENINFO, &var) < 0){SAMPLE_PRT("Get variable screen info failed!\n");close(pstInfo->fd);return HI_NULL;}/* ***********************************************************Step 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**************************************************************/SAMPLE_PRT("[Begin]\n");SAMPLE_PRT("wait 4 seconds\n");usleep(4 * 1000 * 1000);switch (enClrFmt = pstInfo->enColorFmt){case HIFB_FMT_ARGB8888:var.transp = s_a32;var.red = s_r32;var.green = s_g32;var.blue = s_b32;var.bits_per_pixel = 32;u32Color = HIFB_RED_8888;enTdeClrFmt = TDE2_COLOR_FMT_ARGB8888;g_osdColorFmt = OSD_COLOR_FMT_RGB8888;break;default:var.transp = s_a16;var.red = s_r16;var.green = s_g16;var.blue = s_b16;var.bits_per_pixel = 16;enClrFmt = HIFB_FMT_ARGB1555;u32Color = HIFB_RED_1555;enTdeClrFmt = TDE2_COLOR_FMT_ARGB1555;break;}u32BytePerPixel = var.bits_per_pixel/8;switch(pstInfo->ctrlkey){case 3:{var.xres_virtual = 48;var.yres_virtual = 48;var.xres = 48;var.yres = 48;}break;default:{var.xres_virtual = u32Width;var.yres_virtual = u32Height * u32BytePerPixel;var.xres = u32Width;var.yres = u32Height;}}var.activate = FB_ACTIVATE_NOW;/********************************** Step 5. set the variable screen information***********************************/if (ioctl(pstInfo->fd, FBIOPUT_VSCREENINFO, &var) < 0){SAMPLE_PRT("Put variable screen info failed!\n");close(pstInfo->fd);return HI_NULL;}/*********************************** Step 6. get the fix screen information************************************/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*//**************************************** Step 7. map the physical video memory for user use******************************************/#ifdef __HuaweiLite__pShowScreen = fix.smem_start;#elsepShowScreen = 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;}#endifmemset(pShowScreen, 0x0, 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");#ifndef __HuaweiLite__munmap(pShowScreen, fix.smem_len);#endifclose(pstInfo->fd);return HI_NULL;}/* Only for G0 or G1 */if (GRAPHICS_LAYER_G0 == pstInfo->layer || GRAPHICS_LAYER_G1 == pstInfo->layer){for (i = 0; i < 1; i++){if (i % 2){var.yoffset = var.yres;}else{var.yoffset = 0;}ptemp = (pShowScreen + var.yres * u32FixScreenStride * (i % 2));for (y = 100; y < 300; y++){for (x = 0; x < 300; x++){if (HIFB_FMT_ARGB8888 == enClrFmt){*((HI_U32*)ptemp + y * var.xres + x) = HIFB_RED_8888;}else{*((HI_U16*)ptemp + y * var.xres + x) = HIFB_RED_1555;}}}/** Note : Not acting on ARGB8888, for ARGB8888 format image's alpha, you can change ptemp[x][y]'s value* HIFB_RED_8888 = 0xffff00000 means alpha=255(show),red.0x00ff0000 means alpha=0,red(hide).*/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 = (enClrFmt==HIFB_FMT_ARGB8888 ? HIFB_RED_8888 : 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){/* 2 means none buffer and just for pan display.*/case 2:{/*change bmp*/if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&g_Phyaddr, ((void**)&Viraddr),NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * u32BytePerPixel)){SAMPLE_PRT("allocate memory (maxW*maxH*%d bytes) failed\n",u32BytePerPixel);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(g_Phyaddr, Viraddr);g_Phyaddr = 0;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;}/* TDE 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);u64HideScreenPhy = fix.smem_start + (i % 2) * u32FixScreenStride * var.yres;pShowLine = pHideScreen;for (y = (u32Height / 2 - 2); y < (u32Height / 2 + 2); y++){for (x = 0; x < u32Width; x++){if (enClrFmt==HIFB_FMT_ARGB8888){*((HI_U32*)pShowLine + y * var.xres + x) = u32Color;}else{*((HI_U16*)pShowLine + y * var.xres + x) = u32Color;}}}for (y = 0; y < u32Height; y++){for (x = (u32Width / 2 - 2); x < (u32Width / 2 + 2); x++){if (enClrFmt==HIFB_FMT_ARGB8888){*((HI_U32*)pShowLine + y * var.xres + x) = u32Color;}else{*((HI_U16*)pShowLine + y * var.xres + x) = u32Color;}}}if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0){SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n");HI_MPI_SYS_MmzFree(g_Phyaddr, Viraddr);g_Phyaddr = 0;close(pstInfo->fd);return HI_NULL;}/* TDE step2: draw gui picture*/snprintf(image_name, sizeof(image_name), SAMPLE_IMAGE1_PATH, i % 2);#ifdef __HuaweiLite__pDst = g_Phyaddr;#elsepDst = (HI_U8*)Viraddr;#endifSAMPLE_HIFB_LoadBmp(image_name, pDst);/* TDE job step 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 = enTdeClrFmt;stDst.u32Width = u32Width;stDst.u32Height = u32Height;stDst.u32Stride = u32FixScreenStride;stDst.PhyAddr = u64HideScreenPhy;stSrc.enColorFmt = enTdeClrFmt;stSrc.u32Width = SAMPLE_IMAGE_WIDTH;stSrc.u32Height = SAMPLE_IMAGE_HEIGHT;stSrc.u32Stride = u32BytePerPixel* SAMPLE_IMAGE_WIDTH;stSrc.PhyAddr = g_Phyaddr;stSrc.bAlphaExt1555 = HI_TRUE;stSrc.bAlphaMax255 = HI_TRUE;stSrc.u8Alpha0 = 0XFF;stSrc.u8Alpha1 = 0XFF;/* TDE job step 1. start job */s32Handle = HI_TDE2_BeginJob();if (HI_ERR_TDE_INVALID_HANDLE == s32Handle){SAMPLE_PRT("start job failed!\n");HI_MPI_SYS_MmzFree(g_Phyaddr, Viraddr);g_Phyaddr = 0;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(g_Phyaddr, Viraddr);g_Phyaddr = 0;close(pstInfo->fd);return HI_NULL;}/* TDE job step 2. 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(g_Phyaddr, Viraddr);g_Phyaddr = 0;close(pstInfo->fd);return HI_NULL;}if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0){SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n");HI_MPI_SYS_MmzFree(g_Phyaddr, Viraddr);g_Phyaddr = 0;close(pstInfo->fd);return HI_NULL;}SAMPLE_PRT("expected: one image in upper left corner of the screen!\n");SAMPLE_PRT("Wait 1 seconde.\n");sleep(1);}HI_TDE2_Close();HI_MPI_SYS_MmzFree(g_Phyaddr, Viraddr);g_Phyaddr = 0;}break;case 3:{/* move cursor */SAMPLE_HIFB_LoadBmp(SAMPLE_CURSOR_PATH,pShowScreen);if (ioctl(pstInfo->fd, FBIOPAN_DISPLAY, &var) < 0){SAMPLE_PRT("FBIOPAN_DISPLAY failed!\n");munmap(pShowScreen, fix.smem_len);close(pstInfo->fd);return HI_NULL;}SAMPLE_PRT("show cursor\n");sleep(2);for(i=0;i<100;i++){if ('q' == gs_cExitFlag){printf("process exit...\n");break;}stPoint.s32XPos += 2;stPoint.s32YPos += 2;if(ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){SAMPLE_PRT("set screen original show position failed!\n");munmap(pShowScreen, fix.smem_len);close(pstInfo->fd);return HI_NULL;}usleep(70*1000);}for(i=0;i<100;i++){if ('q' == gs_cExitFlag){printf("process exit...\n");break;}stPoint.s32XPos += 2;stPoint.s32YPos -= 2;if(ioctl(pstInfo->fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){SAMPLE_PRT("set screen original show position failed!\n");munmap(pShowScreen, fix.smem_len);close(pstInfo->fd);return HI_NULL;}usleep(70*1000);}SAMPLE_PRT("move the cursor\n");sleep(1);}break;default:{}}/* unmap the physical memory */#ifndef __HuaweiLite__munmap(pShowScreen, fix.smem_len);#endifbShow = 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);SAMPLE_PRT("[End]\n");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_VOID* 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] = {0};HI_U32 maxW;HI_U32 maxH;PTHREAD_HIFB_SAMPLE_INFO* pstInfo;HIFB_COLORKEY_S stColorKey;TDE2_RECT_S stSrcRect={0}, stDstRect={0};TDE2_SURFACE_S stSrc={0}, stDst={0};HI_VOID* Viraddr = NULL;TDE_HANDLE s32Handle;HI_BOOL bCmp = HI_FALSE;HI_U32 u32BytePerPixel = 2;HIFB_COLOR_FMT_E enClrFmt;TDE2_COLOR_FMT_E enTdeClrFmt = TDE2_COLOR_FMT_ARGB1555;HI_U32 u32Color = HIFB_RED_1555;prctl(PR_SET_NAME, "HIFB_REFRESH", 0,0,0);if (HI_NULL == pData){return HI_NULL;}pstInfo = (PTHREAD_HIFB_SAMPLE_INFO*)pData;switch (pstInfo->layer){case GRAPHICS_LAYER_G0:strncpy(file, "/dev/fb0", 12);break;case GRAPHICS_LAYER_G1:strncpy(file, "/dev/fb1", 12);break;default:strncpy(file, "/dev/fb0", 12);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_HDMI == g_enVoIntfType){maxW = 1920;maxH = 1080;}else{maxW = 1920;maxH = 1080;}switch (enClrFmt = pstInfo->enColorFmt){case HIFB_FMT_ARGB8888:stVarInfo.transp = s_a32;stVarInfo.red = s_r32;stVarInfo.green = s_g32;stVarInfo.blue = s_b32;stVarInfo.bits_per_pixel = 32;u32Color = HIFB_RED_8888;enTdeClrFmt = TDE2_COLOR_FMT_ARGB8888;g_osdColorFmt = OSD_COLOR_FMT_RGB8888;break;default:stVarInfo.transp = s_a16;stVarInfo.red = s_r16;stVarInfo.green = s_g16;stVarInfo.blue = s_b16;stVarInfo.bits_per_pixel = 16;enClrFmt = HIFB_FMT_ARGB1555;u32Color = HIFB_RED_1555;enTdeClrFmt = TDE2_COLOR_FMT_ARGB1555;break;}u32BytePerPixel = stVarInfo.bits_per_pixel/8;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;}bCmp = pstInfo->bCompress;if (ioctl(pstInfo->fd, FBIOPUT_COMPRESSION_HIFB, &bCmp)){SAMPLE_PRT("FBIOPUT_COMPRESSION_HIFB failed!\n");close(pstInfo->fd);return HI_NULL;}while(1){usleep(1000);}if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&g_CanvasAddr, ((void**)&pBuf),NULL, NULL, maxW * maxH * (u32BytePerPixel))){SAMPLE_PRT("allocate memory (maxW*maxH*%d bytes) failed\n",u32BytePerPixel);close(pstInfo->fd);return HI_NULL;}stCanvasBuf.stCanvas.u64PhyAddr = g_CanvasAddr;stCanvasBuf.stCanvas.u32Height = maxH;stCanvasBuf.stCanvas.u32Width = maxW;stCanvasBuf.stCanvas.u32Pitch = maxW * (u32BytePerPixel);stCanvasBuf.stCanvas.enFmt = enClrFmt;memset(pBuf, 0x00, stCanvasBuf.stCanvas.u32Pitch * stCanvasBuf.stCanvas.u32Height);/*change bmp*/if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&g_Phyaddr, ((void**)&Viraddr),NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * u32BytePerPixel)){SAMPLE_PRT("allocate memory (maxW*maxH*%d bytes) failed\n",u32BytePerPixel);HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;close(pstInfo->fd);return HI_NULL;}SAMPLE_PRT("[Begin]\n");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++){if(enClrFmt == HIFB_FMT_ARGB8888){*((HI_U32*)pBuf + y * maxW + x) = u32Color;}else{*((HI_U16*)pBuf + y * maxW + x) = u32Color;}}}for (y = 0; y < maxH; y++){for (x = (maxW / 2 - 2); x < (maxW / 2 + 2); x++){if(enClrFmt == HIFB_FMT_ARGB8888){*((HI_U32*)pBuf + y * maxW + x) = u32Color;}else{*((HI_U16*)pBuf + y * maxW + x) = u32Color;}}}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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;close(pstInfo->fd);return HI_NULL;}sleep(2);snprintf(image_name, sizeof(image_name), SAMPLE_IMAGE1_PATH, i % 2);#ifdef __HuaweiLite__pDst = g_Phyaddr;#elsepDst = (HI_U8*)Viraddr;#endifSAMPLE_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 = enTdeClrFmt;stDst.u32Width = maxW;stDst.u32Height = maxH;stDst.u32Stride = maxW * u32BytePerPixel;stDst.PhyAddr = stCanvasBuf.stCanvas.u64PhyAddr;stSrc.enColorFmt = enTdeClrFmt;stSrc.u32Width = SAMPLE_IMAGE_WIDTH;stSrc.u32Height = SAMPLE_IMAGE_HEIGHT;stSrc.u32Stride = u32BytePerPixel * SAMPLE_IMAGE_WIDTH;stSrc.PhyAddr = g_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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;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(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;close(pstInfo->fd);return HI_NULL;}sleep(2);}HI_MPI_SYS_MmzFree(g_Phyaddr, Viraddr);g_Phyaddr = 0;HI_MPI_SYS_MmzFree(g_CanvasAddr, pBuf);g_CanvasAddr = 0;close(pstInfo->fd);SAMPLE_PRT("[End]\n");return HI_NULL;}HI_VOID SAMPLE_HIFB_HandleSig(HI_S32 signo){static int sig_handled = 0;signal(SIGINT, SIG_IGN);signal(SIGTERM, SIG_IGN);if (!sig_handled && (SIGINT == signo || SIGTERM == signo)){sig_handled = 1;gs_cExitFlag = 'q';if (g_stHifbThread){pthread_join(g_stHifbThread, 0);g_stHifbThread = 0;}if (g_Phyaddr){HI_MPI_SYS_MmzFree(g_Phyaddr, HI_NULL);g_Phyaddr = 0;}if (g_CanvasAddr){HI_MPI_SYS_MmzFree(g_CanvasAddr, HI_NULL);g_CanvasAddr = 0;}SAMPLE_COMM_SYS_Exit();printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");}exit(-1);}HI_VOID SAMPLE_HIFB_Usage2(HI_VOID){printf("\n\n/****************index******************/\n");printf("please choose the case which you want to run:\n");printf("\t0: ARGB8888 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("\t4: ARGB1555 BUF_ONE mode with compress\n");printf("\t5: ARGB8888 BUF_ONE mode with compress\n");return;}HI_VOID SAMPLE_HIFB_Usage1(HI_CHAR* sPrgNm){printf("Usage : %s <index> <device> <intf>\n", sPrgNm);SAMPLE_HIFB_Usage2();printf("\n/****************device******************/\n");printf("\t 0) VO device 0#, default.\n");printf("\t 1) VO device 1#.\n");printf("\n/****************intf******************/\n");printf("\t 0) VO HDMI output, default.\n");printf("\t 1) VO BT1120 output.\n");return;}HI_S32 SAMPLE_HIFB_StartVO(VO_DEVICE_INFO* pstVoDevInfo){#if HIFB_BE_WITH_VOVO_INTF_TYPE_E enVoIntfType = pstVoDevInfo->enVoIntfType;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VO_DEV VoDev = pstVoDevInfo->VoDev;VO_PUB_ATTR_S stPubAttr;HI_U32 u32VoFrmRate;SIZE_S stSize;HI_S32 s32Ret;/******************************************* step 1(start vo): start vo device.*****************************************/if (VO_INTF_HDMI == enVoIntfType){stPubAttr.enIntfSync = VO_OUTPUT_1080P60;}else{stPubAttr.enIntfSync = VO_OUTPUT_1080P60;}stPubAttr.enIntfType = enVoIntfType;stPubAttr.u32BgColor = COLOR_RGB_BLUE;s32Ret = SAMPLE_COMM_VO_GetWH(stPubAttr.enIntfSync, &stSize.u32Width, \&stSize.u32Height, &u32VoFrmRate);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("get vo width and height failed with %d!\n", s32Ret);return s32Ret;}s32Ret = SAMPLE_COMM_VO_StartDev(VoDev, &stPubAttr);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("start vo device failed with %d!\n", s32Ret);return s32Ret;}/******************************* step 2(start vo): Bind G3 to VO device.* Do this after VO Device started.* Set bind relationship.********************************/s32Ret = HI_MPI_VO_UnBindGraphicLayer(GRAPHICS_LAYER_G3, VoDev);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("UnBindGraphicLayer failed with %d!\n", s32Ret);return s32Ret;}s32Ret = HI_MPI_VO_BindGraphicLayer(GRAPHICS_LAYER_G3, VoDev);if (HI_SUCCESS != s32Ret){SAMPLE_PRT("BindGraphicLayer failed with %d!\n", s32Ret);return s32Ret;}/******************************* step 3(start vo): Start hdmi device.********************************/if(VO_INTF_HDMI == enVoIntfType){SAMPLE_COMM_VO_HdmiStart(stPubAttr.enIntfSync);}return HI_SUCCESS;#elsereturn HI_SUCCESS;#endif}HI_S32 SAMPLE_HIFB_StopVO(VO_DEVICE_INFO* pstVoDevInfo){#if HIFB_BE_WITH_VOVO_INTF_TYPE_E enVoIntfType = pstVoDevInfo->enVoIntfType;VO_DEV VoDev = pstVoDevInfo->VoDev;if(VO_INTF_HDMI == enVoIntfType){SAMPLE_COMM_VO_HdmiStop();}SAMPLE_COMM_VO_StopDev(VoDev);return HI_SUCCESS;#elsereturn HI_SUCCESS;#endif}HI_S32 SAMPLE_HIFB_StandardMode(VO_DEVICE_INFO* pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;PTHREAD_HIFB_SAMPLE_INFO stInfo1;VO_DEV VoDev = pstVoDevInfo->VoDev;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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_StandarMode_0;}/******************************************step 3: Start VO device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_StandarMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev; /* VO device number */stInfo0.fd = -1;stInfo0.ctrlkey = 2; /* None buffer */stInfo0.bCompress = HI_FALSE; /* Compress opened or not */stInfo0.enColorFmt = HIFB_FMT_ARGB8888;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_PANDISPLAY, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread0 failed!\n");goto SAMPLE_HIFB_StandarMode_1;}stInfo1.layer = 2;stInfo1.fd = -1;stInfo1.ctrlkey = 3;stInfo1.bCompress = HI_FALSE; /* Compress opened or not */stInfo1.enColorFmt = HIFB_FMT_ARGB8888;if (0 != pthread_create(&g_stHifbThread1,0,SAMPLE_HIFB_PANDISPLAY,(void *)(&stInfo1))){SAMPLE_PRT("start hifb thread1 failed!\n");goto SAMPLE_HIFB_StandarMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_StandarMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_StandarMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}HI_S32 SAMPLE_HIFB_DoubleBufMode(VO_DEVICE_INFO * pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;VO_DEV VoDev = pstVoDevInfo->VoDev;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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 device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_DoubleBufMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev;stInfo0.fd = -1;stInfo0.ctrlkey = 1; /* Double buffer */stInfo0.bCompress = HI_FALSE;stInfo0.enColorFmt = HIFB_FMT_ABGR1555;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread failed!\n");goto SAMPLE_HIFB_DoubleBufMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_DoubleBufMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_DoubleBufMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}HI_S32 SAMPLE_HIFB_OneBufMode(VO_DEVICE_INFO * pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;VO_DEV VoDev = pstVoDevInfo->VoDev;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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 device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_OneBufMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev;stInfo0.fd = -1;stInfo0.ctrlkey = 0; /* One buffer */stInfo0.bCompress = HI_FALSE;stInfo0.enColorFmt = HIFB_FMT_ABGR1555;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread failed!\n");goto SAMPLE_HIFB_OneBufMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_OneBufMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_OneBufMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}HI_S32 SAMPLE_HIFB_NoneBufMode(VO_DEVICE_INFO * pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;VO_DEV VoDev = pstVoDevInfo->VoDev;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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 device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_NoneBufMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev;stInfo0.fd = -1;stInfo0.ctrlkey = 3; /* None buffer */stInfo0.bCompress = HI_FALSE;stInfo0.enColorFmt = HIFB_FMT_ABGR1555;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread failed!\n");goto SAMPLE_HIFB_NoneBufMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_NoneBufMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_NoneBufMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}HI_S32 SAMPLE_HIFB_DCMP(VO_DEVICE_INFO * pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;VO_DEV VoDev = pstVoDevInfo->VoDev;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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 device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_OneBufMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev;stInfo0.fd = -1;stInfo0.ctrlkey = 0;stInfo0.bCompress = HI_TRUE;stInfo0.enColorFmt = HIFB_FMT_ABGR1555;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread failed!\n");goto SAMPLE_HIFB_OneBufMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_OneBufMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_OneBufMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}HI_S32 SAMPLE_HIFB_DCMP_ARGB8888(VO_DEVICE_INFO * pstVoDevInfo){HI_S32 s32Ret = HI_SUCCESS;PTHREAD_HIFB_SAMPLE_INFO stInfo0;VO_DEV VoDev = pstVoDevInfo->VoDev;g_enVoIntfType = pstVoDevInfo->enVoIntfType;VB_CONFIG_S stVbConf;/******************************************step 1: init variable******************************************/memset(&stVbConf, 0, sizeof(VB_CONFIG_S));/******************************************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 device.NOTE: Step 3 is optional when VO is running on other system.******************************************/s32Ret = SAMPLE_HIFB_StartVO(pstVoDevInfo);if(HI_SUCCESS !=s32Ret){SAMPLE_PRT("VO device %d start failed\n", pstVoDevInfo->VoDev);goto SAMPLE_HIFB_OneBufMode_0;}/******************************************step 4: start hifb.*****************************************/stInfo0.layer = VoDev;stInfo0.fd = -1;stInfo0.ctrlkey = 0;stInfo0.bCompress = HI_FALSE;stInfo0.enColorFmt = HIFB_FMT_ARGB8888;if (0 != pthread_create(&g_stHifbThread, 0, SAMPLE_HIFB_REFRESH, (void*)(&stInfo0))){SAMPLE_PRT("start hifb thread failed!\n");goto SAMPLE_HIFB_OneBufMode_1;}SAMPLE_HIFB_TO_EXIT();SAMPLE_HIFB_OneBufMode_1:SAMPLE_HIFB_StopVO(pstVoDevInfo);SAMPLE_HIFB_OneBufMode_0:SAMPLE_COMM_SYS_Exit();return s32Ret;}#ifdef __HuaweiLite__#define SAMPLE_HIFB_NAME "sample"void SAMPLE_VO_SEL_Usage(HI_VOID){printf("Usage : %s <index> <device> <intf>\n", SAMPLE_HIFB_NAME);SAMPLE_HIFB_Usage2();printf("\n/****************device******************/\n");printf("\t 0) VO device 0#, default.\n");printf("\t 1) VO device 1#.\n");printf("\n/****************intf******************/\n");printf("\t 0) VO HDMI output, default.\n");printf("\t 1) VO BT1120 output.\n");return;}int app_main(int argc, char *argv[])#elseint main(int argc, char* argv[])#endif{HI_S32 s32Ret = HI_FAILURE;HI_CHAR ch;VO_DEVICE_INFO stVoDevInfo;stVoDevInfo.VoDev = SAMPLE_VO_DEV_DHD0;stVoDevInfo.enVoIntfType = VO_INTF_HDMI; /*default:HDMI or BT1120*/#ifdef __HuaweiLite__HI_CHAR SelDev; /* '0': VO_INTF_CVBS, else: BT1120 */#elseif ( (argc < 4) || (1 != strlen(argv[1])) || (1 != strlen(argv[2]))){SAMPLE_HIFB_Usage1(argv[0]);return HI_FAILURE;}#endif#ifdef __HuaweiLite__#elsesignal(SIGINT, SAMPLE_HIFB_HandleSig);signal(SIGTERM, SAMPLE_HIFB_HandleSig);#endif#ifdef __HuaweiLite__if ((argc < 4) || (1 != strlen(argv[1])) || (1 != strlen(argv[2]))){SAMPLE_VO_SEL_Usage();return HI_FAILURE;}if ((argc > 2) && *argv[2] == '1')#elseif ((argc > 2) && *argv[2] == '1') /* '0': DHD0, else: DHD1 */#endif{stVoDevInfo.VoDev = SAMPLE_VO_DEV_DHD1;}if ((argc > 2) && *argv[3] == '1') /* '0': VO_INTF_HDMI, else: VO_INTF_BT1120 */{stVoDevInfo.enVoIntfType = VO_INTF_BT1120;}if (SAMPLE_VO_DEV_DHD1 == stVoDevInfo.VoDev && VO_INTF_HDMI == stVoDevInfo.enVoIntfType){printf("\n**********************************************************\n*");SAMPLE_PRT("DHD1 does not support HDMI output interface*\n");printf("**********************************************************\n\n");SAMPLE_HIFB_Usage1(argv[0]);return HI_FAILURE;}/******************************************1 choose the case******************************************/ch = *(argv[1]);gs_cExitFlag = 0;switch (ch){case '0':{SAMPLE_PRT("\nindex 0 selected.\n");s32Ret = SAMPLE_HIFB_StandardMode(&stVoDevInfo);break;}case '1':{SAMPLE_PRT("\nindex 1 selected.\n");s32Ret = SAMPLE_HIFB_DoubleBufMode(&stVoDevInfo);break;}case '2':{SAMPLE_PRT("\nindex 2 selected.\n");s32Ret = SAMPLE_HIFB_OneBufMode(&stVoDevInfo);break;}case '3':{SAMPLE_PRT("\nindex 3 selected.\n");s32Ret = SAMPLE_HIFB_NoneBufMode(&stVoDevInfo);break;}case '4':{SAMPLE_PRT("\nindex 4 selected.\n");s32Ret= SAMPLE_HIFB_DCMP(&stVoDevInfo);break;}case '5':{SAMPLE_PRT("\nindex 5 selected.\n");s32Ret= SAMPLE_HIFB_DCMP_ARGB8888(&stVoDevInfo);break;}default :{printf("index invaild! please try again.\n");break;}}if (HI_SUCCESS == s32Ret){SAMPLE_PRT("program exit normally!\n");}else{SAMPLE_PRT("program exit abnormally!\n");}return (s32Ret);}
编译后,执行情况如下:
~ # ./sample_hifb 5 0 0
[main]-1702:
index 5 selected.
press 'q' to exit this sample.
^Z[1]+ Stopped ./sample_hifb 5 0 0
~ # ./test3559 -qws
即可显示qt应用!
将USB鼠标接入,可拖动放大缩小界面!
Qt4.8.6移植到hi3559(四)相关推荐
- opencv应用程序移植到hi3559板卡
opencv应用程序移植到hi3559板卡 opencv在hi3559平台的移植网络上有很多文章,此处不做赘述.很多新手将opencv使用交叉编译工具编译好后,不知道怎么通过交叉编译将opencv应用 ...
- linux系统移植篇(四)—— 根文件系统使用介绍
linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...
- Qt-4.6.3移植与Qt creator开发环境建立
最近把Qt到开发环境建立了起来,以后打算多点时间在学习Qt上面,下面是我的移植与搭建过程,现在贴出来希望能对大家有点帮助..... 作者:顾文彪 博客:http://blog.chinaunix.ne ...
- qt4.8.6移植到海思3531
转载地址 : 1:点击打开链接 2:点击打开链接 3:点击打开链接 按照下面步骤运行,命令一样 刚刚移植完海思.趁新鲜,赶紧写博客记录一下. 刚换新公司,老公司用的平台都是三星的,对Qt等支持都非常好 ...
- 嵌入式开发之qt-4.8.6移植
目录 前言 一.下载qt-4.8.6 二.一键编译 三.移植到目标机 3.1 文件移植 3.2 配置环境变量 3.3 添加库文件 四.测试 4.1 安装和配置qt-creator 4.2 创建并执行测 ...
- Qt4.8.3移植总结
对于ubuntu10 系统,必须先安装 g++ sudo apt-get install g++ 编译tslib 必须安装 autoconf.automake和libtool 工具 sudo apt ...
- 移植uboot第四步:设置NAND启动
写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...
- 算法移植优化(四)c++11 多线程
c++11多线程库:std::thread 一.join函数:用于等待线程对象运行结束 程序从main函数开始,本来由一个线程执行:当执行到std::thread定义一个线程对象,给定初始构造函数后, ...
- 瑞芯微rk3568移植openbmc(四)----关于novnc h264 webcodec硬解码
2022.11.04 更新 1.关于h264 novnc 软解码 上一篇中实现了novnc h264的webassembly软解码,kvm功能 运行一切正常,但帧率较低,且cpu负载相对较高,goog ...
最新文章
- AI时代,人与机器的沟通方式
- numpy resize
- java数组详解_java数组详解
- java 酒店系统_基于JAVA的酒店管理系统
- 第一次打开Lightroom时的基本设置
- 谈一谈synchronized关键词
- sqlserver 2008完整安装教程
- IBM ServerGuide下载地址及安装指南-wugj
- esp8266网页控制RGB灯颜色
- H5页面跳转到微信公众号首页
- android 系统重新安装程序,安卓手机系统怎么重装
- c语言源程序自动评判系统,C语言源程序的自动评判系统.pdf
- 详解Unicode与UTF-8、UTF-16、UTF-32.
- 辽宁小学计算机课本,辽宁初中教材版本
- 关于SQL语句的左连接和右连接,内连接和外连接的区别
- Moo Volume
- wnmp php5.2,laravel在nginx下的伪静态配置,运行环境:wnmp2.2.5/win7sp1旗舰版
- 迷宫游戏纯c语言代码,C++ 迷宫游戏实现代码
- 滴滴要成为自动驾驶“老司机”
- js websocket同步等待_javascript – 如何等待WebSocket的readyState更改