JPEG XS的并行化改造方案与实现

背景介绍

JPEG XS是一种低延迟、视觉无损的图像压缩标准,广泛应用于实时视频传输和高质量图像处理。其参考软件实现了编码和解码功能,但目前的实现是串行的,存在性能优化的空间。本次任务旨在分析其并行化的可能性,并给出详尽的并行化思路、方案与代码。


编解码过程分析

编码过程

  1. 输入图像预处理:支持PNM、PGX、YUV等格式。
  2. 配置编码参数:包括配置文件、比特率等。
  3. 小波变换:分解图像为多个频率子带。
  4. 量化:减少数据冗余。
  5. 熵编码:压缩量化后的数据。
  6. 码流生成:生成符合ISO标准的JPEG XS码流。

解码过程

  1. 读取码流:解析JPEG XS码流结构。
  2. 熵解码:恢复量化数据。
  3. 逆量化:还原小波系数。
  4. 逆小波变换:重建图像像素数据。
  5. 色彩空间转换:还原RGB或YUV格式。

并行化改造思路

串行与并行分析

  • 现状:编码和解码过程是串行的。
  • 优化可能性:编码过程的每一列是独立的,具有并行化潜力。

并行化方案

1. 并行化列处理

  • 现状:列的初始化是通过循环逐列完成的。
  • 改造思路:使用OpenMP将列的初始化并行化。
  • 代码实现
    #pragma omp parallel for
    for (int column = 0; column < ctx->ids.npx; column++) {
        ctx->rc[column] = rate_control_open(xs_config, &ctx->ids, column);
        ctx->precinct[column] = precinct_open_column(&ctx->ids, ctx->xs_config->p.N_g, column);
    }
    

2. 并行化小波变换

  • 现状:小波变换是逐行逐列处理的。
  • 改造思路:将小波变换的行处理并行化。
  • 代码实现
    #pragma omp parallel for
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            output[y][x] = perform_wavelet_transform(input, y, x);
        }
    }
    

3. GPU加速

  • 现状:当前实现基于CPU。
  • 改造思路:使用CUDA或OpenCL将小波变换、量化和熵编码移植到GPU。
  • 优势:GPU擅长处理大规模并行任务,适合图像分块处理。

编译支持OpenMP

修改CMakeLists.txt

  • 添加以下内容以支持OpenMP:
    find_package(OpenMP REQUIRED)
    if (OpenMP_CXX_FOUND)
        target_link_libraries(jxs PRIVATE OpenMP::OpenMP_CXX)
    endif()
    

使用gcc编译

  • 添加-fopenmp选项:
    gcc -fopenmp -o jxs_encoder xs_enc.c -lm
    

总结

通过上述并行化改造,可以显著提升JPEG XS参考软件的编解码性能。主要改动包括:

  • 使用OpenMP并行化列处理和小波变换。
  • 修改编译配置以支持多线程。
  • 考虑使用GPU加速核心计算。

如果需要进一步优化或测试并行化效果,可以继续探索具体模块的实现。

留言与讨论