相信会有不少人对如何确定CU最终的划分有所困惑(包括我在内,刚开始接触时也不知道该怎么做),我觉得很大的一个原因就是CU是递归划分的,这就导致在寻找确定最佳分割位置时比较困难。
其实,解决问题的办法说难也不难,关键在于思路的转换,既然对于xCompressCU中是如何保存划分模式的觉得难以理解,何不跳出这个小圈子寻找新的方法呢?
我们可以从解码器的角度来考虑,因为最终编码后的码流是要经过解码器解码的,解码器事先也是不知道CU到底最终是如何划分的。因此,可以推断,编码器必然会保存下这个信息,至少是提示信息。不妨参考encodeCU这个函数的实现,因为它是最终将信息编码成码流的函数。该函数调用的是xEncodeCU来完成实际工作,截取它当中其中一段对我们有用的代码:
// We need to split, so don't try these modes.
if(!bSliceStart&&( uiRPelX < pcSlice->getSPS()->getPicWidthInLumaSamples() ) && ( uiBPelY < pcSlice->getSPS()->getPicHeightInLumaSamples() ) )
{
m_pcEntropyCoder->encodeSplitFlag( pcC