海思3531DV100视频输入模块
海思3531DV100視頻輸入模塊(VI)
VI 可以對接收到的原始視頻圖像數據進行裁剪(Crop)、水平垂直縮小(Down Scaling)和水平垂直翻轉(Mirror、Flip)等處理,并實現一路或多路原始視頻圖像輸入,輸出一路或多路視頻圖像功能。
視頻輸入設備支持標準 BT.656、標準 BT.1120、自定義時序等若干種時序輸入,負責對時序進行解析。
Hi3531DV100 芯片有 5 個 BT.1120 接口,除第 5 個 BT.1120 接口外,每個 BT.1120 接口依次對應兩個 VI 設備,即第 1 個 BT.1120 口對應 VI 的 Dev0 和 Dev1,第 2 個BT.1120 口對應 VI 的 Dev2 和 Dev3,第 3 個 BT.1120 口對應 VI 的 Dev4 和 Dev5,第 4個 BT.1120 口對應 VI 的 Dev6 和 Dev7。第 5 個 BT.1120 口是專用于級聯的,對應DEV8,共8+1個輸入設備。
前 8 個 VI 設備均支持 1/2/4 路 D1(D1:480i:720×480,幾乎相當于我們所說的4CIF(720×576);)、960H 復合模式輸入(BT.656 協議),以及 2 路720P 復合模式。當前 8 個設備配置為支持 720P/1080P 高清輸入(BT.1120 協議),此時,同一個 BT1120 接口的另一個 Dev 不可用,即 DEV0、DEV1 中只能一個可用;DEV2、DEV3 中只能用一個,依此類推。DEV 的選擇與 VI 的時鐘必須一致,以DEV0 和 DEV1 為例,如果時鐘選擇為 VI0_CLK,則 DEV 選擇為 DEV0,如果時鐘選擇為 VI1_CLK,則 DEV 選擇為 DEV1,其他 DEV 依次類推。
綁定關系
Hi3531DV100 VI 有 9 個設備和 33 個物理通道,除級聯設備外每個設備默認與對應的 4個通道綁定,其鐘一個設備綁定關系如圖 所示
級聯設備綁定關系
通過cat /proc/umap/vi可以查看vi狀態,如下圖。
圖中顯示了配置的vi設備及通道,板子使用了24通道,為vi設備6的通道0,同時顯示了接受的數據幀數。
下圖說明了具體的vi設備配置屬性,使用的接口及復用情況等。
下圖說明了具體的vi綁定關系,中斷次數,獲取 VideoBuffer 失敗次數,丟失中斷次數,圖像幀場標志:frm:逐行圖像,intl:隔行圖像,圖片一行跨度。
通過cat /proc/umap/sys可以查看整個系統綁定狀態,如下圖。
這幅圖說明了我綁定的資源為vi設備6綁定了vpss的group6的1號通道,vpss再綁定vo(視頻輸出)。
下面的代碼塊配置說明為了簡潔,已經把if安全判斷刪除
次代碼為配置視頻輸入的主要代碼,為打開vi(視頻輸入)設備,vpss(視頻處理)設備,將vi的數據綁定vpss,綁定后,vi采集的數據將自動傳輸給綁定的vpss
{
s32Ret = SAMPLE_COMM_VI_Start(enViMode, enNorm);
}
按照視頻輸入場景,依次初始化VI設備
HI_S32 SAMPLE_COMM_VI_Start(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm)
{
VI_DEV ViDev;
VI_CHN ViChn;
HI_S32 i;
HI_S32 s32Ret;
SAMPLE_VI_PARAM_S stViParam;
SIZE_S stTargetSize;
RECT_S stCapRect;
VI_CHN_BIND_ATTR_S stChnBindAttr;
}
HI_S32 SAMPLE_COMM_VI_Mode2Param(SAMPLE_VI_MODE_E enViMode, SAMPLE_VI_PARAM_S pstViParam)
{
switch (enViMode)
{
case SAMPLE_VI_MODE_32_D1:
case SAMPLE_VI_MODE_32_960H:
case SAMPLE_VI_MODE_32_1280H:
case SAMPLE_VI_MODE_32_HALF720P:
/ use chn 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16*/
pstViParam->s32ViDevCnt = 4;
pstViParam->s32ViDevInterval = 1;//設備號間隔
pstViParam->s32ViChnCnt = 16;
pstViParam->s32ViChnInterval = 1;//通道號間隔
break;
case SAMPLE_VI_MODE_16_720P:
case SAMPLE_VI_MODE_16_1080P:
/* use chn 0,2,4,6,8,10,12,14,16,18,20,22,24,28,30,32 /
pstViParam->s32ViDevCnt = 8;
pstViParam->s32ViDevInterval = 1;
pstViParam->s32ViChnCnt = 16;
pstViParam->s32ViChnInterval = 2;
break;
case SAMPLE_VI_MODE_8_720P:
case SAMPLE_VI_MODE_8_1080P:
/ use chn 0,4,8,12,16,20,24,28 */
pstViParam->s32ViDevCnt = 8;
pstViParam->s32ViDevInterval = 1;
pstViParam->s32ViChnCnt = 8;
pstViParam->s32ViChnInterval = 4;
break;
default:
SAMPLE_PRT(“ViMode invaild!\n”);
return HI_FAILURE;
}
return HI_SUCCESS;
}
//設置輸入視頻寬高
HI_S32 SAMPLE_COMM_VI_Mode2Size(SAMPLE_VI_MODE_E enViMode, VIDEO_NORM_E enNorm, RECT_S *pstCapRect, SIZE_S *pstDestSize)
{
pstCapRect->s32X = 0;
pstCapRect->s32Y = 0;
switch (enViMode)
{
case SAMPLE_VI_MODE_32_D1:
pstDestSize->u32Width = 720; //圖像目標寬度(由捕獲圖像縮放得到)
pstDestSize->u32Height = (VIDEO_ENCODING_MODE_PALenNorm)?576:480;
pstCapRect->u32Width = 576; //捕獲視頻輸入區域起始位置
pstCapRect->u32Height = (VIDEO_ENCODING_MODE_PALenNorm)?576:480;
break;
case SAMPLE_VI_MODE_32_960H:
pstDestSize->u32Width = 960;
pstDestSize->u32Height = (VIDEO_ENCODING_MODE_PALenNorm)?576:480;
pstCapRect->u32Width = 960;
pstCapRect->u32Height = (VIDEO_ENCODING_MODE_PALenNorm)?576:480;
break;
case SAMPLE_VI_MODE_8_720P:
case SAMPLE_VI_MODE_16_720P:
pstDestSize->u32Width = 1280;
pstDestSize->u32Height = 720;
pstCapRect->u32Width = 1280;
pstCapRect->u32Height = 720;
break;
}
//打開對應的視頻輸入設備
HI_S32 SAMPLE_COMM_VI_StartDev(VI_DEV ViDev, SAMPLE_VI_MODE_E enViMode)
{
HI_S32 s32Ret;
VI_DEV_ATTR_S stViDevAttr;
memset(&stViDevAttr,0,sizeof(stViDevAttr));
//主要設置視頻輸入 接口模式;1、2、4 路復合工作模式; 分量掩碼配置;時鐘邊沿模式;入數據順序 (僅支持 yuv 格式)。
switch (enViMode)
{
case SAMPLE_VI_MODE_32_D1:
memcpy(&stViDevAttr,&DEV_ATTR_BT656D1_4MUX,sizeof(stViDevAttr));
SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
break;
case SAMPLE_VI_MODE_32_960H:
memcpy(&stViDevAttr,&DEV_ATTR_BT656D1_4MUX,sizeof(stViDevAttr));
SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
break;
case SAMPLE_VI_MODE_8_720P:
case SAMPLE_VI_MODE_8_1080P:
memcpy(&stViDevAttr,&DEV_ATTR_TP2823_720P_1MUX_BASE,sizeof(stViDevAttr));
SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
break;
case SAMPLE_VI_MODE_16_720P:
memcpy(&stViDevAttr,&DEV_ATTR_TP2823_720P_2MUX_BASE,sizeof(stViDevAttr));
SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
break;
case SAMPLE_VI_MODE_16_1080P:
memcpy(&stViDevAttr,&DEV_ATTR_7441_BT1120_STANDARD_BASE,sizeof(stViDevAttr));
SAMPLE_COMM_VI_SetMask(ViDev,&stViDevAttr);
break;
default:
SAMPLE_PRT(“vi input type[%d] is invalid!\n”, enViMode);
return HI_FAILURE;
}
}
/初始化vpss,vpss支持4個通道,具體屬性在下節說明/
HI_S32 SAMPLE_COMM_VPSS_Start(HI_S32 s32GrpCnt, SIZE_S *pstSize, HI_S32 s32ChnCnt,VPSS_GRP_ATTR_S *pstVpssGrpAttr)
{
VPSS_GRP VpssGrp;
VPSS_CHN VpssChn;
VPSS_GRP_ATTR_S stGrpAttr = {0};
VPSS_CHN_ATTR_S stChnAttr = {0};
VPSS_GRP_PARAM_S stVpssParam = {0};
HI_S32 s32Ret;
HI_S32 i, j;
}
//將vi的設備綁定對應vpss。至此,vi的通道數據就可以到達vpss。
HI_S32 SAMPLE_COMM_VI_BindVpss(SAMPLE_VI_MODE_E enViMode)
{
HI_S32 j, s32Ret;
VPSS_GRP VpssGrp;
MPP_CHN_S stSrcChn;
MPP_CHN_S stDestChn;
SAMPLE_VI_PARAM_S stViParam;
VI_CHN ViChn;
}
總結
以上是生活随笔為你收集整理的海思3531DV100视频输入模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux上源码安装py2exe
- 下一篇: 3.8寻找字符串中的手机号