一种基于opencl的jpeg2000中t1并行解码方法和装置与流程

文档序号:36803120发布日期:2024-01-23 12:30阅读:19来源:国知局
一种基于opencl的jpeg2000中t1并行解码方法和装置与流程

本发明涉及jpeg2000解码过程中的熵解码中的t1解码,特别是涉及一种基于opencl的jpeg2000中t1并行解码方法和装置。


背景技术:

1、图像压缩标准jpeg2000是一种压缩效率极高的编解码方法,由于其压缩比高且失真率低,在医疗图像、卫星图像以及数字影院等领域都有广泛的应用,但是其编解码过程繁琐复杂,这阻碍了其在市场上大规模推广和使用。其主要的编码过程为:预处理、小波变换、量化、熵编码,解码过程则依次为熵解码、反量化、小波反变换、后处理,其中最为复杂的是熵编码和解码过程,其中熵编解码又分为t1编解码、t2编解码,t1占比最重。当前技术背景下,jpeg2000大多是采用cpu来完成编解码运算的,市场上仅有英伟达公司采用了cuda开发了自家的nvjpeg库,在显卡gpu上用于jpeg2000快速编解码,且并未开源。

2、openjpeg是一个用c语言编写的开源jpeg2000编解码库,其源码可以任意修改、使用及用于商业用途,也是目前使用较为广泛的jpeg2000编解码库,但是目前只能用于cpu串行解码,无法进行并行解码。

3、有鉴于此,如何克服现有技术所存在的缺陷,解决上述技术问题,是本技术领域待解决的难题。


技术实现思路

1、针对现有技术中的缺陷或改进需求,为了解决现有jpeg2000编解码库只能用于cpu串行解码,无法进行并行解码的问题。本发明提出了一种基于opencl的jpeg2000中t1并行解码方法和装置,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用gpu快速解码jpeg2000码流的目的。

2、本发明采用如下技术方案:

3、第一方面,本发明提供了一种基于opencl的jpeg2000中t1并行解码方法,包括:

4、建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应;

5、依次将对应的代码块拷贝至对应的opencl文件中,将openjpeg定义的数据类型转换为opencl支持的数据类型,并对opencl文件中的代码块进行优化;

6、创建主解码程序,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程。

7、在一个可选的实施方式中,所述八种类型的t1解码相关的代码块具体包括:预定义类型的代码块、结构体定义类型的代码块、数组或者常量类型的代码块、t1整体解码相关类型的代码块、mqc上下文解码器类型的代码块、重要性传播解码类型的代码块、幅值细化解码类型的代码块以及标志清除解码类型的代码块。

8、在一个可选的实施方式中,所述建立八个opencl文件,分别与八种类型的t1解码相关的代码块相对应具体包括:

9、建立八个.cl文件,分别命名为:a1.cl、a2.cl、a3.cl、a4.cl、a5.cl、a6.cl、a7.cl以及a8.cl;其中,a1.cl与预定义类型的代码块相对应;a2.cl与结构体定义类型的代码块相对应;a3.cl与数组或者常量类型的代码块相对应;a4.cl与t1整体解码相关类型的代码块相对应;a5.cl与mqc上下文解码器类型的代码块相对应;a6.cl与重要性传播解码类型的代码块相对应;a7.cl与幅值细化解码类型的代码块相对应;a8.cl标志清除解码类型的代码块相对应。

10、在一个可选的实施方式中,所述将openjpeg定义的数据类型转换为opencl支持的数据类型具体包括:

11、对八个opencl文件内的文本内容进行全文字符串检索,若检索到opj_char则替换为char;若检索到opj_char*则替换为char*;若检索到opj_float32则替换为float;若检索到opj_floa32*则替换为float32*;若检索到opj_float64则替换为double;若检索到opj_floa64*则替换为float64*;若检索到opj_byte则替换为unsigned char;若检索到opj_byte*则替换为unsigned char*;若检索到opj_int32则替换为int;若检索到opj_int32*则替换为int*;若检索到opj_uint32则替换为uint;若检索到opj_uint32*则替换为uint*;若检索到opj_flag_t则替换为uint;若检索到opj_flag_t*则替换为uint*;若检索到opj_bool则替换为bool;若检索到opj_bool*则替换为bool*。

12、在一个可选的实施方式中,所述对opencl文件中的代码块进行优化具体包括:

13、对opj_mqc_state结构体进行优化,将其中指向opj_mqc_state结构体的指针修改为两个uint型成员;

14、对opj_mqc结构体进行优化,将其中指向opj_mqc_state的指针数组ctxs优化修改为一个uint型的数组,长度和原始相同;将其中指向opj_mqc_states的指针的二级指针curctx修改为一个uint型的数据;将其中char型指针lut_ctx_ctxno_zc_orient修改为一个uint型数据;

15、对结构体数组mqc_states进行优化,将结构体中的指针修改为uint数字后,其值只用为索引即可;

16、对mqc上下文解码器类型的代码块进行修改和优化。

17、在一个可选的实施方式中,所述对mqc上下文解码器类型的代码块进行修改和优化具体包括:

18、检索文档中的所有字符串,若出现了*curctx->则替换为mqc_state[curctx];若出现了opj_mqc_state_t**curctx则替换为uint curctx;

