9.3.2. JPEG模块功能说明

9.3.2.1. 原理框图

下图是JPEG编解码引擎的框架示意图

../../../_images/jpg_framework.png
JPEG 解码流程如下:
  • VLD 解码模块从外部存储器读取原始码流,解码出 MCU 块系数信息,并将块系数信息传递给变换/量化模块;

  • 变换/量化模块根据接收到的块系数进行反量化和反变换;

  • 后处理模块读取反变换后的块数据,镜像旋转、镜像或下采样;

  • 最终解码得到的 MCU 数据通过 DMA 写入外部存储器;

  • 时序控制对各个子模块进行调度,确保解码过程的正确性与高效率,为了提高解码效率,各子模块之前采取并行的方式进行。

JPEG编码流程与解码完全相反。
  • 首先通过 DMA 由外部存储器读取 MCU 亮度和色度数据,并保存到内部缓存用于前处理;

  • 前处理模块对 MCU 块数据进行镜像旋转、缩放处理;

  • 变换/量化模块对接收到的块系数进行变换和量化;

  • 量化后的块系数经过 VLC 模块进行 huffman 编码,得到最终的码流;

  • 最后通过 DMA 把比特流数据写入外部存储器。

9.3.2.2. 解码流程

JPEG图片解码启动一次硬件就可以完成一张图片的解码。具体流程如下:

../../../_images/jpg_decode.png

9.3.2.3. 前/后处理

解码后处理支持缩放以及旋转镜像,但两个功能不能同时开启;同时也支持 RGB 颜色格式转换以及 Crop 输出。

编码前处理只支持旋转镜像,不支持缩放。

  • 缩放

缩放功能支持对解码后数据进行下采样,水平、垂直像素宽度可以分别缩小为原始的1、1/2、1/4、1/8。

  • 旋转和镜像

旋转4种模式,分别对应逆时针旋转 90度*n (n=0, 1, 2, 3),镜像支持两种模式(水平镜像和垂直镜像),旋转与镜像可组合使用,如下表所示。

当旋转和镜像组合使用时,先做镜像再做旋转。当该模块被使能后,共有四位寄存器用于工作模式的选择:两位代表选择的角度,另外两位分别代表水平与垂直镜像功能的使能,实际有效只有8种表现。

垂直镜像使能

水平镜像使能

旋转模式

寄存器值

模式

0

4‘b0000

0

90

4‘b0001

1

180

4‘b0010

2

270

4‘b0011

3

0

4‘b0100

4

90

4‘b0101

5

180

4‘b0110

6

270

4‘b0111

7

0

4‘b1000

8

90

4‘b1001

9

180

4‘b1010

10

270

4‘b1011

11

0

4‘b1100

12

90

4‘b1101

13

180

4‘b1110

14

270

4‘b1111

15

../../../_images/mirror.png
  • 颜色格式转换模块

颜色格式转换模块支持 YUV 格式转 RGB/RGBA

  • 误差扩散 Dither

当像素格式从高位宽转为低位宽时(输出颜色格式为 RGB565 或 BGR565 ),如果直接对数值做截断处理,图像的渐变区域会有明显的阶梯效应。 使用 Dither 算法可以使图像渐变区域更平滑。

Dither 算法主要思想是把相邻像素的量化误差扩散到当前像素,从而使图像更平滑。

  • crop 功能

解码后图像的矩形区域数据搬移到目标图像的指定矩形区域中。 只有 RGB/RGBA 颜色格式输出才支持crop功能。

../../../_images/crop.png