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%。

目录
相关文章
|
分布式数据库 芯片
Mstar9632 制作量产emmc母片
Mstar9632 制作量产emmc母片
599 0
Mstar9632 制作量产emmc母片
|
Java Maven
maven篇4:pom文件详解
maven篇4:pom文件详解
863 3
|
存储 编解码 vr&ar
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
用C++实现视频编码器:FFmpeg与SDL技术结合,轻松编写高效编解码器
1561 0
|
编解码 Android开发
Android native层实现MediaCodec编码H264/HEVC
Android平台在上层实现mediacodec的编码,资料泛滥,已经不再是难事,今天给大家介绍下,如何在Android native层实现MediaCodec编码H264/HEVC,网上千篇一律的接口说明,这里不再赘述,本文主要介绍下,一些需要注意的点,权当抛砖引玉,相关设计界面如下:
483 0
|
消息中间件 存储 Kafka
微服务实践之分布式定时任务
微服务实践之分布式定时任务
|
Web App开发 Java iOS开发
webp详解
WebP是一种由谷歌开发的图像文件格式,旨在提供更高效的图像压缩方法,以加快网页加载速度。它支持有损和无损压缩模式,并且在相同的视觉质量下,相比JPEG和PNG等格式,文件大小更小,从而优化了网络传输效率。此外,WebP还支持透明度和动画图像。
人脸的姿态信息 {"yaw": -16.708233,"pitch": -8.508476,"roll": 4.2277336}是什么
【6月更文挑战第16天】人脸的姿态信息 {"yaw": -16.708233,"pitch": -8.508476,"roll": 4.2277336}是什么
375 0
|
Kubernetes 应用服务中间件 nginx
解释一下Kubernetes Minikube是什么,以及如何在本地运行一个Minikube集群
步骤1:准备环境 在开始之前,您需要确保本地环境已经具备以下几个关键的工具和组件:
1955 1
|
算法 Linux API
一文聊聊Linux Kernel的加密子系统【Crypto Subsystem】
一文聊聊Linux Kernel的加密子系统【Crypto Subsystem】
1354 1
|
虚拟化 数据安全/隐私保护 网络安全