上下显示1大3小的显示方式注解

本文详细解析了一种视频显示模式——上下显示1大3小,通过具体代码示例,阐述了如何在不同输出通道下实现该显示模式,包括主通道和辅助通道的配置,以及针对不同分辨率的调整策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

## 标题
对原来的上下显示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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值