😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你------泰戈尔🍭
目录
- 🎄一、概述
-
- [✨1.1 VDEC模块](#✨1.1 VDEC模块)
- [✨1.2 什么是视频解码](#✨1.2 什么是视频解码)
- 🎄二、码流发送方式
-
- [✨ 2.1 流式发送(OT_VDEC_SEND_MODE_STREAM)](#✨ 2.1 流式发送(OT_VDEC_SEND_MODE_STREAM))
- [✨ 2.2 按帧发送(OT_VDEC_SEND_MODE_FRAME)](#✨ 2.2 按帧发送(OT_VDEC_SEND_MODE_FRAME))
- [✨ 2.3 按兼容模式发送(OT_VDEC_SEND_MODE_COMPAT)](#✨ 2.3 按兼容模式发送(OT_VDEC_SEND_MODE_COMPAT))
- 🎄三、时间戳(PTS)处理
- 🎄四、用户图片
- 🎄五、解码帧存分配方式
- 🎄六、总结
🎄一、概述
✨1.1 VDEC模块
海思平台的视频解码是
硬件解码
。VDEC模块提供驱动视频解码硬件工作的MPI接口,实现视频解码功能。硬件解码模块有VDH、JPEGD,可支持解码协议有:
H.264/H.265
、JPEG/MJPEG
。VDEC模块支持解码最大通道数为128个,支持的最大最小分辨率分别为:
H.264/H.265
:max 8192x8192, min 96x96;JPEG/MJPEG
:max 16384x16384,min 8x8。本文涉及到的SDK文档:《MPP媒体处理软件V5.0》
✨1.2 什么是视频解码
一段连续的视频是由一张张画面组成的,每一张的画面称为一帧。一秒钟的画面总数称为帧率。
由于完整地保存视频的每一帧画面会使得数据量很大,不利于传输和保存。所以人们就把视频进行压缩编码。
常见的编码有:
H.264/H.265
、JPEG/MJPEG
。将视频编码数据(
H.264/H.265
、JPEG/MJPEG
)解析成YUV
格式或RGB
格式的数据的整个过程就是视频解码。
🎄二、码流发送方式
码流发送方式决定了我们怎样将编码帧发送给VDEC模块,VDEC模块一共提供了三种方式:
✨ 2.1 流式发送(OT_VDEC_SEND_MODE_STREAM)
用户每次可发送任意长度码流到解码器,由
解码器内部完成一帧码流的识别过程
。
- 优点:不需自己检查帧的开始、结束;
- 缺点:不能希望马上开始解码图像,也就是解码可能会稍微延时。
✨ 2.2 按帧发送(OT_VDEC_SEND_MODE_FRAME)
用户每次发送完整一帧码流到解码器,每调用一次发送接口,解码器就认为该帧码流已经结束,开始解码图像,因此需保证每次调用发送接口发送的码流必须为一帧,否则会出现解码错误。
- 优点:可以达到快速解码的目的;
- 缺点:需要自己判断是否为完整的编码帧,要等一帧完整数据才可发送。
✨ 2.3 按兼容模式发送(OT_VDEC_SEND_MODE_COMPAT)
支持一帧码流分多次发送给解码器,但是每帧码流结束时必须配置帧结束标志end_of_frame为TD_TRUE,否则认为当前帧码流还未结束。
- 优点:不需要等到一帧数据都到了才发送。
- 缺点:需要自己判断是否编码帧结束。
🎄三、时间戳(PTS)处理
在模式OT_VDEC_SEND_MODE_FRAME
下发送码流时,解码输出的图像时间戳PTS为发送码流接口(ss_mpi_vdec_send_stream)中用户送入的PTS,解码器不会更改此值;
如果用户配置的PTS值为0,则表示用户不进行帧率控制,而是由视频输出模块( VO)进行帧率控制;
当VDEC为回放模式且VPSS为AUTO模式时,如果用户送入的PTS值为-1,则表示此图像不会被视频输出模块( VO)显示;
如果是其他值,则表示视频输出模块( VO)根据用户设置的PTS值进行帧率控制。
注意:不能出现PTS值为0和非0混合的情况。
🎄四、用户图片
如果出现没有视频流发送给解码器了,这时解码器允许用户设置一帧图像,来表示当前没有新的视频帧。
当网络异常断开,前端没有码流送来时,用户可通过设置插入用户图片显示在VO上,以提示当前网络异常或没有码流可解码。 VDEC提供两种插入用户图片方式:
- 立刻插入用户图片: VDEC会先清空解码器内部的码流和图像,然后插入用户
图片。 - 延迟插入用户图片: VDEC会先把解码器内部的码流全部解完,待解码图像全
部输出之后再插入用户图片。
🎄五、解码帧存分配方式
- 解码ModuleVB池:
OT_VB_SRC_MOD
创建解码通道时不分配图像Buffer,而是由用户调用相应的MPI接口创建专属于解码模块的ModuleVB池,该VB池只允许VDEC获取VB块,其它模块只能使用不能获取。 - 解码PrivateVB池:
OT_VB_SRC_PRIVATE
创建解码通道时由VDEC创建私有VB池作为该通道的图像Buffer,用户可以在创建通道接口ss_mpi_vdec_create_chn
中设置私有VB池的个数frame_buf_cnt
和VB块的大小frame_buf_size
- 解码UserVB池:
OT_VB_SRC_USER
创建解码通道时不分配图像Buffer,而是由用户调用接口ss_mpi_vb_create_pool
创建一个视频缓存VB池,再通过调用接口ss_mpi_vdec_attach_vb_pool
把某个解码通道绑定到固定的视频缓存VB池中。
三种解码帧存分配方式可通过接口ss_mpi_vdec_set_mod_param
的参数vb_src
来设置。当解码帧存使用ModuleVB池或者UserVB池方式时,可以不用销毁解码通道直接销毁VB池,但是销毁解码VB池前用户必须保证没有任何模块正在使用这个VB池里的任何一块VB(可通过复位解码通道,以及复位解码直接绑定的后级模块实现,如VDEC绑定VPSS,则就要同时复位VDEC和VPSS;如果用户是从VDEC里获取图像上去,也必须保证全部图像释放回VDEC。),否则会出现程序异常的情况。
🎄六、总结
本文记录海思SS528 的 VDEC 模块的一些基础知识,用于日后复习。
如果文章有帮助的话,点赞👍、收藏⭐,支持一波,谢谢 😁😁😁