适用于jpeg的多核并行硬件编码方法和装置

文档序号:912764 发布日期:2021-02-26 浏览:13次 >En<

阅读说明:本技术 适用于jpeg的多核并行硬件编码方法和装置 (Multi-core parallel hardware coding method and device suitable for JPEG ) 是由 雷理 韦虎 张云 刘守浩 于 2020-10-26 设计创作,主要内容包括:本发明公开了适用于JPEG的多核并行硬件编码方法和装置,涉及图像编码技术领域。所述方法包括步骤:获取待编码图像,将待编码图像分割为多个MCU行;通过编码器进行多线程JPEG并行编码;其中,所述编码器包括多个JPEG编码核,通过多个JPEG编码核同时启动各自所在MCU行的编码以并行编码,在压缩完各自MCU行的末尾MCU块后,插入一个各自的重启标识符进行数据阻断;整张图像编码完成后,将多组MCU行的码流按顺序进行码流重组。本发明的多核基于MCU行展开并行计算,显著提升了JPEG图像的编码速度,并且不会降低压缩率,不带来额外内存开销。(The invention discloses a multi-core parallel hardware coding method and device suitable for JPEG, and relates to the technical field of image coding. The method comprises the following steps: acquiring an image to be coded, and dividing the image to be coded into a plurality of MCU rows; performing multi-thread JPEG parallel coding through a coder; the encoder comprises a plurality of JPEG coding cores, the coding of MCU lines where the JPEG coding cores are located is started simultaneously through the plurality of JPEG coding cores to carry out parallel coding, and after the tail MCU blocks of the MCU lines are compressed, a respective restart identifier is inserted to carry out data blocking; and after the whole image is coded, carrying out code stream recombination on code streams of a plurality of groups of MCU lines in sequence. The multi-core of the invention is based on MCU line expansion parallel computation, thereby obviously improving the coding speed of JPEG images, not reducing the compression ratio and not bringing extra memory overhead.)

适用于JPEG的多核并行硬件编码方法和装置

技术领域

本发明涉及图像编码技术领域,尤其涉及一种适用于JPEG的多核并行硬件编码方法和装置。

背景技术

随着工业机器视觉逐步替代人工检测,技术上对捕捉图像的分辨率、捕捉帧率要求越来越高。要实现机器视觉完全替代人工检测,首先就要求机器能够对高清图像进行快速压缩存储,特别是在诸如安防监控、航拍等领域,对图像基本要求实时压缩,这对高清图像快速压缩技术提出了新的挑战。

JPEG作为通用的国际图像压缩标准,能够在提供良好的压缩性能的同时,具有比较好的重建质量,被广泛应用于图像、视频处理领域。在高清摄像时代,动则千万像素的图片用软件压缩会带来较大的CPU、功耗等开销,尤其是在一些如高清图像快速连拍、多路摄像等应用场景下,软件压缩编码速度难以满足要求。因此在工业相机等很多领域采用专门的硬件加速器来进行图像压缩。JPEG硬件编码器多采用流水线设计,以MCU(即,MinimumCoded Unit,最小编码单元)作为流水单元,其主要流水级划分参见图1所示。图1中包括3个层级,各级功能描述如下:第1级Src Fetch处理:从内存预取图像源,及一些简单转换处理;第2级DCT、QT处理:对MCU内8x8 block做DCT变换,及量化;第3级Entropy Enc处理:对量化后DC、AC值分别进行熵编码。

传统的JPEG的编码流程参见图2所示。主要包括以下几个步骤:

1)从内存预取图像,执行一些如零电平偏置、角度旋转(0/90/180/270度)等简单操作后存入流水缓存内。

2)对MCU内各8×8像素块进行DCT变换,得到直流DC、交流AC系数,以去除图像的空间冗余。

3)分别对DC、AC系数展开量化。利用根据人眼视觉特性设计的DC、AC量化矩阵,对低频细量化,高频粗量化,进而减少视觉冗余。

4)对DC系数进行差分编码(即,DPCM)和熵编码(即,Huffman),对AC系数进行zig-zag扫描和游程编码(即,Run-Level)后再进行熵编码,减少数据冗余。

