【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结

2023-11-30 00:12

本文主要是介绍【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

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

目录

  • 🎄一、概述
  • 🎄二、Vdec模块参数
  • 🎄三、创建Vdec解码通道
    • ✨3.1 配置解码通道属性
    • ✨3.2 创建解码通道 hi_mpi_vdec_create_chn
    • ✨3.3 设置解码通道参数 hi_mpi_vdec_set_chn_param
    • ✨3.4 开始接收用户发送的码流 hi_mpi_vdec_start_recv_stream
  • 🎄四
  • 🎄五
  • 🎄六、


在这里插入图片描述

🎄一、概述

上篇文章,我们学习了海思SS528的解码模块的一些基础知识,本文总结一下海思解码模块(VDEC)的使用。

使用海思的解码模块时,我们需要做下面几个步骤:

  • 1.设置Vdec模块参数;
  • 2.创建Vdec解码通道;
  • 3.通道创建成功后,可以向通道发送编码帧;
  • 4.如果解码模块没有绑定到其他模块,可以获取解码帧,手动发送到目标模块(Vpss或Vo或其他);
  • 5.使用后,可以销毁解码通道。

在这里插入图片描述

🎄二、Vdec模块参数

Vdec模块参数的内容很少,主要有两个字段需要留意的。

  • vb_src:解码帧存VB来源
    取值范围:仅支持OT_VB_SRC_MOD、OT_VB_SRC_PRIVATE、 OT_VB_SRC_USER,默认是OT_VB_SRC_MOD
  • mini_buf_mode:码流buffer配置模式
    0:一般模式;
    1:省内存模式。

Mpp的sample:

hi_vdec_mod_param mod_param;
check_return(hi_mpi_vdec_get_mod_param(&mod_param), "vdec get mod param");
mod_param.vb_src = g_vdec_vb_src;
check_return(hi_mpi_vdec_set_mod_param(&mod_param), "vdec set mod param");

在这里插入图片描述

🎄三、创建Vdec解码通道

本小节介绍创建Vdec通道的准备工作,以及创建过程:

  • 1.配置解码通道属性;
  • 2.创建解码通道;
  • 3.设置解码通道参数;
  • 4.开始接收用户发送的码流。

✨3.1 配置解码通道属性

typedef struct {ot_payload_type type;ot_vdec_send_mode mode;td_u32 pic_width;td_u32 pic_height;td_u32 stream_buf_size;td_u32 frame_buf_size;td_u32 frame_buf_cnt;union {ot_vdec_video_attr video_attr;};
} ot_vdec_chn_attr;

