【海思SS626 | VB】关于 视频缓存池 的理解

news2024/11/27 6:26:32

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍海思视频缓存池🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
⏰发布时间⏰: 2024-08-12 23:03:45

本文未经允许,不得转发!!!

目录

  • 🎄一、概述
  • 🎄二、公共视频缓存池(Common VB)
  • 🎄三、模块视频缓存池(Module VB)
  • 🎄四、私有视频缓存池(Private VB)
  • 🎄五、用户视频缓存池(User VB)
  • 🎄六、


在这里插入图片描述
在这里插入图片描述

🎄一、概述

海思芯片的一个主要功能就是处理音视频,而处理音视频(特别是视频)时需要大量的内存暂存或运算视频帧。海思芯片又将物理内存分成两部分:OS内存、MMZ内存。这些专门用来处理视频的内存,在海思MPP中被称为 视频缓存池 。本文就根据自己的理解介绍海思MPP的视频缓存池。

关于OS内存、MMZ内存不了解的,可以参考这篇文章:【海思SS626 | 内存管理】海思芯片的OS内存、MMZ内存设置

视频缓冲池(VB,Video Buffer):就是一段很大、又被合理划分和管理的内存,这段内存是从 MMZ内存 中分配的,专门用来做视频数据的暂存和运算场地。 视频缓存池由海思MPP系统管理,用户可以通过调用海思MPP的相关 API 函数来管理视频缓存池。视频缓存池主要有以下四类:

  • 公共视频缓存池(Common VB);
  • 模块视频缓存池(Module VB);
  • 私有视频缓存池(Private VB);
  • 用户视频缓存池(User VB);

操作VB的相关API函数如下:
在这里插入图片描述


在这里插入图片描述

🎄二、公共视频缓存池(Common VB)

公共视频缓存池,是各个模块都能访问的一段内存。

下面内容引用自 SS626ReleaseDoc\zh\01.software\board\MPP\MPP 媒体处理软件 V5.0 开发参考.pdf 2.3.1 小节

  • 视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。
  • 一组大小相同、物理地址连续的缓存块组成一个视频缓存池。必须在系统初始化之前配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。
  • 所有的视频输入通道都可以从公共视频缓存池中获取视频缓存块用于保存采集的图像。

下图典型的公共视频缓存池数据流图:

  • VI 从公共视频缓存池 B 中获取视频缓存块 Bm,缓存块 Bm 经 VI 发送给 VPSS,输入缓存块 Bm 经过 VPSS 处理之后被释放回公共视频缓存池。
  • 假设 VPSS 通道的工作模式是 USER,则 VPSS 通道 0 从公共视频缓存池 B 中获取缓存块 Bi 作为输出图像缓存 buffer 发送给 VENC,Bi 经 VENC 编码完之后释放回公共视频缓存池;VPSS 通道 1 从公共视频缓存池 B 中获取缓存块 Bk 作为输出图像缓存 buffer 发送给 VO,,Bk 经 VO 显示完之后释放回公共视频缓存池。
  • 看起来是缓存块在各个模块中流转,实际上只是传递视频缓存块的指针,这样可以避免大量的内存复制。

在这里插入图片描述

设置的公共缓存池,MPP系统也会去获取,并不是只有调用 get_blk 才会获取。

下面是分配公共视频缓存池的例子:

// 01_sys_vb
// aarch64-mix410-linux-gcc 01_sys_vb.c -I hi_sdk/SS626V100_SDK_V2.0.1.0/include/ -L hi_sdk/SS626V100_SDK_V2.0.1.0/lib/ \
-lsecurec -lpthread -ldl -lm -lmpi -ldnvqe -lupvqe -lVoiceEngine -o sys_vb

#include "hi_common_sys.h"
#include "hi_common_vb.h"

#include "hi_mpi_vb.h"
#include "hi_mpi_sys.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/* vb init & MPI system init */
hi_s32 sample_comm_sys_init(const hi_vb_cfg *vb_cfg)
{
    hi_s32 ret;

    hi_mpi_sys_exit();
    hi_mpi_vb_exit();

    if (vb_cfg == HI_NULL) {
        printf("input parameter is null, it is invalid!\n");
        return HI_FAILURE;
    }

    ret = hi_mpi_vb_set_cfg(vb_cfg);
    if (ret != HI_SUCCESS) {
        printf("hi_mpi_vb_set_conf failed!\n");
        return HI_FAILURE;
    }

    ret = hi_mpi_vb_init();
    if (ret != HI_SUCCESS) {
        printf("hi_mpi_vb_init failed!\n");
        return HI_FAILURE;
    }

    ret = hi_mpi_sys_init();
    if (ret != HI_SUCCESS) {
        printf("hi_mpi_sys_init failed!\n");
        hi_mpi_vb_exit();
        return HI_FAILURE;
    }

    return HI_SUCCESS;
}

