现在无论对图层设计多样化 一般采用4层 或者更多 、、
我们习惯用宏定义来分开如下:
//#define STILL_IMG_ZAPPING_BUF_SIZE 0x918C00 ///< DWin buffer size used for still image zapping
#define STILL_IMG_ZAPPING_HD_GOP 3 ///< HD GOP used for still image zapping
#define STILL_IMG_ZAPPING_SD_GOP 4 ///< SD GOP used for still image zapping
当然现在都要去初始化一下:
MS_BOOL _DISP_VE_Init(void)
{
MSAPI_VE_INITDATA msAPI_VE_InitData;
msAPI_VE_InitData.u32VEMemAddress = VE_FRAMEBUFFER_ADR ;
msAPI_VE_InitData.u32VEMemSize= VE_FRAMEBUFFER_LEN;
msAPI_VE_InitData.eOutputVideoStd = MS_VE_PAL;
msAPI_VE_InitData.eInputSrcType = MS_VE_SRC_DI;
msAPI_VE_InitData.eOutputDstType = MS_VE_DEST_CVBS;
msAPI_VE_InitData.bBootLogoEnable = FALSE;
//msAPI_VE_InitData.bBootLogoEnable = TRUE;
msAPI_VE_Init(msAPI_VE_InitData);
MDrv_VE_SetBlackScreen(TRUE); //jack.lei refine
#if ENABLE_DI2VE_AUTO
geVeSrcType=E_MSAPI_VE_SOURCE_SCALER_DI2VE;//E_MSAPI_VE_SOURCE_SCALER_OP2;
#else
geVeSrcType=E_MSAPI_VE_SOURCE_SCALER_OP2;//E_MSAPI_VE_SOURCE_SCALER_OP2;
#endif
msAPI_VE_SetSourceType(geVeSrcType);
return TRUE;
}
MS_BOOL DApi_DISP_Init(void)
{
MS_U32 u32OutputTiming;
MS_U16 u16StartX,u16StartY,u16Width,u16Height;
if(_bDISPInited)
{
DBG_ERROR("%s : Already Inited\n",__FUNCTION__);
return TRUE;
}
printf("Demo_GOP_Init\n");
GOP_InitInfo pGopInit;
GFX_Config tGFXcfg;
//MDrv_SEM_Init();
/// -Initial GE
tGFXcfg.bIsCompt = TRUE;
tGFXcfg.bIsHK = TRUE;
MApi_GFX_Init(&tGFXcfg);
printf("driver GE init ok\n");
//_OSD_ScalerInit(); //jerry.wang add
//Initial GOP
MApi_GOP_RegisterFBFmtCB(( MS_U32(*)(MS_U16 pitch,MS_U32 addr , MS_U16 fmt ))_OSD_SetFBFmt);
MApi_GOP_RegisterXCIsInterlaceCB(_sc_is_interlace);
MApi_GOP_RegisterXCGetCapHStartCB(_sc_get_h_cap_start);
MApi_GOP_RegisterXCReduceBWForOSDCB(_XC_Sys_PQ_ReduceBW_ForOSD);
pGopInit.u16PanelWidth = g_IPanel.Width();
pGopInit.u16PanelHeight = g_IPanel.Height();
pGopInit.u16PanelHStr = g_IPanel.HStart();
printf("g_IPanel.HStart()=%d\n",g_IPanel.HStart());
#if GOP_ENABLE_MIU_1
pGopInit.u32GOPRBAdr = GOP_GWIN_RB_ADR + MIU_INTERVAL;
#else
pGopInit.u32GOPRBAdr = GOP_GWIN_RB_ADR;
#endif
pGopInit.u32GOPRBLen = GOP_GWIN_RB_LEN;
#if GOP_ENABLE_MIU_1
pGopInit.u32GOPRegdmaAdr = GOP_REGDMABASE_ADR + MIU_INTERVAL;
#else
pGopInit.u32GOPRegdmaAdr = GOP_REGDMABASE_ADR;
#endif
pGopInit.u32GOPRegdmaLen = GOP_REGDMABASE_LEN;
pGopInit.bEnableVsyncIntFlip = FALSE;
MApi_GOP_Init(&pGopInit);
printf("GOP_GWIN_RB_ADR : %x, GOP_REGDMABASE_ADR: %x\n", GOP_GWIN_RB_ADR, GOP_REGDMABASE_ADR);
printf("driver GOP init ok\n");
// XC init
//XC init
_DISP_XC_Init();//appDemo_XC_Init();
// VE init
_DISP_VE_Init();
//jack.lei refine DApi_DISP_Blank();
u16StartX = 0;
u16StartY = 0;
u16Width = 1920;
u16Height = 1080;
u32OutputTiming = DISP_TIMING_1920X1080_50I;
//_DISP_XC_SetOutputTiming(u32OutputTiming, u16StartX, u16StartY, u16Width, u16Height);
u32OutputTiming = DISP_TIMING_720X576_50I;
u16StartX = 0;
u16StartY = 0;
u16Width = 720;
u16Height = 576;
//_DISP_VE_SetOutputTiming(u32OutputTiming, u16StartX, u16StartY, u16Width, u16Height);
gDispInfo.HD_AS_WND = DISP_ASPECT_WINDOW_FULL;
gDispInfo.SD_AS_WND = DISP_ASPECT_WINDOW_FULL;
_bDISPInited = TRUE;
if (_s32StillImgMutexId < 0)
{
_s32StillImgMutexId = MsOS_CreateMutex(E_MSOS_FIFO, "StillImage_Mutex", MSOS_PROCESS_SHARED);
if (_s32StillImgMutexId < 0)
{
printf("DApi_DISP_Init: Create mutex failed.\n");
}
}
#if 1 //Patch for BW
MS_U32 u32MMIOBaseAdr, u32BankSize;
if( !MDrv_MMIO_GetBASE(&u32MMIOBaseAdr, &u32BankSize, MS_MODULE_HW))
{
printf("Get IOMap failure\n");
MS_ASSERT(0);
return FALSE;
}
else
{
printf("Get IOMap u32NonPmBase = 0x%lx \n",(MS_U32)u32MMIOBaseAdr);
}
u32NonPmBase = u32MMIOBaseAdr;
#endif
pthread_mutex_init(&s_vmix_mutex, NULL);
return TRUE;
}
那么去用呢
MS_BOOL DApi_DISP_InitStillImage(void)
{
MS_BOOL bRet = FALSE;
MS_U32 u32DWinBufPA = 0;
MS_U32 u32DWinBufLen = 0;
if (MsOS_ObtainMutex(_s32StillImgMutexId, MSOS_WAIT_FOREVER) == FALSE)
{
return FALSE;
}
u32DWinBufPA = STILLIMAGE_BUF_ADR;
u32DWinBufLen = STILLIMAGE_BUF_LEN;
printf("Still zapping DWIN buffer PA = %lx, size = %ld\n", u32DWinBufPA, u32DWinBufLen);
bRet = msAPI_GEGOP_CreateStillVideo(STILL_IMG_ZAPPING_HD_GOP, STILL_IMG_ZAPPING_SD_GOP, u32DWinBufPA, STILLIMAGE_BUF_LEN);
if(bRet == FALSE)
{
printf("msAPI_GEGOP_CreateStillVideo FAIL!!!\n");
}
MsOS_ReleaseMutex(_s32StillImgMutexId);
return TRUE;
}
MS_BOOL DApi_DISP_EnableStillImage(void)
{
MS_BOOL bRet = FALSE;
MS_U32 L_last1 = 0;
MS_U32 L_last2 = 0;
MS_U32 L_last = 0;
/*times++;
if(times > 10)
{
return TRUE;
}*/
printf("enter %s\n",__FUNCTION__);
if (MsOS_ObtainMutex(_s32StillImgMutexId, MSOS_WAIT_FOREVER) == FALSE)
{
return FALSE;
}
_bLastFrame = TRUE;
MSAPI_GEGOP_UIEffect_Para UIEffect_Para;
memset(&UIEffect_Para, 0, sizeof(MSAPI_GEGOP_UIEffect_Para));
UIEffect_Para.Effect_Enable = TRUE;
UIEffect_Para.Para1 = COEF_ASRC;
UIEffect_Para.Para2 = 0xFF;
L_last1 = MsOS_GetSystemTime();
printf("line to ..........msAPI_GEGOP_StillVideo_UIBitbltEffect......2138....................\n");
bRet = msAPI_GEGOP_StillVideo_UIBitbltEffect(MSAPI_GEGOP_ABL, ABL_Para_Amount, &UIEffect_Para);
printf("line to ..........bRet == FALSE......2140....................\n");
if(bRet == FALSE)
{
printf("DApi_OSD_ShowStillImage UIBitbltEffect FAIL!!!\n");
}
#if 1 //Patch for BW
REG16_NPM(0x1200*2+0x40*2)=0xC016;
REG16_NPM(0x1200*2+0x42*2)=0x0810;
REG16_NPM(0x1200*2+0x60*2)=0x8011;
REG16_NPM(0x1200*2+0x62*2)=0x0000;
REG16_NPM(0x1200*2+0x68*2)=0xEF0F;
REG16_NPM(0x1200*2+0x6A*2)=0x321C;
REG16_NPM(0x1200*2+0x6C*2)=0x0B87;
REG16_NPM(0x1200*2+0x6E*2)=0xDEA9;
REG16_NPM(0x1200*2+0x70*2)=0x654F;
#endif
printf("line to ..........REG16_NPM......2159....................\n");
bRet = msAPI_GEGOP_ShowStillVideo(STILL_IMG_ZAPPING_HD_GOP, STILL_IMG_ZAPPING_SD_GOP, 0, 0);
printf("line to ..........msAPI_GEGOP_ShowStillVideo......2161....................\n");
L_last2 = MsOS_GetSystemTime();
L_last =(L_last2 - L_last1);
printf("2174...... ...... ...... L_last = %d \n", L_last);
if(bRet == FALSE)
{
printf("msAPI_GEGOP_ShowStillVideo FAIL!!!\n");
}
#if 1 //Patch for BW
REG16_NPM(0x1200*2+0x40*2)=0x8011;
REG16_NPM(0x1200*2+0x42*2)=0x0000;
REG16_NPM(0x1200*2+0x60*2)=0x8015;
REG16_NPM(0x1200*2+0x62*2)=0x0018;
REG16_NPM(0x1200*2+0x68*2)=0xAF5F;
REG16_NPM(0x1200*2+0x6A*2)=0x4321;
REG16_NPM(0x1200*2+0x6C*2)=0x8765;
REG16_NPM(0x1200*2+0x6E*2)=0xCBA9;
REG16_NPM(0x1200*2+0x70*2)=0x0FED;
#endif
MsOS_ReleaseMutex(_s32StillImgMutexId);
return bRet;
}