跳到主要内容

函数:dvpp_jpeg_decode_async

功能及约束说明

功能说明

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在解码图片时,支持按源图片格式解码。

    源图片格式解码是指解码前后图片的编码格式保持一致,例如解码前输入图片为jpeg(440),解码后输出图片为YUV440SP V在前U在后或YUV440SP U在前V在后。

    使用源图片格式解码,有以下方式:

    • 调用acl.media.dvpp_jpeg_get_image_info_v2接口,获取JPEGD解码前输入图片的编码格式,在调用JPEGD解码接口时,将输出图片格式设置的与输入图片编码格式一致。
    • 在调用JPEGD解码接口时,将输出图片格式配置为PIXEL_FORMAT_UNKNOWN,输出格式默认按源图片格式输出、且是V在前U在后的Semi-Planar格式。例如,JPEG输入图片编码格式为jpeg(440),输出图片格式配置为PIXEL_FORMAT_UNKNOWN,JPEGD解码后,实际输出图片格式为YUV440SP V在前U在后。

    :::note 说明 JPEGD解码后的输出图片,如果要直接作为模型推理的输入,建议将输出图片格式配置为PIXEL_FORMAT_UNKNOWN,这时JPEGD使用源图片格式解码(但这里要确保解码后的图片格式模型是支持的),保证模型推理的精度。

    JPEGD解码后的输出图片,如果直接作为VPC的输入,该场景下若使用源图片格式解码时,则需要关注解码后的输出图片格式VPC是否支持(VPC输入图片的格式请参见约束说明),如果VPC不支持,则用户需按VPC支持的情况指定JPEGD的输出图片格式。 :::

图片分辨率约束

  • 输入图片分辨率

    昇腾AI处理器分辨率范围
    Atlas 200/500 A2推理产品最大分辨率:16384*16384,最小分辨率:32*32。
  • 输出图片分辨率

    JPEGD只对图片解码,不会改变图片分辨率,因此输出与输入的图片分辨率保持一致。

图片格式、宽高对齐、内存约束

实现JPEGD图片解码功能时,需调用acl.media.dvpp_malloc接口申请Device上的输入、输出内存,调用acl.media.dvpp_free接口释放输入、输出内存,这部分内存的生命周期由用户自行管理。

  • 输入内存的大小就是指实际的输入图片所占用的大小。
  • 输出内存的大小,可调用acl.media.dvpp_jpeg_predict_dec_size接口预估,计算公式参见下表。

实现JPEGD图片解码功能时,仅支持Huffman编码,压缩前的原图像色彩空间为YUV,像素的各分量比例为4:4:4或4:2:2或4:2:0或4:0:0或4:4:0,不支持算术编码、不支持渐进JPEG格式、不支持JPEG2000格式。

:::note 说明 输出图片格式的定义请参见acldvppPixelFormat,宽stride、高stride等概念请参见基本概念。 :::

表1 图片格式、宽高对齐、内存大小约束

输入图片格式(YUV分量比例)

输出图片格式

输出图片宽、高对齐要求

输出图片宽stride、高stride、内存大小要求

Atlas 200/500 A2推理产品

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对齐

高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对齐

高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(直流)表和2 张AC(交流)表。
    • 最多支持3张量化表。
    • 只支持8bit采样精度。
    • 只支持对顺序式编码的图片进行解码。
    • 只支持基于DCT(Discrete Cosine Transform)变换的JPEG 格式解码。
    • 只支持一个SOS(Start of Scan)标志的图片解码。
  • 软件约束
    • 支持3个SOS标志的图片解码。
    • 支持mcu(Minimum Coded Unit)数据不足的异常图片解码。

精度相关约束

  • 在Atlas 200/500 A2推理产品,JPEGD+VPC串联使用时,由于JPEGD解码后的输出图片的宽stride*高stride有64*16对齐的约束,因此解码后的输出图片的宽、高有一些补边的无效数据,所以在执行VPC功能时(例如缩放时),需调用acl.media.dvpp_set_pic_desc_width和acl.media.dvpp_set_pic_desc_height接口正确设置输入图片的原图宽高,这样VPC在缩放图片前会先根据原图宽高自行抠图,目的是去除无效数据对图像精度的影响。

父主题: JPEGD功能

性能指标说明

性能指标说明

JPEGD性能指标是基于硬件解码的性能,JPEGD硬件解码不支持3个SOS的图片解码,对于硬件不支持的格式,会使用软件解码,软件解码性能参考为1080P 15fps。JPEGD解码的输出图片如果涉及旋转,则性能指标低于软件解码的参考值,例如对于1080P的图片,性能指标低于15fps。

以下性能数据,是基于一个stream上下发10个异步媒体数据处理任务后,执行一次acl.rt.synchronize_stream接口。

1080p指分辨率为1920*1080的图片;4K指分辨率为3840*2160的图片。单个Device的基本场景性能指标参考如下(1路对应一个通道,一个通道对应一个线程):

场景举例总帧率
1080p*n路(1≤n≤2)n*256fps
1080p*n路(n>2)512fps
4k*n路(1≤n≤2)n*64fps
4k*n路(n>2)128fps

父主题: JPEGD功能

函数:dvpp_jpeg_decode_async