在JPEG以上编码流程中,由于直流DC系数反映了该DCT单元(8x8像素块)中包含的直流成分,通常数据较大,而两个相邻的DCT单元的直流系数又通常具有较大的相关性,因此在上述4)步骤对DC系数进行差分编码时,是对本8x8块直流系数与前一8x8块直流系数的差值进行无损编码,如图3所示Diffi(差值)。

上述编码流程中,由于对DC系数进行DPCM编码在MCU间存在明显的数据依赖,难以实现并行算法。因为要实现并行计算,必须保证MCU数据的独立性。

对于JPEG的并行编码问题,现有技术也提供了多核解决方案,比如中国专利申请CN201910032350.9,其公开了一种基于nvidia gpu的黑白图像jpeg数据编码方法:基于JPEG编码原理将黑白数据编码移植到nvidia gpu CUDA库,利用GPU本身的速度快并行性高的特点,结合nvidia gpu CUDA库实现加速。对于多核的cpu,可以在PC端通过软件指定编码算法在某一个核上或某几个核上运行,提升编码速度。然而,上述多核并行编码方案不仅需要设置专门的nvidia gpu CUDA库作为移植库,而且仅适用于黑白数据,适用范围小。

如何提供一种多核可扩展、不带来额外内存开销且适用范围广的JPEG图像编码方法是当前亟需解决的技术问题。

发明内容

本发明的目的在于:克服现有技术的不足,提供了一种适用于JPEG的多核并行硬件编码方法和装置。本发明提供的编码方案,多核基于JPEG MCU行展开并行计算,多核可扩展可大大加速JPEG图像的编码过程,满足实时压缩要求,并且不会降低压缩率,不带来额外内存开销。

为实现上述目标,本发明提供了如下技术方案:

一种适用于JPEG的多核并行硬件编码方法,包括步骤:

获取待编码图像,将待编码图像分割为多个MCU行,每个MCU行包括多个MCU块;

通过编码器进行多线程JPEG并行编码;其中,所述编码器包括多个JPEG编码核,通过多个JPEG编码核同时启动各自所在MCU行的编码以并行编码,在压缩完各自MCU行的末尾MCU块后,插入一个各自的重启标识符进行数据阻断,每个JPEG编码核各自对应一组MCU行的码流;

整张图像编码完成后,将多组MCU行的码流按顺序进行码流重组。

进一步,每隔一个MCU行间插一个重启标识符。

进一步,编码时,循环利用所述重启标识符来阻断DC系数值的传递;重启标识符间插间隔用0xFFDD标记,0xFFDD后接两字节数据表明每隔多少个MCU块间插一个重启标识符;

重启标识符用0xFFD0-0xFFD7标记,插入重启标识符时,从0xFFD0递增到0xFFD7再回到0xFFD0,如此依序循环利用。

可选的,为每个JPEG编码核分配独立的输出码流存储区,从而将各JPEG编码核处理的对应的MCU行的码流进行独立分段存放。

或者,可选的,在DRAM中预设一个X字节存储空间以存储各组MCU行的码流;

在多个JPEG编码核并行对上下相邻的多个MCU行进行编码时,将多行码流设置为每隔X字节交替填入前述DRAM,使得上下相邻的多行码流数据能限定在预设大小的存储区间内存放;

在重组时,读取完整的多行码流并重新拼接写入DRAM后,将前述多行已重组完的多行码流对应的存储空间进行回收,并用于最终码流的存放。

进一步,所述编码器包括4个JPEG编码核,分别为Core0、Core1、Core2和Core3,所述Core0负责第4N个MCU行的编码,Corel负责第4N+1个MCU行的编码,Core2负责第4N+2个MCU行的编码,Core3负责第4N+3个MCU行的编码,其中,N为大于等于0的整数。

进一步,在每个MCU行编码完成后,存放该MCU行码流的起始地址和码流长度,将4组MCU行的码流进行重组的步骤如下:

获取每个MCU行的码流起始地址和码流长度信息;

根据上述信息依次读取相应的4个MCU行码流;

将MCU行码流按顺序完成拼接,并写到DRAM上。

进一步,分配Stream_st_addr作为最终码流的起始地址,设定一个起始行偏移距离为line_offset_gap;

