文档章节

Jpeg 库的解码OpenCL优化

jxt1234
 jxt1234
发布于 2015/10/15 18:06
字数 525
阅读 112
收藏 0

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
jxt1234
粉丝 5
博文 36
码字总数 41634
作品 0
杭州
私信 提问
如何基于AM57x测试OpenCL的加速性能?

1 实验说明 本例程测试功能:读取指定的图像数据,然后对图像进行灰度转换和Canny算法处理,计算处理过程所耗的时间,并将处理后的图像保存到当前目录下。 本例程主要是测试OpenCL是否对这两...

Tronlong
2018/07/04
139
0
ffmpeg2.x开始支持opencl,编译测试

ffmpeg2.x开始支持opencl了,可以对编解码进行加速。 版本:ffmpeg2.2 1. 编译ffmpeg 在configure命令行中增加--enable-opencl, 运行报错了。 错误信息是:"ERROR: opencl not found" 好吧,...

张旭0512
2014/05/08
0
0
AMD 发布 APP SDK 2.8 和 CodeXL 1.0

AMD 的 Accelerated Parallel Processing SDK (APP SDK) 发布了,该版本支持 Direct3D 11 和 64-bit 原子。同时引入预发布版本 Bolt ,这是一个兼容 STL 的 C++ 模板库,同时提供了一些 Open...

oschina
2012/12/12
1K
1
编译ffmpeg“ERROR: opencl not found”问题

编译ffmpeg“ERROR: opencl not found”问题。 ffmpeg在2.x版本支持opencl,可以利用硬件对转码进行加速,故进行编译尝试。 /tmp/ffconf.UNWNaz4r.c:1:23: error: OpenCL/cl.h: No such fil...

张旭0512
2014/05/10
0
1
FFmpeg Maintainer赵军:FFmpeg关键组件与硬件加速

本文来自FFmpeg Maintainer赵军在LiveVideoStackCon 2018热身分享,并由LiveVideoStack整理而成。在分享中,赵军介绍了FFmpeg的历史、关键组件,并介绍了英特尔平台上的多种FFmpeg硬件加速方...

LiveVideoStack
2018/07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Httpd 整合 Tomcat 步骤

环境:Tomcat8 + Httpd2.4 工作原理:借助于Tomcat的AJP连接器实现Apache与Tomcat的通信 配置步骤: 1. 配置httpd.conf 新增: Include conf/extra/mod_jk.conf 修改:添加 index.jsp <IfM...

ZeroneLove
昨天
1
0
Docker笔记3——容器命令(未写完,明天整理接着写)

未写完,明天整理接着写 新建并启动容器 docker run docker run [OPTIONS] IMAGE [COMMEND] [ARG...] OPTIONS: --name=[容器新名字] :为容器指定一个名称 -d:后台运行容器,并返回容器ID,...

HappyBKs
昨天
1
0
2018个人年终总结

感谢领导的信任和指导,新的一年获得了很多成长和提高,改掉了很多不好的习惯。 在这一年里,我在领导的帮助下,主要完成了以下功能: 1、完成上海银行版本投资营销相关功能的开发。 2、完成车...

万山红遍
昨天
9
0
保密工作与linux系统的发展

保密工作从性质上可以分成商业方面的保密和国家安全方面的保密。由于自己从事的是IT方面的工作,工作中必然会接触涉及到计算机信息方面的相关文件。加上单位已近通过武器装备科研生产单位二级...

linux-tao
昨天
2
0
Spark共享变量

概述 Spark程序的大部分操作都是RDD操作,通过传入函数给RDD操作函数来计算。这些函数在不同的节点上并发执行,但每个内部的变量有不同的作用域,不能相互访问,所以有时会不太方便,Spark提...

仟昭
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部