当前位置: 首页 > news >正文

【海思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
  • 🎄四、Vdec处理过程
    • ✨4.1 向视频解码通道发送码流数据 hi_mpi_vdec_send_stream
    • ✨4.2 获取视频解码通道的解码图像 hi_mpi_vdec_get_frame
  • 🎄五、销毁解码通道
  • 🎄六、总结


在这里插入图片描述

🎄一、概述

上篇文章,我们学习了海思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.重复调用启动接收码流接口时,返回成功。


在这里插入图片描述

🎄四、Vdec处理过程

解码通道创建完成后,用户可以向解码器发送编码帧,解码器接收正确的编码帧后,开始解码;如果绑定到其他模块如Vpss、Vo,会自动将解码帧送到目标模块处理;如果没有绑定模块,用户需要自己从解码通道取帧进行处理。下面看看常用的一些不足

✨4.1 向视频解码通道发送码流数据 hi_mpi_vdec_send_stream

向视频解码通道发送码流数据,可以需要调用函数 hi_mpi_vdec_send_stream 并指定通道和传入视频帧数据。函数原型:

hi_s32 hi_mpi_vdec_send_stream(hi_vdec_chn chn, const hi_vdec_stream *stream, hi_s32 milli_sec);

发送码流时需要按照创建解码通道时设置的发送方式进行发送。

  • 按帧发送时,调用此接口一次,必须发送完整的一帧码流,否则解码会出现错误。
  • 兼容模式发送时,一帧可以分多次接口调用,每帧码流结束时必须配置帧结束标志end_of_frame为1,否则解码会出现错误
  • 流式发送则无此限制。

按帧/兼容模式发送码流时,解码图像的时间戳等于传入参数stream结构体中的时间戳,按流发送时,解码图像的时间戳等于0

其他注意事项参考文档《MPP媒体处理软件V5.0》。


✨4.2 获取视频解码通道的解码图像 hi_mpi_vdec_get_frame

在解码器解码过程中,我们可以通过调用 hi_mpi_vdec_get_frame 函数来获取解码的数据。函数原型:

hi_s32 hi_mpi_vdec_get_frame(hi_vdec_chn chn, hi_video_frame_info *frame_info,hi_vdec_supplement_info *supplement,  hi_s32 milli_sec);

参数说明:

  • chn:解码通道;
  • frame_info:获取的解码图像信息。
  • supplement:获取的解码图像补充信息。如果不需要获取补充信息,可以设置为NULL
  • milli_sec:获取图像方式标志。
    -1:阻塞。
    0:非阻塞。
    正值:超时时间,没有上限值,以ms为单位

注意
1.通过ss_mpi_vdec_get_frame获取解码图像数据后,需要通过 ss_mpi_vdec_release_frame 来释放;
2.此接口支持select操作;
3.输入码流为奇数宽高分辨率的JPEG图像时,解码会对原宽高向下裁剪为2对齐。因此保存为YUV或RGB文件时,需要直接使用帧信息中的stride,不能用输出后的宽度计算stride。

其他注意事项参考文档《MPP媒体处理软件V5.0》。

在这里插入图片描述

🎄五、销毁解码通道

解码结束后,可以销毁解码通道。销毁解码通道,需要先停止接收码流(hi_mpi_vdec_stop_recv_stream),然后再调用函数 hi_mpi_vdec_destroy_chn 进行销毁。

看例子:

hi_s32 sample_comm_vdec_stop(hi_s32 chn_num)
{hi_s32 i;for (i = 0; i < chn_num; i++) {check_chn_return(hi_mpi_vdec_stop_recv_stream(i), i, "vdec stop recv stream");check_chn_return(hi_mpi_vdec_destroy_chn(i), i, "vdec destroy chn");}return HI_SUCCESS;
}

在这里插入图片描述

🎄六、总结

👉本文主要总结了使用海思Vdec模块的一些常用步骤,常用函数,供以后学习、复习。

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

相关文章:

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

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

Kubernetes sample-controller 例子介绍

sample-controller sample-controller 是 K8s 官方自定义 CDR 及控制器是实现的例子 通过使用这个自定义 CDR 控制器及阅读它的代码&#xff0c;基本可以了解如何制作一个 CDR 控制器 CDR 运作原理 网上有更好的文章&#xff0c;说明其运作原理&#xff1a; https://www.z…...

【C/C++指针】指针*与引用的区别

指针变量的值是所指对象的地址&#xff08;准确说是首地址&#xff0c;其类型定义其所指对象的字节长度&#xff09;引用变量的值是所引用对象本身的值 1 初始化 指针变量 可不初始化 且 可以更换指向对象 int *p;//此时是个野指针&#xff0c;该指针变量的值是任意值&#x…...

【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式

本文讲解在ArcGIS Pro中制作全球任意经纬网的两种方式。 文章目录 一、生成全球经纬网矢量1. 新建地图加载数据2. 创建经纬网矢量数据二、布局生成经纬网1. 新建布局2. 创建地图框2. 创建经纬网一、生成全球经纬网矢量 以1:100万比例尺地图分幅为例,创建经差6、维差4的经纬网…...

【二叉树】练习题终章