/* vb exit & MPI system exit */
hi_void sample_comm_sys_exit(hi_void)
{
    hi_mpi_sys_exit();
    hi_mpi_vb_exit_mod_common_pool(HI_VB_UID_VDEC);
    hi_mpi_vb_exit_mod_common_pool(HI_VB_UID_VDEC_ADAPT);
    hi_mpi_vb_exit();
    return;
}

int main()
{
	hi_vb_cfg vb_conf = {0};
	vb_conf.max_pool_cnt = 1;/* 1 pool cnt */
    vb_conf.common_pool[0].blk_cnt = 11;
    vb_conf.common_pool[0].blk_size = 1920*1080*1.5;
	sample_comm_sys_init(&vb_conf);
	
	int count = 0;
	while(count++ < 20)
		sleep(1);
	
	sample_comm_sys_exit();
	return 0;
}

运行后可以使用cat /proc/umap/vb查看分配的视频缓存池,如下图:
在这里插入图片描述


在这里插入图片描述

🎄三、模块视频缓存池(Module VB)

模块视频缓存池是特定的模块才会使用。SS626的模块视频缓冲池仅适用于VDEC模块,解码帧存分配方式可通过接口ss_mpi_vdec_set_mod_param的参数vb_src来设置。HI_VB_SRC_MOD表示设置为模块视频缓存池。

解码ModuleVB池:创建解码通道时不分配图像Buffer,而是由用户调用相应的MPI接口创建专属于解码模块的ModuleVB池,该VB池只允许VDEC获取VB块,其它模块只能使用不能获取。

对于SS626V100,不同的解码通道部署模式使用的模块VB池不同:部署模式为OT_VDEC_DEPLOYMENT_MODE0的通道,模块vb使用uid为OT_VB_UID_VDEC的ModuleVB池;部署模式为OT_VDEC_DEPLOYMENT_MODE0的通道,模块vb使用uid为OT_VB_UID_VDEC_ADAPT的ModuleVB池。

使用解码ModuleVB池方式时要在创建解码通道之前要先创建专属于VDEC的模块VB池,使用解码UserVB方式时也要先创建用于解码的视频缓存VB池,且要保证VB块的大小和个数满足当前解码通道所需图像Buffer的大小和个数。

H264、 H265、MPEG4解码每个解码通道所需VB个数至少为参考帧+显示帧+1, JPEG/MJPEG解码每个解码通道所需VB个数至少为显示帧+1。不同协议解码所需的图像VB块大小不同,具体计算方法可参见ot_buffer.h里面的函数ot_vdec_get_pic_buf_size

模块视频缓存池的使用:

  • 必须先调用 ss_mpi_vb_init 进行公共视频缓冲池初始化。
  • 必须先调用 ss_mpi_vb_set_mod_pool_cfg 配置缓存池属性,再初始化缓存池,否则会失败。
  • VDEC模块公共池仅在解码帧存分配方式使用模块公共VB池时才需要创建。

模块视频缓存池相关的api函数:

td_s32 ss_mpi_vb_init_mod_common_pool(ot_vb_uid vb_uid);
td_s32 ss_mpi_vb_exit_mod_common_pool(ot_vb_uid vb_uid);
td_s32 ss_mpi_vb_set_mod_pool_cfg(ot_vb_uid vb_uid, const ot_vb_cfg *vb_cfg);
td_s32 ss_mpi_vb_get_mod_pool_cfg(ot_vb_uid vb_uid, ot_vb_cfg *vb_cfg);

在这里插入图片描述

🎄四、私有视频缓存池(Private VB)

海思 SS626 的 编码帧存、解码帧存 都可以设置成私有视频缓存池(Private VB)。私有视频缓存池一般由MPP系统内部创建并使用的,没有相关的api接口函数。

编码PrivateVB池方式:

可以调用 ss_mpi_venc_set_mod_param 接口将模块参数设置为OT_VB_SRC_PRIVATE表示使用编码PrivateVB池方式。

创建编码通道时由VENC创建私有VB池作为该通道的参考帧和重构帧buffer。使用PrivateVB方式时每个编码通道之间没有关联,单独销毁某个通道对其它通道无影响,使用灵活。

解码PrivateVB池:
可以调用 ss_mpi_vdec_set_mod_param 的将模块参数参数vb_src设置为OT_VB_SRC_PRIVATE表示使用解码PrivateVB池方式。

