HEVC中的QG和delta QP

2021年6月17日 / 39次阅读 / Last Modified 2021年6月17日
图像处理

HEVC中,对frame的划分,除了CTU,CU,TU和PU这些之外,还有一个QG,Quantization Group。它的作用是用来包含delta QP值。

如果pps中的cu_qp_delta_enabled_flag被置位,想到与delta QP功能的使能,在bitstream中,紧接着这个置位的bit,是diff_cu_qp_delta_depth,它用来确定QG的log2大小(标准中只计算Log2MinCuQpDeltaSize这个量,它是个最小值)。QG的大小一定大于或等于最小CU的大小!

另一个HEVC标准的规定是,delta QP只在有non-zero transform coefficients的CU时传输。

  • 如果QG小于CU的size,CU中包含多个QG,此时,如果此CU的cbf被置位,即存在non-zero transform coefficients,delta QP会被传输,多个QG共享此delta QP;如果这个大CU没有cbf,对应的多个QG就都没有delta QP。(这个说成共享,我觉得也可以理解为,此时QG的大小与CU相同,因为标准中只有确定了一个QG的最小值,不过这个细节没有在HM代码中去确认?)
  • 如果QG等于CU的size,跟上一条基本一样。
  • 如果QG小于CU的size,此时QG内包含多个CU,delta QP只在第一个cbf被置位的CU时传输。存在这种可能性,QG中包含的CU全部都没有cbf置位,此时delta QP不会被传输。

delta QP要能够被使用,还需要一个QP predictor值。这个值通过临近(left和above)的QG对应QpY,配合解出来的delta QP计算得到。QpY值用来计算最终的qp值,QpY值除了通过left和above的QG对应的QpY计算,还通过一个previous值计算,previous的初始为slice QP。有了初始,就可以一层层递归迭代计算每一个QG的QpY值。这部分太绕,对应标准文档的8.6部分。

上图QG的的left和above概念,不能跨CTU。(QG最大就跟CTU一样大)

HEVC的delta QP在QG level,对应的AVC在MB层面。

不管怎样,最后得到当前CU对应的QpY,然后就简单了!

delta QP提供了在一个slice中,不同区域使用不同QP的可能性,比如rate control就会用到这个机制。

如果不开启cu_qp_delta_enabled_flag,QpY的值,无论怎么计算,就等于slice QP。此时,QG的大小就是CTU的大小!cu_qp_delta_enabled_flag开关在pps中,因此有可能在一个CVS中,部分frame打开了,部分frame没有打开。

一旦CU的QpY确定后,CU中的TU共享!不过,只有在第1个有cbf的TU时,才能确定这个值。好绕。。。

-- EOF --

本文链接:https://www.pynote.net/archives/3729

留言区

您的电子邮箱地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top