二叉树的销毁 void BTreeDestroy(BTNode* root) {if (root NULL)return;BTreeDestroy(root->left);BTreeDestroy(root->right);free(root); }递归展示图 使用后序销毁&#xff0c;如果用前序销毁的话&#xff0c;就会找不到根对应的子树的地址.下面就不能被销毁了&…...

flutter开发实战-实现获取视频的缩略图封面video_thumbnail

flutter开发实战-实现获取视频的缩略图封面video_thumbnail 在很多时候&#xff0c;我们查看视频的时候&#xff0c;视频没有播放时候&#xff0c;会显示一张封面&#xff0c;可能封面没有配置图片&#xff0c;这时候就需要通过获取视频的缩略图来显示封面了。这里使用了video…...

Prompt Toolkit探索:打造交互式CLI应用

简介&#xff1a;prompt_toolkit 是一个 Python 的库&#xff0c;它提供了一系列功能丰富的用户界面元素&#xff0c;比如自动完成、语法高亮、多行编辑、提示等等&#xff0c;让你可以轻松地构建出功能强大的命令行工具。而且&#xff0c;这个库还被 IPython 和 pgcli 这样的知…...

【已解决】AttributeError: module ‘gradio‘ has no attribute ‘outputs‘

问题描述 AttributeError: module gradio has no attribute outputs 不知道作者用的是哪个gradio版本&#xff0c;最新的版本报错AttributeError: module gradio has no attribute outputs &#xff0c; 换一个老一点的版本会报错AttributeError: module gradio has no attribu…...

WPF Mvvm模式下面如何将事件映射到ViewModel层

前言 平常用惯了Command绑定,都快忘记传统的基于事件编程模式了,但是Commond模式里面有个明显的问题,就是你无法获取到事件源的参数。很多大聪明肯定会说,这还不简单,通过自己写控件,给控件加个自定义属性不就行了,想要啥事件就写啥事件进去,完全自主可控。但是对于写…...

C# WPF上位机开发(计算器界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 c# wpf最大的优势就是开发业务软件比较快、效率比较高。一般来说&#xff0c;它的界面和逻辑部分可以同时开发。界面的部分用xaml编写即可&#xf…...

[c]比较月亮大小

本题的难点就是分情况讨论 #include<stdio.h> int main() {int n;scanf("%d",&n);int arr2[n];int p;for(int m0;m<n-1;m){scanf("%d",&arr2[m]);//输入n个数保存到数组}if(n1)//当输入一个数据时&#xff0c;输入0&#xff0c;可以判断…...

【Java 基础】16 泛型

文章目录 什么是泛型&#xff1f;泛型的声明泛型的使用泛型方法通配符和泛型上下界1&#xff09;通配符2&#xff09;泛型上下界 泛型的好处注意事项 泛型提供了一种在编写代码时更好地 支持类型安全的机制。通过泛型&#xff0c;我们可以编写更加 通用、 灵活、 可读性高的…...

Android framework定制1-->用户无操作一段时间,自动播放客户提供的视频,用户操作后退出播放

在PowerManagerService.java中监听用户操作&#xff0c;10秒无操作则打开预置的apk播放视频&#xff0c;直接上代码&#xff1a; --- a/frameworks/base/services/core/java/com/android/server/power/PowerManagerService.javab/frameworks/base/services/core/java/com/andr…...

Vmware17虚拟机安装windows10系统

不要去什么系统之家之类的下载镜像&#xff0c;会不好安装&#xff0c;镜像被魔改过了&#xff0c;适合真实物理机上的系统在PE里安装系统&#xff0c;建议下载原版系统ISO文件 安装vmware17pro 下载地址https://dwangshuo.jb51.net/202211/tools/VMwareplayer17_855676.rar 解…...

Golang实践录:读取yaml配置文件

本文对 yaml 文件进行解析。 下载 yaml执行 go get github.com/spf13/viper 安装。 golang 有很多库可以解释 yaml 文件。本文选用 viper 进行解析&#xff0c;执行 go get github.com/spf13/viper 安装。 yaml语法规则 yaml对大小写敏感。yaml的层级关系只能使用空格缩进&a…...

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行&#xff0c;会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面&#xff0c;鼠标右键&#xff0c;点击执行计划&#xff0c;会出现sql的执行计…...

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并,并且不能跨品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…...

微信小程序显示二维码?

wxml <canvas style"width: 100%;height: 100%;margin-left: 20%;" id"Canvase" type"2d"></canvas> js // pages/code/code.js Page({/*** 页面的初始数据*/data: {code: ,},/*** 生命周期函数--监听页面加载*/onLoad(options) {…...

JavaWeb开发全流程笔记

JavaWeb 前端Web开发javaScript1.JS引入2.JS基础语法3.JS函数4.JS对象 BOMDOM文档对象模型JS事件监听VueVue常用指令Vue的生命周期 AjaxAxios 前端工程化环境准备NodeJS安装和Vue-cli安装vue项目Vue组件库Element组件的使用 Vue路由Nginx打包部署 后端Web开发MavenSpringBootHT…...

LLM;超越记忆《第 2 部分 》

一、说明 在这篇博客中&#xff0c;我深入研究了将大型语言模型&#xff08;LLM&#xff09;提升到基本记忆之上的数学框架。我们探索了动态上下文学习、连续空间插值及其生成能力&#xff0c;揭示了 LLM 如何理解、适应和创新超越传统机器学习模型。 LLM代表了人工智能的重大飞…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...