创建解码通道时由VDEC创建私有VB池作为该通道的图像Buffer,用户可以在创建通道接口ss_mpi_vdec_create_chn中设置私有VB池的个数frame_buf_cnt和VB块的大小frame_buf_size

如果解码帧存分配方式使用的是解码PrivateVB池,则用户需要根据解码码流配置解码所需的帧存VB大小frame_buf_size和个数frame_buf_cnt,以及存放tmv信息的VB大小tmv_buf_size解码器内部按此配置创建相应的私有VB池。


在这里插入图片描述

🎄五、用户视频缓存池(User VB)

如果使用UserVB方式,需要先创建VB池,再把n个通道绑定到对应的VB池中。通道个
数大于2的情况,使用UserVB可以减少内存消耗,需要的帧存个数请参考多通道使用
的情况;通道数为1或2的情况,也不会增加内存消耗,此时需要的帧存个数可以参考
单通道使用的情况。

在这里插入图片描述

🎄六、

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁

参考:
《MPP 媒体处理软件 V5.0 开发参考.pdf》
什么是视频缓存池
https://blog.csdn.net/weixin_42031299/article/details/129477605

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2045004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#】explicit、implicit与operator

字面解释 explicit&#xff1a;清楚明白的;易于理解的;(说话)清晰的&#xff0c;明确的;直言的;坦率的;直截了当的;不隐晦的;不含糊的。 implicit&#xff1a;含蓄的;不直接言明的;成为一部分的;内含的;完全的;无疑问的。 operator&#xff1a;操作人员;技工;电话员;接线员;…

OSL 冠名赞助Web3峰会 “FORESIGHT2024”圆满收官

OSL 望为香港数字资产市场发展建设添砖加瓦 &#xff08;香港&#xff0c;2024 年 8 月 13 日&#xff09;- 8 月 11 日至 12 日&#xff0c; 由 香港唯一专注数字资产的上市公司 OSL 集团&#xff08;863.HK&#xff09;冠名赞助&#xff0c;Foresight News、 Foresight Ventu…

C++ 11相关新特性(lambda表达式与function包装器)

目录 lambda表达式 引入 lambda表达式介绍 lambda表达式捕捉列表的传递形式 lambda表达式的原理 包装器 包装器的基本使用 包装器与重载函数 包装器的使用 绑定 C 11 新特性 lambda表达式 引入 在C 98中&#xff0c;对于sort函数来说&#xff0c;如果需要根据不同的比较方式实现…

Springboot日志监听功能

目录 1. 概述1.1. 需求1.2. 思路 2. 功能实现2.1 依赖选取2.2 编写logBack.xml2.3 日志拦截2.4 封装请求为HttpServletRequestWrapper2.5 AOP2.6 日志监听 3. 后记 1. 概述 1.1. 需求 背景&#xff1a;拆分支付系统的日志&#xff0c;把每笔单子的日志单独拎出来存库。每笔单…

如何将高清图片修复?3个方法一键还原图片

如何将高清图片修复&#xff1f;高清图片修复是一个涉及图像处理技术的复杂过程&#xff0c;是对图片进行简单的调整或优化。这个过程旨在最大程度地恢复和提升图片的清晰度、细节和整体视觉效果&#xff0c;使其更加逼真、生动。通过高清图片的修复&#xff0c;我们可以让老旧…

稀疏注意力:时间序列预测的局部性和Transformer的存储瓶颈

时间序列预测是许多领域的重要问题&#xff0c;包括对太阳能发电厂发电量、电力消耗和交通拥堵情况的预测。在本文中&#xff0c;提出用Transformer来解决这类预测问题。虽然在我们的初步研究中对其性能印象深刻&#xff0c;但发现了它的两个主要缺点:(1)位置不可知性:规范Tran…

C++_2_ inline内联函数 宏函数(2/3)

C推出了inline关键字&#xff0c;其目的是为了替代C语言中的宏函数。 我们先来回顾宏函数&#xff1a; 宏函数 现有个需求&#xff1a;要求你写一个Add(x,y)的宏函数。 正确的写法有一种&#xff0c;错误的写法倒是五花八门&#xff0c;我们先来“见不贤而自省也。” // …

windows下部署redis3.2

一、下载redis3.2的包 6.2.6的包也有&#xff0c;但无法安装为Windows服务&#xff0c;暂时舍弃。 直接运行&#xff1a; redis-server redis.windows.conf 修改密码, 对应 redis.windows.conf 中的 requirepass 节点&#xff0c;注意去掉前面的# 修改端口&#xff0c;对应…

缺陷检测AI 重要参数解释

一、参数介绍 基本参数 True Positives (TP) True Positives (TP) 是一个用于评估模型性能的术语。它指的是模型正确预测为正例&#xff08;Positive&#xff09;的样本数量&#xff0c;即实际为正例且被正确分类为正例的样本数量。 False Positives (FP) FP (False Posit…

