Video Path流程学习之路

news2024/11/29 0:39:42

RPC

RPC指远程过程调用(Remote Procedure Call),通俗一些理解就是两台服务器A、B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。(远程过程调用是相对于本地过程调用来说的)

RPC要解决的两个问题

1、解决分布式系统中,服务之间的调用问题。

2、远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。

远程过程调用过程中有哪些步骤和问题:
在这里插入图片描述

1、要解决通讯的问题。客户端和服务端之间要建立连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。

2、要解决寻址的问题。A服务器上的应用要想办法告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称是什么,这样才能完成调用

3、序列化发送参数请求。当A服务器上的应用发起远程过程调用时,方法的参数要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,通过寻址和传输将序列化的二进制发送给B服务器。

4、对参数进行反序列化。B服务器收到请求后,需要对参数进行反序列化(序列化的逆操作),恢复为内存中的表达式,然后找到对应的方法(寻址的一部分)进行本地调用,然后得到返回值。

5、返回值序列化回传。返回值还要发送会服务器A上的应用,也要经过序列化的方式发送,服务器A接到后,再反序列号,恢复为内存中的表达方式,交给A服务器上的应用。


VDEC

VDEC是视频解码器,参考海思mpp的VDEC接口调用学习到:

一、初始化系统:

HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();
HI_MPI_VB_SetConfig(pstVbConfig);//整个系统中可以容纳缓存池的个数,每个缓存池缓存块的个数,缓存块的大小
HI_MPI_VB_Init();
HI_MPI_SYS_Init();

二、VDEC初始化并获取VB:

1.根据每个解码通道的需要解码的视频的宽高,像素格式,位宽 以及不同的解码方式(如:h.264 h.265等)计算每个通道需要的VB大小。
2. 模块公共视频缓存池

HI_MPI_VB_ExitModCommPool(VB_UID_VDEC);
HI_MPI_VB_SetModPoolConfig(VB_UID_VDEC, &stVbConf)//设置模块公共视频缓存池属性
HI_MPI_VB_InitModCommPool(VB_UID_VDEC);

三、start VDEC:

HI_MPI_VDEC_SetModParam(&stModParam)//主要是设置VB 来源选择

以下的操作,在每个解码通道都需要操作一遍。

HI_MPI_VDEC_CreateChn(i, &stChnAttr[i])//创建视频解码的通道。
HI_MPI_VDEC_SetChnParam(i, &stChnParam)//设置解码通道i参数stChnParam
HI_MPI_VDEC_StartRecvStream(i)//使能解码通道i

四、start VPSS:

每个解码通道一个VPSSgroup,每个VPSSgroup中有4个phy通道

HI_MPI_VPSS_SetModParam(&stModParam);//hdr支持

以下的操作,在每个解码通道都需要操作一遍。

HI_MPI_VPSS_CreateGrp(VpssGrp, pstVpssGrpAttr);

for (j = 0; j < VPSS_MAX_PHY_CHN_NUM; j++)// VPSS_MAX_PHY_CHN_NUM = 4
VpssChn = j;
HI_MPI_VPSS_SetChnAttr(VpssGrp, VpssChn, &pastVpssChnAttr[VpssChn]);
HI_MPI_VPSS_EnableChn(VpssGrp, VpssChn);

HI_MPI_VPSS_StartGrp(VpssGrp);

五、start VO:

在这里插入图片描述

简称全称中文名备注
DHD0Device HD0超高清设备 0
DHD1Device HD1高清设备 1
VHD0Video layer of HD0超高清视频层 0隶属于 DHD0
VHD1Video layer of HD1高清视频层 1隶属于 DHD1
VHD2Video layer of HD 2高清视频层 2Hi3559AV100 上隶属于 DHD0

Hi3519AV100/Hi3556AV100 上可以绑定至 DHD0 或者 DHD1, 用作 PIP 层。
WD: Write Back Channel Device, 回写通道设备。
图形层 G3: Graphic layer 3, 用作鼠标层, DHD0 和 DHD1 中均有此项, 但只能绑定其中一个设备,
G3 默认绑定在 DHD1 上。

HI_MPI_VO_SetPubAttr(VoDev, pstPubAttr);// 配置视频输出设备VoDev(根据不同的芯片,有所不同)的公共属性(hdmi或者mipi,视频的输出格式如1080P60)。
HI_MPI_VO_Enable(VoDev);//使能视频输出设备

