编码装置和系统的制作方法

文档序号:18832683发布日期:2019-10-09 03:58阅读:127来源:国知局
编码装置和系统的制作方法

本专利文件披露的内容包含受版权保护的材料。该版权为版权所有人所有。版权所有人不反对任何人复制专利与商标局的官方记录和档案中所存在的该专利文件或者该专利披露。

本申请涉及视频编解码领域,并且更为具体地,涉及一种编码装置和系统。



背景技术:

视频编码技术可以对视频数据进行压缩,从而方便视频数据的存储和传输。目前,视频编码技术广泛应用于各个领域,如移动终端领域,无人机图传领域等。

目前,有些视频编码协议要求在熵编码之前,先对量化后的交流(alternatingcurrent,ac)系数进行level-run的编码,level-run信息可用于表征接下来需要编码的非零ac系数的数量。

传统技术中,行程编码和熵编码的过程需要对量化系数进行两次遍历,耗时较长。因此,传统技术存在编码效率低的问题。



技术实现要素:

本申请提供一种编码装置和系统,能够提高编码效率。

第一方面,提供一种编码装置,所述编码装置包括:第一缓存,用于缓存量化电路输入的图像块的量化系数;信息生成电路,用于对所述图像块的量化系数依次进行检测,以获取行程编码信息,所述行程编码信息包括level-run信息、zero-run信息以及直流分量dc系数的标识信息中的至少一种;第二缓存,用于缓存所述信息生成电路生成的行程编码信息;处理电路,用于当所述第二缓存存储有行程编码信息时,从所述第二缓存中读取所述行程编码信息,从所述第一缓存中读取所述行程编码信息对应的量化系数,并向熵编码电路输出所述行程编码信息及其对应的量化系数。

第二方面,提供一种编码装置,所述编码装置包括:变换电路,用于生成图像块的变换系数;扫描电路,用于将所述变换系数从二维数据转换成一维数据序列;量化电路,用于对所述一维数据序列进行量化,生成所述图像块的量化系数;熵编码电路,用于对所述量化系数进行熵编码。

第三方面,提供一种编码系统,所述编码系统包括:如第一方面或第二方面所述的编码装置;内存,所述内存包括用于存储所述编码装置输出的码流的环形存储空间。

本申请提供的编码装置通过引入两个缓存、信息生成电路以及处理电路,将量化系数的写入逻辑与量化系数的读出逻辑相互隔离,使得若干个量化系数的行程编码信息确认之后,行程编码信息的提取过程与量化系数的熵编码过程即可并行执行,而且行程编码与量化过程之间的硬件流水不会被打断,提高了编码装置的并行度。

附图说明

图1是图像帧、条带、分量、码流关系的一个示例图。

图2是raw格式的图像的4个分量的排布图案。

图3是图像帧、条带、分量、码流关系的另一示例图。

图4是编码装置的通用架构的示意图。

图5是本申请一个实施例提供的编码装置的硬件架构示意图。

图6是图5所示的编码装置的硬件架构的电路模块的时序图。

图7是本申请另一实施例提供的编码装置的硬件架构示意图。

图8是图7所示的编码装置的硬件架构的电路模块的时序图。

图9是本申请又一实施例提供的编码装置的硬件架构示意图。

图10是图9所示的编码装置的硬件架构的电路模块的时序图。

图11是本申请又一实施例提供的编码装置的硬件架构示意图。

图12是图11所示的编码装置的硬件架构的电路模块的时序图。

图13是本申请实施例提供的行程编码和熵编码流程的软件算法流程图。

图14是本申请一个实施例提供的编码装置的示意图。

图15是本申请另一实施例提供的编码装置的示意图。

图16是本申请实施例提供的信息生成电路的控制逻辑的流程图。

图17是本申请实施例提供的处理电路的控制逻辑的流程图。

图18是本申请又一实施例提供的编码装置的示意图。

图19是本申请实施例提供的编码系统的示意图。

图20是本申请实施例提供的具有环形缓存空间的内存结构示例图。

具体实施方式

需要说明的是,本申请实施例对需要编码的图像的格式不做具体限定,可以是rgb,也可以是yuv,还可以是raw。

视频编码器通常以图像块为单位进行编码。该图像块有时也可称为条带(slice)。一帧图像可以包括一个或多个条带,每个条带可以包括图像的多个分量(如rgb,yuv等)。下面结合图1-图3,对码流、图像帧、条带、分量之间的关系进行举例说明。

作为一个示例,假设视频图像的规格为4k,图像的格式为yuv。如图1中的(a)所示,4k规格的视频中的图像帧的尺寸可以为4096×2160。如图1中的(b)所示,针对该图像帧,可以以128×16为单位进行划分,共得到4320个条带,其中每个条带可以独立编解码。图像中的像素通常包含多个分量(y分量、u分量和v分量),如图1的(c)所示。对图1的(a)中的图像帧编码后,可以得到码流。该码流包含图像帧的帧头(frameheader),该帧头对应的帧数据可以包含4320个子码流的码流信息。子码流可以包含头文件以及y、u、v分量对应的码流信息。

作为另一示例,假设视频图像的规格为8k,图像的格式为raw。raw格式的图像一般具有4个分量,gr、gb、b、r。如图2所示,该4个分量可以有4种排列方式,形成4种贝尔图案(bayerpattern)。如图3中的(a)所示,8k规格的视频中的图像帧的尺寸可以为8192×4320。如图3中的(b)所示,针对该图像帧,可以以256×16为单位进行划分,共得到8640个条带,其中每个条带可以独立编解码。图像中的像素通常包含多个分量(g分量、b分量和r分量),如图3的(c)所示。对图3的(a)中的图像帧编码后,可以得到码流。该码流包含图像帧的帧头,该帧头对应的帧数据可以包含8640个子码流的码流信息。子码流可以包含头文件以及gr、gb、b、r分量对应的码流信息。

进一步地,一个条带可以包括若干个宏块(macroblock)。一个宏块可以包括若干像素,如16×16个像素。一个宏块还可以进一步划分为若干个小的编码块(codeblock)。以一个宏块包含16×16个像素为例,宏块可以包括4个编码块,每个编码块的大小可以是8×8。

下面结合图4,对视频编码器的一般架构进行举例说明。

如图4所示,视频编码器40可以包括以下电路中的一种或多种的组合:分割电路41、伪log编码电路42、变换电路43、量化电路44、熵编码电路45、码率控制(ratecontrol,rc)电路46、码流输出电路47等。

分割电路41可以将待编码的图像帧分割为一个或多个可独立编解码的图像块,并以图像块为单位进行独立的编码处理。

伪log编码(pesudo-logencode,ple)电路42可以将图像块的数据从线性数据转换成非线性数据(或者将图像块从线性域转换到非线性域)。需要说明的是,伪log编码电路42为视频编码器40中的可选电路,在某些实施例中,也可以不经过伪log编码电路42,直接对图像块进行变换操作。

变换电路43可用于生成图像块的变换系数。变换的目的是为了从频域的角度减小图像数据的相关性(如空间相关性),以降低码率。变换电路43对应的变换方式可以有多种,如傅里叶变换或离散余弦变换(discretecosinetransform,dct)变换等。

量化电路44可用于对变换电路43输出的变换系数进行量化,生成量化系数。量化电路44主要利用人眼对高频信号敏感度较低的特性,将变换数据中的部分高频信息舍弃,从而将变换系数限定在一定范围内,以进一步降低码率。

熵编码电路45也可称为可变长度编码器(variablelengthcoder,vlc)。熵编码例如可以是霍夫曼(huffman)编码,也可以是算术编码等。熵编码可以将量化系数以更少的码流表示,以实现量化系数的无损压缩。可选地,在熵编码之前,还可以对量化系数进行行程编码。行程编码可以将量化系数以run-level两个因子表示,从而进一步简化数据。行程编码和熵编码有时可以统称为熵编码。

rc电路46通常采用预测等方式计算待编码的图像块所采用的量化参数。码率输出电路47可以在码流头部添加头部信息,从而将码流打包输出。

上文描述的是视频编码器的通用硬件架构。在上述视频编码器的通用硬件架构基础上,本申请实施例提供几种具有高并行度的硬件架构,下面对这种具有高并行度的硬件架构进行详细说明。

可选地,作为一个实施例,可以将图4中的变换电路43和量化电路44配置为:变换电路43和量化电路44在每个时钟周期处理相同数量的像素点,换句话说,变换电路43和量化电路44在每个时钟周期的处理速率相匹配,这样一来,变换电路43和量化电路44之间的硬件可以实现紧密流水。进一步地,可以将量化电路44和熵编码电路45配置为:量化电路44和熵编码电路45在每个时钟周期处理相同数量的像素点。假设量化电路44每个时钟周期处理t个像素点(t为大于1的正整数),则熵编码电路45内部可以设置t个并行的vlc,从而使得熵编码电路45在每个时钟周期也可以对t个像素点。

以图像块的格式为raw格式,一个条带包括16个宏块,每个宏块包括16×16个像素为例,如图5所示,可以将变换电路43和量化电路44的处理速率配置为4像素/时钟周期,熵编码电路45内部设置4个并行的vlc,由于一个vlc在一个时钟周期可以处理一个量化系数,因此,熵编码电路45在每个时钟周期可以处理4个量化系数,即其处理速率也为4像素/时钟周期。

图6为图5所示的硬件架构在最坏情况下(即某个分量全部都是非零ac系数,则需要等待该分量的所有量化系数量化完成之后才能确定level-run信息,进而才能开始熵编码)的处理时序图。具体地,变换电路43和量化电路44在一个时钟周期均可以对4个像素进行处理,二者的处理速率相匹配,数据在它们之间可以紧密流水起来。由于一个条带包括16个宏块,每个宏块包括16×16个像素,则量化电路44对一个条带的处理时间为1024个时钟周期。假设量化系数在进入vlc之前需要先编码非零ac系数的level-run信息,最坏情况下,vlc需要等待一个条带的一个分量全部量化完成之后,才能开始进行熵编码,因此,vlc在最坏情况下需要等待512个时钟周期才能开始对量化系数进行熵编码。考虑到编码完成之后进行码率控制以计算下一个条带的量化参数的时间约为10个时钟周期,因此,4个vlc在最坏情况下编码完一个条带需要约1536个时钟周期。

仍以图像块的格式为raw,一个条带包括16个宏块,每个宏块包括16×16个像素为例,如图7所示,可以将变换电路43和量化电路44的处理速率配置为8像素/时钟周期,熵编码电路45内部设置8个并行的vlc,由于一个vlc在一个时钟周期可以处理一个量化系数,因此,熵编码电路45在每个时钟周期可以处理8个量化系数,即其处理速率为8像素/时钟周期。

图8为图7所示的硬件架构在最坏情况下的编码时序图。具体地,变换电路43和量化电路44在一个时钟周期均可以对8个像素进行处理,二者的处理速率相匹配,数据在它们之间可以紧密流水起来。由于一个条带包括16个宏块,每个宏块包括16×16个像素,则量化电路44对一个条带的处理时间为512个时钟周期。假设量化系数在进入vlc之前需要先编码非零ac系数的level-run信息,最坏情况下,vlc需要等待一个条带的一个分量全部量化完成之后,才能开始进行熵编码,因此,vlc在最坏情况下需要等待256个时钟周期才能开始对量化系数进行熵编码。考虑到编码完成之后进行码率控制以计算下一个条带的量化参数的时间约为10个时钟周期,因此,8个vlc在最坏情况下编码完一个条带需要约768个时钟周期。

可选地,作为另一实施例,可以将图4中的变换电路43和量化电路44配置为:变换电路43和量化电路44在每个时钟周期处理相同数量的像素点,换句话说,变换电路43和量化电路44在每个时钟周期的处理速率相匹配,这样一来,变换电路43和量化电路44之间的硬件可以实现紧密流水。进一步地,可以将量化电路44和熵编码电路45配置为:量化电路44在每个时钟周期处理的像素点的数量大于熵编码电路45在每个时钟周期处理的像素点的数量。例如,量化电路44在每个时钟周期处理的像素点的数量为熵编码电路445在每个时钟周期处理的像素点的数量的整数倍(如2倍)。

以图像块的格式为raw,一个条带包括16个宏块,每个宏块包括16×16个像素为例,如图9所示,可以将变换电路43和量化电路44的处理速率配置为8像素/时钟周期,熵编码电路45内部设置4个并行的vlc,由于一个vlc在一个时钟周期可以处理一个量化系数,因此,熵编码电路45在每个时钟周期可以处理4个量化系数,即其处理速率为4像素/时钟周期。由此可见,在该实施例中,量化电路44的处理速率为熵编码电路45的2倍。

图10为图9所示的硬件架构在最坏情况下的处理时序图。具体地,变换电路43和量化电路44在一个时钟周期均可以对8个像素进行处理,二者的处理速率相匹配,数据在它们之间可以紧密流水起来。由于一个条带包括16个宏块,每个宏块包括16×16个像素,则量化电路44对一个条带的处理时间为512个时钟周期。假设量化系数在进入vlc之前需要先编码非零ac系数的level-run信息,最坏情况下,vlc需要等待一个条带的一个分量全部量化完成之后,才能开始进行熵编码,因此,vlc在最坏情况下需要等待256个时钟周期才能开始对量化系数进行熵编码。考虑到编码完成之后进行码率控制以计算下一个条带的量化参数的时间约为10个时钟周期,因此,4个vlc在最坏情况下编码完一个条带需要约1280个时钟周期。

可选地,作为又一实施例,可以将图4中的变换电路43和量化电路44配置为:变换电路43和量化电路44在每个时钟周期处理相同数量的像素点,这样一来,换句话说,变换电路43和量化电路44在每个时钟周期的处理速率相匹配,变换电路43和量化电路44之间的硬件可以实现紧密流水。进一步地,可以将量化电路44和熵编码电路45配置为:量化电路44在每个时钟周期处理的像素点的数量小于熵编码电路45在每个时钟周期处理的像素点的数量。例如,熵编码电路45在每个时钟周期处理的像素点的数量为量化电路44在每个时钟周期处理的像素点的数量的整数倍。

以图像块的格式为raw格式,一个条带包括16个宏块,每个宏块包括16×16个像素为例,如图11所示,可以将变换电路43和量化电路44的处理速率配置为4像素/时钟周期,熵编码电路45内部设置8个并行的vlc,由于一个vlc在一个时钟周期可以处理一个量化系数,因此,熵编码电路45在每个时钟周期可以处理8个量化系数,即其处理速率为8像素/时钟周期。由此可见,在该实施例中,熵编码电路45的处理速率为量化电路44的处理速率的2倍。

图12为图11所示的硬件架构在最坏情况下的处理时序图。具体地,变换电路43和量化电路44在一个时钟周期均可以对4个像素进行处理,二者的处理速率相匹配,数据在它们之间可以紧密流水起来。由于一个条带包括16个宏块,每个宏块包括16×16个像素,则量化电路44对一个条带的处理时间为1024个时钟周期。假设量化系数在进入vlc之前需要先编码非零ac系数的level-run信息,最坏情况下,vlc需要等待一个条带的一个分量全部量化完成之后,才能开始进行熵编码,因此,vlc在最坏情况下需要等待512个时钟周期才能开始对量化系数进行熵编码。考虑到编码完成之后进行码率控制以计算下一个条带的量化参数的时间约为10个时钟周期,因此,4个vlc在最坏情况下编码完一个条带需要约1152个时钟周期。

在其他实施例中,量化电路44与熵编码电路45的处理速率之间的关系也可以不是整数倍的关系,例如,量化电路44每个时钟周期处理8个像素点,熵编码电路45每个时钟周期处理5个像素点。

将量化电路44和熵编码电路45之间的处理速率之间的关系设置为一致或设置为整数倍关系简化二者之间的时序关系,提高编码效率。

前文已经指出,传统编码方式,在熵编码之前,需要多次遍历量化系数,导致编码效率较低。

为了提高编码效率,本申请实施例首先将传统行程编码和熵编码之间的软件算法流程更改成如图13所示的实现方式,以避免对量化系数的多次遍历,从而可以提高编码装置的并行度。下面结合图13,对行程编码和熵编码的软件算法流程进行详细说明。

首先,定义两个整型变量m和n,n可用于表示zero-run,m可用于表示level-run。如图13所示,本申请实施例提供的行程编码和熵编码的软件算法流程包括步骤s1302至步骤s1340。

步骤s1302:初始化m、n。

首先,可以将m和n的取值均设置为0。其次,先将n设置为有效状态,将m设置为无效状态。

步骤s1304:接收输入的量化系数。

该量化系数为图像块的某个分量的量化系数。该分量例如可以是rgb分量中的某个分量,也可以是yuv分量中的某个分量,本申请实施例对此并不限定。可以从如图4所示的量化电路44接收量化系数。

步骤s1306:判断量化系数为dc系数还是ac系数。

如果量化系数为dc系数,则执行步骤s1308;如果量化系数为ac系数,则执行步骤s1310。

步骤s1308:对dc系数进行差分编码。

与ac系数不同,dc系数通常采用差分编码。差分编码的具体编码方式可以参见传统技术,此处不再详述。

步骤s1310:判断ac系数为零ac系数还是非零ac系数。

如果ac系数为零ac系数,则执行步骤s1312;如果ac系数为非零ac系数,则执行步骤s1320。

步骤s1312:判断m是否处于有效状态。

如果m处于有效状态,则执行步骤s1314;如果m处于无效状态,则执行步骤s1318。

步骤s1314:对m进行熵编码、将m的取值设置为0,并将m设置为无效状态。

m表示level-run,对m进行熵编码即对level-run信息进行熵编码。

步骤s1316:对缓存的m个量化数据进行熵编码。

在level-run信息编码完成之后,可以立即开始对level-run信息对应的量化数据进行熵编码。

步骤s1318:将n设置为有效状态,并将n的取值加1。

步骤s1320:判断n是否处于有效状态。

如果n处于有效状态,则执行步骤s1322;如果n处于无效状态则执行步骤s1328。

步骤s1322:对(n-1)进行熵编码,将n的取值设置为0,并将n设置为无效状态。

对(n-1)进行熵编码相当于对zero-run信息进行熵编码。

步骤s1324:对量化系数进行熵编码。

即对zero-run信息对应的量化系数进行熵编码。

步骤s1326:将m设置为有效状态。

步骤s1328:将量化数据存入缓存中。

步骤s1330:将m取值加1。

步骤s1332:判断输入的量化系数是否为分量的最后一组量化系数。

如果步骤s1304接收到的量化系数不是分量的最后一组量化系数,则重新执行步骤s1332;如果步骤s1306接收到的量化系数是分量的最后一组量化系数,则执行步骤s1334。

步骤s1334:判断m是否处于有效状态。

如果m处于有效状态,则执行步骤s1336;如果m处于无效状态,则执行步骤s1340。

步骤s1336:对m进行熵编码。

步骤s1338:对缓存中的m个量化系数进行熵编码。

步骤s1340:结束熵编码流程。

从上述软件流程的实现方式可以看出,本申请实施例提供的行程编码和熵编码过程的软件算法流程中,一旦有行程编码信息(m或n)被确认,则可以立即开始熵编码,这样可以提高编码过程的并行度。

在上述软件算法流程的基础上,本申请实施例提供一种编码装置,不但可以实现上述算法流程,而且可以保证行程编码电路和前级电路(如量化电路)之间的硬件流水不会被打断。下面结合图14,对该编码装置进行详细描述。

如图14所示,编码装置1400可以包括第一缓存1410、信息生成电路1420、第二缓存1430以及处理电路1440。

第一缓存1410可用于缓存图像块的量化系数。第一缓存1410可以缓存外部的量化电路输入的图像块的量化系数。因此,第一缓存1410也可称为量化系数的缓存。第一缓存1410例如可以是基于先入先出(firstinfirstout,fifo)的缓存,在该实施例中,可以将第一缓存1410称为quantfifo。

信息生成电路1420可用于对图像块的量化系数依次进行检测,以获取行程编码信息。行程编码信息包括level-run信息、zero-run信息以及直流(directcurrent,dc)系数的标识信息中的至少一种。level-run信息为level(即非零ac系数)的行程。换句话说,level-run信息可用于指示接下来需要编码的连续非零ac系数的数量。zero-run信息可用于指示zero(即零ac系数)的行程。换句话说,zero-run信息可用于指示连续出现的零ac系数的数量。dc系数可用于指示待编码的量化系数为dc系数。

可以理解的是,信息生成电路1420可执行图13中的除编码相关的其他操作,如检测量化系数,对m和n的取值进行配置和调整等。下文还会结合图16,详细描述信息生成电路1420的具体实现方式,此处暂不详述。

第二缓存1430可用于缓存信息生成电路1420生成的行程编码信息。因此,第二缓存1430也可称为行程编码信息缓存。第二缓存1430例如可以是基于fifo的缓存,在该实施例中,可以将第二缓存1430称为runfifo。应理解,信息生成电路1420一旦提取到行程编码信息(或一旦确认某些量化系数的行程编码信息),就会将其存入第二缓存1430中,以便处理电路1440及时对其进行处理。

处理电路1440可用于当第二缓存1430存储有行程编码信息时,从第二缓存1430中读取行程编码信息,从第一缓存1410中读取行程编码信息对应的量化系数,并向位于输出端的熵编码电路输出行程编码信息及其对应的量化系数。

处理电路1440可以不断检测第二缓存1430是否非空,一旦检测到第二缓存1430非空(表示第二缓存1430中存储了已经确认的行程编码信息),则会从第二缓存1430中读取行程编码信息,并从第一缓存1410中读取该行程编码信息对应的量化系数(或该行程编码信息所确认的量化系数)。处理电路1440从第一缓存1410中读取行程编码信息对应的量化系数的方式可以有多种。例如,可以将第一缓存1410和第二缓存1430均设置为基于fifo的缓存。处理电路1440从第二缓存1430的fifo队列的队首获取到一条行程编码信息之后,如果该行程编码信息为level-run信息,则可以按照先入先出的原则,从第一缓存1410的fifo队列中读取与level-run值等量的量化系数。又如,信息生成电路1420可以预先标记第一缓存1410中存储的量化系数与第二缓存1430中存储的行程编码信息之间的对应关系,处理电路1440可以依据该对应关系从第二缓存1430中读取行程编码信息对应的量化系数。

处理电路1440在向熵编码电路输出行程编码信息及其对应的量化系数之前,还可以通过查表的方式得到待熵编码的码本。下文会结合图17,详细描述处理电路1440的实现方式。

本申请实施例提供的编码装置1400通过引入两个缓存1410、1430、信息生成电路1420以及处理电路1440,将量化系数的写入逻辑与量化系数的读出逻辑相互隔离,使得输入的若干个量化系数的行程编码信息确认之后,可以立即开始后续的熵编码过程。换句话说,当输入的若干个量化系数的行程编码信息确认之后,行程编码信息的提取过程与量化系数的熵编码过程即可并行执行,而且行程编码与量化过程之间的硬件流水不会被打断,提高了编码装置的并行度。

信息生成电路1420、量化电路、第一缓存1410、第二缓存1430之间的连接关系可以有多种。作为一个示例,信息生成电路1420的输入端可以与量化电路连接,信息生成电路1420的输出端与第一缓存1410和第二缓存1430相连。在该实施例中,信息生成电路1420可用于:接收量化电路输入的量化系数;对输入的量化系数进行检测,当获取到行程编码信息时,将获取到的行程编码信息存入第二缓存1430中;将输入的量化系数存入第一缓存1410。作为另一个示例,第一缓存1410可以直接与量化电路相连,并将量化电路输入的量化系数存入第一缓存1410中。信息生成电路1420可以不与第一缓存1410相连,仅与量化电路和第二缓存1430相连。

如图15所示,第一缓存1410、信息生成电路1420、第二缓存1430以及处理电路1440共同构成了编码装置1400中的行程编码电路1510,其中,第一缓存1410和第二缓存1430均为基于fifo的缓存。编码装置1400还可以包括量化电路1520和熵编码电路1530。站在行程编码电路1510的角度,通过第一缓存1410和第二缓存1420,该行程编码电路1510与量化电路1520之间的接口逻辑(下称写入侧(writeside)的逻辑)与该行程编码电路1510与处理电路1440之间的接口逻辑(下称读出侧(readside)的逻辑)相互隔离。写入侧的逻辑由信息生成电路1420控制,读出侧的逻辑由处理电路1440控制。

下面以量化电路1520每个时钟周期处理8个像素对应的量化数据,熵编码电路包括4个vlc,每个时钟周期对4个像素对应的量化系数进行熵编码为例,对信息生成电路1420和处理电路1440的实现方式进行更为详细的举例说明。

由于量化电路1520每个时钟周期处理8个像素对应的量化数据,因此量化电路1520每个时钟周期会向行程编码电路1510输出8个量化系数。在信息生成电路1420中会对这8个量化系数进行行程编码信息提取,然后再将这8个量化系数存入到第一缓存1410中。某些量化系数的行程编码信息一旦确认,信息生成电路1420即可将其写入到第二缓存1430中。处理电路1440可以不断检测第二缓存1430的状态,一旦第二缓存1430非空,说明有量化系数的行程编码信息得到确认,处理电路1440读取第一缓存1410和第二缓存1430中的数据,将第二缓存1430输出的行程编码信息联合第一缓存1410输出的量化系数进行一系列的处理(如对dc系数进行差分运算,计算ac系数的绝对值和符号值等),并通过查表得到待编码值的码本。然后,处理电路1440可以将处理后的数据传输至4路并行的熵编码电路1430,由熵编码电路1530对处理电路1440输出的数据进行并行处理。

图16是图15所示的编码框架下的信息生成电路1420的详细流程的示例图。应理解,图16将8个量化系数视为一组量化系数,并以组为单位对量化系数进行处理。总体上来说,图16的流程大致为:首先判断输入的一组量化系数判断是否全为dc系数。如果一组量化系数全为dc系数,则不会生成run信息(包括level-run信息或zero-run信息)。此时,可以直接将dc系数的标识信息写入到runfifo中;如果一组量化系数并非全为dc系数,则进一步判断8个量化系数中是否存在零ac系数。如果存在零ac系数,意味着之前输入的所有量化系数组的行程编码信息均可以被确定,也即之前输入的所有量化系数组的数据可以经由处理电路1440传给熵编码电路1630进行编码。

如图16所示,信息生成电路1420的处理路程包括步骤s1602至步骤s1628。

步骤s1602:接收某个分量的8个量化系数。

如图15所示,量化电路1620每个时钟周期处理8个像素对应的量化系数,因此,量化电路1620每个时钟周期向信息生成电路1420输出8个量化系数。

步骤s1604:将8个量化系数存入第一缓存中。

步骤s1606:判断8个量化系数是否均为dc系数。

如果8个量化系数并非均为dc系数,则执行步骤s1608;如果8个量化系数均为dc系数,则执行步骤s1612。

步骤s1604和步骤s1606可以并行执行,也可以按照一定的顺序先后执行,本申请实施例对此并不限定。

步骤s1608:判断是否存在零ac系数。

如果存在零ac系数,则执行步骤s1610;如果不存在零ac系数,则执行步骤s1616。

步骤s1610:判断之前的ac系数组是否有效。

如图15所示,量化电路1620每个时钟周期输入一组量化系数,每组量化系数包含8个量化系数。本申请实施例以组为单位进行判断,之前的ac系数组有效表示之前的ac系数组的level-run信息已经得到确认,可以进行后续的熵编码。

如果之前的ac系数组有效,则执行步骤s1612;如果之前的ac系数组无效,则执行步骤s1618。

步骤s1612:之前的所有量化系数组的行程编码信息得到确认。

步骤s1614:将确认的行程编码信息写入第二缓存。

步骤s1616:判断是否存在level-run信息。

如果存在level-run信息,则执行步骤s1618;如果不存在level-run信息,则执行步骤s1620。

步骤s1618:记录level-run的位置,并将之前的ac组设置为有效。

步骤s1620:更新level-run信息。

即更新level-run的计数值。

步骤s1622:判断步骤s1602输入的量化系数是否为该分量的最后一组量化系数。

如果步骤s1602输入的量化系数为该分量的最后一组量化系数,则执行步骤s1624;如果步骤s1602输入的量化系数不是该分量的最后一组量化系数,则重新执行步骤s1602,再次接收量化电路1620输入的一组新的量化系数。

步骤s1624:确认该分量的所有量化系数的行程编码信息。

步骤s1626:将行程编码信息写入第二缓存。

步骤s1628:结束该分量的量化系数的信息提取过程。

图17是图15所示的编码框架下的处理电路1440的详细流程的示例图。图17包括步骤s1702至步骤s1716。下面结合图17,对这些步骤进行详细描述。

步骤s1702:检测第二缓存的状态。

第二缓存初始状态为空闲状态。

步骤s1704:判断第二缓存是否处于空闲状态。

如果第二缓存处于空闲状态,则重新执行步骤s1702;如果第二缓存处于非空状态,则执行步骤s1706。

步骤s1706:读取第二缓存中的行程编码信息。

步骤s1708:读取第一缓存中的一组量化系数。

例如,处理电路1440可以分别向第一缓存和第二缓存发送数据读取请求,以读取缓存中的数据。

步骤s1710:处理前4个像素对应的量化系数。

步骤s1712:处理后4个像素对应的量化系数。

在图16-17所示的实施例中,一组量化系数包含与8个像素一一对应的8个量化系数。由于熵编码电路包含并行的4个vlc,因此,该熵编码电路一个时钟周期可以处理4个像素对应的量化系数。因此,在处理电路1440侧,可以将行程编码信息已经确认的8个像素对应的8个量化系数分两个时钟周期传输至熵编码电路,使得量化和熵编码之间的速率相匹配。

步骤s1714:查表得到待编码的量化系数对应的码本。

熵编码电路进行熵编码之前,需要先确定待编码的量化系数对应码本。因此,处理电路1440可以通过查表的方式确定待编码的量化系数对应的码本索引,并将该码本索引传递至熵编码电路。

步骤s1716:判断第一缓存中的下一组量化系数的行程编码信息是否确认。

如果下一组量化系数的行程编码信息得到确认,则重新执行步骤s1708;如果下一组量化系数的行程编码信息未得到确认,则重新执行步骤s1702。

上文任意实施例描述的编码装置除了包括变换电路、量化电路和熵编码电路之外,还可以包括扫描电路。变换电路可用于生成图像块的变换系数。该变换系数为二维数据。量化电路可用于对变换系数进行量化,得到量化系数。量化系数仍然为二维数据。扫描电路可用于将二维数据重新组织成一维数据序列,再进行后续的行程编码和熵编码过程。

扫描电路需要等到图像块的某个分量的所有量化系数得到之后,才可以按照预设顺序(如zigzag顺序)对该分量的所有量化系数进行扫描。换句话说,扫描电路需要等待量化电路对某个分量的所有量化系数处理完成之后,才可以开始该分量的量化系数的扫描,这样会降低编码装置的编码效率。

下面结合图18详细描述本申请实施例提供的编码装置,能够提高编码效率。

如图18所示,本申请实施例提供的编码装置1800可以包括变换电路1810,扫描电路1820,量化电路1830和熵编码电路1840。

变换电路1810可用于生成图像块的变换系数。通过变换操作,数据会从一维转换到二维。扫描电路1820可用于将变换系数从二维数据转换成一维数据序列。量化电路1830可用于对一维数据序列进行量化,生成图像块的量化系数。熵编码电路1840可用于对量化系数进行熵编码。

与传统编码方式不同,本申请实施例并非对量化系数进行扫描,而是将扫描过程提前,使其直接对二维的变换系数进行扫描,这样一来,扫描和量化过程可以紧密流水起来,从而可以提高编码装置的并行度。

可选地,扫描电路1820对图像块的一个分量的处理时间与量化电路1830对一个分量的处理时间相互重叠。处理时间相互重叠指的是扫描电路1820在扫描一个分量的像素时,量化电路1830也在处理同一分量的像素,二者并行进行。例如,扫描电路1820每处理完一个时钟周期对应的像素点,就将该时钟周期对应的像素点的数据传递至量化电路1830,由量化电路1830对其进行量化,使得扫描电路1820和量化电路1830的硬件紧密流水起来,扫描电路1820和量化电路1830的处理过程几乎可以达到完全并行的状态。当然,本申请实施例不限于此,只要二者之间的处理时间上有重叠,就可以提高整个编码装置的并行度。

此外,编码装置1800还可以包括分割电路、伪log编码电路、码流输出电路、rc电路等,关于这些电路的功能和实现形式参见前文的描述,此处不再详述。

本申请实施例还提供一种编码系统。如图19所示,编码系统1900可以编码装置1910和内存1920。编码装置1910可以是上文任意实施例描述的编码装置。内存1920包括用于存储编码装置1910输出的码流的环形存储空间。该内存例如可以是双倍速率(doubledatarate,ddr)。

如图20所示,内存空间2000中设置有环形存储空间2010。该环形存储空间2010的存储地址包括起始地址2012和末尾地址2014,码流可以从环形存储空间2010的低地址向高地址写,当达到环形存储空间2010的末尾地址2014之后,可以重新回到环形存储空间2010的起始地址2012继续写码流。

本申请实施例提供的环形存储空间可以避免编码装置1910出错时不停往内存1920中写数据而导致的系统崩溃,从而提高了系统的额鲁棒性。

随着技术的发展,图像传感器采集到的图像(如raw图)的比特深度及分辨率越来越高,导致一帧图像的尺寸越来越大。如果将图像直接写入内存中,系统的带宽开销会比较大。在相同的分辨率下,如果能在保存几乎相同的信息量的前提下,以尽量小的比特深度写入内存的话,带宽的开销会有一定的降低,业界一般的做法是将高比特深度的图像经过log变换,然后写入到内存中。log变换会将图像数据从线性数据转换为非线性数据。log变换相当于保留了暗部区域的动态范围,压缩亮部的动态范围。经过log变换之后,内存输入到编码装置的图像数据不再是线性的图像数据,对于某些要求输入的图像数据为线性数据的编码装置而言,上述实现方式会导致该类编码装置无法正常工作。

为了解决上述问题,本申请实施例提供可以对如图4所示的视频编码器的电路进行调整,添加逆log变换电路,逆log变换电路可用于获取经log变换后的图像的非线性数据,对图像的非线性数据进行逆log变化,得到图像的线性数据。该逆log变换电路可以与分割电路41位于同一电路模块中,也可以位于分割电路41之间,本申请实施例对此并不限定。

上文列举的编码装置的电路是从功能上划分的功能电路,实际上,不同功能电路可以由同一或不同硬件电路实现,本申请实施例对此并不限定。

本申请实施例提供的编码装置可以在现场可编程门阵列(fieldprogrammablegatearray,fpga)平台上实现,也可以在特定用途集成电路(applicationspecificintegratedcircuit,asic)平台上实现,本申请实施例对此并不限定。

需要说明的是,在不冲突的前提下,本申请描述的各个实施例和/或各个实施例中的技术特征可以任意的相互组合,组合之后得到的技术方案也应落入本申请的保护范围。

本申请提及的变换系数指的是变换后的系数,即经过变化操作之后得到的系数;本申请提及的量化系数指的是量化后的系数,即经过量化操作之后得到的系数。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digitalsubscriberline,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digitalvideodisc,dvd))、或者半导体介质(例如固态硬盘(solidstatedisk,ssd))等。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。

所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。

以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以所述权利要求的保护范围为准。

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