应用率失真优化需要三个算法/模型
- 根据信源输入及选择的编码框架,建立合适的R-D模型(通常是R-Q、D-Q关系);
- 根据给定的码率R以及缓冲区状态,为每个编码单元分配比特并带入R-D模型求解Q,并在编码完成后更新模型参数;
- 针对给定的λ,求解最佳编码参数;
分析应用率失真优化的过程,会发现如下悖论:
- 建立的R-D模型中往往存在与图像内容相关的参数,而这部分参数需要在RDO优化后得到;
- 在比特分配后,求得相应的Qp需要使用该R-D模型,而此时图像尚未进行RDO优化,模型参数无法更新;
因此,部分码率控制模型需要进行二次编码。
本文对H.264参考编码器中采用的JVT-G012r1基础码率控制算法进行了整理,在参考已有研究和文献的基础上记录了一些自己对于公式的理解,并从中分析上述率失真优化算法1、2及其悖论如何实际求解。
参考:
- 专栏H.264 by zhanghui_cuc
- Li Z. Adaptive basic unit layer rate control for JVT
- Scalable Rate Control for MPEG-4 Video
- A novel rate control scheme for video over the internet
预备知识
基础码率控制单元(BasicUnit, BU)的定义
作用:确定码率控制的粒度
为提高码率控制的灵活性,JVT-G012r1中提出BU作为码率控制的粒度。首先给出该方案中对于BU的定义:
N u n i t = N m b p i c N m b u n i t (1) N_{unit} = \frac{N_{mbpic}}{N_{mbunit}} \tag{1} Nunit=NmbunitNmbpic(1)
其中, N u n i t N_{unit} Nunit代表BU个数, N m b p i c N_{mbpic} Nmbpic代表图像中宏块(MacroBlock,MB)总数, N m b u n i t N_{mbunit} Nmbunit代表每一BU中希望分配的MB数量。需要指出,一个BU中的MB是连续的,和片组对于宏块的划分不同。
从定义不难看出,BU的定义使得图像的码率控制可以在帧到宏块的范围间灵活选择。实际应用中,选择更大的BU,比如帧,可以活得更好的率失真性能,但也会导致较大的码率波动;而较小的BU在保证码率平稳的同时则会牺牲部分质量。
流体传输模型
作用:描述虚拟缓冲区的状态
由于实际编码其输出的比特流码率步恒定,且传输信道也可能存在速率波动,因此在编码器与解码器之间需要加入缓冲区以实现速率匹配。流体流量模型对缓冲区的描述如下:
B
c
(
n
i
,
j
+
1
)
=
m
i
n
{
m
a
x
{
0
,
B
c
(
n
i
,
j
)
+
A
(
n
i
,
j
)
−
u
(
n
i
,
j
)
F
r
}
,
B
s
}
(2.1)
B_c(n_{i,j+1}) = min\left\{ max\left\{0, B_c(n_{i,j}) + A(n_{i,j}) - \frac{u(n_{i,j})}{F_r} \right\} ,B_s \right\} \tag{2.1}
Bc(ni,j+1)=min{max{0,Bc(ni,j)+A(ni,j)−Fru(ni,j)},Bs}(2.1)
B
c
(
n
1
,
1
)
=
B
s
8
(2.2)
B_c(n_{1,1}) = \frac{B_s}{8} \tag{2.2}
Bc(n1,1)=8Bs(2.2)
B
c
(
n
i
+
1
,
0
)
=
B
c
(
n
i
,
N
G
O
P
)
(2.3)
B_c(n_{i+1,0}) = B_c(n_{i,N_{GOP}}) \tag{2.3}
Bc(ni+1,0)=Bc(ni,NGOP)(2.3)
其中:
- n i , j n_{i,j} ni,j为第i个GOP中第j帧图像
- N G O P N_{GOP} NGOP为GOP中图像总数
- B c ( n i , j ) B_c(n_{i,j}) Bc(ni,j)为编码第j帧图像后缓冲区占用的比特数
- A ( n i , j ) A(n_{i,j}) A(ni,j)为 n i , j n_{i,j} ni,j产生的比特数
- u ( n i , j ) u(n_{i,j}) u(ni,j)为编码完 n i , j n_{i,j} ni,j时刻可用的信道带宽
- F r F_r Fr为帧率
- B s B_s Bs为缓冲区上限
解释:
- 式(2.1)表明,在向假设解码器(Hypothetical Reference Decoder, HRD)中输入第j+1帧码流后,缓冲区内的数据容量由三项构成:第一项为第j帧输入后的缓冲区容量,第二项为第j帧的比特数,第三项为当前信道速率下每一帧的平均码率。
- 式(2.2)表明第一帧编码完后的缓冲区初始充盈度为缓冲区上限的1/8;
- 式(2.3)表明第i+1个GOP刚刚开始时缓冲区充盈度为第i个GOP结束时的充盈度。
二项式率失真模型
作用:建立码率R-失真D的关系
文献“A New Rate Control Scheme Using Quadratic Rate Distortion Model”指出二次R-D率失真模型如下:
R = a Q − 1 + b Q − 2 (3.1) R = aQ^{-1}+bQ^{-2} \tag{3.1} R=aQ−1+bQ−2(3.1)
在MPEG-4 VM8码率控制算法中对该模型进行改进:
R − H M A D = a Q − 1 + b Q − 2 (3.2) \frac{R-H}{MAD} = aQ^{-1}+bQ^{-2} \tag{3.2} MADR−H=aQ−1+bQ−2(3.2)
其中:
- H H H为非纹理(头信息)比特数
- M A D MAD MAD为待变换编码数据平均误差和
- a , a a, a a,a为模型参数
解释:
- 该公式直观地反应了率失真优化中存在的悖论:为当前帧编码选取Q需要得知当前图像与预测图像的MAD,而MAD在编码前无法获得。
线性MAD预测模型
作用:通过预测解决R-D模型中MAD值的选取,即悖论的解决
该模型通过前一帧中相同位置的BU实际得到的MAD值预测当前帧BU的MAD值。
M A D c b = a 1 ∗ M A D p b + a 2 (4) MAD_{cb} = a_1 * MAD_{pb} + a_2 \tag{4} MADcb=a1∗MADpb+a2(4)
其中:
- M A D c b MAD_{cb} MADcb为当前帧当前BU的MAD预测值
- M A D p b MAD_{pb} MADpb为上一帧同位置BU的MAD实际值
- a 1 , a 2 a_1, a_2 a1,a2为模型参数,初始值为1和0
码率控制方案大体流程
- 用流体传输模型和线性跟踪理论来计算当前帧的目标比特数
- 平均分配剩余的比特数给当前帧中其他没有编码的基本单元
- 通过MAD线性预测模型用前一帧相同位置处的基本单元的实际MAD值来预测当前帧的当前基本单元的MAD值
- 用二次R-D模型计算相应的QP值
- 用从步骤4得来的QP值来对当前基本单元中的每一个宏块进行RDO
层级:GOP -> 帧 -> BU
GOP级码率控制方案
该层级码率控制方案主要解决每一GOP的总可用比特数、初始QP分配。
总比特数计算
T r ( n i , 0 ) = u ( n i , 1 ) F r ∗ N G O P − ( B s 8 − B c ( n i − 1 , N G O P ) ) (5.1) T_r(n_{i,0}) = \frac{u(n_{i,1})}{F_r} * N_{GOP} - (\frac{B_s}{8} - B_c(n_{i-1,N_{GOP}})) \tag{5.1} Tr(ni,0)=Fru(ni,1)∗NGOP−(8Bs−Bc(ni−1,NGOP))(5.1)
其中:
- F r F_r Fr为帧率
- u ( n i , 1 ) u(n_{i,1}) u(ni,1)为编码完 n i , 1 n_{i,1} ni,1时刻可用的信道带宽
- N G O P N_{GOP} NGOP为GOP中图像总数
- B s B_s Bs为缓冲区上限
- B c ( n i − 1 , N G O P ) B_c(n_{i-1,N_{GOP}}) Bc(ni−1,NGOP)为编码第i-1GOP后缓冲区占用的比特数
- T r T_r Tr为该GOP中所有未编码图像剩余可用比特
解释:
- 第一项为通过信道带宽计算的GOP可用比特数
- 第二项为目标缓冲区充盈度与上一GOP实际编码完成后缓冲区充盈度的差,用于修正当前GOP总比特数
总比特数修正
在信道速率可变的情况下,需要对GOP可用比特数不断进行修正以满足缓冲区需求。
T r ( n i , j ) = T r ( n i , j − 1 ) + u ( n i , j ) − u ( n i , j − 1 ) F r ∗ ( N G O P − j ) − A ( n i , j − 1 ) (5.2) T_r(n_{i,j}) = T_r(n_{i,j-1}) + \frac{u(n_{i,j}) - u(n_{i,j-1})}{F_r} * (N_{GOP} - j) - A(n_{i,j-1}) \tag{5.2} Tr(ni,j)=Tr(ni,j−1)+Fru(ni,j)−u(ni,j−1)∗(NGOP−j)−A(ni,j−1)(5.2)
其中:
- A ( n i , j ) A(n_{i,j}) A(ni,j)为 n i , j n_{i,j} ni,j产生的比特数
解释:
- 第一项为编码j-1帧时的可用bit数
- 第二项为编码第i-1帧时刻与第i帧信道速率差值对GOP中剩余图像可用比特的修正
- 第三项为第j-1帧实际的比特数
在恒定速率信道(CBR)的情况下,5.2式简化为:
T r ( n i , j ) = T r ( n i , j − 1 ) − A ( n i , j − 1 ) (5.3) T_r(n_{i,j}) = T_r(n_{i,j-1}) - A(n_{i,j-1}) \tag{5.3} Tr(ni,j)=Tr(ni,j−1)−A(ni,j−1)(5.3)
初始QP选择
第一个GOP的初始QP为QP0,用于第一个I帧和第一个P帧。QP0决定了初始实际码率且与GOP长度有关。一般情况下,信道 带宽高使用较低QP0,反之选用较大QP0。带宽一定时,GOP长度增加15,QP0减小1。
其余GOP初始QP计算如下:
Q
P
s
t
=
S
u
m
P
Q
P
N
p
−
1
−
8
T
r
(
n
i
−
1
,
N
G
O
P
)
T
r
(
n
i
,
0
)
−
N
G
O
P
15
(5.4)
QP_{st} = \frac{Sum_{PQP}}{N_p} - 1 - \frac{8T_r(n_{i-1,N_{GOP}})}{T_r(n_{i,0})} - \frac{N_{GOP}}{15} \tag{5.4}
QPst=NpSumPQP−1−Tr(ni,0)8Tr(ni−1,NGOP)−15NGOP(5.4)
其中:
- Q P s t QP_{st} QPst为当前GOP初始QP
- S u m P Q P Sum_{PQP} SumPQP为前一GOP中全部P帧的QO之和
- N p N_p Np为上一GOP中P帧数量之和
- T r ( n i − 1 , N G O P ) T_r(n_{i-1,N_{GOP}}) Tr(ni−1,NGOP)为上一GOP编码完成后可用的剩余比特(可能为负)
- T r ( n i , 0 ) T_r(n_{i,0}) Tr(ni,0)为当前GOP可用比特
帧级码率控制方案
该层级码率控制解决GOP中的不同类型图像具体的QP选择以及模型参数更新
编码前码率控制
该阶段在帧级别计算GOP中各帧的QP
B帧QP选择
考虑到B帧不能被其它帧参考且为了节省码率,其QP会比它邻近的P帧或I帧的QP值大。同时为保持视频质量的连贯性,相邻帧QP值之差不能大于2。
记相邻I、P帧之间B帧的个数为 L L L,QP选择通过如下线性插值法得出:
Case 1:
L
=
1
L=1
L=1,即GOP结构为IBPBPBP
Q
B
1
=
{
Q
P
1
+
Q
P
2
+
2
2
Q
P
1
≠
Q
P
2
Q
P
1
+
2
o
t
h
e
r
(6.1)
QB_1 = \begin{cases} \frac{QP_1+QP_2+2}{2}& QP_1 \neq QP_2 \\QP_1+2&other \end{cases} \tag{6.1}
QB1={2QP1+QP2+2QP1+2QP1=QP2other(6.1)
Case 2:
L
>
1
L>1
L>1,即GOP结构为IBBPBBP等
Q
B
~
i
=
Q
P
1
+
α
+
m
a
x
{
m
i
n
{
Q
P
2
−
Q
P
1
L
−
1
,
2
(
i
−
1
)
}
,
−
2
(
i
−
1
)
}
(6.2)
Q\widetilde{B}_i = QP_1 + \alpha + max \left\{ min \left\{ \frac{QP_2-QP_1}{L-1}, 2(i-1) \right\}, -2(i-1) \right\} \tag{6.2}
QB
i=QP1+α+max{min{L−1QP2−QP1,2(i−1)},−2(i−1)}(6.2)
α
=
{
−
3
i
f
Q
P
2
−
Q
P
1
≤
−
2
L
−
3
−
2
i
f
Q
P
2
−
Q
P
1
=
−
2
L
−
2
−
1
i
f
Q
P
2
−
Q
P
1
=
−
2
L
−
1
0
i
f
Q
P
2
−
Q
P
1
=
−
2
L
1
i
f
Q
P
2
−
Q
P
1
=
−
2
L
+
1
2
O
t
h
e
r
C
a
s
e
(6.3)
\alpha = \begin{cases} -3 &if \quad QP_2 - QP_1 \leq -2L-3\\ -2 &if \quad QP_2 - QP_1 = -2L-2\\ -1 &if \quad QP_2 - QP_1 = -2L-1\\ 0 &if \quad QP_2 - QP_1 = -2L\\ 1 &if \quad QP_2 - QP_1 = -2L+1\\ 2 &OtherCase \end{cases} \tag{6.3}
α=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧−3−2−1012ifQP2−QP1≤−2L−3ifQP2−QP1=−2L−2ifQP2−QP1=−2L−1ifQP2−QP1=−2LifQP2−QP1=−2L+1OtherCase(6.3)
最后QB会被限制在1~51的范围内。
需要指出,QP差值<-2L+1的情况只会在GOP之间切换(变化较大)的情况下发生。
P帧码率计算
计算P帧QP需要先确定目标缓冲级别。由于在GOP层已给定了第一个P帧的QP值,所以只需要预先确定GOP中其他P帧的目标缓冲级别。
编码完第一个P帧后,设置缓冲级别为:
T
b
l
(
n
i
,
2
)
=
B
c
(
n
i
,
2
)
(7.1)
Tbl(n_{i,2}) = B_c(n_{i,2}) \tag{7.1}
Tbl(ni,2)=Bc(ni,2)(7.1)
其中:
- B c ( n i , 2 ) B_c(n_{i,2}) Bc(ni,2)为第i个GOP中第一P帧编码完成后的缓冲占用(P帧前面还有I帧,所以下标为2)
其余P帧的缓冲级别设置为:
T
b
l
(
n
i
,
j
+
1
)
=
T
b
l
(
n
i
,
j
)
−
T
b
l
(
n
i
,
2
)
−
B
s
/
8
N
p
−
1
+
w
~
p
(
n
i
,
j
)
(
L
+
1
)
w
~
p
(
n
i
,
j
)
+
w
~
b
(
n
i
,
j
)
L
∗
u
(
n
i
,
j
)
F
r
−
u
(
n
i
,
j
)
F
r
(7.2)
Tbl(n_{i,j+1}) = Tbl(n_{i,j}) - \frac{Tbl(n_{i,2}) - B_s/8}{N_p - 1} + \frac{\widetilde{w}_p(n_{i,j})(L+1)}{\widetilde{w}_p(n_{i,j})+\widetilde{w}_b(n_{i,j})L} * \frac{u(n_{i,j})}{F_r} - \frac{u(n_{i,j})}{F_r} \tag{7.2}
Tbl(ni,j+1)=Tbl(ni,j)−Np−1Tbl(ni,2)−Bs/8+w
p(ni,j)+w
b(ni,j)Lw
p(ni,j)(L+1)∗Fru(ni,j)−Fru(ni,j)(7.2)
w
~
p
(
n
i
,
j
)
=
w
p
(
n
i
,
j
)
8
+
7
∗
w
~
p
(
n
i
,
j
)
8
\widetilde{w}_p(n_{i,j}) = \frac{w_p(n_{i,j})}{8} + \frac{7*\widetilde{w}_p(n_{i,j})}{8}
w
p(ni,j)=8wp(ni,j)+87∗w
p(ni,j)
w
~
b
(
n
i
,
j
)
=
w
b
(
n
i
,
j
)
8
+
7
∗
w
~
b
(
n
i
,
j
)
8
\widetilde{w}_b(n_{i,j}) = \frac{w_b(n_{i,j})}{8} + \frac{7*\widetilde{w}_b(n_{i,j})}{8}
w
b(ni,j)=8wb(ni,j)+87∗w
b(ni,j)
w
p
(
n
i
,
j
)
=
S
p
(
n
i
,
j
)
Q
p
(
n
i
,
j
)
w_p(n_{i,j}) = S_p(n_{i,j})Q_p(n_{i,j})
wp(ni,j)=Sp(ni,j)Qp(ni,j)
w
b
(
n
i
,
j
)
=
S
b
(
n
i
,
j
)
Q
b
(
n
i
,
j
)
1.3636
w_b(n_{i,j}) = \frac{S_b(n_{i,j})Q_b(n_{i,j})}{1.3636}
wb(ni,j)=1.3636Sb(ni,j)Qb(ni,j)
其中:
- w ~ p ( n i , j ) \widetilde{w}_p(n_{i,j}) w p(ni,j)为P帧平均复杂度权重
- w ~ b ( n i , j ) \widetilde{w}_b(n_{i,j}) w b(ni,j)为B帧平均复杂度权重
- S p , S b S_p,S_b Sp,Sb为该帧编码后的比特数
- Q p , Q b Q_p,Q_b Qp,Qb为该帧的QP值
- T b l ( n i , j ) Tbl(n_{i,j}) Tbl(ni,j)为第i个GOP第j帧的目标缓冲水平
解释:
- 第一项为上一帧的目标缓冲水平
- 第二项为编码第1个I和P帧后实际缓冲水平与期望的 B s / 8 B_s/8 Bs/8之间的差值,并平均到该GOP此后的每一P帧上进行补偿
- 第三项似乎是根据复杂度权重对第四项的一个补偿?
- 第四项为第i帧在其编码完成时刻信道输出的比特数
编码完一个GOP后, T b l ( n i , N G O P ) Tbl(n_{i,N_{GOP}}) Tbl(ni,NGOP)应该接近 Bs/8。即实际的缓冲充盈度和目标缓冲级别一样,每一个GOP只用了自己的比特开销。然而,由于率失真模型和MAD预测模型并不准确,实际缓冲充盈度和目标缓冲级别之间常常有差别。因此需要对每一帧的目标比特进行微调,来减小实际缓冲充盈度和目标缓冲级别之间的差别。
微调算法如下:
首先使用线性跟踪理论,通过目标缓冲级别、帧率、可获得的信道带宽和实际的缓冲充盈度可以确定分给第i个GOP的第j帧的目标比特,这个目标bit数即为平均意义上指定一个码率时一帧该有的比特数。
f ~ ( n i , j ) = u ( n i , j ) F r + γ ( T b l ( n i , j ) − B c ( n i , j ) ) (7.3) \widetilde{f}(n_{i,j}) = \frac{u(n_{i,j})}{F_r} + \gamma(Tbl(n_{i,j}) - B_c(n_{i,j})) \tag{7.3} f (ni,j)=Fru(ni,j)+γ(Tbl(ni,j)−Bc(ni,j))(7.3)
其中, γ \gamma γ为常数,无B帧取0.75,否则取0.25。
解释:
- f ~ ( n i , j ) \widetilde{f}(n_{i,j}) f (ni,j)理解为平均意义上一个P帧的比特数,由信道速率在每帧上的平均加上目标缓冲水平与实际缓冲区占用的差值修正得到
- 较大的 γ \gamma γ值可以实现紧缓冲调节
其次,使用复杂度权重对剩余帧数、剩余比特数进行加权计算得到在当前GOP可用bit范围内该帧的目标比特数
f ^ ( n i , j ) = w p ( n i , j − 1 ) T r ( n i , j ) w p ( n i , j − 1 ) N p , r ( j − 1 ) + w b ( n i , j − 1 ) N b , r ( j − 1 ) (7.4) \hat{f}(n_{i,j}) = \frac{w_p(n_{i,j-1})T_r(n_{i,j})}{w_p(n_{i,j-1})N_{p,r}(j-1)+w_b(n_{i,j-1})N_{b,r}(j-1)} \tag{7.4} f^(ni,j)=wp(ni,j−1)Np,r(j−1)+wb(ni,j−1)Nb,r(j−1)wp(ni,j−1)Tr(ni,j)(7.4)
其中:
- T r ( n i , j ) T_r(n_{i,j}) Tr(ni,j)为该GOP中剩余比特数
- N p , r N_{p,r} Np,r为该GOP中剩余P帧数
- N b , r N_{b,r} Nb,r为该GOP中剩余B帧数
最终P帧修正过后的目标比特数为:
f
(
n
i
,
j
)
=
β
∗
f
^
(
n
i
,
j
)
+
(
1
−
β
)
∗
f
~
(
n
i
,
j
)
(7.5)
f(n_{i,j}) = \beta*\hat{f}(n_{i,j}) + (1-\beta)*\widetilde{f}(n_{i,j}) \tag{7.5}
f(ni,j)=β∗f^(ni,j)+(1−β)∗f
(ni,j)(7.5)
其中,
β
\beta
β为常数,无B帧取0.5,否则取0.9。
P帧QP选择
在得知当前编码P帧的目标码率后,先通过上述(4)式预测当前帧的MAD值,在带入(3.2)式中的二次率失真模型计算QP。
当前帧的QP相较于前一个P帧的变化幅度将被限制在±2之间,且在1,51的范围内。
编码后码率控制
该阶段在帧级别更新MAD线性预测模型参数、二次R-D模型参数、确定跳帧数
二次模型参数更新算法
参考文献[3],二次率失真模型的更新如下:
滑动窗口选择
在JVT-G012r1码率控制算法中,计算二次模型所用参数的滑动窗口长度选择算法同文献[4]中所述:
其中:
- σ(n)为第n帧的MAD参数
相比于[3]中的滑动窗口算法,在场景变化后该算法的窗口长度会逐渐增加(参考公式中的第一项+1处),以避免[3]中窗口长度剧烈增加的问题。
跳帧选择
为了确保更新后的缓冲占有率不是太高,跳帧数
N
p
o
u
t
N_{pout}
Npout设为0,当下面的缓冲条件满足时才增加:
B
c
(
n
i
,
j
+
N
p
o
u
t
)
<
B
s
∗
0.8
(7.6)
B_c(n_{i,j+N_{pout}}) < B_s * 0.8 \tag{7.6}
Bc(ni,j+Npout)<Bs∗0.8(7.6)
跳帧后缓冲充盈度按下式更新:
B
c
(
n
i
,
j
+
l
+
1
)
=
B
c
(
n
i
,
j
+
l
)
−
u
(
n
i
,
j
+
l
)
/
F
r
(7.7)
B_c(n_{i,j+l+1}) = B_c(n_{i,j+l}) - u(n_{i,j+l})/F_r \tag{7.7}
Bc(ni,j+l+1)=Bc(ni,j+l)−u(ni,j+l)/Fr(7.7)
BU级码率控制方案
I帧QP选择
I帧以帧级确定的单一QP值进行编码。
B帧QP选择
B帧以帧级确定的单一的QP值编码,QP1和QP2由相应帧中所有BU的QP的平均值替换
P帧QP选择
首先需要执行帧级的码率控制,确定该帧可用的比特数,并对每一个BU平均分配(此时还不知道每一BU的预测的MAD信息),随后再使用BU级的码率控制算法对每一BU的QP进一步细化以尽可能满足目标比特率。下面详细介绍该算法:
Step1:计算当前BU纹理比特数 R t , l R_{t,l} Rt,l:
-
Step1.1 计算当前BU目标比特数
当前BU目标比特数为 f r b / N u b f_{rb}/N_{ub} frb/Nub, f r b f_{rb} frb为当前帧剩余比特数,初始值 f ( n i , j ) f(n_{i,j}) f(ni,j); N u b N_{ub} Nub为当前帧剩余BU个数,初始值 N u n i t N_{unit} Nunit -
Step1.2 计算当前BU平均头信息比特数
m ~ h d r , l = m ~ h d r , l − 1 ( 1 − 1 / l ) + m ^ h d r , l / l (7.8) \widetilde{m}_{hdr,l} = \widetilde{m}_{hdr,l-1}(1-1/l) + \hat{m}_{hdr,l}/l \tag{7.8} m hdr,l=m hdr,l−1(1−1/l)+m^hdr,l/l(7.8)
m h d r = m ~ h d r , l l N u n i t + m h d r , l ( 1 − l N u n i t ) m_{hdr} = \widetilde{m}_{hdr,l}\frac{l}{N_{unit}} + m_{hdr,l}(1-\frac{l}{N_{unit}}) mhdr=m hdr,lNunitl+mhdr,l(1−Nunitl)其中:
- m ^ h d r , l \hat{m}_{hdr,l} m^hdr,l为当前帧第l个BU实际头信息比特数
- m h d r , l m_{hdr,l} mhdr,l为前一帧中所有BU得到的预测值
理解:
- (7.8)的两个公式实际上再利用当前已编码BU的头信息比特数和前帧的信息进行对当前BU头信息比特数的预测
-
Step1.3 计算当前BU纹理信息比特数
R t , l = f r b N u b − m h d r , l (7.9) R_{t,l} = \frac{f_{rb}}{N_{ub}} - m_{hdr,l} \tag{7.9} Rt,l=Nubfrb−mhdr,l(7.9)
Step2:使用式(4)通过前一帧相同位置的BU预测当前BU的MAD值
Step3:使用上述计算的纹理比特数代入式(3.2)计算当前BU的QP,有3种情况:
-
Case1:当前帧第一个BU
Q c b = Q a p f (7.10.1) Q_{cb} = Q_{apf} \tag{7.10.1} Qcb=Qapf(7.10.1)
其中: Q c b Q_{cb} Qcb为当前BU选用的Qp值, Q a p f Q_{apf} Qapf为前一帧所有BU的平均QP值 -
Case2: f r b < 0 f_{rb} < 0 frb<0,即可用比特数小于0:
此时增大QP:
Q c b ^ = Q p b + D Q u a n t (7.10.2) \hat{Q_{cb}} = Q_{pb} + DQuant \tag{7.10.2} Qcb^=Qpb+DQuant(7.10.2)
其中:DQuant再BU总数大于8时取1,否则取2
为保证质量连续性,需进一步限制QP:
Q c b = m a x { 1 , Q a p f − Δ , m i n { 51 , Q a p f + Δ } } (7.10.3) Q_{cb} = max \left\{1, Q_{apf}-\varDelta, min\left\{ 51,Q_{apf}+\varDelta \right\} \right\} \tag{7.10.3} Qcb=max{1,Qapf−Δ,min{51,Qapf+Δ}}(7.10.3)
其中,Δ在一个BU中MB数量小于一行MB数量时取3,否则取6 -
Case3:其它情况
Q ~ c b = m a x { Q p b − D Q u a n t , m i n { Q c b ^ , Q p b + D Q u a n t } } (7.10.4) \widetilde{Q}_{cb} = max \left\{Q_{pb}-DQuant, min\left\{ \hat{Q_{cb}},Q_{pb}+DQuant \right\} \right\} \tag{7.10.4} Q cb=max{Qpb−DQuant,min{Qcb^,Qpb+DQuant}}(7.10.4)
Q c b = m a x { 1 , Q a p f − Δ , m i n { 51 , Q a p f + Δ , Q ~ c b } } (7.10.5) Q_{cb} = max \left\{1, Q_{apf}-\varDelta, min\left\{ 51,Q_{apf}+\varDelta,\widetilde{Q}_{cb} \right\} \right\} \tag{7.10.5} Qcb=max{1,Qapf−Δ,min{51,Qapf+Δ,Q cb}}(7.10.5)
Step4:对当前基本单元的所有宏块使用选定的QP进行RDO
Step5:更新当前帧的剩余比特数和没有编码的基本单元的个数,循环编码
Step6:更新Qapf
解释:
- BU级码率控制算法实际上细化的是每一个BU的头信息比特数和MAD预测模型的预测粒度