令Core_st_addr=Stream_st_addr+line_offset_gap,将第1-4个MCU行对应的子码流填入Core_st_addr中;重组时,读取第1-4个MCU行的子码流并拼接,写入Stream_st_addr后,回收Core_st_addr中已经完成重组的第1-4个MCU行的子码流空间并用于最终码流的存放;后续进行第5-8个MCU行的重组,读取第5-8个MCU行的子码流并拼接,写入Stream_st_addr时利用前述回收的第1-4个MCU行的子码流空间;如此循环递进,直至所有的MCU行的码流完成重组。

本发明还提供了一种适用于JPEG的多核并行硬件编码装置,包括如下结构:

数据划分模块,用于获取待编码图像,将待编码图像分割为多个MCU行,每个MCU行包括多个MCU块;

编码模块,用于通过编码器进行多线程JPEG并行编码;其中,所述编码器包括多个JPEG编码核,通过多个JPEG编码核同时启动各自所在MCU行的编码以并行编码,在压缩完各自MCU行的末尾MCU块后,插入一个各自的重启标识符进行数据阻断,每个JPEG编码核各自对应一组MCU行的码流;

重组模块,用于将各码流按顺序进行拼接并写到DRAM上以完成多组MCU行的码流的重组。

进一步,在DRAM中预设一个X字节存储空间以存储各组MCU行的码流;

所述编码模块被配置为,在多个JPEG编码核并行对上下相邻的多个MCU行进行编码时,将多行码流设置为每隔X字节交替填入前述DRAM,使得上下相邻的多行码流数据能限定在预设大小的存储区间内存放;

所述重组模块被配置为,在重组时,读取完整的多行码流并重新拼接写入DRAM后,将前述多行已重组完的多行码流对应的存储空间进行回收,并用于最终码流的存放。

本发明由于采用以上技术方案,与现有技术相比,作为举例,具有以下的优点和积极效果:本发明提供的编码方案,多核基于JPEG MCU行展开并行计算,多核可扩展可大大加速JPEG图像的编码过程,满足实时压缩要求,并且不会降低压缩率,不带来额外内存开销。

一方面,本发明借用重启标识符实现了基于MCU行的多核并行编码,按行多插入1字节(Byte)的RST给压缩率带来的影响非常小。同时,多核还可根据图像尺寸进行任意调整,根据需要设置更多核,可扩展性好,适用性广。

另一方面,本发明还提出了一种码流重组动态回收循环利用方法,可显著降低多核并行编码带来的额外内存开销。

附图说明

图1为现有技术中的JPEG硬件编码器的流水线设计示意图。

图2为现有技术中的JPEG的编码流程图。

图3为现有技术中的直流系数的差值Diffi

图4为本发明实施例提供的四核并行编码插入RST的示例图。

图5为本发明实施例提供的每个编码核的输出码流的存放和重组过程示意图。

图6为本发明实施例提供的码流重组动态回收循环利用的操作示意图。

具体实施方式

以下结合附图和具体实施例对本发明公开的适用于JPEG的多核并行硬件编码方法和装置作进一步详细说明。应当注意的是,下述实施例中描述的技术特征或者技术特征的组合不应当被认为是孤立的,它们可以被相互组合从而达到更好的技术效果。在下述实施例的附图中,各附图所出现的相同标号代表相同的特征或者部件,可应用于不同实施例中。因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步讨论。

需说明的是,本说明书所附图中所绘示的结构、比例、大小等,均仅用以配合说明书所揭示的内容,以供熟悉此技术的人士了解与阅读,并非用以限定发明可实施的限定条件,任何结构的修饰、比例关系的改变或大小的调整,在不影响发明所能产生的功效及所能达成的目的下,均应落在发明所揭示的技术内容所能涵盖的范围内。本发明的优选实施方式的范围包括另外的实现,其中可以不按所述的或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。

对于相关领域普通技术人员已知的技术、方法和设备可能不作详细讨论,但在适当情况下,所述技术、方法和设备应当被视为授权说明书的一部分。在这里示出和讨论的所有示例中,任何具体值应被解释为仅仅是示例性的,而不是作为限制。因此,示例性实施例的其它示例可以具有不同的值。

实施例