HI_MPI_VO_GetVideoLayerAttr(VoLayer, &stLayerAttr);// VoLayer(0.1.2即高清视频层0.1.2)获取视频层属性
HI_MPI_VO_SetChnAttr(VoLayer, i, &stChnAttr);//同一个图层VoLayer中,不同的视频输出通道i的属性
HI_MPI_VO_EnableChn(VoLayer, i);//使能同一个图层的不同的视频输出通道。

HI_MPI_VO_SetVideoLayerPartitionMode(VoLayer, enVoPartMode);// 设置当前视频层VoLayer的分割模式(VO_PART_MODE_MULTI,VO_PART_MODE_SINGLE)。
HI_MPI_VO_SetDisplayBufLen(VoLayer, pstVoConfig->u32DisBufLen);
HI_MPI_VO_SetVideoLayerAttr(VoLayer, pstLayerAttr);// 设备分辨率、显示分辨率和图像分辨率
HI_MPI_VO_EnableVideoLayer(VoLayer);

以下是视频输出的硬件接口的使能:
HDMI:

HI_MPI_HDMI_Init();
HI_MPI_HDMI_Open(enHdmiId);
HI_MPI_HDMI_GetAttr(enHdmiId, &stAttr);
HI_MPI_HDMI_SetAttr(enHdmiId, &stAttr)//属性中比较重要的一点是输出的视频的格式。

如:1080P60。

HI_MPI_HDMI_Start(enHdmiId)

MIPI:

fd = open("/dev/hi_mipi_tx", O_RDWR);
s32Ret = ioctl(fd, HI_MIPI_TX_SET_DEV_CFG, pstMipiTxConfig);//视频的输出格式。

如:MIPI_TX_1080X1920_60_CONFIG。

/中间部分为现实屏的初始化操作。主要区别和显示屏的分辨率有关。直接参考代码中的sample中的ioctl操作/

s32Ret = ioctl(fd, HI_MIPI_TX_ENABLE);

六、VDEC bind VPSS:

stSrcChn.enModId   = HI_ID_VDEC;
stSrcChn.s32DevId  = 0;
stSrcChn.s32ChnId  = VdecChn;

stDestChn.enModId  = HI_ID_VPSS;
stDestChn.s32DevId = VpssGrp;
stDestChn.s32ChnId = 0;
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn)

七、VPSS bind VO:

stSrcChn.enModId   = HI_ID_VPSS;
stSrcChn.s32DevId  = VpssGrp;
stSrcChn.s32ChnId  = VpssChn;//固定为0

stDestChn.enModId  = HI_ID_VO;
stDestChn.s32DevId = VoLayer;//Vodev
stDestChn.s32ChnId = VoChn;//对应于VpssGrp
HI_MPI_SYS_Bind(&stSrcChn, &stDestChn)

八、send stream to vdec

(选定需要解码的文件路径和文件名)
每个解码通道创建一个相对应的线程,当应用程序退出时,直接退出线程即可。

pthread_join(pVdecThread[i], HI_NULL);

pthread_create(&pVdecThread[i], 0, SAMPLE_COMM_VDEC_SendStream, (HI_VOID *)&pstVdecSend[i]);

SAMPLE_COMM_VDEC_SendStream:
fpStrm = fopen(cStreamFile, "rb");//打开视频文件
while(1)
{
        fseek(fpStrm, s32UsedBytes, SEEK_SET);
        s32ReadLen = fread(pu8Buf, 1, pstVdecThreadParam->s32MinBufSize, fpStrm);
        有区别于vdec,按stream和frame
        HI_MPI_VDEC_SendStream(pstVdecThreadParam->s32ChnId, &stStream, pstVdecThreadParam->s32MilliSec);
}
/* send the flag of stream end */
memset(&stStream, 0, sizeof(VDEC_STREAM_S) );
stStream.bEndOfStream = HI_TRUE;
HI_MPI_VDEC_SendStream(pstVdecThreadParam->s32ChnId, &stStream, -1); //在发送完所有码流后,可以发送 bEndOfStream 为 1 的空码流包,表示当前码流文件结束,解码器会把所有码流全部解完并输出全部图像。

九、应用退出:

pthread_join(pVdecThread[i], HI_NULL);
vpss vo unbind:HI_MPI_SYS_UnBind(&stSrcChn, &stDestChn);
vdec vpss unbind

HI_MPI_HDMI_Stop(enHdmiId)
HI_MPI_HDMI_Close(enHdmiId)
HI_MPI_HDMI_DeInit()

HI_MPI_VO_DisableChn(VoLayer, i);
HI_MPI_VO_DisableVideoLayer(VoLayer);
HI_MPI_VO_Disable(VoDev);

