HEVC函数分析之TComPattern::fillReferenceSamples()

来源:互联网 发布:电视盒子破解软件 编辑:程序博客网 时间:2024/05/17 04:15

这个函数完全没有难度,参考8.4.4.2.2。第一次看这个代码时感觉很多变量没搞懂啥意思,其实思想很简单。顺便吐槽一下,这个代码写的。。。。shit,传入参数10几个。。。很简单的思路写的代码很不容易读。

1 若参考点都不可用,直接用iDCValue = 1 << (bitDepth - 1)赋值给所有的参考点

2 若参考点都可用,则将对应的数据赋给参考点

3 若参考点部分可用,先赋值可用的对应数据,

此时若左下不可用,则从左下到右上依次扫描,直到找到第一个可用的数据(加入此时扫描到第K个),将其赋值给前面0到K-1个所有没有被赋值的数据。然后从K+1按照左下,左,左上,上,右上的顺序,若扫描到某个不可用时,用其前面最近的那个可用的数据填充。(即在竖直方向上用下面最近的一个可用数据填充,在水平方向上用最近的左面可用数据填充)

敬请参考:http://blog.csdn.net/hevc_cjl/article/details/8175721


Void TComPattern::fillReferenceSamples(Int bitDepth, Pel* piRoiOrigin, Int* piAdiTemp, Bool* bNeighborFlags, Int iNumIntraNeighbor, Int iUnitSize, Int iNumUnitsInCu, Int iTotalUnits, UInt uiCuWidth, UInt uiCuHeight, UInt uiWidth,UInt uiHeight, Int iPicStride, Bool bLMmode ){  Pel* piRoiTemp;  Int  i, j;  Int  iDCValue = 1 << (bitDepth - 1);  if (iNumIntraNeighbor == 0)  {    // Fill border with DC value    for (i=0; i<uiWidth; i++)    {      piAdiTemp[i] = iDCValue;    }    for (i=1; i<uiHeight; i++)    {      piAdiTemp[i*uiWidth] = iDCValue;    }  }  else if (iNumIntraNeighbor == iTotalUnits)  {    // Fill top-left border with rec. samples    piRoiTemp = piRoiOrigin - iPicStride - 1;    piAdiTemp[0] = piRoiTemp[0];    // Fill left border with rec. samples    piRoiTemp = piRoiOrigin - 1;    if (bLMmode)    {      piRoiTemp --; // move to the second left column    }    for (i=0; i<uiCuHeight; i++)    {      piAdiTemp[(1+i)*uiWidth] = piRoiTemp[0];      piRoiTemp += iPicStride;    }    // Fill below left border with rec. samples    for (i=0; i<uiCuHeight; i++)    {      piAdiTemp[(1+uiCuHeight+i)*uiWidth] = piRoiTemp[0];      piRoiTemp += iPicStride;    }    // Fill top border with rec. samples    piRoiTemp = piRoiOrigin - iPicStride;    for (i=0; i<uiCuWidth; i++)    {      piAdiTemp[1+i] = piRoiTemp[i];    }        // Fill top right border with rec. samples    piRoiTemp = piRoiOrigin - iPicStride + uiCuWidth;    for (i=0; i<uiCuWidth; i++)    {      piAdiTemp[1+uiCuWidth+i] = piRoiTemp[i];    }  }  else // reference samples are partially available  {    Int  iNumUnits2 = iNumUnitsInCu<<1;    Int  iTotalSamples = iTotalUnits*iUnitSize;    Pel  piAdiLine[5 * MAX_CU_SIZE];    Pel  *piAdiLineTemp;     Bool *pbNeighborFlags;    Int  iNext, iCurr;    Pel  piRef = 0;    // Initialize    for (i=0; i<iTotalSamples; i++)    {      piAdiLine[i] = iDCValue;    }        // Fill top-left sample    piRoiTemp = piRoiOrigin - iPicStride - 1;    piAdiLineTemp = piAdiLine + (iNumUnits2*iUnitSize);    pbNeighborFlags = bNeighborFlags + iNumUnits2;    if (*pbNeighborFlags)    {      piAdiLineTemp[0] = piRoiTemp[0];      for (i=1; i<iUnitSize; i++)      {        piAdiLineTemp[i] = piAdiLineTemp[0];      }    }    // Fill left & below-left samples    piRoiTemp += iPicStride;    if (bLMmode)    {      piRoiTemp --; // move the second left column    }    piAdiLineTemp--;    pbNeighborFlags--;    for (j=0; j<iNumUnits2; j++)    {      if (*pbNeighborFlags)      {        for (i=0; i<iUnitSize; i++)        {          piAdiLineTemp[-i] = piRoiTemp[i*iPicStride];        }      }      piRoiTemp += iUnitSize*iPicStride;      piAdiLineTemp -= iUnitSize;      pbNeighborFlags--;    }    // Fill above & above-right samples    piRoiTemp = piRoiOrigin - iPicStride;    piAdiLineTemp = piAdiLine + ((iNumUnits2+1)*iUnitSize);    pbNeighborFlags = bNeighborFlags + iNumUnits2 + 1;    for (j=0; j<iNumUnits2; j++)    {      if (*pbNeighborFlags)      {        for (i=0; i<iUnitSize; i++)        {          piAdiLineTemp[i] = piRoiTemp[i];        }      }      piRoiTemp += iUnitSize;      piAdiLineTemp += iUnitSize;      pbNeighborFlags++;    }    // Pad reference samples when necessary    iCurr = 0;    iNext = 1;    piAdiLineTemp = piAdiLine;    while (iCurr < iTotalUnits)    {      if (!bNeighborFlags[iCurr])      {        if(iCurr == 0)        {          while (iNext < iTotalUnits && !bNeighborFlags[iNext])          {            iNext++;          }          piRef = piAdiLine[iNext*iUnitSize];          // Pad unavailable samples with new value          while (iCurr < iNext)          {            for (i=0; i<iUnitSize; i++)            {              piAdiLineTemp[i] = piRef;            }            piAdiLineTemp += iUnitSize;            iCurr++;          }        }        else        {          piRef = piAdiLine[iCurr*iUnitSize-1];          for (i=0; i<iUnitSize; i++)          {            piAdiLineTemp[i] = piRef;          }          piAdiLineTemp += iUnitSize;          iCurr++;        }      }      else      {        piAdiLineTemp += iUnitSize;        iCurr++;      }    }    // Copy processed samples    piAdiLineTemp = piAdiLine + uiHeight + iUnitSize - 2;    for (i=0; i<uiWidth; i++)    {      piAdiTemp[i] = piAdiLineTemp[i];    }    piAdiLineTemp = piAdiLine + uiHeight - 1;    for (i=1; i<uiHeight; i++)    {      piAdiTemp[i*uiWidth] = piAdiLineTemp[-i];    }  }}

请指教:1729048547

原创粉丝点击