JPEG软解码

[English]

1、JPEG软解码流程

JPEG软解码主要流程如下:

  1. 预解码,将一张JPEG数据中头解析出来,获取图像格式,图像的长和宽,量化表以及霍夫曼表;

  2. 查找量化表以及霍夫曼表进行解析一个block数据;

  3. 将一个block数据转换为需要输出的图像格式;

  4. 将转换后的图像数据写入到输出图像中;

  5. 重复2-4,直至出现异常或解码结束;

jpeg_decode sw

Figure 1. jpeg soft decode process

2、内存需求

JPEG软解码对线程依赖在1K以内,主要需要的buffer及用途如下:

  1. 一块10240的buffer,用于存储霍夫曼表以及中间数据处理;

  2. 一块0xB0大小的buffer,用于存储中间运行的指针和变量;

  3. 一块16*16*2大小的buffer,用于软解码后进行图像旋转;(旋转仅支持YUYV格式)

3、JPEG软解码模块使用

1)调用 bk_jpeg_dec_sw_init ,初始化软解码模块;

2)调用 jd_set_output_format ,可选配置项,用于设置解码输出格式;

设置图像输出格式(支持YUYV,RGB565,RGB888多种格式,具体见JD_FORMAT_OUTPUT枚举变量), 默认为YUYV格式,
缩放比例(0:1,1:1/2, 2:1/4, 3:1/8),默认为0,不缩放;
字节序(0:小端,1:大端),默认为小端,该大端格式示例(0X12345678(小端) -> 0x34127856(大端)),用户需要根据实际情况配置;
每个参数可以单独调用函数设置,具体函数请查看api;

3)调用 jd_set_rotate ,可选配置项,用于设置解码输出图像旋转角度;仅支持YUYV格式;

旋转角度(0:0度,1:90度,2:180度,3:270度),默认为0,不旋转;
旋转buffer:用于内部图像旋转加速, 默认为NULL,不旋转;
如果旋转角度配置为非0度,该参数必须配置,且大小必须大于等于<width * 16 * 2>,否则输出图像不旋转;

4)调用 bk_jpeg_dec_sw_start ,对传入的图像进行解码;

内部解码实例仅一个,不支持多个task线程同时调用,多线程调用请使用一次性解码函数 `bk_jpeg_dec_sw_start_one_time`;
解码完成后,会将解码后的图像数据写入到输出buffer中;
输出buffer的大小必须大于等于<width * height * 2>,RGB888格式的输出buffer大小必须大于等于<width * height * 3>,否则会导致解码失败;

5)调用 bk_jpeg_dec_sw_deinit ,将软解码内部buffer释放;

函数参数请查看 API Reference :

备注

软解码图像需要宽度为偶数

4、获取图像信息接口

为了方便用户获取图像的宽度和高度信息,后续申请足够大小的buffer,提供了获取图像信息的接口 bk_jpeg_get_img_info,

该接口的内存独立于jpeg解码模块,因此需要额外的内存,内存需求见章节2;
在函数执行结束后,内存会自动释放;

函数参数请查看 API Reference :

5、一次性解码函数

出于部分场景下需要,提供了一次性解码的接口 bk_jpeg_dec_sw_start_one_time,

该接口使用前不需要调用 `bk_jpeg_dec_sw_init` ,buffer可以由外部传入;
如果外部传入NULL,则由接口内部自动申请;申请的buffer大小请看章节2的内存需求,不满足需求会导致解码失败;
解码完成后自动释放内部申请的buffer,外部传入的buffer需要外部主动释放;

备注

该接口可以和软解码模块并行解码,解码速度并行时会降低;

6、解码速度优化

在DTCM充足的情况下,可以在CP1和CP2上将 CONFIG_SOFTWARE_DECODE_SRAM_MAPPING 置为 y 来加快解码速度;

该优化方式为将解码线程以及部分解码使用的buffer放到dtcm上运行,同时将原来解码一个block就存到psram上改为缓冲16行之后再一起存到psram上,减少实际运行中psram频繁地址切换时间;

备注

软解码和旋转模块不能同时工作,因为默认配置下软解码中用于缓冲16行的buffer为旋转模块中使用的buffer;
如果需要同时使用软解码和旋转模块,需要将调用 `jd_set_rotate` 传入外部申请的buffer,而不是旋转模块中使用的buffer;
外部申请的buffer大小必须大于等于<width * 16 * 2>,否则会导致解码失败;