Jpeg 库的解码OpenCL优化

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

时间: 2024-09-15 19:12:21

Jpeg 库的解码OpenCL优化的相关文章

bmp-用IJG的jpeg库压缩DIB位图出现色彩失真。

问题描述 用IJG的jpeg库压缩DIB位图出现色彩失真. 这是用IJG的jpeg库编写的一段压缩DIB位图的程序,程序运行没问题,结果图形色彩却出现了严重的失真: jpeg_compress_struct jpeg; jpeg_error_mgr jerr; jpeg.err = jpeg_std_error(&jerr); //错误输出在绑定 jpeg_create_compress(&jpeg); //初始化压缩对象 //定义压缩后的输出,这里输出到一个文件! FILE* pFile

库-libjpeg解码jpeg图片问题,具体怎么实现?

问题描述 libjpeg解码jpeg图片问题,具体怎么实现? 具体怎么解码,同时解码后解码后改变头信息?编译了libjpeg库后不会用啊. 解决方案 JPEG图片解码使用libjpeg解码jpeg图片 解决方案二: http://blog.chinaunix.net/uid-23983143-id-3343779.html

Skia深入分析10——Skia库的性能与优化潜力

Skia库性能与优化潜力 图形/渲染 算法/架构 作为图形渲染引擎,性能上是非常重要的,按通常Android手机60帧的刷新率,绘制一帧的总时间只有16ms,可谓是毫厘必争.提升性能到最后,就必然跟不同CPU的特性打交道,毕竟一个SIMD下去,好做的提升5.6倍,不那么好做的也达到2.3倍,收益极其可观. SIMD,在intel上是SSE,在arm上是neon,在mips上则是其dsp功能.使用SIMD,需要代码架构是满足内存连续性要求的,否则需要重构,Skia作为正常的图形渲染引擎,采用行渲染

备库CPU使用异常优化

一般在一些容灾环境中,尤其是在11g的ADG非常普及的场景下,备库被赋予了更多的责任,很多时候在容忍一些延迟的情况下,有些应用的大量数据查询任务直接放到了备库,把它当做一个只读节点来使用,所以在有些情况下,可能备库的压力还是蛮大的. 最近自从把备库纳入zabbix的监控体系之后,有一个备库总是在午夜发来一条报警邮件.内容大体如下: adb0_s1@10.127.xx.xx_报警 ------------------------------------ 报警内容: CPU utilization

mcu-请教jpeglib库在压缩存储jpeg图片的详细过程

问题描述 请教jpeglib库在压缩存储jpeg图片的详细过程 jpeg库在压缩存储rgb数据时,是以压缩后的MCU为单位存储,还是以压缩后的一行rgb数据为单位存储? jpeg在压缩图片时不是以8x8的像素块(MCU也可能不是8x8)来编码的么,为什么它提供的 jpeg_write_scanlines()函数给人的感觉是压缩一行像素图,再把压缩后的数据存入文件中而不是存储一个压缩后的MCU.

WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实需求是将地方坐标系坐标反转成WGS84坐标,如果现在需要将其转换成百度坐标系数据.常规方案是先建立好整个该市的本地坐标和百度坐标之间的控制点库后再进行转换.但是在具体实施中发现转换特别慢,由于控制点库也有200多万条记录,大概一个点需要一秒钟才能转换完. 2.将Update变成Insert关键字段值

AMD OpenCL大学课程(12) 性能优化案例NBody

    本节主要介绍NBody算法的OpenCL性能优化. 1.NBody     NBody系统主要用来通过粒子之间的物理作用力来模拟星系系统.每个粒子表示一个星星,多个粒子之间的相互作用,就呈现出星系的效果.      上图为一个粒子模拟星系的图片:Source: THE GALAXY-CLUSTER-SUPERCLUSTER CONNECTION,http://www.casca.ca/ecass/issues/1997-DS/West/west-bil.html    由于每个粒子之间都

Skia深入分析6——skia中图像编解码代码概述

1.API和自注册机制 Skia中编码解码图片都只需要一行代码: SkBitmap bitmap; SkImageDecoder::DecodeFile("test.xxx", &bitmap);//由文件名解码,自动推断图片类型 //或者由流解码 SkFILEStream stream("test.xxx"); SkImageDecoder::DecodeStream(stream, &bitmap);//由输入流解码,自动推断图片类型 //编码

手淘双十一系列(一) | 521 性能优化项目揭秘

该文章来自阿里巴巴技术协会(ATA)精选集  亿万用户都会在双十一这一天打开手机淘宝,高兴地在会场页面不断浏览,面对琳琅满目的商品图片,抢着添加购物车,下单付款.为了让用户更顺畅更方便地实现这一切,做到"如丝般顺滑",双十一前夕手机淘宝成立了"521"(我爱你)性能优化项目,在日常优化基础之上进行三个方面的专项优化攻关,分别是: 1)H5页面的一秒法则: 2)启动时间和页面帧率提升20%: 3)Android内存占用降低50%. 优化过程中遇到的困难,思考后找寻的方