encodeSlice代码中,一些VTM没有打开的宏定义的部分代码,为了阅读方便我给删除掉了。
encodeSlice函数在编码端,实现一帧中所有ctu的二进制码流的编码,其中调用coding_tree_unit函数进行一个ctu中各种数据的编码。
函数的入口参数pcPic表示函数需要编码的一帧,pcSubstreams表示需要写入的ctu编码数据流。
函数流程很简单,首先CABAC编码器初始化准备编码码流的写入,然后对每个ctu计算pos和area,调用coding_tree_unit函数进行编码。
void EncSlice::encodeSlice ( Picture* pcPic, OutputBitstream* pcSubstreams, uint32_t &numBinsCoded )
{
Slice *const pcSlice = pcPic->slices[getSliceSegmentIdx()];
const uint32_t startCtuTsAddr = pcSlice->getSliceCurStartCtuTsAddr();
const uint32_t boundingCtuTsAddr = pcSlice->getSliceCurEndCtuTsAddr(); //一帧中ctu的起始和结束tsAddr
// setup coding structure
CodingStructure& cs = *pcPic->cs; //要编码一帧的cs,其中存储了一帧中所有ctu的经过compress的信息
cs.slice = pcSlice;
// initialise entropy coder for the slice
m_CABACWriter->initCtxModels( *pcSlice ); //CABAC编码器初始化cabac参数模型
DTRACE( g_trace_ctx, D_HEADER, "=====&#