并行解码方法和并行解码装置的制造方法
【技术领域】
[0001 ]本发明总体地涉及。
【背景技术】
[0002]传统的视频编码标准,从H.261开始,历经MPEG-1,MPEG_2,H.263,MPEG_4,H.264等等,都是编码器复杂,解码器相对简单;编码器可以自由定义算法,解码器算法固定。这样做的主要原因是解码器是大众消费产品,解码器往往是硬件芯片实现,为了便于解码器能够接收不同编码器编出的码流,因此码流格式必须标准化、一致化,因此解码器的解码流程也就标准化了,几乎没有改动或改进的余地,这样也事实上提高了解码器的量产数量,降低了解码器的设计制造成本。
[0003]但是随着编解码标准越来越复杂,解码器也变得越来越复杂,4K分辨率的视频在2.7GHz的i7处理器上单线程也只能刚好达到30fps的软件解码速度。另一方面,由于硬件解码研发周期长,操作系统适配兼容性差,因此在不少实际产品中研发企业更偏向于更为灵活的软件解码方案,而越来越高的解码复杂度对软件解码提出了挑战。
[0004]软件解码主要分为三个阶段:
[0005]I)熵解码
[0006]2)反量化+gDCT
[0007]3)预测或运动补偿
[0008]4)SA0、环路滤波等后处理
[0009]由于解码器已经被视频标准约束得比较严格,能做的变化和改进相对比较少,具体到并行解码技术上,传统的并行方案有如下这几种:
[0010]I )G0P即帧组级别的并行,比如每16帧一个组,且第I帧为Intra帧,这样每16帧的解码做为一个并行单位,用多核或者集群等技术进行并行。这种方案的缺点是I)当前最邻近的帧解码速度并没有得到提升,第一个GOP还是很慢;2)如果用户在点播的时候要拖动、快进、快退,新起始点的第一个GOP还是慢,且之前很多GOP的解码被白白浪费掉了;3)缓存需求很大,在线实时解码时需要提前下载后面GOP的数据,网络缓存加大,同时还需要更多的缓存保存后面GOP解码完成的图像数据。
[0011]2)Slice/Tile级别的并行,即把一帧图像分成若干个小图像,分别按小图像编码和解码,小图像之间可以并行。这种方案的缺点是:I)需要编码器端配合,编码器首先要将图像分割成小图像,否则解码端无法并行;2)由于分成了小图像,小图像之间不能互相参考,严重影响编码效率,即压缩率将变低。
[0012]3)WPP级别的并行,即根据帧内编码瀑布式下推的特性,通过多个熵编码起始点,使得多行编码块的解码过程之间可以并行。这种方案的缺点是:I)需要编码端的配合,如果编码端不按并行的方式编码,解码端就无法并行;2)由于有多个熵编码起始点,编码效率下降虽然不多,但仍然会有一点下降。
[0013]4)帧解码内部的并行,即在每个编码块的内部进行并行,比如DCT计算过程并行,预测过程并行等。这种方案的确定是:由于每个块的执行时间粒度已经很小(毫秒级别),而操作系统调度的时间片大小一般在20毫秒左右,所以这种并行设计起来非常困难,硬件兼容性差。
【发明内容】
[0014]针对上述各种并行解码方案存在的问题,本专利提出一种可以克服上述问题较为通用的解码器并行方案,可以在宏块级别并行,无需编码端针对并行做任何专门的处理,编码效率没有损失,并行化的软件实现不是很困难,对缓存要求不高的软件并行解码方案。
[0015]根据本发明的一个方面,提供了一种计算机执行的、针对采用了CABAC熵编码技术编码的码流进行的、宏块级别的并行解码方法,对于一个宏块的解码操作包括熵解码操作和除了熵解码操作外的在后解码操作,其中包括:接收来自编码器侧的码流,该码流是采用了 CABAC熵编码技术熵编码的;利用单独的CABAC熵解码线程对所接收的码流中的宏块进行CABAC熵解码;至少部分基于CABAC熵解码的结果、帧内宏块和帧间宏块之间的依赖关系、当前能够利用的存储资源和计算资源,界定能够彼此并行进行在后解码操作的宏块;以及利用并行的块解码线程,彼此并行地对所界定的宏块进行在后解码操作。
[0016]根据本发明实施例的并行解码方法,还可以包括:利用环状缓冲区来存储宏块进行在后解码操作所需要的上下文内容数据集,缓冲区的存储单位为每个宏块进行在后解码操作所需要的上下文内容数据集,缓冲区的长度大于图像水平方向所包含的编码块的数目,缓冲区中的每个数据集具有可填充标记和可解码标记,可填充标记标识该数据集是否可以被覆盖,可解码标记标识该元素是否有足够的数据进行对应区域的解码工作,具体图像块可解码指的是能够对该具体图像块进行在后解码操作。
[0017]根据本发明实施例的并行解码方法,所界定的能够彼此并行进行在后解码操作的宏块可以包括在不同帧中的宏块。
[0018]根据本发明实施例的并行解码方法,所述界定能够彼此并行进行在后解码操作的宏块可以在以下两种情况下被触发执行:在CABAC熵解码线程中具体图像块的CABAC熵解码完成后,确定该具体图像块是否可以进行在后解码操作,如果确定可以,则将该具体图像块加入能够彼此并行进行在后解码操作的宏块的集合中;在具体图像块的在后解码操作完成后,确定与该具体图像块相关的图像块中是否有新的可进行在后解码操作的图像块出现,如果有,则将出现的新的可进行在后解码操作的图像块加入能够彼此并行进行在后解码操作的宏块的集合中。
[0019]根据本发明实施例的并行解码方法,还可以包括:利用并行化调度模块,基于环状缓冲区中可进行在后解码操作的图像块的数量A、图像块熵解码完成领先数量B、当前计算资源的使用率C、当前的并行的块解码线程的数量D,对熵解码线程和并行的块解码线程进行调度。
[0020]根据本发明实施例的并行解码方法,所述对熵解码线程和并行的块解码线程进行调度可以包括下述项目中的至少一个:暂停熵解码线程、重启熵解码线程、增加并行的块解码线程、减少并行的块解码线程。
[0021]根据本发明实施例的并行解码方法,并行化调度模块可以在每次块解码线程准备开始寻找一个可解码图像块进行解码时进行调度。
[0022]根据本发明实施例的并行解码方法,所述并行化调度模块可以根据下述规则中的至少一个进行调度:熵解码线程处于运行状态时,当图像块熵解码完成领先数量等于预定的最大值时,熵解码线程暂停;熵解码线程处于暂停状态时,并且图像块熵解码完成领先数量小于预定最大值的预定百分比时,熵解码线程重启;如果环状缓冲区中可进行在后解码操作的图像块的数量A大于等于2,且当前计算资源的使用率C不大于第一预定阈值,则增加一个块解码线程;如果当前的并行的块解码线程的数量D大于1、当前计算资源的使用率C大于第二预定阈值、图像块熵解码完成领先数量B小于预定的最大值,则减少一个块解码线程。
[0023]根据本发明的另一方面,提供了一种针对采用了CABAC熵编码技术编码的码流进行的、宏块级别的并行解码装置,对于一个宏块的解码操作包括熵解码操作和除了熵解码操作外的在后解码操作,并行解码装置可以包括:码流接收单元,接收来自编码器侧的码流,该码流是采用了CABAC熵编码技术熵编码的;CABAC熵解码单元,利用单独的CABAC熵解码线程对所接收的码流中的宏块进行CABAC熵解码;可解码宏块界定单元,至少部分基于CABAC熵解码的结果、帧内宏块和帧间宏块之间的依赖关系、当前能够利用的存储资源和计算资源,界定能够彼此并行进行在后解码操作的宏块;以及在后解码操作执行单元,利用并行的块解码线程,彼此并行地对所界定的宏块进行在后解码操作。
[0024]根据本发明的再一方面,提供了一种针对采用了CABAC熵编码技术编码的码流进行宏块级别的并行解码的计算装置,对于一个宏块的解码操作包括熵解码操作和除了熵解码操作外的在后解码操作,所述计算装置包括存储器和处理器,存储器中存储有计算机可执行指令集合,当处理器执行所述计算机可执行指令集合时,执行下述操作:接收来自编码器侧的码流,该码流是采用了 CABAC熵编码技术熵编码的;利用单独的CABAC熵解码线程对所接收的码流中的宏块进行CABAC熵解码;至少部分基于CABAC熵解码的结果、帧内宏块和帧间宏块之间的依赖关系、当前能够利用的存储资源和计算资源,界定能够彼此并行进行在后解码操作的宏块;以及利用并行的块解码线程,彼此并行地对所界定的宏块进行在后解码操作。
【附图说明】
[0025]从下面结合附图对本发明实施例的详细描述中,本发明的这些和/或其它方面和优点将变得更加清楚并更容易理解,其中:
[0026]图1示出了根据本发明一个实施例的并行解码方法100的流程图。
[0027]图2示例性地示出了帧内图像块解码的依赖关系的示意图。
[0028]图3示例性地示出了帧间图像块解码的依赖关系的示意图。
[0029]图4示出了根据本发明一个实施例的并行编码框架的示意图。
[0030]图5A到5Y示例性说明对帧内图像和帧间图像的图像块进行解码的解码过程的一系列示意图。
【具体实施方式】
[0031]为了使本领域技术人员更好地理解本发明,下面结合附图和【具体实施方式】对本发明作进一步详细说明。
[0032]本文中,在没有特别说明的情况下,“可解码”指的是可进行除了“熵解码”操作之外的在后解码操作。单独出现的“解码”也是指的是进行除了“熵解码”操作的在后解码操作。
[0033]后面的描述将以H.265标准的解码技术为例加以说明,其中采用CABAC熵编码方式。而H.264标准的编码技术H.264中是有两种熵编码方式,CAVLC和CABAC,CAVLC由于复杂度低是事实上大部分码流所采用的编码方式,CAVLC的解码过程比较快,相邻的元素解码不存在依赖关系,因此如果H.264采用CAVLC方式编码的话,解码可以不用特别考虑熵解码部分带来的复杂性。H.265中出于编码效率的考虑,统一只采用CABAC的熵编码方式,CAVLC不再被包含在H.265标准中。而如果采用CABAC,即算术编码,则CABAC的编码和解码过程都比CAVLC复杂很多,速度也慢,前后元素的编解码过程互相关联,如果前面的元素不解码完成,后面的元素是无法解码的,只有到了帧(更准确的说是Slice)的边界,熵解码才会有结束标志,并重新初始化进行编解码,也就是说只有到了帧的边界,熵解码才有并行的可能,在帧的内部,熵解码必须串行顺序执行。
[0034]下面描述一下本发明的发明思想,以便于透彻理解本发明。
[0035]针对H.265只有CABAC这一种熵编码方式,并考虑到CABAC的解码在Intra帧中占据了近50%的解码时间,在Inter帧中占据了约30%的解码时间这一统计事实,着重考虑了有CABAC条件下如何并行解码的问题。
[0036]首先,本发明实施例给CABAC熵解码单独建立了一个线程,解码器的其他线程跟随在CABAC线程后面执行,CABAC与其他线程之间存在并行关系,CABAC之外的块解码线程之间也存在并行关系。
[0037]此外,本发明实施例的并行解码方法同时面向帧内图像解码和帧间图像解码,特别的是对帧间图像而言,图像块是否可以解码很多情况下并不依赖其左侧和上方的图像块是否已经解码完成,而是依赖前一帧图像中的参考位置是否存在,因此图像块之间的并行没有很强的依赖关系,可以“乱”序并行解码。在一个示例中,为了将帧间图像的“乱”序并行和帧内图像的“顺”序并行融合在一起,采用了一种由环状缓冲区管理可解码图像块列表,统一图像块可并行解码的信号触发方式,使得“顺”和“乱”两种方式都能得到统一的并行化支持。
[0038]根据本发明的一个实施例,为了保障最大并行效率,基于一些参数对熵解码线