只简单写了几个最重要的几个函数,调用层次关系为1-->2-->3-->4-->5-->6-->7-->8-->9-->10-->11,其中最重要的解码函数是xDecompressCU,在此函数完成图像的解码。
1.mian()
{
cTAppDecTop.decode();
}
2.Void TAppDecTop::decode()
{
m_cTDecTop.decode();
}
3.Bool TDecTop::decode()
{
xDecodeSlice();
}
4.Bool TDecTop::xDecodeSlice()
{
m_cGopDecoder.decompressSlice();
}
5.Void TDecGop::decompressSlice
{
m_pcSliceDecoder->decompressSlice();
}
6.Void TDecSlice::decompressSlice()
{
for( UInt ctuTsAddr = startCtuTsAddr; !isLastCtuOfSliceSegment && ctuTsAddr < numCtusInFrame; ctuTsAddr++)
{ //循环48次,和编码的时候一样,decode和decompress的顺序和compress和encode的顺序相反;
m_pcCuDecoder->decodeCtu ();
m_pcCuDecoder->decompressCtu ();
}
}
7.Void TDecCu::decompressCtu()
{
xDecompressCU();
if (pCtu->getSlice()->isIntra())
{
xDecompressCU();
}
}
8.Void TDecCu::xDecompressCU()
{
for ( UInt uiPartIdx = 0; uiPartIdx < 4; uiPartIdx++ )//四叉树递归
{
xDecompressCU();
}
if (pCtu->getBTSplitModeForBTDepth(uiAbsPartIdx, uiBTDepth)==1)
{
for ( UInt uiPartUnitIdx = 0; uiPartUnitIdx < 2; uiPartUnitIdx++ )//二叉树水平递归
{
xDecompressCU();
}
}
else if (pCtu->getBTSplitModeForBTDepth(uiAbsPartIdx, uiBTDepth)==2)//二叉树垂直递归
{
for ( UInt uiPartUnitIdx = 0; uiPartUnitIdx < 2; uiPartUnitIdx++ )
{
xDecompressCU( pCtu, uiAbsPartIdx, uiDepth, uiWidth>>1, uiHeight );
}
}
switch( m_pppcCU[uiWidthIdx][uiHeightIdx]->getPredictionMode(0) )//根据对应的预测模式重建;
{
case MODE_INTER:
xDeriveCUMV( pCtu , uiAbsPartIdx , uiDepth );
xReconInter( m_pppcCU[uiWidthIdx][uiHeightIdx], uiDepth );
case MODE_INTRA:
xReconIntraQT( m_pppcCU[uiWidthIdx][uiHeightIdx], uiDepth );
}
}
9.TDecCu::xReconIntraQT()
{
do
{
xIntraRecQT();
}while();
}
10.TDecCu::xIntraRecQT()
{
xIntraRecBlk();
}
11.TDecCu::xIntraRecBlk()
{
initIntraPatternChType(); //初始化可用的pattern;
predIntraAng(); //计算预测值;
m_pcTrQuant->invTransformNxN(); //反变换和反量化;
pReco [ uiX ] = ClipA(pPred[ uiX ] + pResi[ uiX ], compID); //重建;
}