MPP中如何修改HDMI的VO设置能实现多个HDMI的VI同时在同一个HDMI口输出,详细做法
时间: 2023-11-28 18:49:05 浏览: 35
在MPP中实现多个HDMI的VI同时在同一个HDMI口输出,需要进行以下步骤:
1. 打开mpp/sample/common/sample_comm_sys.c文件,在SAMPLE_COMM_SYS_GetPicSize函数中添加一个新的VI通道。
例如,如果你需要添加第二个VI通道,可以添加以下代码:
```c
case VI_MODE_1080P_30:
case VI_MODE_1080P_25:
if (ViChn < 2) // 添加一行判断,如果ViChn小于2,则返回1080P分辨率
{
pstSize->u32Width = 1920;
pstSize->u32Height = (VI_MODE_1080P_30 == enPicSize)? 1080 : 1088;
}
else // 如果ViChn大于等于2,则返回720P分辨率
{
pstSize->u32Width = 1280;
pstSize->u32Height = (VI_MODE_1080P_30 == enPicSize)? 720 : 704;
}
break;
```
2. 打开mpp/sample/common/sample_comm_venc.c文件,在SAMPLE_COMM_VENC_H264Encode函数中添加一个新的VENC通道。
例如,如果你需要添加第二个VENC通道,可以添加以下代码:
```c
case 1: // 添加一行判断,如果i < 2,则使用第一个编码通道
VencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
VencChnAttr.stRcAttr.stH264Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.u32StatTime = 1;
VencChnAttr.stRcAttr.stH264Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.u32BitRate = 1024*2; // 2Mbps
VencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;
VencChnAttr.stGopAttr.stNormalP.s32IPQpDelta = 0;
VencChnAttr.stGopAttr.stNormalP.u32GopPresetIdx = 0;
VencChnAttr.stGopAttr.stNormalP.u32IQp = 20;
break;
case 2: // 如果i大于等于2,则使用第二个编码通道
VencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
VencChnAttr.stRcAttr.stH264Cbr.u32Gop = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.u32StatTime = 1;
VencChnAttr.stRcAttr.stH264Cbr.u32SrcFrmRate = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.fr32DstFrmRate = (VIDEO_ENCODING_MODE_PAL==g_enNorm)?25:30;
VencChnAttr.stRcAttr.stH264Cbr.u32BitRate = 1024*2; // 2Mbps
VencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;
VencChnAttr.stGopAttr.stNormalP.s32IPQpDelta = 0;
VencChnAttr.stGopAttr.stNormalP.u32GopPresetIdx = 0;
VencChnAttr.stGopAttr.stNormalP.u32IQp = 20;
break;
```
3. 打开mpp/sample/common/sample_comm_vo.c文件,在SAMPLE_COMM_VO_HdmiStart函数中添加一个新的VO通道。
例如,如果你需要添加第二个VO通道,可以添加以下代码:
```c
stLayerAttr.stDispRect.s32X = 0;
stLayerAttr.stDispRect.s32Y = (HI_S32)VoDev * 720; // 根据VoDev的值计算新的Y坐标
stLayerAttr.stDispRect.u32Width = 1920;
stLayerAttr.stDispRect.u32Height = 720;
```
4. 修改程序中的启动脚本,将新添加的VI通道和VENC通道绑定在一起,将新添加的VENC通道和VO通道绑定在一起。
例如,如果你需要将第二个VI通道和第二个VENC通道绑定在一起,可以在启动脚本中添加以下代码:
```bash
# 绑定VI通道和VENC通道
echo "bind vi1 and venc2..."
mipi_receiver 1 0
mipi_phy 1 on
vi 1 isp 0
vi 1 attr 1080P30
venc 2 attr 1080P30 2000 30 30 20
venc 2 rc cbr 1024 1
venc 2 roi off
venc 2 crop off
venc 2 chn 2
```
然后,将第二个VENC通道和第二个VO通道绑定在一起,可以在启动脚本中添加以下代码:
```bash
# 绑定VENC通道和VO通道
echo "bind venc2 and vo2..."
vo 1 hdmi
vo 1 attr 1080P30 vo_1080P30
vo 1 chn 1
vo 1 layer 0
vo 1 layer 0 alpha 0xff
vo 1 layer 0 pos 0 $(($VoDev * 720))
venc 2 chn 2 bit 1024
venc 2 rc start
venc 2 chn 2 destory
```
以上就是实现多个HDMI的VI同时在同一个HDMI口输出的详细步骤,希望能对你有所帮助。