Decompress

该示例演示使用 IDU 对各种不同压缩算法和颜色格式的压缩文件的解压缩功能。

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

在此示例工程的演示中,无需进行额外的物理连线。

配置选项

以下宏可以配置选择目标压缩算法和颜色格式。注意:以下这些宏中只能有一个被设置为1。

#if 0 /*< RGB888, RLE stage 1, Run Length in stage1 = 1 */
#if 0 /*< RGBA8888, RLE stage 1, Run Length in stage1 = 1 */
#if 0 /*< RGBA8888, RLE stage 1, Run Length in stage1 = 2 */
#if 0 /*< RGBA8888, RLE stage 2, Run Length in stage1 = 1, Run Length in stage2 = 1 */
#if 0 /*< RGBA8888, RLE stage 2, Run Length in stage1 = 1, Run Length in stage2 = 2 */
#if 0 /*< RGBA8888, RLE stage 2, Run Length in stage1 = 2, Run Length in stage2 = 1 */
#if 0 /*< RGBA8888, RLE stage 2, Run Length in stage1 = 2, Run Length in stage2 = 2 */
#if 0 /*< RGBA8888, FastLZ */
#if 0 /*< RGB888, YUV411 sampling, No bit blur */
#if 0 /*< RGB888, YUV411 sampling, Blur 1 bit */
#if 0 /*< RGB888, YUV411 sampling, Blur 2 bits */
#if 0 /*< RGB888, YUV411 sampling, Blur 4 bits */
#if 0 /*< RGB888, YUV422 sampling, No bit blur */
#if 0 /*< RGB888, YUV422 sampling, Blur 1 bit */
#if 0 /*< RGB888, YUV422 sampling, Blur 2 bits */
#if 0 /*< RGB888, YUV422 sampling, Blur 4 bits */
#if 0 /*< RGB888, YUV444 sampling, No bit blur */
#if 0 /*< RGB888, YUV444 sampling, Blur 1 bit */
#if 0 /*< RGB888, YUV444 sampling, Blur 2 bits */
#if 0 /*< RGB888, YUV444 sampling, Blur 4 bits */
#if 0 /*< RGB888, YUV411 sampling, No bit blur, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV411 sampling, Blur 1 bit, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV411 sampling, Blur 2 bits, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV411 sampling, Blur 4 bits, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV422 sampling, No bit blur, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV422 sampling, Blur 1 bit, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV422 sampling, Blur 2 bits, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV422 sampling, Blur 4 bits, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV444 sampling, No bit blur, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV444 sampling, Blur 1 bit, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV444 sampling, Blur 2 bits, FastLZ applied on sampled data */
#if 0 /*< RGB888, YUV444 sampling, Blur 4 bits, FastLZ applied on sampled data */

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

解压数据成功

当该示例运行在EVB上后,DebugAnalyzer窗口中会打印以下信息,表明IDU解压缩成功,所有解压后的数据都与标准数据相符。

decompress procedure succeeded

解压数据失败

当该示例运行在EVB上后,DebugAnalyzer窗口中会打印以下信息,表明IDU解压缩失败,解压后的数据与标准数据不符。错误的数据与正确的数据都会进行展示,并告知产生错误数据的位置。例如:

错误的数据与正确的数据都会进行展示,并告知产生错误数据的位置。例如:

Received word is 0xABCDEF00
Golden word is 0x12345678
[ERROR] occurs during decompress procedure at offset 172

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\idu\decompress\proj

  • 源码路径: sdk\samples\peripheral\idu\decompress\src

初始化

初始化流程包含在 IDU_test() 中。

  1. 根据 配置选项 中的介绍选择待测试的压缩算法和颜色格式.

  2. 从压缩数据的头部读取信息。算法,像素大小和图像大小信息存储在 IDU_file_header 中。

IDU_file_header *header = (IDU_file_header *)file_data;
  1. 在结构体 IDU_decode_range 中填充需要解压的范围。

IDU_decode_range range;
range.start_column = 0;
range.end_column = header->raw_pic_width - 1;
range.start_line = 0;
range.end_line = header->raw_pic_height - 1;
  1. 在结构体 IDU_DMA_config 指定使用的DMA通道和存放解压后数据的地址。

IDU_DMA_config dma_cfg;
dma_cfg.output_buf = (uint32_t *)buf;
dma_cfg.RX_DMA_channel_num = 0;
dma_cfg.TX_DMA_channel_num = 1;

功能实现

执行 IDU_Decode() 后,解压完成的数据会与标准数据进行比对。如果产生错误,能够观察到产生错误的地址和数据。如果在此操作中产生错误,错误数据会如 测试验证 章节中展示,在DebugAnalyzer中显示。