HI_MPI_VPSS_StopGrp(VpssGrp);//停止每个vpssgroup
HI_MPI_VPSS_DisableChn(VpssGrp, VpssChn);//禁止vpss下的通道
HI_MPI_VPSS_DestroyGrp(VpssGrp);//销毁VpssGrp

//多个解码通道的话,每个通道都要分别执行
HI_MPI_VDEC_StopRecvStream(i)//解码通道i停止接收数据流
HI_MPI_VDEC_DestroyChn(i)//销毁解码通道i

HI_MPI_VB_ExitModCommPool(VB_UID_VDEC);//VDEC退出模块公共视频缓存池

HI_MPI_SYS_Exit();
HI_MPI_VB_Exit();

至此整个视频的解码流程就到此结束

关于面向海思芯片VDEC的学习还可以看视频编解码(二):海思VDEC模块视频解码代码解析


VBM

暂时搞不懂


VMN

暂时搞不懂

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

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

相关文章

go-zero学习 第三章 微服务

go-zero学习 第三章 微服务 1 相关命令2 微服务代码实战2.1 基础代码2.2 API简单调用RPC服务2.3 服务注册/发现2.4 文件上传/下载&分组2.5 go-zero超时时间2.6 grpc服务端接收请求体大小限制2.7 grpc客户端接收响应体大小限制2.8 API和RPC服务拦截器2.9 服务间通过metadata…

平替笔和ipad笔差别大吗?主动式电容笔推荐

现在不少人开始用上了iPad&#xff0c;用来书写笔记&#xff0c;用来作画。再一个&#xff0c;现在很多iPad的使用者&#xff0c;追求的是实用性&#xff0c;认为要提高iPad的实用性&#xff0c;必须要有一个好的电容笔才行。事实上&#xff0c;如果你仅仅是拿来记笔记&#xf…

从零开始 Spring Boot 68:连接实体

从零开始 Spring Boot 68&#xff1a;连接实体 图源&#xff1a;简书 (jianshu.com) 在 JPA 中关联实体实际上对应表连接&#xff0c;而表连接可以通过内连接&#xff08;Inner Join&#xff09;、外连接&#xff08;Outer Join&#xff09;和 Where等方式实现&#xff0c;实际…

系统运维和网络运维有什么区别吗?

跟着互联网以及科技的高速开展&#xff0c;衍生出了许多的新奇职业&#xff0c;比方网络运维、网络安全运维。 从字面意思了解&#xff0c;两者之间没有什么太大区别&#xff0c;因而很多人很容易将两者混杂。 系统和网络运维有什么区别? 一个偏系统&#xff08;linux、doc…

cookiesession(会话技术)

会话技术 Http:超文本传输协议&#xff0c;不可靠。 ​ 不保持连接的协议。无状态的。 什么是会话 会话是在一次会话中包含多次请求和响应 一次会话&#xff1a;浏览器第一次给服务器资源发送请求&#xff0c;会话建立&#xff0c;直到有一方断开为止 会话的作用 由于Http是…

微服务之Eureka服务注册中⼼

关于务注册中⼼服 服务注册中⼼本质上是为了解耦服务提供者和服务消费者,尽可能量使两者联系可控在一定的范围外 1.在父项目下下引入 Spring Cloud 依赖 <dependencyManagement> <dependencies> <!-- SCN --> <dependency> <groupId> org.sp…

【记录】SMB|Windows下修改SMB端口并挂载

环境&#xff1a;Window11 使用背景&#xff1a;勒索病毒导致445端口不安全&#xff0c;故而该端口在服务器端被全面禁用了&#xff0c;如需使用SMB服务需要换个SMB服务端口。 方法1&#xff1a;端口转发 winx点开管理员权限的终端&#xff1a; 运行以下指令&#xff0c;检查…

ROS:URDF使用

目录 一、URDF集成Rviz&#xff08;实例讲解&#xff09;1.1需求1.2流程1.3code操作1.3.1创建功能包1.3.2编写 URDF 文件1.3.3在 launch 文件中集成 URDF 与 Rviz1.3.4在 Rviz 中显示机器人模型1.3.5优化 rviz 启动 二、URDF语法详解2.1robot2.1.1属性2.2.2子标签 2.2link2.2.1…

手把手教你玩转内存函数(含模拟实现)

目录 一、memcpy 1.认识memcpy 2.使用memcpy 3.拓展&#xff1a;模拟实现memcpy 二、memmove 1.认识memmove 2.使用memmove 3.拓展&#xff1a;模拟实现memmove 三、memcmp 1.认识memcmp 2.使用memcmp 四、memset 1.认识memset 2.使用memset 3.拓展&#xff1a;模…

【网络编程】应用层协议——HTTP协议

