Jpeg 库的解码OpenCL优化

简介: libJpeg库解码OpenCL优化这两周在闲暇时基于通用的libjpeg库重新做了一个opencl解码实现。重新熟悉下算法。代码路径https://github.com/jxt1234/platform_external_jpeg OpenCL文件夹目录下面的就是所有的修改。 用Xcode开发的,没兴趣去整Makefile了,代码独立,移植集成也很方便。

libJpeg库解码OpenCL优化

这两周在闲暇时基于通用的libjpeg库重新做了一个opencl解码实现。重新熟悉下算法。

代码路径

https://github.com/jxt1234/platform_external_jpeg
OpenCL文件夹目录下面的就是所有的修改。
用Xcode开发的,没兴趣去整Makefile了,代码独立,移植集成也很方便。

主要特点

1.算法代码完全独立,不修改原来库中的代码。
2.支持各种YUV格式(411、422、444等等)。
3.霍夫曼解码仍然由CPU完成,采用OpenCL做idct和颜色转换,向量化实现,效率很高。(PS:当年移植那个坑爹的libjpeg-opencl时被坑死了)
4.只支持输出为rgb的格式,需要扩展的看下代码自己改,也不麻烦,这部分用simd实现比较好,因此没怎么写。

使用示例

extern "C"
{
#include "jpeglib.h"
};
int main() {
    const char* inputfile = "input.jpg";
    const char* outputfile = "output.jpeg";
    struct jpeg_decompress_struct cinfo;
    FILE* infile;
    int row_stride;
    auto sta = clock();
    if ((infile = fopen(inputfile, "rb")) == NULL)
    {
        return NULL;
    }
    jpeg_create_decompress(&cinfo);
    struct jpeg_error_mgr jerr;
    cinfo.err = jpeg_std_error(&jerr);
    jpeg_stdio_src(&cinfo, infile);
    (void) jpeg_read_header(&cinfo, TRUE);
    /*必须设成float方式,若是cpu解码,这个会影响性能,但对于gpu来说没有关系,而且float方式精度最高,几乎不会造成图片失真*/
    cinfo.dct_method = JDCT_FLOAT;
    (void) jpeg_start_decompress(&cinfo);
    auto width = cinfo.output_width;
    auto height = cinfo.output_height;

    /*rgb 三个分量*/
    auto pixels = (JSAMPLE*)(malloc(width*height*3));

    /*opencl 解码的 api*/
    /*pixels 默认为rgb24位,事先分配好内存*/
    jpeg_decode_by_opencl(&cinfo, pixels);

    //这里用abort而不是finish,直接中止掉
    (void) jpeg_abort_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);
    fclose(infile);
    auto fin = clock();
    printf("Time cost for %d * %d, %lu / %ds\n", width, height, fin-sta, CLOCKS_PER_SEC);

    /*用得到的pixels做一些事情。。。。。。*/


    /*释放掉pixels*/
    free(pixels);
    return 0;
}

性能数据

MACBook上数据,仅供参考
OpenCL优化后数据:
Time cost for 3200 * 2000, 177757 / 1000000s
MCU is 130001 / 1000000s

原CPU方式数据
Time cost for 3200 * 2000, 363453 / 1000000s

idct和颜色转换的时间压缩到可以忽略不计了。几乎只剩下解霍夫曼编码的时间,总体性能是提升了100%。

目录
相关文章
|
存储 编解码 vr&ar
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
1923 0
|
机器学习/深度学习 存储 监控
yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)
yolov5单目测距+速度测量+目标跟踪(算法介绍和代码)
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
735 0
|
编解码 缓存 开发工具
HarmonyOS NEXT实战:字符串工具
本课程讲解如何在HarmonyOS Next中使用ArkTS语言封装字符串工具类,实现字符串空值判断、编码转换、Base64编解码等功能,帮助开发者高效处理字符串操作。
413 1
|
Web App开发 Java iOS开发
webp详解
WebP是一种由谷歌开发的图像文件格式,旨在提供更高效的图像压缩方法,以加快网页加载速度。它支持有损和无损压缩模式,并且在相同的视觉质量下,相比JPEG和PNG等格式,文件大小更小,从而优化了网络传输效率。此外,WebP还支持透明度和动画图像。
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
高频面试题:如何分别用三种姿势实现三个线程交替打印0到100
1200 0
|
消息中间件 存储 Kafka
微服务实践之分布式定时任务
微服务实践之分布式定时任务
|
安全 Linux 算法框架/工具
open Euler安全加固
open Euler安全加固
2080 11
【LVGL快速入门】SquareLine Studio安装教程(LVGL官方工具)
【LVGL快速入门】SquareLine Studio安装教程(LVGL官方工具)
6086 0