要实现并行计算,就必须保证各MCU数据独立。根据JPEG标准,其在制定时为允许部分压缩流数据传输出错后能够重新同步,定义了一种可选的“重启标识”机制(ReStartMarker,以下简称RST)。由于目前大多数JPEG图像都是通过无错误通道传输的,前述RST(或称重启标识符)在正常编码时几乎不被用到,这种重启标识符插入编码块后,会重置其内部首个像素块DC值为0。

基于上述原理,本发明提出了借用重启标识符实现基于MCU行的多核并行编码方案。所述MCU被插入重启标识符后,会重置MCU内部首个像素块的DC值为0,如此便可以阻断DC系数进行DPCM编码的数据依赖,实现多线程JPEG并行编码。由于重启标记符可每间隔任意个MCU插入,使得编码器能够将压缩任务分成N个线程并行处理,最后将压缩流数据拼接以形成最终压缩流。

本发明提供的适用于JPEG的多核并行硬件编码方法,具体包括如下步骤:

S100,待编码图像,将待编码图像分割为多个MCU行,每个MCU行包括多个MCU块。

S200通过编码器进行多线程JPEG并行编码;其中,所述编码器包括多个JPEG编码核,通过多个JPEG编码核同时启动各自所在MCU行的编码以并行编码,在压缩完各自MCU行的末尾MCU块后,插入一个各自的重启标识符进行数据阻断,每个JPEG编码核各自对应一组MCU行的码流。

S300整张图像编码完成后,将多组MCU行的码流按顺序进行码流重组。

本实施例中,在编码时可以循环利用所述重启标识符来阻断DC系数值的传递。根据JPEG协议,重启标识符间插间隔可以用0xFFDD标记,0xFFDD后接两字节数据表明每隔多少个MCU块间插一个重启标识符。重启标识符用0xFFD0-0xFFD7一共8个标记,插入重启标识符时,从0xFFD0递增到0xFFD7再回到0xFFD0,如下表所示,如此依序循环利用。

虽然理论上每个MCU之后都可间插一个RST,使得每个MCU都可以并行计算,但频繁插入0xFFD0-0xFFD7会降低压缩率。本实施例为保证压缩率和减小多核调度复杂度,优选的,每隔一个MCU行间插一个RST。

以设置4个JPEG编码核构造的四核并行编码方案为例,结合图4至6详细描述本实施例。

参见图4所示,所述编码器包括4个JPEG编码核,分别为编码核Core0、Core1、Core2和Core3。按前述并行方案,4个JPEG编码核同时启动所在MCU行的独立编码,所述Core0负责第4N个MCU行的编码,Core1负责第4N+1个MCU行的编码,Core2负责第4N+2个MCU行的编码,Core3负责第4N+3个MCU行的编码,其中,N为大于等于0的整数。

在压缩完各自的MCU行的行末尾MCU块后,插入一个各自的RST符。行末插入RST符时,按行序,按0xFFD0到0xFFD7的顺序依次插入,从0xFFD0递增到0xFFD7再回到0xFFD0,依序循环。在编码过程中,每个编码核会各自输出其所在行的压缩码流。

本实施例的一个实施方式中,为每个JPEG编码核分配独立的输出码流存储区,从而将各JPEG编码核处理的对应的MCU行的码流进行独立分段存放。如此,整张图像的码流需分4个空间存放。参见图5所示,DRAM被分为了至少5个空间,其中4个分别用于存放编码核Core0、Core1、Core2和Core3处理的分段子码流,1个用于存放最终码流。符号Core0_st_addr、Core1_st_addr、Core2_st_addr、Core3_st_addr分别表示各分段子码流起始地址,符号Stream_st_addr表示最终码流起始地址。

整张图像编码完成后,需将4组MCU行的码流进行重组(即,Reorder)。

本实施例中,可以在每个MCU行编码完成后,存放该MCU行的码流起始地址和码流长度,以确保重组时各码流能正确拼接上。结合图5,将4组MCU行的码流进行重组的步骤如下:

获取每个MCU行的码流起始地址和码流长度信息;

根据上述信息依次读取相应的4个MCU行码流;

将MCU行码流按顺序完成拼接,并写到DRAM上。

