vcc裡面的查表示例
阿新 • • 發佈:2021-01-13
技術標籤: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相同。