一种多核平台下MPEG2高清编码器的Slice码率分配方法转让专利

申请号 : CN201010526210.6

文献号 : CN101969560B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 姚威邓伟田克俊褚震宇

申请人 : 北京中科大洋科技发展股份有限公司

摘要 :

本发明涉及一种多核平台下MPEG2高清编码器的Slice码率分配方法,是一种用于视频图像压缩编码的方法。本发明所述的方法包括以下步骤:输入无压缩帧数据的步骤;创建编码线程的步骤;划分的步骤;判断输入视频图像帧类型的步骤;运动补偿预测的步骤;交叉分配的步骤;编码过程计算的步骤;输出压缩帧数据的步骤。本发明在单帧多编码线程的前提下,通过在各编码线程间平均分配码率的办法,将信息量较大的Slice和信息量较少的Slice交叉分配,平均各编码线程Slice的码率,在各编码线程内仍使用TM5模型编码,最终较好解决了单帧画面有序而视频序列画面存在随机性的矛盾。

权利要求 :

1.一种多核平台下Mpeg2高清编码器的Slice码率分配方法,所述方法使用带有多个CPU核的,具有并行计算能力的计算机视频图像处理系统,所述的方法包括以下步骤:输入无压缩的原始视频图像帧的数据的步骤:用于接收待压缩编码的YUV原始视频图像帧的数据;

创建编码线程的步骤:首先获取CPU的核数,设为M;根据CPU的核数创建N个编码线程,使N等于M,或者使N是M的整数倍,如果不是初次视频压缩则跳过这一步骤;

划分的步骤:用于将原始视频图像帧从上到下依次划分为Q个图像部分,划分后的图像部分的数量Q等于编码线程数N,或者图像部分的数量Q是N的整数倍数;每个图像部分包含多个Slice,每个Slice包含多个宏块;将各个图像部分平均分配给各个编码线程处理;

判断输入视频图像帧类型的步骤:用于判断输入的视频图像帧类型,如果是“B”类型帧或者是“P”类型帧则进入“编码线程运动补偿预测步骤”如果是“I”类型帧则进入“交叉分配的步骤”; 编码线程运动补偿预测的步骤:用于各编码线程分别对分配给各自的图像部分进行搜索,计算运动补偿预测,并将计算的结果按宏块暂存;

其特征在于如下步骤:

交叉分配的步骤:用于将原始视频图像上的Slice交叉分配形成编码视频图像帧,所述的编码视频图像帧中包含N个Slice组,将各个Slice组分配给各编码线程,并按照各编码线程所分配的Slice数占总视频图像Slice总数的比例,给各编码线程分配各自的占总体目标码率相应比例的码率,具体方法是:将原始视频图像帧按从上到下的次序,依次取出N个Slice作为一个Slice段,直至分完为止;如果Slice数不能被N整除,最后不足N个的Slice也作为一个Slice段;将即将形成的编码视频图像帧按从上到下的次序分为N个Slice组,每个Slice段中的第一个Slice分配给第一个Slice组、第二个Slice分配给第二个Slice组、第三个Slice分配给第三个Slice组,余此类推,第N个Slice分配给第N个Slice组;如果Slice数不能被N整除,对于最后一个Slice数不足N个的Slice段,记其所包含的Slice数为P,只需将其包含的P个Slice依次分配给第1至第P个Slice组即可,这样形成交叉顺序的带有N个Slice组的编码视频图像帧;

编码计算的步骤:用于各个编码线程对Slice组内的各个Slice的宏块依次执行编码计算,如果该帧为B帧或P帧,编码计算过程将使用运动补偿预测的结果;

恢复正常顺序和输出压缩视频图像帧的数据的步骤:用于将经过编码计算的编码视频图像帧按正常的顺序进行拼接,形成正常Slice次序的压缩视频图像帧并输出,完成视频图像帧的编码。

2.根据权利要求1所述的方法,其特征在于,所述编码计算的步骤中的编码计算包括:

二维DCT变换、量化和VLC编码处理。

3.根据权利要求1或2所述的方法,所述的计算机视频图像处理系统的CPU的核数为