C函数原型aclError acldvppJpegDecodeAsync(acldvppChannelDesc *channelDesc, const void *data, uint32_t size, acldvppPicDesc *outputDesc, aclrtStream stream)
Python函数ret = acl.media.dvpp_jpeg_decode_async(dvpp_channel_desc, data, size, output_dvpp_pic_desc, stream)
函数功能解码.jpg、.jpeg、.JPG、.JPEG图片,异步接口。
输入说明dvpp_channel_desc:int,指定通道描述信息的指针地址,与调用acl.media.dvpp_create_channel接口创建通道时指定的dvpp_channel_desc保持一致。 data:int,输入图片的内存地址的指针地址。 size:int,输入图片的实际数据大小,单位Byte。 output_dvpp_pic_desc:int,输出图片信息的指针地址。
- 调用acl.media.dvpp_create_pic_desc接口创建图片描述信息。
- 调用acl.media.dvpp_set_pic_desc系列接口设置输出图片的内存地址、内存大小、格式、width_stride、height_stride。
- 输出图片的内存大小可提前调用acl.media.dvpp_jpeg_predict_dec_size接口预估。
- JPEG原图的宽、高可通过acl.media.dvpp_jpeg_get_image_info/acl.media.dvpp_jpeg_get_image_info_v2接口获取。
- 输出图片格式、输出图片的宽高对齐要求,请参见功能及约束说明。 作为输出时,用户可以从内存地址中获取解码后的输出图片数据、可以调用acl.media.dvpp_get_pic_desc系列接口获取输出图片的宽/高。 (说明:Atlas 200/500 A2推理产品 上,如果解码后的输出图片数据需要在后续操作(例如,使用VPC实现抠图、缩放等功能)中使用,建议在解码后调用acl.media.dvpp_get_pic_desc获取输出图片的宽/高,因为解码过程中可能会对输出图片的宽高执行对齐操作,例如,jpeg(444) 源码的图片解码成YUV420SP格式的输出图片时,当jpeg(444) 源码图片的宽/高为奇数时,解码出来的YUV420SP格式的输出图片的宽/高理论上应该为奇数,但是YUV420SP格式本身要求图片的宽/高都为偶数,这时JPEGD会对奇数宽/高做向下2对齐的操作。) stream:int,指定Stream对象。
返回值说明ret:int,错误码。
- 返回0,表示任务下发成功。
- 返回非0,表示任务下发失败。
参考资源接口调用流程及示例,参见JPEGD图片解码

父主题: JPEGD功能

函数:dvpp_jpeg_get_image_info

C函数原型aclError acldvppJpegGetImageInfo(const void *data, uint32_t size, uint32_t *width, uint32_t *height, int32_t *components)
Python函数width, height, components, ret = acl.media.dvpp_jpeg_get_image_info(data, size)
函数功能从存放JPEG图片数据的内存中读取JPEG图片的宽、高、颜色通道个数。 该接口会检查图片格式是否支持解码,如果遇到不支持的码流则该接口会返回ACL_ERROR_UNSUPPORTED_JPEG错误码,该错误码的详细描述请参见aclError
输入说明data:int,存放JPEG图片数据的内存的地址。 size:int,内存大小,单位为Byte。
返回值说明width:int,图片的宽的指针地址。 height:int,图片的高的指针地址。 components:int,颜色通道个数的指针地址。 ret:int,错误码。
- 返回0表示成功。
- 返回其它值表示失败。

父主题: JPEGD功能

函数:dvpp_jpeg_get_image_info_v2

C函数原型aclError acldvppJpegGetImageInfoV2(const void *data, uint32_t size, uint32_t *width, uint32_t *height, int32_t *components, acldvppJpegFormat *format)
Python函数width, height, components, format, ret = acl.media.dvpp_jpeg_get_image_info_v2(data, size)
函数功能从存放JPEG图片数据的内存中读取JPEG图片的宽、高、颜色通道个数、JPEG原图编码格式。 该接口会检查图片格式是否支持解码,如果遇到不支持的码流则该接口会返回ACL_ERROR_UNSUPPORTED_JPEG错误码,该错误码的详细描述请参见aclError
输入说明data:int,存放JPEG图片数据的内存的地址。 size:int,内存大小,单位为Byte。
返回值说明width:int,图片的宽的指针地址。 height:int,图片的高的指针地址。 components:int,颜色通道个数的指针地址。 format:int,JPEG原图编码格式的指针地址。 ret:int,错误码。
- 返回0表示成功。
- 返回其它值表示失败。

父主题: JPEGD功能

函数:dvpp_jpeg_predict_dec_size

C函数原型aclError acldvppJpegPredictDecSize(const void *data, uint32_t dataSize, acldvppPixelFormat outputPixelFormat, uint32_t *decSize)
Python函数dec_size, ret = acl.media.dvpp_jpeg_predict_dec_size(data, data_size, format)
函数功能根据存放JPEG图片数据的内存预估JPEG图片解码后所需的输出内存的大小。
输入说明data:int,Host上存放JPEG图片数据的内存的地址。 data_size:int,内存大小,单位为Byte。 format:int,解码后的输出图片的格式。详情见acl.media.dvpp_set_pic_desc_format介绍。
返回值说明dec_size:int,预估JPEG图片解码后所需的输出内存的大小的指针地址,单位为Byte。 ret:int,错误码。
- 返回0表示成功。
- 返回其它值表示失败。

父主题: JPEGD功能

在线提单