zl程序教程

您现在的位置是:首页 >  其它

当前栏目

海思 关于视频层和通道的认识

关于 视频 认识 通道 海思
2023-09-14 09:13:10 时间

一、视频层和通道号的关系

SDK 将通道归属于视频层管理,一个视频层上可显示多个视频,每一个视频显示区域称为一个通道,视频被限制通道内,通道被限制在视频层内。对于一个视频层,其上面的通道都是独立的。同时,不同的视频层上的通道也是独立的。

指定视频层的通道号的视频暂停:HI_MPI_VO_PauseChn(0, 0);

HI_S32 HI_MPI_VO_PauseChn (VO_LAYER VoLayer, VO_CHN VoChn);

暂停视频层号(VoLayer)为0,通道号(VoChn)为0的视频。

typedef HI_S32 AI_CHN;
typedef HI_S32 AO_CHN;
typedef HI_S32 AENC_CHN;
typedef HI_S32 ADEC_CHN;
typedef HI_S32 AUDIO_DEV;
typedef HI_S32 AVENC_CHN;
typedef HI_S32 VI_DEV;
typedef HI_S32 VI_WAY;
typedef HI_S32 VI_CHN;
typedef HI_S32 VO_DEV;
typedef HI_S32 VO_LAYER;
typedef HI_S32 VO_CHN;
typedef HI_S32 VO_WBC;
typedef HI_S32 GRAPHIC_LAYER;
typedef HI_S32 VENC_CHN;
typedef HI_S32 VDEC_CHN;
typedef HI_S32 VENC_GRP;
typedef HI_S32 VO_GRP;
typedef HI_S32 VDA_CHN;
typedef HI_S32 IVE_HANDLE;
typedef HI_S32 CLS_HANDLE;
typedef HI_S32 FD_CHN;
typedef HI_S32 MD_CHN;

sample_comm_vdec.c文件SAMPLE_COMM_VDEC_CmdCtrl();函数。

HI_VOID SAMPLE_COMM_VDEC_CmdCtrl(HI_S32 s32ChnNum,VdecThreadParam *pstVdecSend)
{
    HI_S32 i;
    HI_S32 s32FrameRate = 0;
    HI_BOOL /*bIsPause = HI_FALSE, */bVoPause = HI_FALSE;
    VDEC_CHN_STAT_S stStat;
    char c=0;
         for (i=0; i<s32ChnNum; i++) 
        pstVdecSend[i].cUserCmd = 0;   
    while(1)    
    {
        printf("\nSAMPLE_TEST:press 'e' to exit; 'p' to pause/resume; 'q' to query!;'s' to step!;'a' to add!;'d' to sub!;\n"); 
          
        c = getchar();
        if(10 == c)
        {
            continue;
        }
        getchar();
        if (c == 'e')
        {      
            for (i=0; i<s32ChnNum; i++) 
            pstVdecSend[i].cUserCmd = 0; 
            break;
        }
//此处省略注释的代码
        else if (c == 'p')  
        {
            if (bVoPause)
            {   
                HI_MPI_VO_ResumeChn(0, 0);  
                HI_MPI_VO_ResumeChn(1, 0); 
                printf("VO Resume.");
            }
            else
            {  
                HI_MPI_VO_PauseChn(0, 0);  
                HI_MPI_VO_PauseChn(1, 0); 
                printf("VO Pause.");
            }
            bVoPause = !bVoPause;              
        }
        else if (c == 'a')        
        {   
            for(i = 0; i < 2; i++)
            {      
                HI_MPI_VO_GetChnFrameRate(i, 0, &s32FrameRate);  
                if (s32FrameRate >= 120)
                {
                    printf("VO layer %d is larger than 120.", i);
                    continue;
                }
                s32FrameRate += 10;
                HI_MPI_VO_SetChnFrameRate(i, 0, s32FrameRate);  
                printf("VO layer %d is set to %d.", i, s32FrameRate);
             }
        }
        else if (c == 'd')        
        {      
            for(i = 0; i < 2; i++)
            {      
                HI_MPI_VO_GetChnFrameRate(i, 0, &s32FrameRate);  
                if (s32FrameRate < 10)
                {
                    printf("VO layer %d is less than 10.", i);
                    continue;
                }
                s32FrameRate -= 10;
                HI_MPI_VO_SetChnFrameRate(i, 0, s32FrameRate);  
                printf("VO layer %d is set to %d.", i, s32FrameRate);
             }
        }
        else if (c == 's')        
        {    
            if (bVoPause == HI_FALSE)
            {
                printf("Firstly press 'p' to pause,then step.");
                continue;
            }
            HI_MPI_VO_StepChn(0, 0);  
            HI_MPI_VO_StepChn(1, 0); 
            printf("VO Step.");
        }
        else if (c == 'q')        
        {           
            for (i=0; i<s32ChnNum; i++)  
            {              
                HI_MPI_VDEC_Query(pstVdecSend[i].s32ChnId, &stStat);     
                PRINTF_VDEC_CHN_STATE(pstVdecSend[i].s32ChnId, stStat);
            }
        }
        fflush(stdout);
    }
}

二、Vi通道间的关系

主要是vi设备、vi通道、编码通道组以及编码通道间的一些分配关系,没有涉及输出设备、音频以及解码等通道关系。

2.1 vi设备、vi通道、编码通道组以及编码通道间关系

在这里插入图片描述