本实施例的另一实施方式中,考虑到设置四个内存空间分别分配给第4N个MCU行、第4N+1个MCU行、第4N+2个MCU行、第4N+3个MCU行进行子压缩流存储时,会带来额外一倍的内存开销,进一步提出了一种码流重组动态回收循环利用方法,可显著降低多核并行编码带来的额外内存开销。

参见图6所示,上下相邻4个MCU行进行并行编码时,可以预先设定一个固定大小的X字节存储空间,将前述分段存储的4段码流变换为每隔X字节交替填入DRAM(内存),如此可以将一组上下相邻的4行压缩码流限定在一定的DRAM区间内。在重组时,读取完完整的4行码流并重新拼接写入DRAM后,此4行已重组完的子码流空间可回收,并用于最终码流的存放。

具体的,作为典型方式的举例而非限制,比如分配Stream_st_addr作为最终码流的起始地址,设定一个起始行偏移距离为line_offset_gap;本实施例中,所述行偏移距离为至少4行。

令Core_st_addr=Stream_st_addr+line_offset_gap(at least 4 lines),进行如下步骤:

1)编码时,将第1-4个MCU行(MCU的line0-line3)对应的子码流填入Core_st_addr中。

2)重组(Reorder)时,读取第1-4个MCU行(MCU的line0-line3)的子码流并拼接,写入Stream_st_addr后,回收Core_st_addr中已经完成重组的line0-line3的4行子码流空间,并用于最终码流的存放;

3)后续进行下一周期的第5-8个MCU行(MCU line4-line7)的重组时,重组模块读取第5-8个MCU行的子码流并拼接,写入Stream_st_addr时,因为可以利用line0-line3的4行子码流空间,完成拼接后写入的空间地址一定会小于line4-line7子码流所在地址。

以此循环,通过对完成重组的前一周期的4个MCU行码流存放空间进行回收,并用于在后周期的4个MCU行码流的最终码流的写入,直至所有的MCU行的码流完成重组。由于分段子码流读完后就回收用于后续重组后最终码流的填入,拼接后码流数据不会打乱未完成重组(Reorder)的子码流数据,如此动态循环利用可节省前文所述的额外内存开销。

本发明的另一实施例,还提供了一种适用于JPEG的多核并行硬件编码装置。

所述装置包括数据划分模块,编码模块和重组模块。

所述数据划分模块,用于获取待编码图像,将待编码图像分割为多个MCU行,每个MCU行包括多个MCU块。

所述编码模块,用于通过编码器进行多线程JPEG并行编码;其中,所述编码器包括多个JPEG编码核,通过多个JPEG编码核同时启动各自所在MCU行的编码以并行编码,在压缩完各自MCU行的末尾MCU块后,插入一个各自的重启标识符进行数据阻断,每个JPEG编码核各自对应一组MCU行的码流。

所述重组模块,用于将各码流按顺序进行拼接并写到DRAM上以完成多组MCU行的码流的重组。

本实施例中,在DRAM中预设一个X字节存储空间以存储各组MCU行的码流。

此时,所述编码模块被配置为:在多个JPEG编码核并行对上下相邻的多个MCU行进行编码时,将多行码流设置为每隔X字节交替填入前述DRAM,使得上下相邻的多行码流数据能限定在预设大小的存储区间内存放。

所述重组模块被配置为:在重组时,读取完整的多行码流并重新拼接写入DRAM后,将前述多行已重组完的多行码流对应的存储空间进行回收,并用于最终码流的存放。

其它技术特征参见在前实施例的描述,在此不再赘述。

在上面的描述中,本发明的公开内容并不旨在将其自身限于这些方面。而是,在本公开内容的目标保护范围内,各组件可以以任意数目选择性地且操作性地进行合并。另外,像“包括”、“囊括”以及“具有”的术语应当默认被解释为包括性的或开放性的,而不是排他性的或封闭性,除非其被明确限定为相反的含义。所有技术、科技或其他方面的术语都符合本领域技术人员所理解的含义,除非其被限定为相反的含义。在词典里找到的公共术语应当在相关技术文档的背景下不被太理想化或太不实际地解释,除非本公开内容明确将其限定成那样。本发明领域的普通技术人员根据上述揭示内容做的任何变更、修饰,均属于权利要求书的保护范围。

14页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:硬件解码器流水线优化方法及应用

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类