Python 文件目录操作,以及json.dump() 和 json.load()

import os 是用来引入 Python 标准库中的 os 模块的&#xff0c;这个模块提供了与操作系统交互的功能。这个模块常用于文件和目录操作&#xff0c;比如获取文件的目录路径、创建目录等。 如果你在代码中需要使用与操作系统相关的功能&#xff08;例如获取目录名、检查文件是否…

qt-11基本对话框(消息框)

基本对话框--消息框 msgboxdlg.hmsgboxdlg.cppmain.cpp运行图QustionMsgInFormationMsgWarningMsgCriticalMsgAboutMsgAboutAtMsg自定义 msgboxdlg.h #ifndef MSGBOXDLG_H #define MSGBOXDLG_H#include <QDialog> #include <QLabel> #include <QPushButton>…

Cesium模型制作,解决Cesium加载glb/GLTF显示太黑不在中心等问题

Cesium模型制作&#xff0c;解决Cesium加载glb/GLTF显示太黑不在中心等问题 QQ可以联系这里&#xff0c;谢谢

电商搜索新纪元:大模型引领购物体验革新

随着电商行业的蓬勃发展&#xff0c;搜索技术作为连接用户与商品的桥梁&#xff0c;其重要性日益凸显。在技术不断革新的今天&#xff0c;电商搜索技术经历了哪些阶段&#xff1f;面对大模型的飞速发展&#xff0c;企业又将如何把握趋势&#xff0c;应对挑战&#xff1f;为了深…

openinstall支持抖音游戏小手柄监测,助力游戏联运生态高效增长

近来&#xff0c;抖音“小手柄”功能风靡游戏广告生态&#xff0c;通过新颖的联运形式成功将游戏广告触达到抖音整个流量池&#xff0c;由于受众较广&#xff0c;小手柄也是目前直播场数、点赞数最高的形式。 为了帮助广告主快速捕捉流量红利&#xff0c;打通抖音小手柄的数据…

【选型指南】大流量停车场和高端停车场如何选择停车场管理系统?

在当今快节奏的城市生活中&#xff0c;大型停车场和高端车场的运营者面临着一系列挑战&#xff0c;尤其是在车辆流量大和客户期望高的情况下。选择一个合适的停车场管理系统&#xff0c;不仅关系到日常运营的效率&#xff0c;更关系到客户的满意度和车场的整体形象。 捷顺科技认…

螺纹钢生产线中测径仪对基圆和负公差的测量和影响

螺纹钢生产线中测径仪的作用 在螺纹钢生产线中&#xff0c;测径仪是一种关键的检测设备&#xff0c;它负责对螺纹钢的基圆直径、横肋和纵肋等尺寸进行实时测量。测径仪的数据对于监控和控制螺纹钢的生产质量至关重要&#xff0c;尤其是在进行负公差轧制时&#xff0c;它能够提供…

K8S中使用英伟达GPU —— 筑梦之路

前提条件 根据不同的操作系统&#xff0c;安装好显卡驱动&#xff0c;并能正常识别出来显卡&#xff0c;比如如下截图&#xff1a; GPU容器创建流程 containerd --> containerd-shim--> nvidia-container-runtime --> nvidia-container-runtime-hook --> libnvid…

【Spring Boot - 注解】@ResponseBody 注解:处理 JSON 响应

文章目录 一、ResponseBody 注解概述1. 注解的功能2. 主要功能 二、ResponseBody 的工作原理1. 接口定义2. 消息转换器3. 自动配置与默认行为 三、ResponseBody 的应用场景1. RESTful API 的实现2. 返回复杂数据结构3. 错误处理和异常处理 四、ResponseBody 的配置和自定义1. 自…

Rabbit的学习——从安装到集群

一、MQ概念 1.1、异步通讯和同步通讯 1.2、同步调用和异步调用 1.2.1、同步调用 1.2.2、异步调用 1.3、消息队列的作用 1.3.1、流量削峰/限流 1.3.2、 应用解耦 1.3.3、异步处理 1.4、消息队列的两种模式 1.4.1、点对点模式 1.4.2、发布/订阅模式 二、RabbitMQ 2.1…

MyBatis Plus批量写入慢?

1. 数据库连接配置 在使用 MyBatis Plus 进行批量插入之前&#xff0c;首先需要配置数据库连接。在连接 URL 中添加 &rewriteBatchedStatementstrue&#xff0c;以提高批量插入的性能。以下是一个示例&#xff1a; spring.datasource.urljdbc:mysql://localhost:3306/your…