简介
背景:
HEVC为了提高屏幕内容编码的效率,采用了TSM(Transform Skip Mode)技术。研究表明,由于屏幕视频内容的各项异性特征,对于文本、图形、色调单一的背景等区域,如果不做频域变换,而直接对预测残差编码,效果会更好。
原理:
在人造序列(如动画片、游戏视频等)中,图像呈平缓区域无变化、边界区域剧烈变化的趋势,预测之后的残差与 自然图像有明显的区别。这些残差数量较少,但值很大。经过变换,这些残差会形成大量的高频信息,导致出现大量冗余。transform skip技术在编码端决定是否进行变换,在上述现象发生时不进行变换,从而使得人造序列的压缩率得到了极大地提升。
X265中实现
帧间4x4以及帧内的NxN(也是4x4的块),如果开启TransformSkip的开关并且使用transform时的cbf不为0,则亮度以及色度块都会进行判断,即将使用变换与RDO-cost与不使用变换的RDO-cost做比较,最终选择最优的模式。
Transform Skip虽然是跳过变换模块,但是仍然要对残差进行处理,再进行量化的操作。
处理的代码如下:
void cpy2Dto1D_shl(int16_t* dst, const int16_t* src, intptr_t srcStride, int shift)
{
X265_CHECK(((intptr_t)dst & 15) == 0, "dst alignment error\n");
X265_CHECK((((intptr_t)src | (srcStride * sizeof(*src))) & 15) == 0 || size == 4, "src alignment error\n");
X265_CHECK(shift >= 0, "invalid shift\n");
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
dst[j] = src[j] << shift;
src += srcStride;
dst += size;
}
}
同理,在执行完反量化后,虽然不需要执行反变换,但是仍需要对数据做处理后才能还原出残差值,处理代码如下:
void cpy1Dto2D_shr(int16_t* dst, const int16_t* src, intptr_t dstStride, int shift)
{
X265_CHECK((((intptr_t)dst | (dstStride * sizeof(*dst))) & 15) == 0 || size == 4, "dst alignment error\n");
X265_CHECK(((intptr_t)src & 15) == 0, "src alignment error\n");
X265_CHECK(shift > 0, "invalid shift\n");
int16_t round = 1 << (shift - 1);
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
dst[j] = (src[j] + round) >> shift;
src += size;
dst += dstStride;
}
}