• 2-2视频缓存池


    什么是视频缓存池?

    1.视频的本质是多帧图片,图片的本质的是RGB或者rawRGB数据,要占用一段连续内存

    2.视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算

    3.视频缓冲池(VB:video buffer)就是一段很大,又被合理划分和管理的内存,用来做视频数据的暂存和运算场地

    4.公共视频缓存池的【公共】可以理解为全局变量,也就是各个模块都能访问的一段内存

    5.看似视频缓冲块在各个模块之间流转,实际上并没有内存复制,而是指针在传递

    6.视频缓存池的内存有MPP维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)

    7.缓存池需要几个,每个包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用mpp的相关api来向mpp申请分配的

    相关数据结构和api

    1.VB_CONF_S:定义视频缓存池属性结构体

    typedef struct hiVB_CONF_S
    {
        HI_U32 u32MaxPoolCnt;     /* max count of pools, (0,VB_MAX_POOLS]  */    
        struct hiVB_CPOOL_S
        {
            HI_U32 u32BlkSize;//每个缓存池的缓存块大小
            HI_U32 u32BlkCnt;//缓存块的数量
            HI_CHAR acMmzName[MAX_MMZ_NAME_LEN];//缓存块的名字
        }astCommPool[VB_MAX_COMM_POOLS];
    } VB_CONF_S;

    2.HI_MPI_VB_SetConf:设置 MPP 视频缓存池属性

    3.HI_MPI_VB_Init:初始化 MPP 视频缓存池

    /******************************************************************************
    * function : vb init & MPI system init
    ******************************************************************************/
    HI_S32 SAMPLE_COMM_SYS_Init(VB_CONF_S* pstVbConf)
    {
        MPP_SYS_CONF_S stSysConf = {0};
        HI_S32 s32Ret = HI_FAILURE;
    
        HI_MPI_SYS_Exit();
        HI_MPI_VB_Exit();
    
        if (NULL == pstVbConf)
        {
            SAMPLE_PRT("input parameter is null, it is invaild!
    ");
            return HI_FAILURE;
        }
    
        s32Ret = HI_MPI_VB_SetConf(pstVbConf);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VB_SetConf failed!
    ");
            return HI_FAILURE;
        }
    
        s32Ret = HI_MPI_VB_Init();
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_VB_Init failed!
    ");
            return HI_FAILURE;
        }
    
        stSysConf.u32AlignWidth = SAMPLE_SYS_ALIGN_WIDTH;
        s32Ret = HI_MPI_SYS_SetConf(&stSysConf);
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_SYS_SetConf failed
    ");
            return HI_FAILURE;
        }
    
        s32Ret = HI_MPI_SYS_Init();
        if (HI_SUCCESS != s32Ret)
        {
            SAMPLE_PRT("HI_MPI_SYS_Init failed!
    ");
            return HI_FAILURE;
        }
    
        return HI_SUCCESS;
    }
  • 相关阅读:
    RHEL6.x 删除Oracle11g
    通过IPV6上QQ及自建IPV6代理的方法
    Carrier frequency and EARFCN
    FDD LTE frequency band allocations
    Cmake参考资料
    sigal & mq_notify
    哈夫曼编码与解码
    哈夫曼数与哈夫曼编码
    算法做题顺序
    我的大学
  • 原文地址:https://www.cnblogs.com/muzihuan/p/11527672.html
Copyright © 2020-2023  润新知