4或6,其特征在于,创建编码线程的步骤中创建4个或6个编码线程。

4.根据权利要求1或2所述的方法,所述的计算机视频图像处理系统的CPU的核数为

8或16,其特征在于,创建编码线程的步骤中创建8个或16个编码线程。

说明书 :

一种多核平台下MPEG2高清编码器的Slice码率分配方法

技术领域

[0001] 本发明涉及一种多核平台下高清编码器的Slice码率分配方法,是一种用于视频图像压缩编码的方法。

背景技术

[0002] 当前,数字电视领域正在向高清时代过渡,1920×1080分辨率下的编码器,对一帧视频编码的计算量大约是标清(720×576)的5倍,如果还采用串行的计算过程,编码器会因为效率低下实用价值大大下降。现在随着多核平台的出现,采用多线程技术以充分利用并行运算的优势,对编码器进行改进是必然的趋势。由于MPEG2编码的码率控制模型绝大部分都是基于TM5模型实现的,码率控制的意思是指采用某种算法使视频序列编码压缩后的实际码率跟目标码率(即期望达到的码率)一致。 TM5模型是以整幅视频帧作为码率分配的单元,在编码开始前设定目标码率值后,对以后连续的各帧编码时,TM5会根据已经编码生成的比特数、当前帧类型以及当前宏块的复杂度,按照特定公式依次计算帧中各个宏块的量化步长,最后使压缩编码后的各帧大小符合初始设定的目标码率。TM5模型是一个先天的串行计算过程,设计之初就没有考虑并行计算,因此需要找到一种合适简单的方法在保证编码质量的前提下能充分利用多核平台的并行计算优势。
[0003] 现有视频图像在TM5模型下的多线程编码并行计算有两个方式:帧间多线程计算和单帧图像分割的多线程计算。
[0004] 帧间多线程计算的大体思想是将准备编码和即将编码的多帧图像同时进入多核平台进行计算编码。这种方式虽然可以提高编码的计算速度,但问题也是明显的:因为先后图像的编码是互相依赖的,由于这种依赖关系,如果强行并行,最终编码结果的输出会产生较大的延迟。
[0005] 单帧图像分割的多线程计算的大体思想是利用原压缩编码时对单帧图像进行的分解,平均划分图像区域,即将画面按CPU核数等分,创建与CPU核数相同数量的编码线程,每一个区域内的所有Slice分配给一个编码线程进行计算,也就是把一幅图像分割为多幅子图像同时压缩,这样就需要进行码率分配,通常的做法是将图像序列的总体目标码率平分配到各个编码线程内的区域上从而形成每个区域内的目标码率。对每个区域内的宏块使用TM5码率控制模型计算量化步长,既能使各个区域最终编码后的实际码率总和达到总体目标码率值,又能实现并行编码。该方法具有简单易行的特点,既能充分利用现有的编码器算法,也能充分利用CPU多核心并行计算特性。但是该种方法也存在一个明显的缺陷:对于单帧画面来说,一帧图像的各个部位表达的信息量存在变化,在该帧图像的某些画面部分细节较少,即信息量较少;而在该帧图像的某些部分画面细节繁杂,则信息量较大。现有的方法是从上当下依次分割,并按照这个顺序将分割的图像部分送入各个编码线程编码。各个编码线程内Slice将占用总体目标码率分配给该编码线程的一定比例的码率,此时,由于图像画面存在变化,可能导致画面简单部分所在Slice在一个编码线程负责的图像部分内,而复杂画面部分所在Slice在另外一个编码线程负责的图像部分内。现有的编码方法大都是将一个图像部分分配给一个编码线程进行计算,如果这不同编码线程的码率分配比例采取简单的平均分配的方法,将会导致一帧画面中出现简单画面部分比较清晰,复杂画面部分比较模糊,造成整个画面各部分之间质量不均衡,致使整体画面质量变差。

发明内容

