---
title: JPEGD功能及约束说明
description: "JPEGD（JPEG Decoder）实现.jpg、.jpeg、.JPG、.JPEG图片文件的解码。"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/dvpp/aclcppdevg_03_0355.html
sourcePath: /source/zh/canncommercial/900/API/dvpp/aclcppdevg_03_0355.html
indexId: 0662b32afbaa1155b564ee0105e3625d8645259806028a766dbf7fa1f96d8afe62
---
# JPEGD功能及约束说明

#### 功能说明

JPEGD（JPEG Decoder）实现.jpg、.jpeg、.JPG、.JPEG图片文件的解码。

- JPEGD在解码图片时，支持对图片进行旋转。
  如果输入图片的码流中包含Orientation信息（代表捕获图像时摄像机相对于场景的方向），则JPEGD在解码时会解析Orientation信息，将图片进行90度、180度、270度或镜像旋转。旋转后输出图片的宽stride、高stride、输出内存仍需满足图片格式、宽高对齐、内存约束中的要求。

  如果输入图片的码流异常，导致JPEGD解码时无法读取Orientation信息，则不能实现图片旋转的功能。

  针对以下产品型号，旋转图片时，若原图高为奇数，并且旋转方式为宽高对换，则旋转后宽存在黑边，建议用户将宽向下对齐到偶数使用（即去除黑边）。例如JPEGD 422格式
  旋转图片，原图为200*101，若旋转后为101*200，则建议用户实际使用区域为100*200；再例如JPEGD 440格式
  旋转图片，原图为201*101，若旋转后为100*201，则建议用户实际使用区域为100*200。
  - Atlas 350 加速卡
  - Atlas A3 训练系列产品 / Atlas A3 推理系列产品
  - Atlas A2 训练系列产品 / Atlas A2 推理系列产品
  - Atlas 200I/500 A2 推理产品


- JPEGD在解码图片时，支持按源图片格式解码。
源图片格式解码是指解码前后图片的编码格式保持一致，例如解码前输入图片为jpeg(440)，解码后输出图片为YUV440SP V在前U在后或YUV440SP U在前V在后。
使用源图片格式解码，有以下方式：

  - 调用    acldvppJpegGetImageInfoV2
接口，获取JPEGD解码前输入图片的编码格式，在调用JPEGD解码接口时，将输出图片格式设置的与输入图片编码格式一致。
  - 在调用JPEGD解码接口时，将输出图片格式配置为PIXEL_FORMAT_UNKNOWN，输出格式默认按源图片格式输出、且是V在前U在后的Semi-Planar格式。例如，JPEG输入图片编码格式为jpeg(440)，输出图片格式配置为PIXEL_FORMAT_UNKNOWN，JPEGD解码后，实际输出图片格式为YUV440SP V在前U在后。
    JPEGD解码后的输出图片，如果要直接作为模型推理的输入，建议将输出图片格式配置为PIXEL_FORMAT_UNKNOWN，这时JPEGD使用源图片格式解码（但这里要确保解码后的图片格式模型是支持的），保证模型推理的精度。


#### 图片分辨率约束

输入图片分辨率：| 型号 | 分辨率范围 |
| --- | --- |
| Atlas 推理系列产品 Atlas 训练系列产品 | 最大分辨率：8192\*8192，最小分辨率：32\*32。 |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 Atlas A2 训练系列产品 / Atlas A2 推理系列产品 Atlas 200I/500 A2 推理产品 | 最大分辨率：16384\*16384，最小分辨率：32\*32。 |


输出图片分辨率：

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


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

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

JPEGD支持的输出图片格式如下表所示。输出图片格式的定义请参见acldvppPixelFormat。其中，YUV400 8bit格式，Atlas 训练系列产品不支持。

不同产品上，宽stride*高stride的对齐约束不同（宽stride、高stride等概念请参见基本概念），如下所示：

- 针对以下产品型号，宽stride*高stride有64*16对齐的约束
  Atlas A3 训练系列产品 / Atlas A3 推理系列产品

  Atlas A2 训练系列产品 / Atlas A2 推理系列产品

  Atlas 200I/500 A2 推理产品

  Atlas 推理系列产品

- 针对以下产品型号，宽stride*高stride有128*16对齐的约束：
  Atlas 训练系列产品


实现JPEGD图片解码功能时，需调用acldvppMalloc接口申请Device上的输入、输出内存，调用acldvppFree接口释放输入、输出内存，这部分内存的生命周期由用户自行管理。输入内存的大小就是指实际的输入图片所占用的大小。输出内存的大小是指存放输出图片的内存大小，可调用acldvppJpegPredictDecSize接口预估，计算公式参见下表。


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

| 输入图片格式（YUV分量比例） | 输出图片格式 | 输出图片宽、高对齐要求 | 输出图片内存大小要求 |
| --- | --- | --- | --- |
| jpeg(444) | YVU444SP 8bit YUV444SP 8bit | 无对齐要求 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3 |
| jpeg(444) | YUV420SP NV12 8bit YUV420SP NV21 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3/2 |
| jpeg(422) | YVU422SP 8bit YUV422SP 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 2 |
| jpeg(422) | YUV420SP NV12 8bit YUV420SP NV21 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3/2 |
| jpeg(420) | YUV420SP NV12 8bit YUV420SP NV21 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3/2 |
| jpeg(400) | YUV420SP NV12 8bit YUV420SP NV21 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3/2 |
| jpeg(400) | YUV400 8bit | 无对齐要求 | 内存大小（单位Byte）≥ 宽stride \* 高stride |
| jpeg(440) | YVU440SP 8bit YUV440SP 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 2 |
| jpeg(440) | YUV420SP NV12 8bit YUV420SP NV21 8bit | 宽2对齐 高2对齐 | 内存大小（单位Byte）≥ 宽stride \* 高stride \* 3/2 |


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


#### 软、硬件约束

- 硬件约束：

  - 最多支持4张Huffman表，其中包括2 张DC（直流）表和2 张AC（交流）表。
  - 最多支持3张量化表。
  - 只支持8bit采样精度。
  - 只支持对顺序式编码的图片进行解码。
  - 只支持基于DCT（Discrete Cosine Transform）变换的JPEG格式解码。
  - 只支持一个SOS（Start of Scan）标志的图片解码。
- 软件约束：

  - 支持3个SOS标志的图片解码。
  - 支持mcu（Minimum Coded Unit）数据不足的异常图片解码。


#### 精度相关约束

JPEGD+VPC串联使用时，由于JPEGD解码后的输出图片的宽stride*高stride有对齐的约束，因此解码后的输出图片的宽、高有一些补边的无效数据，所以在执行VPC功能时（例如缩放时），需调用acldvppSetPicDescWidth和acldvppSetPicDescHeight接口正确设置输入图片的原图宽高，这样VPC在缩放图片前会先根据原图宽高自行抠图，目的是去除无效数据对图像精度的影响。