19、对函数opj_mqc_resetstates进行修改,将mqc的ctxs均初始化为0;

20、对opj_mqc_setstate进行修改,对mqc的ctxs的第ctxno赋值为mbs+prob*2。

21、在一个可选的实施方式中,所述主解码程序包含kernel函数,用于根据opencl文件中优化的代码块实现t1并行解码的过程具体包括:

22、所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化;

23、初始化passno为0,passtype执行循环;

24、设需要进行的t1解码块为n个,配置kernel函数运算的global size为(n),localsize为(1,1),执行编译好的代码进行并行解码。

25、在一个可选的实施方式中,所述kernel函数接收解码块的global参数,并根据解码块的global参数进行各项初始化具体包括:

26、kernel函数接收global参数:unsigned char*cblkdata_buffer表示每个解码块的原始图像压缩数据;int*t1_data_buffer表示解码后的数据存放空间;uint*len_buffer表示每个解码块的长度;uint*real_num_passes_buffer、uint*orient_buffer、int*bpno_plus_one_buffer表示每个解码块解码过程中用到的中间参数;uint*w_buffer、uint*h_buffer表示每个解码块的解码后图像块的宽和高;uint*idx1_buffer表示每个解码块解码后数据存放位置地址相对于t1_data_buffer地址偏移量;uint*idx2_buffer表示每个解码块原始数据相对于cblkdata_buffer的地址偏移量;

27、获取当前解码块的global_id,所述global_id对应每个解码块的global参数的索引,依据global_id依次获取每个解码块的对应global参数的值;

28、初始化一个uint数组,用于存放解码过程中的标志位;

29、初始化一个opj_mqc_t结构体mqc,将该mqc的lut_ctxno_zc_orient值初始化为global参数中的orient值的左移9位的值;

30、初始化一个opj_t1_t结构体t1,其中t1的data值初始化为idx1_buffer的第global_id个值的指针,表示该解码块的解码值的存放起始位置,t1的flags值初始化为uint数组,t1的mqc值初始化为指向opj_mqc_t结构体mqc的指针;

31、调用opj_t1_allocate_buffers函数进行二次初始化,其中,opj_t1_allocate_buffers传入的参数依次为指向t1的指针、w值和h值;

32、调用opj_mqc_resetstates函数,该函数传入t1的mqc值;

33、调用opj_mqc_setstate函数三次,该函数接收4个参数;第一次该函数传入4个参数依次为t1的mqc值、t1_ctxno_uni、0、46;第二次该函数传入4个参数依次为t1的mqc值、t1_ctxno_agg、0、3;第三次该函数传入4个参数依次为t1的mqc值、t1_ctxno_zc、0、4;其中t1_ctxno_uni、t1_ctxno_agg、t1_ctxno_zc为预定义值;

34、调用函数opj_mqc_init_dec初始化t1的mqc,该函数接收5个参数,依次为t1的mqc、cblkdata_buffer、idx2_buffer数组中的第globa_id个值、len、opj_common_cblk_data_extra;其中,opj_common_cblk_data_extra为预定义值。

35、在一个可选的实施方式中,所述passtype执行循环具体包括:

36、步骤f1:判断passno<real_num_passes且bpno_plus_one>1是否成立,若成立则执行步骤f2,不成立则结束循环;

37、步骤f2:判断passtype的值,若passtype的值为0则执行步骤f3;若passtype的值为1则执行步骤f4;若passtype的值为2则执行步骤f5;

38、步骤f3:执行opj_t1_dec_sigpass_mqc_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤f7;

39、步骤f4:执行opj_t1_dec_refpass_mqc_generic函数,传入该函数两个参数,一个为t1,一个为bpno_plus_one;之后执行步骤f7;

40、步骤f5:执行opj_t1_dec_clnpass_generic_novsc函数,传入该函数两个参数,一个为t1,一个为bpno__plus_one;之后执行步骤f6;

41、步骤f6:执行opj_t1_dec_clnpass_check_segsym函数,传入该函数一个参数,为t1;之后执行步骤f7;

42、步骤f7:passtype=passtype+1;

43、步骤f8:判断passtype的值是否等于3,若是则passtype=0,bpno_plus_one=bpno_plus_one–1,返回步骤f1;否则直接返回步骤f1。

44、另一方面,本发明提供了一种基于opencl的jpeg2000中t1并行解码装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储能被至少一个处理器执行的指令,指令在被处理器执行后,用于完成第一方面中的基于opencl的jpeg2000中t1并行解码方法。

45、与现有技术相比,本发明的有益效果在于:

46、本发明提出了一种基于opencl的jpeg2000中t1并行解码方法和装置,为了解决现有jpeg2000编解码库只能用于cpu串行解码,无法进行并行解码的问题,本发明以openjpeg中jpeg2000的t1解码源码部分为基础,将其优化为可支持opencl设备进行t1并行解码,在一定条件下,能够加快解码速度。本发明针对jpeg2000解码中,最为复杂的熵解码中的t1解码过程,提出了一种基于opencl的t1并行解码方案,从而实现利用gpu快速解码jpeg2000码流的目的。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1