[0006] 为解决现有技术的问题,本发明提出一种多核平台下Mpeg2高清编码器的Slice码率分配方法,所述方法将单帧图像分割后,不是简单依次送入各个编码线程解码,而是交叉分配,使不同信息量的画面部分进入相同的编码线程,从而使进入每一个编码线程的信息量得以平衡,最终获得整体上高质量的画面编码效果。
[0007] 本发明的目的是这样实现的:一种多核平台下Mpeg2高清编码器的Slice码率分配方法,所述方法使用带有多个CPU核的,具有并行计算能力的计算机视频图像处理系统,所述的方法包括以下步骤:
[0008] 输入无压缩的原始视频图像帧的数据的步骤:用于接收待压缩编码的YUV原始视频图像帧的数据;
[0009] 创建编码线程的步骤:首先获取CPU的核数,设为M;根据CPU的核数创建N个编码线程,使N等于M,或者使N是M的整数倍。如果不是初次视频压缩则跳过这一步骤;
[0010] 划分的步骤:用于将原始视频图像帧从上到下依次划分为Q个图像部分,划分后的图像部分的数量Q等于编码线程数N,或者图像部分的数量Q是N的整数倍数;每个图像部分包含多个Slice,每个Slice包含多个宏块;将各个图像部分平均分配给各个编码线程处理;
[0011] 判断输入视频图像帧类型的步骤:用于判断输入的视频图像帧类型,如果是“B”类型帧或者是“P”类型帧则进入“编码线程运动补偿预测步骤”如果是“I”类型帧则进入“交叉分配的步骤”;
[0012] 编码线程运动补偿预测的步骤:用于各编码线程分别对分配给各自的图像部分进行搜索,计算运动补偿预测;并将计算的结果按宏块暂存;
[0013] 交叉分配的步骤:用于将原始视频图像上的Slice依次交叉分配形成编码视频图像帧,所述的编码视频图像帧中包含N个Slice组,将各个Slice组分配给各编码线程,并按照各编码线程所分配的Slice数占整个视频图像帧Slice总数的比例,将总体目标码率分配给各编码线程,这样得到各个线程内的Slice组的目标码率,具体方法是:将原始视频图像帧按从上到下的次序,依次取出N个Slice作为一个Slice段,直至分完为止;如果Slice数不能被N整除,最后不足N个的Slice也作为一个Slice段;将即将形成的编码视频图像帧按从上到下的次序分为N个Slice组,每个Slice段中的第一个Slice分配给第一个Slice组、第二个Slice分配给第二个Slice组、第三个Slice分配给第三个Slice组,余此类推,第N个Slice分配给第N个Slice组;如果Slice数不能被N整除,对于最后一个Slice数不足N个的Slice段,记其所包含的Slice数为P,只需将其包含的P个Slice依次分配给第1至第P个Slice组即可,这样形成交叉顺序的带有N个Slice组的编码视频图像帧;
[0014] 编码计算的步骤:用于各个编码线程对Slice组内的各个Slice的宏块依次执行编码计算,如果该帧为B帧或P帧,编码计算过程将使用运动补偿预测的结果;
[0015] 恢复正常顺序和输出压缩视频图像帧的数据的步骤:用于将经过编码计算的编码视频图像帧按正常的顺序进行拼接,形成正常Slice次序的压缩视频图像帧并输出,完成视频图像帧的编码。
[0016] 本发明产生的有益效果是:在单帧多编码线程的前提下,通过在各编码线程间平均分配码率的办法,即打乱图像信息原来的顺序规律,将信息量较大的Slice和信息量较少的Slice交叉分配,平均各编码线程所负责的Slice的信息量,在各编码线程内仍使用TM5模型编码,最终较好解决了单帧图像多线程编码时各部分图像质量不均衡视频质量不稳定的问题。Mpeg2高清编码器使用本发明所述技术方案后,充分利用了多核平台,视频图像画面在解压缩后仍然保证了极高画面质量。

附图说明

[0017] 下面结合附图和实施例对本发明作进一步说明。
[0018] 图1是发明实施例一所述的方法的过程原理框图;
[0019] 图2是发明实施例一所述的方法的交叉分配示意图。

具体实施方式

