VDEC性能指标数据
JPEGD功能及约束说明
功能说明
JPEGD(JPEG Decoder)实现.jpg、.jpeg、.JPG、.JPEG图片文件的解码。
-
JPEGD在解码图片时,支持对图片进行旋转。
如果输入图片的码流中包含Orientation信息(代表捕获图像时摄像机相对于场景的方向),则JPEGD在解码时会解析Orientation信息,将图片进行90度、180度、270度或镜像旋转。旋转后输出图片的宽stride、高stride、输出内存仍需满足图片格式、宽高对齐、内存约束中的要求。如果输入图片的码流异常,导致JPEGD解码时无法读取Orientation信息,则不能实现图片旋转的功能。
:::note 说明 Atlas 200/500 A2推理产品上,JPEGD 422格式旋转图片,若原图高为奇数,并且旋转方式为宽高对换,则旋转后宽存在黑边,建议用户将宽向下对齐到偶数使用(即去除黑边),比如原图为200*101,若旋转后为101*200,则建议用户实际使用区域为100*200。
Atlas 200/500 A2推理产品上,JPEGD 440格式旋转图片,若原图宽为奇数,并且旋转方式为宽高对换,则旋转后高存在黑边,建议用户将高向下对齐到偶数使用(即去除黑边),比如原图为201*101,若旋转后为100*201,则建议用户实际使用区域为100*200。
JPEGD 422格式旋转图片,若原图高为奇数,并且旋转方式为宽高对换,则旋转后宽存在黑边,建议用户将宽向下对齐到偶数使用(即去除黑边),比如原图为200*101,若旋转后为101*200,则建议用户实际使用区域为100*200。
JPEGD 440格式旋转图片,若原图宽为奇数,并且旋转方式为宽高对换,则旋转后高存在黑边,建议用户将高向下对齐到偶数使用(即去除黑边),比如原图为201*101,若旋转后为100*201,则建议用户实际使用区域为100*200。 :::
-
JPEGD在解码图片时,支持按源图片格式解码。
源图片格式解码是指解码前后图片的编码格式保持一致,例如解码前输入图片为jpeg(440),解码后输出图片为YUV440SP V在前U在后或YUV440SP U在前V在后。
使用源图片格式解码,有以下方式:
-
在调用JPEGD解码接口时,直接将输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,输出格式默认按源图片格式输出、且是V在前U在后的Semi-Planar格式。例如,JPEG源图片格式为jpeg(440),输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,JPEGD解码后,实际输出图片格式为YUV440SP V在前U在后。
此种方式,由于不知道输出图片格式,因此需要用户申请尽量大的内存或调用hi_mpi_dvpp_get_image_info接口获取解码输出内存大小,防止内存不够,无法存放输出图片。
-
先调用hi_mpi_dvpp_get_image_info接口根据传入的jpeg源图片,获取按源图解码时的输出图片的宽、高、宽stride、高stride、解码输出内存大小、图片格式等信息后,再调用JPEGD解码接口,使用通过hi_mpi_dvpp_get_image_info接口获取的图片格式来设置输出图片格式。
:::note 说明 JPEGD解码后的输出图片,如果要直接作为模型推理的输入,建议将输出图片格式配置为HI_PIXEL_FORMAT_UNKNOWN,这时JPEGD使用源图片格式解码(但这里要确保解码后的图片格式模型是支持的),保证模型推理的精度。
JPEGD解码后的输出图片,如果直接作为VPC的输入,该场景下若使用源图片格式解码时,则需要关注解码后的输出图片格式VPC是否支持(VPC输入图片的格式请参见约束说明),如果VPC不支持,则用户需按VPC支持的情况指定JPEGD的输出图片格式。 :::
-
图片分辨率约束
-
输入图片分辨率
版本 分辨率范围 Atlas 200/500 A2推理产品 最大分辨率:16384*16384,最小分辨率:32*32。 -
输出图片分辨率
JPEGD只对图片解码,不会改变图片分辨率,因此输出与输入的图片分辨率保持一致。
内存申请/释放接口说明
输入内存的大小就是指实际的输入图片所占用的大小,输出内存的大小参见表1中的计算公式。
| 版本 | 内存申请接口 |
|---|---|
| Atlas 200/500 A2推理产品 | JPEGD图片解码时,支持以下两种内存申请接口: - 调用aclrtMalloc[aclrtFree](./aclcppdevg_03_0101.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 - 调用hi_mpi_dvpp_malloc[hi_mpi_dvpp_free](./aclcppdevg_03_0726.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 注意:调用hi_mpi_dvpp_malloc接口申请的内存为媒体数据处理的专用内存,但专用内存的地址空间有限,若关注内存规划或内存资源有限时,建议调用aclrtMalloc接口申请内存。 |
图片格式、宽高对齐、内存约束
实现JPEGD图片解码功能时,仅支持Huffman编码,压缩前的原图像色彩空间为YUV,像素的各分量比例为4:4:4或4:2:2或4:2:0或4:0:0或4:4:0,不支持算术编码、不支持渐进JPEG格式、不支持JPEG2000格式。
:::note 说明 输出图片格式的定义请参见hi_pixel_format,宽stride、高stride等概念请参见基本概念。 :::
表1 图片格式、宽高对齐、内存大小约束
输入图片格式(YUV分量比例) | 输出图片格式 | 输出图片宽、高对齐要求 | 输出图片宽stride、高stride、内存大小要求 |
|---|---|---|---|
jpeg(444) | YVU444SP 8bit | 无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3 |
YUV444SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit | |||
jpeg(422) | YVU422SP 8bit | 宽2对齐 高无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 2 |
YUV422SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit | |||
jpeg(420) | YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 |
YUV420SP NV21 8bit | |||
jpeg(400) | YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 |
YUV420SP NV21 8bit | |||
YUV400 8bit | 无对齐要求 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride | |
jpeg(440) | YVU440SP 8bit | 宽无对齐要求 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 2 |
YUV440SP 8bit | |||
YUV420SP NV12 8bit | 宽2对齐 高2对齐 | 宽stride为宽64对齐后的值。 高stride为高16对齐后的值。 内存大小(单位Byte)≥ 宽stride * 高stride * 3/2 | |
YUV420SP NV21 8bit |
软、硬件约束
- 硬件约束:
- 最多支持4张Huffman表,其中包括2 张DC(Direct Current)(直流)表和2 张AC(Alternating Current)(交流)表;
- 最多支持3张量化表;
- 只支持8bit采样精度;
- 只支持对顺序式编码的图片进行解码;
- 只支持基于DCT(Discrete Cosine Transform)变换的JPEG 格式解码;
- 只支持一个SOS(Start of Scan)标志的图片解码。
- 软件约束:
- 支持3个SOS标志的图片解码;
- 支持mcu(Minimum Coded Unit)数据不足的异常图片解码。
精度相关约束
JPEGD+VPC串联使用时,由于JPEGD解码后的输出图片的宽stride*高stride有64*16对齐的约束,因此解码后的输出图片的宽、高有一些补边的无效数据,所以在执行VPC功能时(例如缩放时),需在输入图片的hi_vpc_pic_info.picture_width、hi_vpc_pic_info.picture_height参数处正确设置输入图片的原图宽高,这样VPC在缩放图片前会先根据原图宽高自行抠图,目的是去除无效数据对图像精度的影响。
其它注意事项
若图片内EOI(End Of Image,标记代码为0XFFD9)之后,还有用户自定义的数据,则JPEGD在对图片进行解码时,会直接清零EOI之后的8字节数据,若用户需要保留这些自定义的数据,则将图片数据读入内存之后,需要提前备份这部分数据,再传给JPEGD处理。
若需要查看图片内EOI之后是否存在自定义数据,可以使用二进制查看工具打开图片查看,例如下图中的FFD9标记符之后就存在自定义数据。

JPEGD性能指标数据
性能指标说明
JPEGD性能指标是基于硬件解码的性能,JPEGD硬件解码不支持3个SOS的图片解码,对于硬件不支持的格式,会使用软件解码,软件解码性能参考为1080P 15fps。JPEGD解码的输出图片如果涉及旋转,则性能指标低于软件解码的参考值,例如对于1080P的图片,性能指标低于15fps。
1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):
表1 Atlas 200/500 A2推理产品性能规格数据
| 场景举例 | 总帧率 |
|---|---|
| 1080p*n路(1≤n≤2) | n*256fps |
| 1080p*n路(n>2) | 512fps |
| 4k*n路(1≤n≤2) | n*64fps |
| 4k*n路(n>2) | 128fps |
VDEC功能及约束说明
功能说明
VDEC(Video Decoder)实现视频的解码。
分辨率约束
-
输入码流分辨率:
版本 分辨率范围 Atlas 200/500 A2推理产品 对于H264输入码流,最大分辨率8192*8192,最小分辨率128*128。 对于H265输入码流,最大分辨率5400*8192,最小分辨率128*128。 -
输出图片分辨率:
版本 分辨率范围 Atlas 200/500 A2推理产品 输出图片最大分辨率8192*8192;当输入码流宽度小于或等于4096时,输出图片最小分辨率为10*6,当输入码流宽度大于4096时,输出图片最小分辨率为128*128。
内存申请/释放接口说明
输入内存的大小就是指实际的输入码流所占用的大小,输出内存的大小参见表1中的计算公式。
| 版本 | 内存申请接口 |
|---|---|
| Atlas 200/500 A2推理产品 | VDEC视频解码时,支持以下两种内存申请接口: - 调用aclrtMalloc[aclrtFree](./aclcppdevg_03_0101.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 - 调用hi_mpi_dvpp_malloc[hi_mpi_dvpp_free](./aclcppdevg_03_0726.md)接口申请\释放Device上的输入、输出内存,这部分内存的生命周期由用户自行管理。 注意:调用hi_mpi_dvpp_malloc接口申请的内存为媒体数据处理的专用内存,但专用内存的地址空间有限,若关注内存规划或内存资源有限时,建议调用aclrtMalloc接口申请内存。 |
码流/图片格式、宽高对齐、内存约束
-
输入码流格式
- H264 bp/mp/hp level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
- H265 8/10bit level5.1 YUV420编码的码流,当前只支持annex-B的裸码流。
-
输出图片要求:
表1 码流/图片格式、宽高对齐、内存大小约束
输出图片格式
输出图片宽、高对齐要求
输出图片宽stride、高stride、内存大小要求
Atlas 200/500 A2推理产品
YUV420SP NV12 8bit
宽2对齐
高2对齐
宽stride无对齐要求,与宽相同即可,最小10,最大24576。
高stride无对齐要求,与高相同即可,最小6,最大24576。
内存大小(单位Byte)≥ 宽stride * 高stride * 3/2
YUV420SP NV21 8bit
宽2对齐
高2对齐
RGB888
无对齐要求
宽stride为宽乘以3的值,最小30,最大24576。
高stride无对齐要求,最小6,最大16384。
内存大小(单位Byte)≥ 宽stride * 高stride
BGR888
无对齐要求
:::note 说明 输出图片格式的定义请参见hi_pixel_format,宽stride、高stride等概念请参见基本概念。 :::
其它约束
- VDEC只支持对按帧输入码流进行解码。
- 若码流中有坏帧、缺帧等情况,解码器VDEC解码时会将该帧标记为解码失败,并上报异常。
- 通过隔行扫描方式编码出来的码流,VDEC仅支持解码H264 8bit编码的码流。
- 同时配置按帧发送码流与按解码序输出,可以达到快速解码和快速输出的目的,但这种场景不支持解码含有B帧的码流。
VDEC性能指标数据
性能指标说明
720p指分辨率为1280*720的图片;1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。
单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):
表1 Atlas 200/500 A2推理产品性能指标数据
| 场景举例 | 总帧率 |
|---|---|
| 720p*n路(1≤n≤4) | n*600fps |
| 720p*n路(n>4) | 2400fps |
| 1080p*n路(1≤n≤4) | n*300fps |
| 1080p*n路(n>4) | 1200fps |
| 4k*n路(1≤n≤4) | n*75fps |
| 4k*n路(n>4) | 300fps |
下表以1080P分辨率的输入码流为例,说明每路VDEC解码的最大内存消耗的计算公式,在计算公式中:
- 输入码流缓存大小:大于或等于解码通道大小(宽*高)的 3/4倍。
- 解码图像帧存大小:可调用hi_vdec_get_pic_buf_size接口获取解码图像帧存大小,该参数值跟输入码流分辨率相关。
- 视频解码图像Tmv缓存大小:可调用hi_vdec_get_tmv_buf_size接口获取视频解码图像Tmv缓存大小,该参数值跟输入码流分辨率相关。
- 输入码流缓存大小*、解码图像帧存大小、*视频解码图像Tmv缓存大小、参考帧数量均由用户调用hi_mpi_vdec_create_chn接口创建通道时设置。
- 解码后缓存图像帧数由用户在调用hi_mpi_vdec_set_chn_param接口时设置。
每路VDEC解码的内存消耗计算公式 | 场景举例 | 内存消耗(单位为MB) |
|---|---|---|
6MB + 输入码流缓存大小 * 2 + (解码图像帧存大小 + 视频解码图像Tmv缓存大小) * (参考帧数量 + 解码后缓存图像帧数 +1 ) | 52.5MB(参考帧数量为8) 31.5MB(参考帧数量为2) | |
58MB(参考帧数量为8) 34MB(参考帧数量为2) |
hi_mpi_vdec_create_chn
函数功能
根据设置的通道属性创建解码通道。
约束说明
- 单个Device上的通道号不能超出最大的通道号范围。
- 在创建解码通道之前必须保证通道未创建(或者已经销毁),否则会直接返回错误。
- 系统内存不足时会返回HI_ERR_VDEC_NO_MEM的错误码,可考虑扩展操作系统内存。
- 如果需要解码的H.264码流有B帧,或者需要解码的H.265码流支持时域运动矢量预测(sps_temporal_mvp_enabled_flag = 1),则创建通道时需要设置此通道支持时域运动矢量预测(temporal_mvp_en 设置为 1),还需要为其分配输出每一帧Tmv(Temporal Motion Vector)信息的VB(Vedio Buffer)块,该VB块的大小比图像VB块小很多,所需个数为RefFrameNum+1,具体大小通过调用函数hi_vdec_get_tmv_buf_size获取,否则会导致解码出现花屏等错误。
- H264、H265解码每个解码通道所需VB个数至少为参考帧+显示帧+1,JPEG解码每个解码通道所需VB个数至少为显示帧+1。不同协议解码所需的图像VB块大小不同,具体大小通过调用函数hi_vdec_get_pic_buf_size获取。
- 如果 H.264解码不需要解码B帧,或者 H.265解码不需要解码支持时域运动矢量预测(sps_temporal_mvp_enabled_flag = 1)的码流,则创建通道时可设置此通道不支持时域运动矢量预测(temporal_mvp_en 设置为 0),此种情况不输出Tmv信息,可以不用创建Tmv VB池,节省内存。
- 用户需要根据解码码流配置解码所需的帧存VB大小 frame_buf_size 和个数 frame_buf_cnt,以及存放Tmv信息的VB大小 tmv_buf_size,解码器内部按此配置创建相应的私有VB池。
- 只要帧存buffer和Tmvbuffer足够大,解码通道能解码在最大最小分辨率范围内的任意分辨率码流。通道宽高当前只与码流buffer、SCDbuffer(start code detector buffer)大小有关。
函数原型
hi_s32 hi_mpi_vdec_create_chn(hi_vdec_chn chn, const hi_vdec_chn_attr *attr)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 解码通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),JPEGD功能和VDEC功能共用通道,且通道总数最多128。 (说明:对于 Atlas 200/500 A2推理产品 , 昇腾虚拟化实例(Ascend Virtual Instance)场景下,VDEC通道 = ( 被分配的VDEC硬件单元 / VDEC硬件单元 ) * 128,如果通道总数不为整数,则向下取整。JPEGD的通道数不随算力影响,但JPEGD+VDEC的总通道数最大128。) |
| attr | 输入 | 解码通道属性指针。 如果参数attr为空,会返回错误码HI_ERR_VDEC_NULL_PTR。 当通道属性attr中的值超过解码能力集时,会返回HI_ERR_VDEC_ILLEGAL_PARAM的错误码。 |
返回值说明
- 0:成功
- 非0:失败,参见VDEC视频解码/JPEGD图片解码返回码
参考资源
接口调用流程及示例,参见JPEGD图片解码、VDEC视频解码。
hi_mpi_vdec_destroy_chn
函数功能
销毁解码通道,以释放相关资源。
约束说明
- 销毁前必须保证通道已创建,否则会返回通道未创建的错误。
- 销毁前必须停止接收码流(或者尚未开始接收码流),否则返回错误码HI_ERR_VDEC_NOT_PERM。
函数原型
hi_s32 hi_mpi_vdec_destroy_chn(hi_vdec_chn chn)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 解码通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),JPEGD功能和VDEC功能共用通道,且通道总数最多128。 |
返回值说明
- 0:成功
- 非0:失败,参见VDEC视频解码/JPEGD图片解码返回码
参考资源
接口调用流程及示例,参见JPEGD图片解码、VDEC视频解码。
hi_mpi_vdec_get_chn_attr
函数功能
获取视频解码通道属性。
约束说明
获取属性前必须保证通道已创建,否则会返回通道未创建的错误码HI_ERR_VDEC_UNEXIST。
函数原型
hi_s32 hi_mpi_vdec_get_chn_attr(hi_vdec_chn chn, hi_vdec_chn_attr *attr)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| chn | 输入 | 解码通道号。 Atlas 200/500 A2推理产品,该参数的取值范围:[0, 128),JPEGD功能和VDEC功能共用通道,且通道总数最多128。 |
| attr | 输出 | 解码通道属性指针。 |
返回值说明
- 0:成功
- 非0:失败,参见VDEC视频解码/JPEGD图片解码返回码
在线提单