上面是解码通道的属性结构体,我们重点关注以下几个字段:

  • type:解码协议类型,主要有HI_PT_H264、HI_PT_H265、HI_PT_JPEG、HI_PT_MJPEG几个取值;
  • mode:码流发送方式,主要有
    流式发送(HI_VDEC_SEND_MODE_STREAM
    按帧发送(HI_VDEC_SEND_MODE_FRAME
    按兼容模式发送(HI_VDEC_SEND_MODE_COMPAT
  • pic_width/pic_height:通道支持的解码图像最大宽、高(以像素为单位)
  • stream_buf_size:码流缓存的大小。推荐值:一幅YUV420解码图像大小。即:宽x高x1.5

设置解码通道属性的例子:

{hi_pic_buf_attr buf_attr = { 0 };chn_attr->type = type;chn_attr->mode = OT_VDEC_SEND_MODE_FRAME; 	// 按帧发送chn_attr->pic_width = width;				// 解码图像宽高chn_attr->pic_height = height;chn_attr->stream_buf_size=width*height*1.5;	// 码流缓存的大小,推荐一幅YUV420解码图像大小。即:宽x高x1.5chn_attr->frame_buf_cnt = 10;				// 解码图像帧存个数,仅PrivateVB模式有效buf_attr.align = 0;buf_attr.height = chn_attr->pic_width;buf_attr.width = chn_attr->width;if (type == HI_PT_H264 || type == HI_PT_H265) {buf_attr.bit_width = HI_DATA_BIT_WIDTH_8;buf_attr.pixel_format = HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420;chn_attr->video_attr.ref_frame_num = 5;chn_attr->video_attr.temporal_mvp_en = 0;chn_attr->frame_buf_size = hi_vdec_get_pic_buf_size(chn_attr->type, &buf_attr);// 解码图像帧存buffer大小,仅PrivateVB模式有效} else if (type == HI_PT_JPEG || type == HI_PT_MJPEG) {chn_attr->mode = HI_VDEC_SEND_MODE_FRAME;buf_attr.bit_width = HI_DATA_BIT_WIDTH_8;buf_attr.pixel_format = sample_vdec->sample_vdec_picture.pixel_format;chn_attr->frame_buf_size = hi_vdec_get_pic_buf_size(chn_attr->type, &buf_attr);// 解码图像帧存buffer大小,仅PrivateVB模式有效}return 0;
}

✨3.2 创建解码通道 hi_mpi_vdec_create_chn

创建解码通道比较简单,只需要调用hi_mpi_vdec_create_chn函数,并指定要创建的通道号和解码通道参数即可。

hi_mpi_vdec_create_chn(chn, &chn_attr)

注意:
1.通道号不能超出最大的通道号范围;
2.属性attr不能为空,否则返回错误码OT_ERR_VDEC_NULL_PTR
3.属性attr的值不能超过解码能力集;
4.使用解码ModuleVB池方式时要在创建解码通道之前要先创建专属于VDEC的模块VB池;
5.使用解码UserVB方式时也要先创建用于解码的视频缓存VB池,且要保证VB块的大小和个数满足当前解码通道所需图像Buffer的大小和个数。
其他注意事项看文档《MPP媒体处理软件V5.0》。


✨3.3 设置解码通道参数 hi_mpi_vdec_set_chn_param

typedef struct {ot_payload_type type;td_u32 display_frame_num;union {ot_vdec_video_param video_param;ot_vdec_pic_param pic_param;};
} ot_vdec_chn_param;

首先注意区别通道属性(ot_vdec_chn_attr)和通道参数(ot_vdec_chn_param),通道参数几个需要留意的字段:

  • type:解码协议类型,主要有HI_PT_H264、HI_PT_H265、HI_PT_JPEG、HI_PT_MJPEG几个取值;
  • display_frame_num:解码缓存图像的最小帧数。取值范围: [0, 16]。默认值: 2。
  • video_param.dec_mode:解码模式。默认值:HI_VIDEO_DEC_MODE_IP;
  • video_param.compress_mode:解码图像压缩模式。
  • video_param.video_format:解码图像数据格式,SS528仅支持OT_VIDEO_FORMAT_TILE_64x16

设置通道参数例子:

{hi_vdec_chn_param chn_param;check_chn_return(hi_mpi_vdec_get_chn_param(chn, &chn_param), chn, "vdec get chn param");if (type == HI_PT_H264 || type == HI_PT_H265) {chn_param.video_param.dec_mode = HI_VIDEO_DEC_MODE_IP;		//解码模式chn_param.video_param.compress_mode = HI_COMPRESS_MODE_NONE;chn_param.video_param.video_format = HI_VIDEO_FORMAT_TILE_64x16; // SS528 只支持这个格式} else {chn_param.pic_param.pixel_format = HI_PIXEL_FORMAT_YVU_SEMIPLANAR_420;chn_param.pic_param.alpha = 255;}chn_param.display_frame_num = 4; // 解码缓存图像的最小帧数check_chn_return(hi_mpi_vdec_set_chn_param(chn, &chn_param), chn, "vdec set chn param");
}

✨3.4 开始接收用户发送的码流 hi_mpi_vdec_start_recv_stream

创建完解码通道的最后一个步骤就是开始接收用户发送的码流,只需要在调用hi_mpi_vdec_start_recv_stream时指定解码通道就可以使该通道处于开始接收码流的状态。
看例子:

check_chn_return(hi_mpi_vdec_start_recv_stream(chn), chn, "vdec start recv stream");

注意:
1.启动接收码流之后,才能调用ss_mpi_vdec_send_stream发送码流成功;
2.启动接收码流前必须保证通道已创建,否则会返回通道未创建的错误码OT_ERR_VDEC_UNEXIST;
3.启动接收码流前必须保证已经禁止使能用户图片,否则返回该操作不允许的错误码OT_ERR_VDEC_NOT_PERM;
4.重复调用启动接收码流接口时,返回成功。

在这里插入图片描述

🎄四

在这里插入图片描述

🎄五

在这里插入图片描述

🎄六、

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

这篇关于【海思SS528 | VDEC】MPP媒体处理软件V5.0 | VDEC的使用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/434872

相关文章

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot security使用jwt认证方式

《springbootsecurity使用jwt认证方式》:本文主要介绍springbootsecurity使用jwt认证方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录前言代码示例依赖定义mapper定义用户信息的实体beansecurity相关的类提供登录接口测试提供一

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp