缓冲器的容量越大,那么所能够承受的码率波动也越大。问题是,太大的缓冲器会造成过大的缓冲延时,而且硬件开销上也不适宜。于是,就需要在合理大小的缓冲 器前提下,把编码器输出码流的波动控制在缓冲器所能承受的范围内:在任何时刻要尽量保证缓冲器中的数据既不“溢出”(上溢),也不能由于数据供应不足而出 现“断档”(下溢)。这就是码率控制所要完成的任务。
目标码率和量化参数
码率控制的机制,主要包括两个方面:目标码率的预分配和量化参数的决定。
在目标码率预分配方面,一种预分配方案是基于图像编码的复杂度来决定将要分配的目标比特数。但是更多采用的另一种分配方案是,在考虑图像编码复杂度的同时,结合缓冲区的占用率情况来决定最终的目标比特分配:
以帧层的比特分配为例,上式中,Tk表示为第k帧分配的目标比特数,Ck是根据图像的编码复杂度得到的比特分配,Bk是根据缓冲器占用情况得到的比特分配,λ为分配权重。
现有的码率控制算法主要是通过调整对DCT系数的量化参数大小来达到控制输出码率的目的。量化参数(QP)反映了空间细节的压缩情况,如果QP较小,大部 分的图像细节都会被保留;当QP增大时,一些图像细节会丢失,码率也会随之降低,代价是图画质量的下降。量化参数的选取与图像复杂度,实际编码产生的比特 数和缓冲区的占用情况有关。
图1:码流编码、传输、解码处理系统框图。
码率控制的算法
码率控制的算法通常包括以下三个步骤:
根据要达到的目标输出比特率,为各个层次(GOP,帧/场,宏块)分配目标比特;
根据当前图像的复杂程度,或实际编码使用的比特数决定QP的变化;
计算虚拟缓冲器的占用情况,调整目标比特;
1. GOP层的码率控制
这一层的任务是为当前GOP分配目标比特,和确定GOP的初始QP。
当前GOP的目标比特可用下式计算:
其中,Ti是分配给第i个GOP的目标比特数,vo是所要达到的目标输出比特率(信道带宽),Fr是帧率,NGOP是当前GOP包含的总帧数,Bi-1是编码当前GOP时缓冲器的空余量,α是比例系数,Bs是缓冲器大小。
第一个GOP的初始QP,用于第一个I帧的第一个MB(宏块),可以通过计算BPP(每像素比特数)并利用经验数据来决定。
其中,w和h分别为一帧图像的宽和高(以像素为单位)。
然后,根据图像分辨率的大小以及信道带宽,按照经验确定三个比较参照值L1,L2,L3。通过将BPP的值与L1,L2,L3比较,来决定初始QP的值:
if(BPP<=L1) QP_initial = a;
else if(BPP<=L2) QP_initial = b;
else if(BPP<=L3) QP_initial = c;
else QP_initial = d;
其中,SumPQP是前一个GOP中所有P帧的QP之和,NP是前一个GOP的P帧数, Ti-1,NGOP是前一个GOP最后一帧分配的目标比特, Ti,0是当前GOP首帧分配的目标比特。 2 帧层的码率控制
分配给每帧的比特数,按照I,P,B帧的复杂度,GOP中I,P,B的帧数以及缓冲区的占用情况来决定:
Gbits是分配给当前GOP的比特量,CIP表示I帧相对于P帧的复杂度,CPB表示P帧相对于B帧的复杂度, NI,NP,NB分别为GOP中I,P,B的帧数,kp根据I,P,B帧取不同值:对于I帧kp=CIP×CPB,对于P帧kp=CPB,对于B帧 kp=1。
另外,需要根据缓冲器的占用情况,对当前帧的目标比特设定两个阈值“maxbits”和“minbits”,以保证缓冲器内的数据不会发生上溢或者下溢。
当前GOP的第一个I帧的初始QP值采用该GOP的初始QP值。对于后续各帧,需要先根据过去帧的编码情况求出Δqp,然后计算当前帧的初始QP(用于第一个宏块):
其中QPave是前一帧的平均QP值。
3. 宏块层的码率控制
在帧层比特分配的基础上,给每一个宏块分配目标比特:
其中,NMB是当前帧所包含的宏块数,MADi表示当前帧的第i个宏块的MAD值(Mean Absolute Difference,平均绝对差值,反映图像的编码复杂度),MADave表示一帧图像中各个宏块的平均MAD。MAD值是在对当前图像编码完以后才能 得到的,为此,式中的MAD值可以用平均像素信息比特APIB值来代替(参看文献[3])。
一个宏块的APIB定义为:
N为宏块所包含的像素个数,Yi是宏块内某一像素的DCT系数,X是最小量化步长(H.26?标准中定义为0.625)。
很多码率控制算法的核心是率失真函数,如果把函数中的MAD用APIB来代替,就能得到反映量化参数QP与目标比特关系的表达式:
Ri是分配给第i个宏块的目标比特,Hi代表头信息、运动矢量和语法元素占用的比特量。a、b是模型参数,每编码完一个宏块后将会更新。硬件设计结构
图2:码率控制的硬件结构。本文的码率控制的硬件结构如图2所示。RC_TOP是顶层控制模块,控制各个模块协同工 作;RC_INIT由顶层控制模块启动,负责从总线接收目标比特率、帧率、GOP长度等参数信息,并依据这些参数信息为后续模块做好初始化等准备工 作;RC_GOP、RC_FRAME和RC_MB分别负责GOP、帧、宏块层的目标比特计算和分配,以及各层次(初始)量化参数的计算;DELTA_QP 模块依据当前宏块和上一个宏块的QP,可以计算出二者的差值,即一般情况下,delta_qp = current_qp-last_qp。
但是关于delat_qp的计算有例外的情况。h.26?句法协议规定,对于I 4×4的预测模式且CBP(Coded Block Pattern)值全部为零的情况,不传递delta_qp值。例如
表1中的2号宏块,其预测模式为I 4×4且CBP值全部为零,则不对其作delta_qp的计算。而第3号宏块的delta_qp值为27-25=2,并非27-26=1。
DC综合结果及结论
对硬件语言代码进行DC综合后,综合报告的部分数据如图3。从报告结果可以看出,本设计满足时序要求。
图3:硬件语言代码进行DC综合后,综合报告的部分数据。
本文从GOP、帧和宏块三个层次对目标码字进行了计算和分配,并分别对其量化参数选取初始值和进行计算。最后完成的硬件设计通过了仿真验证,DC综合结果表明满足时序要求。且本设计实现的复杂度并不高,适用于实时编码的码率控制。
转载:www.****.com