日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

海思3531DV100视频输入模块

發布時間:2023/12/29 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 海思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);

/******************************************step 4: start vpss and vi bind vpss(視頻處理) ******************************************/ s32Ret = SAMPLE_COMM_SYS_GetPicSize(enNorm, PIC_HD1080, &stSize); memset(&stGrpAttr,0,sizeof(VPSS_GRP_ATTR_S)); stGrpAttr.u32MaxW = stSize.u32Width; stGrpAttr.u32MaxH = stSize.u32Height; stGrpAttr.bNrEn = HI_TRUE; stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT; s32Ret = SAMPLE_COMM_VPSS_Start(s32VpssGrpCnt, &stSize, VPSS_MAX_CHN_NUM, &stGrpAttr);s32Ret = SAMPLE_COMM_VI_BindVpss(enViMode);

}

按照視頻輸入場景,依次初始化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;

/*** 通過視頻輸入場景,獲得輸入設備參數 ***/ s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);//手動設置輸入的視頻寬高 s32Ret = SAMPLE_COMM_VI_Mode2Size(enViMode, enNorm, &stCapRect, &stTargetSize);for(i=0; i<stViParam.s32ViDevCnt; i++) {ViDev = i * stViParam.s32ViDevInterval;s32Ret = SAMPLE_COMM_VI_StartDev(ViDev, enViMode);//根據視頻輸入場景,初始化輸入設備 }/*** Start VI Chn ***/ for(i=0; i<stViParam.s32ViChnCnt; i++) {ViChn = i * stViParam.s32ViChnInterval;if (SAMPLE_VI_MODE_16_1080P == enViMode|| SAMPLE_VI_MODE_16_720P == enViMode){/* When in the 16x1080p mode, bind chn 2,6,10,14 to way1 is needed */if (ViChn%4 != 0){s32Ret = HI_MPI_VI_GetChnBind(ViChn, &stChnBindAttr);//獲取 VI 通道綁定關系if (HI_ERR_VI_FAILED_NOTBIND == s32Ret){stChnBindAttr.ViDev = ViChn/4;stChnBindAttr.ViWay = 1;s32Ret = HI_MPI_VI_BindChn(ViChn, &stChnBindAttr);} }}s32Ret = SAMPLE_COMM_VI_StartChn(ViChn, &stCapRect, &stTargetSize, enViMode, VI_CHN_SET_NORMAL); }return HI_SUCCESS;

}

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;

case SAMPLE_VI_MODE_8_1080P:case SAMPLE_VI_MODE_16_1080P:pstDestSize->u32Width = 1920;pstDestSize->u32Height = 1080;pstCapRect->u32Width = 1920;pstCapRect->u32Height = 1080;break; case SAMPLE_VI_MODE_4_4Kx2K:pstDestSize->u32Width = 3840;pstDestSize->u32Height = 2160;pstCapRect->u32Width = 3840;pstCapRect->u32Height = 2160;break;default:SAMPLE_PRT("vi mode invaild!\n");return HI_FAILURE; }return HI_SUCCESS;

}

//打開對應的視頻輸入設備
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;
}

s32Ret = HI_MPI_VI_SetDevAttr(ViDev, &stViDevAttr);//設置 VI 設備屬性s32Ret = HI_MPI_VI_EnableDev(ViDev);//啟用 VI 設備return HI_SUCCESS;

}

/初始化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;

/*** Set Vpss Grp Attr ***/if(NULL == pstVpssGrpAttr) {stGrpAttr.u32MaxW = pstSize->u32Width;stGrpAttr.u32MaxH = pstSize->u32Height;stGrpAttr.enPixFmt = SAMPLE_PIXEL_FORMAT;stGrpAttr.bIeEn = HI_FALSE;stGrpAttr.bNrEn = HI_TRUE;stGrpAttr.bDciEn = HI_FALSE;stGrpAttr.bHistEn = HI_FALSE;stGrpAttr.bEsEn = HI_FALSE;stGrpAttr.enDieMode = VPSS_DIE_MODE_NODIE; } else {memcpy(&stGrpAttr,pstVpssGrpAttr,sizeof(VPSS_GRP_ATTR_S)); }for(i=0; i<s32GrpCnt; i++) {VpssGrp = i;/*** create vpss group ***/s32Ret = HI_MPI_VPSS_CreateGrp(VpssGrp, &stGrpAttr);/*** set vpss param ***/s32Ret = HI_MPI_VPSS_GetGrpParam(VpssGrp, &stVpssParam);stVpssParam.u32IeStrength = 0;s32Ret = HI_MPI_VPSS_SetGrpParam(VpssGrp, &stVpssParam);/*** enable vpss chn, with frame ***/for(j=0; j<s32ChnCnt; j++){VpssChn = j;/* Set Vpss Chn attr */stChnAttr.bSpEn = HI_FALSE;stChnAttr.bUVInvert = HI_FALSE;stChnAttr.bBorderEn = HI_TRUE;stChnAttr.stBorder.u32Color = 0xffffff;stChnAttr.stBorder.u32LeftWidth = 2;stChnAttr.stBorder.u32RightWidth = 2;stChnAttr.stBorder.u32TopWidth = 2;stChnAttr.stBorder.u32BottomWidth = 2;s32Ret = HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &stChnAttr);s32Ret = HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);}/*** start vpss group ***/s32Ret = HI_MPI_VPSS_StartGrp(VpssGrp); } return HI_SUCCESS;

}

//將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;

s32Ret = SAMPLE_COMM_VI_Mode2Param(enViMode, &stViParam);VpssGrp = 0; for (j=0; j<stViParam.s32ViChnCnt; j++) {ViChn = j * stViParam.s32ViChnInterval;stSrcChn.enModId = HI_ID_VIU;stSrcChn.s32DevId = 0;stSrcChn.s32ChnId = ViChn;stDestChn.enModId = HI_ID_VPSS;stDestChn.s32DevId = VpssGrp;stDestChn.s32ChnId = 0;s32Ret = HI_MPI_SYS_Bind(&stSrcChn, &stDestChn);VpssGrp ++; } return HI_SUCCESS;

}

總結

以上是生活随笔為你收集整理的海思3531DV100视频输入模块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。