## 标题
对原来的上下显示1大3小的显示方式进行注解,比原来有新的认识了。这又有新的想法了。
static void stDEMO_ModeUD13_FULL(OUTCHN_t Ch)
{
/* add begin by lejianz, 2020-04-12, 原因: */
// 下面对上下显示为1大3小的方式进行解读,4分割显示时,由于是上下全屏(FULL)显示,上半部分为2/3,下半部分为1/3
//
PMDIN_VIDEO_INFO pINFO;
MDIN_ACTVIDEO_SIZE stWIND_m, stWIND_x, stWIND_o;
MDIN_ACTVIDEO_SIZE stSkipPixel={0,0};
/////////////////////////////
MdinChipSel = MDIN_CHIP_INP1;
pINFO = &stVideo[MdinChipSel];
MDIN4xx_GetSrcVideoSIZE(pINFO, &stWIND_m);
MDINAUX_GetSrcVideoSIZE(pINFO, &stWIND_x);
MDIN4xx_GetOutVideoSIZE(pINFO, &stWIND_o);
stClearScalerFactor();
if (Ch == OUTCH1)
{
// 主通道为OUTCH1, 也就是上半部分大的显示区域为CH1
// 此时,宽度为输出窗口的宽度,高度为2/3,显示位置为(0,0)
stVIEW_m.w = stWIND_o.w; stVIEW_m.x = 0;
stVIEW_m.h = stWIND_o.h*2/3; stVIEW_m.y = 0;
// 辅通道为OUTCH2, 它只能在下面的1/3处的最左边区域显示,它的宽度为W的1/3,它的高度也为1/3
// 显示位置为(0,H*2/3)
stVIEW_x.w = EVEN(stWIND_o.w/3); stVIEW_x.x = 0;
stVIEW_x.h = stWIND_o.h/3; stVIEW_x.y = stWIND_o.h*2/3;
DEMO_SetMAINAntiAlias(0);
DEMO_SetAUXAntiAlias((OutRes == RES_1080P60)? 2 : 1);
}
else if (Ch == OUTCH2)
{
// 主通道为OUTCH1, 它只能在下面的1/3处的最左边区域显示,它的宽度为W的1/3,它的高度也为1/3
// 显示位置为(0,H*2/3)
stVIEW_m.w = EVEN(stWIND_o.w/3); stVIEW_m.x = 0;
stVIEW_m.h = stWIND_o.h/3; stVIEW_m.y = stWIND_o.h*2/3;
// 辅通道为OUTCH2, 也就是上半部分大的显示区域为CH2
// 此时,宽度为输出窗口的宽度,高度为2/3,显示位置为(0,0)
stVIEW_x.w = stWIND_o.w; stVIEW_x.x = 0;
stVIEW_x.h = stWIND_o.h*2/3; stVIEW_x.y = 0;
DEMO_SetMAINAntiAlias(1);
DEMO_SetAUXAntiAlias(0);
}
else
{
// 其它情况,H,W都为1/3, 此时,可能是另外一块芯片的2个输入通道为在REAL上为主通道
// 此时,当前的二个通道都只显示1/3,并且,画面位置分别为(0,0),(W*1/3, 0)
// 这样的话,在REAL芯片中会裁剪显示出来
stVIEW_m.w = EVEN(stWIND_o.w/3); stVIEW_m.x = 0;
stVIEW_m.h = stWIND_o.h/3; stVIEW_m.y = 0;
stVIEW_x.w = EVEN(stWIND_o.w/3); stVIEW_x.x = EVEN(stWIND_o.w/3);
stVIEW_x.h = stWIND_o.h/3; stVIEW_x.y = 0;
DEMO_SetMAINAntiAlias(1);
DEMO_SetAUXAntiAlias((OutRes == RES_1080P60)? 2 : 1);
}
MDIN4xx_EnableFreeze(pINFO, OFF);
MDIN4xx_EnableDisplay(HDRx_AVInfo[OUTCH1].RxON);
MDINAUX_EnableFreeze(pINFO, OFF);
MDINAUX_EnableDisplay(pINFO, HDRx_AVInfo[OUTCH2].RxON);
MDIN4xx_SetVideoWindowMOVE(pINFO, &stMOVE_m);
MDINAUX_SetVideoWindowMOVE(pINFO, &stMOVE_x);
MDIN4xx_GetSeamlessDone(pINFO);
DEMO_SetChromaKey(OFF);
/////////////////////////////
MdinChipSel = MDIN_CHIP_INP2;
pINFO = &stVideo[MdinChipSel];
MDIN4xx_GetSrcVideoSIZE(pINFO, &stWIND_m);
MDINAUX_GetSrcVideoSIZE(pINFO, &stWIND_x);
MDIN4xx_GetOutVideoSIZE(pINFO, &stWIND_o);
stClearScalerFactor();
// 这一部分和上面的基本上差不多,只不过是第二块芯片为主输出通道
if(Ch == OUTCH3)
{
// CH3
stVIEW_m.w = stWIND_o.w; stVIEW_m.x = 0;
stVIEW_m.h = stWIND_o.h*2/3; stVIEW_m.y = 0;
// CH4在AUX通道,位置为(2/3, 1/3)处
stVIEW_x.w = EVEN(stWIND_o.w/3); stVIEW_x.x = EVEN(stWIND_o.w*2/3);
stVIEW_x.h = stWIND_o.h/3; stVIEW_x.y = stWIND_o.h*2/3;
DEMO_SetMAINAntiAlias(0);
DEMO_SetAUXAntiAlias((OutRes == RES_1080P60)?2 : 1);
}
else if (Ch == OUTCH4)
{
// CH3在MAIN通道中,W,H大小为1/3, 位置为(2/3, 2/3)处
stVIEW_m.w = EVEN(stWIND_o.w/3); stVIEW_m.x = EVEN(stWIND_o.w*2/3);
stVIEW_m.h = stWIND_o.h/3; stVIEW_m.y = stWIND_o.h*2/3;
// CH4为主画面,位置为(0, 0)
stVIEW_x.w = stWIND_o.w; stVIEW_x.x = 0;
stVIEW_x.h = stWIND_o.h*2/3; stVIEW_x.y = 0;
DEMO_SetMAINAntiAlias(1);
DEMO_SetAUXAntiAlias(0);
}
else
{
stVIEW_m.w = EVEN(stWIND_o.w/3); stVIEW_m.x = 0;
stVIEW_m.h = stWIND_o.h/3; stVIEW_m.y = 0;
stVIEW_x.w = EVEN(stWIND_o.w/3); stVIEW_x.x = EVEN(stWIND_o.w/3);
stVIEW_x.h = stWIND_o.h/3; stVIEW_x.y = 0;
DEMO_SetMAINAntiAlias(1);
DEMO_SetAUXAntiAlias((OutRes == RES_1080P60)?2 : 1);
}
MDIN4xx_EnableFreeze(pINFO, OFF);
MDIN4xx_EnableDisplay(HDRx_AVInfo[OUTCH3].RxON);
MDINAUX_EnableFreeze(pINFO, OFF);
MDINAUX_EnableDisplay(pINFO, HDRx_AVInfo[OUTCH4].RxON);
MDIN4xx_SetVideoWindowMOVE(pINFO, &stMOVE_m);
MDINAUX_SetVideoWindowMOVE(pINFO, &stMOVE_x);
MDIN4xx_GetSeamlessDone(pINFO);
DEMO_SetChromaKey(OFF);
/////////////////////////////
MdinChipSel = MDIN_CHIP_REAR;
pINFO = &stVideo[MdinChipSel];
MDIN4xx_GetSrcVideoSIZE(pINFO, &stWIND_m);
MDINAUX_GetSrcVideoSIZE(pINFO, &stWIND_x);
MDIN4xx_GetOutVideoSIZE(pINFO, &stWIND_o);
stClearScalerFactor();
// 这个是第三块REAL芯片的输出,需要根据前面二块芯片的结果进行真正输出
// 计算SKIP像素,
stSkipPixel.w = (OutRes == RES_1080P60)? EVEN(stWIND_o.w * __OVERSCAN__ / 200) : 0;
stSkipPixel.h = (OutRes == RES_1080P60)? stWIND_o.h * __OVERSCAN__ / 200 : 0;
if (Ch == OUTCH1 || Ch == OUTCH2)
{
/* add begin by lejianz, 2020-04-12, 原因: */
// 当大画面是CH1或CH2时, REAL的MAIN输出(大窗口部分)是芯片1,因此,它作为主要显示区域
stVIEW_m.w = stWIND_o.w - stSkipPixel.w*2; stVIEW_m.x = EVEN(stSkipPixel.w);
stVIEW_m.h = stWIND_o.h - stSkipPixel.h*2; stVIEW_m.y = stSkipPixel.h;
// AUX显示CH3,CH4,因此,它的显示位置为右下角二个1/3区域
stVIEW_x.w = (stWIND_o.w - stSkipPixel.w*2)*2/3; stVIEW_x.x = EVEN((stWIND_o.w - stSkipPixel.w*2)/3 + stSkipPixel.w);
stVIEW_x.h = (stWIND_o.h - stSkipPixel.h*2)/3; stVIEW_x.y = (stWIND_o.h - stSkipPixel.h*2)*2/3 + stSkipPixel.h;
// 做裁剪显示,因此先前CH3,CH4只在左上角显示(2/3 , 1/3)的一个区域
stCROP_x.w = stWIND_x.w*2/3; stCROP_x.x = 0;
stCROP_x.h = (stWIND_x.h/3); stCROP_x.y = 0;
}
else
{
// 主通道为CH1和CH2并列的一个显示画面
// 显示窗口大小W为2/3, H为1/3, 从位置为(0,h*2/3)开始, 也就是左下角的一小块区域
stVIEW_m.w = EVEN((stWIND_o.w - stSkipPixel.w*2)*2/3); stVIEW_m.x = EVEN(stSkipPixel.w);
stVIEW_m.h = (stWIND_o.h - stSkipPixel.h*2)/3; stVIEW_m.y = (stWIND_o.h - stSkipPixel.h*2)*2/3 + stSkipPixel.h;
// 裁剪位置为(0,0), W度为2/3,H度为1/3
stCROP_m.w = EVEN(stWIND_m.w*2/3); stCROP_m.x = 0;
stCROP_m.h = (stWIND_m.h/3); stCROP_m.y = 0;
// 当大画面是CH3或CH4时, REAL的MAIN输出(大窗口部分)是芯片2,因此,它作为主要显示区域
stVIEW_x.w = (stWIND_o.w - stSkipPixel.w*2); stVIEW_x.x = EVEN(stSkipPixel.w);
stVIEW_x.h = (stWIND_o.h - stSkipPixel.h*2); stVIEW_x.y = stSkipPixel.h;
stCROP_x.w = stWIND_x.w; stCROP_x.x = 0;
stCROP_x.h = stWIND_x.h; stCROP_x.y = 0;
}
MDIN4xx_SetVideoWindowMOVE(pINFO, &stMOVE_m);
MDINAUX_SetVideoWindowMOVE(pINFO, &stMOVE_x);
MDIN4xx_GetSeamlessDone(pINFO);
MDIN4xx_VsyncPulseWAIT();
MDIN4xx_SetPIPBlendLevel((Ch == OUTCH1 || Ch == OUTCH2)? AUXFRONT : MAINFRONT);
DEMO_SetAUXFrontVNRFilter(pINFO, (OutRes == RES_1080P60)?ON : OFF);
MDIN4xx_EnableFreeze(pINFO, OFF);
MDIN4xx_EnableDisplay(ON);
MDINAUX_EnableFreeze(pINFO, OFF);
MDINAUX_EnableDisplay(pINFO, ON);
OSD_ChDisplay(MODE_UD13_FULL, Ch, OUTCH_No);
DEMO_SetChromaKey(OFF);
}