文章目录 一、HTTP协议基本认识二、URL的认识2.1 urlencode和urldecode 三、HTTP协议格式3.1 HTTP请求与响应格式3.2 如何保证请求和响应被应用层完整读取&#xff1f;3.3 请求和响应如何做到序列化和反序列化&#xff1f;3.4 代码验证请求格式3.5 代码验证响应格式3.5.1 telne…

小程序开发及生态丰富,还需要App吗?

微信小程序自2017年推出以来&#xff0c;其生态系统得到了迅速的发展和壮大。作为中国最大的社交平台之一&#xff0c;微信拥有庞大的用户基础。微信小程序作为微信生态系统的一部分&#xff0c;自然而然地吸引了大量用户。据对公开资料进行统计&#xff0c;2021年全网小程序数…

校园跑腿小程序:为学生提供便捷的服务

随着社会的发展和人们生活水平的提高&#xff0c;高等教育越来越受到重视。大学校园不仅是学习的地方&#xff0c;也是学生们日常生活的场所。然而&#xff0c;在繁忙的学业和生活压力下&#xff0c;学生可能经常面临诸如代购、快递、取餐等各种琐碎但繁琐的任务。基于这个需求…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 Cohere 集成搭建智能问答系统

目录 准备工作 主要参数 准备数据 创建 Collection 插入数据 测试问答 本文将演示如何使用 Zilliz Cloud 和 Cohere 搭建基于 SQuAD 数据集 的问答系统。其中,Zilliz Cloud 负责提供向量数据库,Cohere 负责提供获取指定文字向量表示的接口。 准备工作 本示例中的脚…

黑马前端三大件

文章目录 1.html1.1 标题标签1.2 段落标签1.3换行标签1.4 水平分割线标签1.5 文本格式化标签1.6 图片标签1.7 音频标签1.8 视频标签1.9 链接标签的介绍1.10列表标签1.10.1 无序列表1.10.2 无序列表1.10.3 自定义列表 1.11表格属性1.11.1表格的基本标签1.11.2 表格相关属性1.11.…

使用layui滑块slider遇到问题解决:1、加标尺2、兼容移动端拖拽1、多个滑块使用赋值4、切换箭头赋值问题

使用layui框架 滑块组件 slider 时遇到的问题&#xff0c;以下图为例&#xff0c;我创建了一个总滑块和3个滑块&#xff0c;改变总滑块可以控制滑块123&#xff1a; 1、我的需求是加上标尺&#xff0c;layui没有该功能&#xff0c;自己写了一个简单的,代码在下面。 2、移动端…

Linux:输入输出流、重定向、管道命令

相关文章 Linux&#xff1a;chgrp、chown、chmod权限属性更改指令 Linux&#xff1a; 磁盘状态观察命令lsblk、blkid Linux&#xff1a;df、du容量查询指令 1、标准流文件 数据流重定定向由字面上的意思来看&#xff0c;就是将数据定向到其他地方去&#xff0c;事实也是如此…

ModaHub魔搭社区:非结构化数据范式转变和示例

目录 范式转变——非结构化数据 非结构化数据示例 范式转变——非结构化数据 既然我们对结构化数据和半结构化数据有了清晰的理解,现在让我们开始谈谈非结构化数据。与结构化数据和半结构化数据不同,非结构化数据可以采取任何形式,可以有任意大小或尺寸,并需要大量的运行…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 HuggingFace 集成搭建问答系统

目录 准备工作 主要参数 创建 Collection 插入数据 测试问答 本文将演示如何使用 Zilliz Cloud 和 HuggingFace 搭建问答系统。其中,Zilliz Cloud 负责提供向量数据库,HuggingFace 负责提供获取指定文字向量表示的接口。 准备工作 本示例中的脚本需要安装 pymilvus,…

寡头竞争和混合策略均衡

纯寡头的产量竞争 两家企业生产相同的产品,产量是决策变量,市场上只有一种价格。市场需求/Demand:P = 100 - (Q1+Q2) Q 是企业生产的产量 假设生产成本为0 这个案例可能存在的结果 (1)合谋 (2)古诺-纳什均衡 每个企业将它竞争对手的产量水平视为固定的,然后决定自己…

【C++学习笔记】C++如何规范C语言中的类型转换

C的类型转换 1 C语言中类型转换的缺陷2 为什么C要规范C的类型转换3 C强制类型转换3.1 static_cast3.2 reinterpret_cast3.3 const_cast3.4 dynamic_cast 1 C语言中类型转换的缺陷 在C语言中&#xff0c;如果赋值运算符左右两侧类型不同&#xff0c;或者形参与实参类型不匹配&a…