[0020] 实施例一:
[0021] 本实施例是一种多核平台下高清编码器的Slice码率分配方法,过程如图1所示。本实施例所述方法可以通过编辑软件的方式,作为程序运行在各种带有视频编码器的视频图像处理系统中,例如视频图像编辑系统、视频图像采编系统等等,也可以通过逻辑电路的形式体现在编码器芯片中。本实施例所述的视频编码器指的是:按照某种标准格式对视频进行压缩编码处理的工具,可以对1920×1080分辨率的视频画面进行压缩的高清编码器。
本实施例所述的视频压缩格式为Mpeg2,也适用于Mpeg4,H264等。
[0022] 本实施例所述的计算机视频图像处理系统是多核平台的,所述多核平台指的是:单个CPU芯片具有多个CPU核或者计算机主板上具有多个CPU芯片插槽,而每个芯片插槽插入的CPU芯片又包含一个或多个CPU核。这种多核平台是具有并行计算能力的视频图像处理系统。本实施例所述多核平台是指基于通用多核CPU的x86平台,如Intel酷睿2双核,4核,较新的如Intel i3、i5、i7等多核CPU。本实施例所述的多核平台可以是2至16核,甚至更多。本实施例中比较常用的是4、6、8、16核。本实施例所述并行计算指的是空间上的并行,即用多个处理器并发的执行计算。在多核CPU环境下,要有不少于CPU核数的N个编码线程运行,保证所有的CPU核处于运行状态,能最大限度利用CPU资源。
[0023] 本实施例所述的视频压缩编码指的是:对视频图像进行压缩编码处理,减少其最终编码形成的数据量的编码方式。是一种针对宏块作为压缩单元进行的压缩编码,宏块是16×16像素的图像块。处于同一行的宏块连在一起称为宏块行,或标记为Slice,在本实施例中一个Slice就是一个宏块行。本实施例采用TM5码率控制模型来计算宏块中每一个块的量化尺度。
[0024] 本实施例所述的多核并行计算压缩编码的思想是:有多少核(假设为M个),就创建多少编码线程或M的整倍数个线程进行并行视频压缩计算。
[0025] 本实施例所述的方法包括以下步骤:
[0026] 输入无压缩的原始视频图像帧的数据的步骤:用于接收待压缩的YUV的原始视频图像帧的数据。本步骤是视频图像压缩过程的开始。为将图像压缩编码,在通常情况下,会将图像划分为多个宏块,然后对宏块进行编码压缩。本实施例所述的YUV宏块的视频颜色格式如果是4:2:2,当本实施例应用在MPEG-2格式标准时,每个宏块包含4个8×8的Y亮度块,2个8×8的U色度块,和2个8×8的V色度块。或者YUV宏块的视频颜色格式如果是4:2:0,则按MPEG-2格式标准划分宏块,每个宏块包含4个8×8的Y亮度块,1个8×8的U色度块和1个8×8的V色度块。使用4:2:2视频颜色格式可以获得良好的画质,但码率较高。使用4:2:0码率较低,但画质略差。可以按照具体情况和要求进行选择。
[0027] 创建编码线程的步骤:用于根据CPU的核数M创建M个编码线程,或者创建M的整倍数个编码线程。创建的编码线程数量与CPU的核数相同,或者编码线程数量是CPU核数的整数倍,例如CPU的核数N为4,侧创建4个线程,或创建2×4=8个线程,或者3×4=12的线程等等。通常编码线程数量与CPU核数相同时是最优选择,如果不是初次视频压缩则跳过这一步骤。在通常情况下,本步骤不是每帧图像输入时都要创建编码线程,仅仅在初始时探测硬件环境,然后通过对硬件环境的了解,计算出可以使用的编码线程,之后则不再需要这个步骤,应当跳过。
[0028] 划分的步骤:用于将原始视频图像帧按照CPU的核数创建的编码线程数N从上到下依次划分为N个图像部分,每个图像部分包含多个宏块行,每个宏块行是由同一行的所有宏块连在一起组成的。每个Slice由同一宏块行上的多个相邻的宏块组成,宏块是16×16像素的图像块,一个宏块行可以包含一个或多个Slice,本实施例中,一个宏块行包含一个Slice。本步骤中划分图像部分是专门为下面进行图像运动补偿进行的准备。或者说:为了充分的利用N个线程,使N个线程都参与图像补偿,将图像按照从上到下顺序分为N部分,N个部分包含的Slice数量大致相同。例如,创建了4个线程,则将图像从上到下分为第一部分、第二部分、第三部分和第四部分。这里分的图像部分与后面的将图像分为“段”和“组”无关。
[0029] 判断输入视频图像帧类型的步骤:用于判断输入的视频图像帧类型,如果是“B” 类型帧或者是“P” 类型帧,则进入“运动补偿预测步骤”如果是“I” 类型帧,则进入下一步骤。本实施例所述的视频压缩编码同时考虑了通过运动补偿的方式进行数据的压缩。在视频序列中,相邻帧之间一般存在极大的相关性,也就是相邻帧图像画面相似度很大,如果以一帧画面为基准,后续帧图像中各个宏块通过搜索算法,计算出该宏块相对于上一帧图像近似宏块的偏移向量,然后用该宏块各像素的YUV值减去近似块的YUV值,剩下的残差值包含信息量较少,可以比较方便的使用游程编码等方式进行压缩。在解码恢复时,只需要将解出的残差值加上参考帧宏块的YUV值,就可以还原得到后续帧图像。这样压缩后的图像帧就分为两种类型,一种是参考类型帧(I类型帧),包含了本帧图像的全部信息;一种是预测类型帧(B类型帧、P类型帧),通过与参考帧的比较和残差值计算才能获得本帧图像的全部信息。预测帧要以参考帧为基础才能进行计算和预测。本步骤为进行运动补偿预测做准备,如果是参考类型帧就不需要进行运动步骤预测,跳过下一步骤,直接进入交叉分配的步骤。
[0030] 运动补偿预测的步骤:用于各编码线程分别对分配到各自编码线程上的图像部分进行搜索,计算运动补偿预测,得到的运动向量值和残差都按宏块暂存,之后进入下一步骤,进行交叉。在本步骤中图像通过运动向量值和残差得到部分的压缩。
[0031] 交叉分配的步骤:用于将原始视频图像上的Slice交叉分配形成编码视频图像帧,所述的编码视频图像帧中包含N个Slice组,将各个Slice分配给各编码线程,并按照各编码线程所分配的Slice数占总视频图像Slice总数的比例,给各编码线程分配各自的目标码率。本步骤是本实施例的关键步骤。所述的交叉分配指的是:将图像中的正常顺序的Slice打乱。这样做的原因是通常在一帧图像中,画面信息是有规律的,某些部分的图像比较简单,而另一些部分的图像则比较复杂,往往复杂的部分集中在一起,而简单的部分也集中在一起,如果按照正常的顺序将一帧图像的分为几个Slice组,有的组就会集中了一些十分简单的Slice,将这样的Slice组交给一个线程处理;另一些Slice组就会集中一些复杂的Slice,将这样的Slice组交给一个另线程处理,由于各线程计算的Slice组之间的码率分配是根据各线程所分配的Silce数量占总Slice数的比例平均分配的,就是说画面信息较少的Slice组和画面信息较多的Slice组占用同样的码率比例,这样会导致部分情况下画面信息较少的Slice组压缩后会非常清晰,但是画面信息较多的Slice组压缩后会非常模糊,导致整体画面质量变差,正确的做法应该是把画面信息较少的Slice和画面信息较多的Slice交叉形成N个画面信息量基本相当的Slice组,每个Slice组分配的码率比例一样,这样就能使整个画面的质量一致。
[0032] 在本实施例中未进行交叉处理的视频图像帧称为“原始视频图像帧”,交叉处理后的视频图像帧称为“编码视频图像帧”。
[0033] 交叉的方式有多种:如可以随机的抽取原始视频图像帧中任意位置的Slice,插入到编码视频图像帧任意的一个Slice位置,不断的抽取原始视频图像帧的Slice,不断的填充编码视频图像帧Slice的位置,直至原始视频图像帧中的Slice被抽光,编码视频图像帧中的Slice位置被填满。这种方式抽取方式简单,易于实现, 但是由于是随机抽取,还是可能使画面信息量多的Slice集中在一个Slice组中,使画面质量不均衡而导致最后的整体画面质量下降。
[0034] 视频图像变化的规律一般是上半部比较简单,下半部比较复杂。根据这个规律可以提出交叉的方式为:将上半部的Slice与下半部的Slice交叉,实现分组后的Slice复杂程度的平衡。这种方式也有几种选择:
[0035] 首先,可以将原始视频图像按照从上到下的次序分为多段,抽取的顺序是依次抽取各段的第一个Slice,再依次抽取各段的第二个Slice,然后是各段的第三个Slice等等,直至抽完。抽出的Slice随机的放入编码视频图像帧。这种方式考虑了图像的规律,有一定的平衡作用,但实现起来比较复杂。
[0036] 其次,可以将编码视频图像帧中的Slice位置按线程的个数N,分为N个Slice组,随机的在原始视频图像帧中抽取Slice。每次抽取的Slice按照第一个Slice放入第一Slice组中、第二个Slice放入第二个Slice组中,直到第N的Slice放入第N个Slice组中,然后回过头来再从第一个Slice组开始。抽出的Slice轮流分配给各个Slice组。这种方式可以有效的解决视频图像中Slice复杂程度不同的问题。
[0037] 第三,可以综合上述的方式,将原始视频图像帧分段、编码视频图像帧分组,轮流抽取原始视频图像帧各个段中的Slice,依次放入编码视频图像帧各个Slice组中。这种方式更为简单有效。
[0038] 交叉分配的目的是:使各编码线程内Slice组的画面信息量的均衡,以便于按照各编码线程所分配的Slice数占整体视频图像帧Slice总数的比例,将总体目标码率分配给各编码线程。总体目标码率是指希望对视频序列编码压缩后生成码流的数据率,也就是每秒多少比特数。
[0039] 编码过程计算的步骤:用于各个编码线程对交叉分配后的Slice组内的各个Slice的宏块依次执行编码计算,如果该帧为B帧或P帧,编码计算过程将使用运动补偿预测的结果。编码计算有多种方式,常用的TM5模型。如果使用TM5模型,则进行过程是:每个编码线程对图像区域内的各个Slice宏块依次执行2维DCT,用TM5模型计算量化步长,量化后,VLC编码,编码出的码流,以Slice为单位单独缓存。
[0040] 恢复正常顺序和输出压缩视频图像帧的数据的步骤:用于将经过编码计算的编码视频图像帧按正常的顺序进行拼接,形成正常Slice次序的压缩视频图像帧并输出,完成视频图像帧的编码。码流的输出不能还按照交叉后的图像顺序,而是按照正常的Slice顺序,从Slice1、Slice2、Slice3……一直到最后一个Slice,把在缓存中的Slice编码流拼接成一个正常完整图像的编码帧。
[0041] 实施例二:
[0042] 本实施例是实施例一的改进,是实施例一关于交叉分配步骤中的交叉分配方法的细化。本实施例所述的交叉分配的步骤中的交叉分配和码率分配方法是:将原始视频图像帧按从上到下的次序,依次取出N个Slice作为一个Slice段,直至分完为止;如果Slice数不能被N整除,最后不足N个的Slice也作为一个Slice段;将即将形成的编码视频图像帧按从上到下的次序分为N个Slice组,每个Slice段中的第一个Slice分配给第一个Slice组、第二个Slice分配给第二个Slice组、第三个Slice分配给第三个Slice组,余此类推,第N个Slice分配给第N个Slice组;对于最后一个Slice数不足N个的Slice段,记其所包含的Slice数为P,只需将其包含的P个Slice依次分配给第1至第P个Slice组即可,这样形成交叉顺序的带有N个Slice组的编码视频图像帧。将各个Slice组依次分配给各编码线程,并按照各编码线程所分配的Slice块数占总视频图像Slice块总数的比例,给各编码线程分配各自的预期码率;
[0043] 本实施例为叙述方便将一组视频图像中的Slice分为“段”和“组”。其中“Slice段”表示的是原始视频图像帧中组合在一起的一些Slice;“Slice组”表示的是编码视频图像帧中组合在一起的一些Slice。
[0044] 各段抽出的Slice在放入Slice组时,可以采取按顺序的方式,即:从第一Slice段中抽出的Slice都放入各个Slice组的第一个位置;从第二Slice段中抽出的Slice都放入各个Slice组的第二个位置,余此类推,从第N个Slice段中抽出的Slice都放入各个Slice组的第N个位置。这种方式简单一些,操作性好。也可以采用随机的方式,即:每个Slice段抽出的Slice随机的放入Slice组中任何一个位置。
[0045] 在一帧视频图像中的 Slice可以被线程数N整除的情况下这种方法没有问题。如果一帧视频图像中Slice数不能被线程数N整除,那么可以根据每个线程计算的Slice组内Slice数所占的百分比来分配给该Slice组的码率值。例如:高清视频画面的一帧视频图像的Slice数为68,如果使用6核平台,需要创建6个线程,而6无法整除68。则码率分配方法如下:
[0046] 总体码率为:R
[0047] 创建的线程数为:N
[0048] 视频帧图像的总Slice数为:S
[0049] S除以N取模:r = S % N
[0050] S除以N取整:a = (int)S/N
[0051] 各 线 程 内 处 理 的 Sl ic e 组 内 的 S li ce 数 :(i是线程序号,i = 1、2、3…N)
[0052]
[0053] 各线程所计算的Slice组的码率值:(i是线程序号,i = 1、2、3…N)[0054]
[0055] 实施例三:
[0056] 本实施例是上述实施例的改进,是上述实施例关于编码计算的步骤的细化。本实施例所述编码计算的步骤中的编码计算包括:二维DCT变换、量化、VLC编码处理。
[0057] 每个线程对Slice组内的各个Slice中的各个宏块依次执行2维DCT,用TM5模型计算量化步长,量化。量化后,VLC编码。VLC编码处理后得到宏块压缩bit流,所有宏块bit流按顺序组合就得到了该帧的编码后数据,之后以Slice为单位单独缓存。
[0058] 二维DCT变换的作用:将时域内的图像值变换成频域内的图像值,其中代表了重要图像信息的能量集中在左上角,代表了不可见或者不重要的图像细节的能量集中在右下角,为量化做准备。
[0059] 量化:根据压缩率,采用码率控制算法计算得到当前块的量化步长,对DCT变换后的图像值进行除法处理(除以量化矩阵和量化步长值),量化步长直接决定了压缩比,而量化步长值是由码率控制算法提前计算出的。
[0060] VLC编码, 一种熵编码方法,可以有效去除静态(比特结构)冗余度。
[0061] 实施例四:
[0062] 本实施例是上述实施例的改进,是上述实施例的关于创新编码线程的细化,本实施例所述的计算机视频图像处理系统的CPU的核数为4或6,即CPU的是核数是4个或6个。根据实施例中对编码线程创建的要求,应当创建4个或6个编码线程。或者创建4或6的正整数倍的线程数,例如:4×2=8、4×3=12、4×4=16等等。或6×2=12、6×3=18、6×4=24等等。本实施例以创建4个编码线程为例对如何在原始视频图像帧分Slice段和在压缩视频图像帧分Slice组,以及如何进行交叉分配进行说明。
[0063] Slice交叉分配的情况如图2的简单例子说明,图2中为CPU核数为4的编码线程Sliece交叉分配情况,创建的编码线程数也为4个。图2中左边为20个Slice 的一个完整原始视频图像帧101,将这20个Slice划分为多个Slice段,每个Slice段包含与线程数相同数量的Slice,本实施例中每个Slice段应当包含4个Slice,而20个Slice的原始视频图像帧就应当包含5个Slice段1011、1012、1013、1014、1015。原始视频图像帧的5个Slice段中的Slice将被重新分配至压缩视频图像帧102中的多个Slice组中。根据即将形成的压缩视频图像帧的分组要求,Slice组的数量应当与线程数量相同,在本实施例中压缩视频图像帧就应当有4个Slice组1021、1022、1023、1024。这样将20个Slice交叉分配到4个Slice组中。
[0064] 交叉分配的方法是:
[0065] Slice1 ——>第1Slice组
[0066] Slice2 ——>第2Slice组
[0067] Slice3 ——>第3Slice组
[0068] Slice4 ——>第4Slice组
[0069] 压缩视频图像帧中第一Slice段分配完毕,开始分配第二Slice段
[0070] Slice5 ——>第1Slice组
[0071] Slice6 ——>第2Slice组
[0072] Slice7 ——>第3Slice组
[0073] Slice8 ——>第4Slice组
[0074] ……。
[0075] 即每帧原始视频图像帧的各个Slice段依次分配给压缩视频图像帧中各Slice组,形成4个新的Slice组,如图2右边部分所示。这些重构Slice组只是在运算过程中以逻辑整体单元存在于内存中,在编码过程中分配给不同的编码线程进行计算,通常情况下这些编码线程会被分配给不同CPU核心同时运算。
[0076] Slice这样排列后,把规则图像打乱,各个Slice组均包含简单画面部分的Slice和复杂画面部分的Slice,总码率就可以简单平均分配到4个编码线程对应的Slice组。从概率的角度看,这样分配方法也存在的合理性。实际上高清视频画面Slice数为68,如果Slice数不能被编码线程数整除,那么根据每个编码线程计算的Slice组内Slice数所占的一帧图像总Slice数的比例来分配该Slice组的码率值。例如在CPU核心数为8的时候,前4个Slice组将各自被分配9个Slice,每个Slice组内占总Slice数的比例为9/68,这4个Slice组各自占总码率的9/68; 后4个Slice组将各自被分配8个Slice,每个Slice组内占总Slice数的比例为8/68,这4个Slice组各自占总码率的8/68。
[0077] 这样交叉分配Slice的理论基础是多数图像的上半部分比较简单,下半部分比较复杂,如风景的图像,上半部分是天空——比较简单,下半部分是景物——比较复杂,在各部分图像压缩质量大体相同的情况下,上半部分的所需要的比特数较少,而下半部分所需要的比特数较多。将上半部分和下半部分的Slice交叉,形成新的图像组合,相当于将整体所需要的码率平均一下,使各个编码线程的所负责的图像组合复杂度相对平均。
[0078] 实施例七:
[0079] 本实施例是实施例1至5的改进,是实施例1至5关于创建编码线程的细化。本实施例所述的计算机视频图像处理系统的CPU的核数为8或16,创建编码线程的步骤中创建8个或16个编码线程。
[0080] 如果Slice数是68,编码线程数是8个,交叉分配的方法是:
[0081] Slice1 ——>第1 Slice组
[0082] Slice2 ——>第2 Slice组
[0083] Slice3 ——>第3 Slice组
[0084] Slice4 ——>第4 Slice组
[0085] Slice5 ——>第5 Slice组
[0086] Slice6 ——>第6 Slice组
[0087] Slice7 ——>第7 Slice组
[0088] Slice8 ——>第8 Slice组
[0089] 压缩视频图像帧中第一Slice段分配完毕,开始分配第二Slice段
[0090] Slice9 ——>第1 Slice组
[0091] Slice10 ——>第2 Slice组
[0092] Slice11 ——>第3 Slice组
[0093] Slice12 ——>第4 Slice组
[0094] Slice13 ——>第5 Slice组
[0095] Slice14 ——>第6 Slice组
[0096] Slice15 ——>第7 Slice组
[0097] Slice16 ——>第8 Slice组
[0098] ……
[0099] Slice64 ——>第8 Slice组
[0100] Slice65 ——>第1 Slice组
[0101] Slice66 ——>第2 Slice组
[0102] Slice67 ——>第3 Slice组
[0103] Slice68 ——>第4 Slice组
[0104] 即每帧图像的Slice依次分配给各Slice组,形成8个新的Slice组。
[0105] 如此等等。
[0106] 最后应说明的是,以上仅用以说明本发明的技术方案而非限制,尽管参照较佳布置方案对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案(比如视频宏块的格式码率过程计算等)进行修改或者等同替换,而不脱离本发明技术方案的精神和范围。