注:
1.Hi3515有4个VI设备端口,每个设备最多可接4路视频(视频输入通道与物理上的实际视频采集通道一一对应)。
2.hi3515最多支持8路视频输入(VI通道)即设置接口模式为ITU-R BT.656,工作模式为4D1时成立。此时只有VI设备0和设备2有效。
3.一个编码通道组最多可同时包含1路主码流(H.264/MJPEG)、1路次码流(H.264/MJPEG),或者仅包含1路JPEG抓拍(即 JPEG抓拍时,不允许包含任何其他通道),或者1路MPEG4编码通道。
4.最大编码组的个数为64,最大编码通道个数也为64。
5.主次码流直接由源图像编码得到,主码流由源图像缩小后编码得到 ,次码流编码图像支持的最大尺寸为 CIF。主码流用于本地存储,子码流适用于图像在低带宽网络上传输。

三、Hi3518C通道讲解

最近在折腾HI3518C的芯片,应用到IPCamera上,最终获取多路不同分辨率的视频流供不同需求的预览切换。此处简单记录一下视频前处理元VPSS(Video Process Sub-System)的多通道间的关系以及使用心得。

HI3518C的视频子系统包括:视频系统初始化模块(MPP_SYS_CONF_S)、视频输入模块(VI)、视频前处理模块(VPSS)、视频编码模块(VENC)和视频输出模块(VO)组成。

HI3518C的VPSS是视频数据编码前的预处理单元,主要完成对一幅输入图像的统一预处理,如去噪、去隔行等,然后再对各通道分别进行缩放、锐化等处理(如:PreScale、De-ring/De-block、NR、IE、DIE、Sharpen 等,具体可参见VPSS_GRP_ATTR_S结构体),最后输出多种不同分辨率的图像。

其中,HI3518C对用提供GROUP的概念来管理VPSS,最多支持128个GROUP(我目前只使用了一个组:GROUP0)。VPSS的GROUP又包含多个通道(CHANNEL),对于不同规格的芯片,每个组包含的通道数也不相同,规格文档上都有详细说明。

HI3518C的各个GROUP包含8个CHANNEL,其中2个物理通道(PHY CHN)、一个直通通道(Bypass)和5个扩展通道(EXT CHN)。

物理通道是由硬件提供的,各物理通道的功能和限制各不相同;直通通道具备CROP功能,可以把不需要作预处理的一幅幅图像直接透传给接收者;扩展通道具备缩放功能,当它绑定到物理通道后,可以把从物理通道获取到的图像缩小或放大成用户所需要的不同分辨率的图像。Hi3518C 提供 5 路扩展通道以提供更好的灵活性,扩展通道具备缩放和帧率控制功能,不经过其他硬件算法单元处理。

用户在使用的时候,需要首先创建VPSS GROUP,然后设置好GROUP属性并启用VPSS GROUP之后,再把VI作为源通道,把VPSS作为目标通道,通过调用 HI_MPI_SYS_Bind 绑定VI到VPSS,就可以建立视频输入到视频预处理间的通路,使得前端采集到的视频数据经由此通路到达VPSS单元。注意,每个 GROUP 仅可与一个输入源绑定。

然后,就是根据实际需要来创建多个VPSS CHANNEL,从CHANNEL中获得所需要的目标分辨率的图像输出了。

HI3518C的物理通道0无缩放能力,支持锐化,不支持抽场,一般用于大码流编码和JPEG抓拍。

HI3518C的物理通道1,水平、垂直均最大支持 8 倍缩小,水平、垂直均最大支持 8 倍放大,支持锐化, 不支持抽场,一般用于小码流编码和CVBS(复合视频广播信号)预览。

因此,用户可以通过CHANNEL(0)来获取到前端图像采集模块所支持的最大像素分辨率的图像,也就是说,如果前端sensor支持的最大图像分辨率为19201080像素,那么经CHANNEL0所得到的图像就是19201080像素格式,并且不可以把该通道的数据再作为其它扩展通道的源来进行图像的放大或缩小处理。

用户可以通过CHANNEL(1)来获取到的图像为用户任意指定的合法的像素大小,通过指定像素格式及宽高大小,进行预处理后可以作为视频编码模块(VENC)的输入。同时,用户可以把该通道作为后面所要建立的扩展通道的源,通过设置所要建立的扩展通道的属性(主要指:绑定的源通道号、图像帧率、图像宽高等,见VPSS_EXT_CHN_ATTR_S结构体),再经由各扩展通道来获取到的所需的目标分辨率。

用户还可通过扩展通道CHANNEL(3、4、5、6、7)来获取除VI所支持的最大分辨率以外的各种符合标准的不同分辨率图像,比如前端sensor支持最大分辨率为19201080,那么结合扩展通道的使用,用户就可以获取到HD720(1280720)、VGA(640480)、QVGA(320240)、CIF(352288)、QCIF(176144)等分辨率的图像了。

注意,当把通道 1 作为输入源的时候,要设置通道 1 为USER模式。因为HI3518C只有两个物理通道,通道0不具备缩放功能,所以只有通道1可以作为扩展通道的源,对图像进行缩放处理。

其中,VPSS GROUP有两种工作模式:AUTO 和 USER,两种模式间可动态切换。默认的工作模式为 AUTO,此模式下各通道仅可与一个接收者绑定。若想使用 USER 模式,则需调用 MPI 接口进行设置,同时指定所需图像的大小和格式,此模式下各通道可与多个接收者绑定。需要特别注意的是,USER 模式主要用于对同一通道图像进行多路编码的场景,此模式下播放控制不生效,因此预览和回放场景下不建议使用。Bypass 通道只能工作在 AUTO 模式,可与多个接收者绑定。