|
回复 52# GZboy 的帖子
我想在这里需要理清一下DCT、CABAC、trellis三者的关系。
DCT是一个转换动作,理论上它是不会对任何资料构成变化的,只是改变了表示的方式而已,但是为了达到压缩额度效果,就需要作量化(quantization)处理,也是产生失真的原因。
例如有一对数据,经过DCT后,就会产生100 3 2 10 5 7......这样的数字,你会发现这些数字都很小,而quantization在这里就是要把表示数字的位数弄得更小,例如除以3。
DCT的好处是数据经过它的处理后,会变成一个frequency domain的东西了——频率越高的地方,即使有些不一样,会造成的影响也会越小,这就意味着频率越高的部分,你能quantization得越多,表示该数字的位数越少。
在视频压缩中时常会出现的问题是:必须想方设法达到某个码率(bitrate),这样你就不可能只用一个固定的quantization数值,而是需要若干个可以调整的quantization。
嗯,这个时候就大都会采用一个固定的quantization matrix,然后把这个quantization matrix的值乘以一个固定的因数(factor),利用改变这个factor来进行调整。
视频画面复杂度低,理论上需要存放的数据越少亚,这时候使用一个小的factor,就可以达到丢失较少数据,达到较高的品质(quality)。
如果画面复杂度高,就需要存放较多的数据了,这时候就需要调大factor,避免超出bitrate的范围。
现在的问题是,做好DCT后,你怎么才能知道factor需要设置成多少而又刚好可以落在bitrate的范围内。
当然,理论上你可以尝试逐个逐个尝试每个可能的factor,但是这样会很慢,效率很低亚。
这时候就需要一个方法,从"DCT的结果",去[估计]factor应该设置成多少,trellis就是这样的办法。
打了这么多字...简而言之,trellis,其实是CABAC模块中,对DCT结果进行估计 factor应该设置为多少的东西,而不直接属于在 DCT 阶段的东西。
最后补充一下前面"DCT"的,因为h264的transformation其实根本不是用DCT,而是一个基于整数的transformation,DCT的系数都是小数——无限位数的小数,这是相当麻烦的事情。因为往往会因为不同的执行方法产生的精度不一,造成解码的结果和原先的有些微出入,为了避免这个问题H264改用了一个所有系数都是整数的transformation,确保编码器、解码器都是同样的结果。 |
|