關於getLuma4x4Neighbour()函數的tip

M提供的void getLuma4x4Neighbour (int curr_mb_nr, int block_x, int block_y, int rel_x, int rel_y, PixelPos *pix)函數是一個非常簡單的函數,用於找到指定的鄰接塊座標。正因爲它簡單我們往往忽視了對它的分析,引起不必要的錯誤。
    getLuma4x4Neighbour的參數,curr_mb_nr爲當前宏塊序號,block_x,block_y爲參考塊在當前宏塊中的塊座標,rel_x, int rel_y爲目標塊相對於參考塊的像素座標,pix爲輸出座標以及相關宏塊信息。這些都不必螯述。分析代碼可以看到改函數又調用了getNeighbour()函數,對參數作了一些處理,getNeighbour()又根據幀場自適應標誌決定調用getAffNeighbour()或getNonAffNeighbour()。
    在最終的函數getNonAffNeighbour()中我們看到 
 if ((xN<0)&&(yN<0))
 。。。
 else if ((xN<0)&&((yN>=0)&&(yN 。。。
 else if (((xN>=0)&&(xN 。。。
 else if (((xN>=0)&&(xN=0)&&(yN 。。。
 else if ((xN>=maxWH)&&(yN<0))
 。。。
 else
 pix->available = 0;
    前面的5個if分別對D塊、A塊、B塊、塊內、C塊進行判斷,如果不在這5個宏塊內,就返回 pix->available = 0,所以類似這樣的函數getLuma4x4Neighbour (curr_mb_nr,0,0,18,0,pix)是不可能得到當前塊右邊的塊的,也就是說getNeighbour函數只能找到在當前塊之前編碼的塊信息,因此如果要獲取右邊和下面的塊,必須自己動手搞定。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章