1. 程式人生 > 其它 >vcc裡面的查表示例

vcc裡面的查表示例

技術標籤:H.266

if (leftAvailable || aboveAvailable) //如果左側或者上側畫素可用時
  {
    int diff = maxLuma[0] - minLuma[0];//maxY - minY
    if (diff > 0)
    {
      int diffC = maxLuma[1] - minLuma[1];//maxC - minC
      int x = floorLog2( diff );
      static const uint8_t DivSigTable[1 << 4] = {
        // 4bit significands - 8 ( MSB is omitted )
        0,  7,  6,  5,  5,  4,  4,  3,  3,  2,  2,  1,  1,  1,  1,  0
      };
      int normDiff = (diff << 4 >> x) & 15;
      int v = DivSigTable[normDiff] | 8;
      x += normDiff != 0;
 
      int y = floorLog2( abs( diffC ) ) + 1;
      int add = 1 << y >> 1;
      a = (diffC * v + add) >> y;
      iShift = 3 + x - y;
      if ( iShift < 1 )
      {
        iShift = 1;
        a = ( (a == 0)? 0: (a < 0)? -15 : 15 );   // a=Sign(a)*15
      }
      b = minLuma[1] - ((a * minLuma[0]) >> iShift);
    }

從上面公式可以看出α計算過程中出現了除法,為了避免除法運算採用查表法計算α。同時為了減少儲存表的空間,將diff值(最大值和最小值的差值)和α使用指數形式表示。例如,diff用4位有效部分和指數近似表示。因此,對於16個有效位值,1/diff表被縮減為16個元素,如下所示:

DivTable [ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 }

這樣做的好處是既降低了計算的複雜性,又減少了儲存所需表所需的記憶體大小。

假設diff=2,查表知道x=1,normdiff=0,v=8.

小數1/2=0.5 在計算機中二進位制儲存為1000,和v相同。