macroblock.c中的SetMotionVectorPredictor()

參考軟件JM95,ldecode
macroblock.c中的SetMotionVectorPredictor()

pmv:將要獲得的預測向量.
ref_frame:當前參考幀序號,refIdxLX
rFrameL:相鄰塊A的參考幀序號,即標準中的refIdxLXA
rFrameU:refIdxLXB
rFrameUR:refIdxLXC
refPic:當前編碼幀每個4X4子塊的參考幀索引.
tmp_mv:當前編碼幀每個4X4子塊的運動MV包括X,Y兩個方向.
(已經運動估計過的的子塊,當前編碼塊相鄰的A,B,C,D子塊都是已經運動估計了,所以refPic,tmp_mv可以用來參考)
ref_frame:參考幀索引號,不是frame_num,也不是POC號,是位於list中的序號.
block_x:X方向的座標
block_y:Y方向的座標
blockshape_x:該子塊X方向的尺寸,MbPartWidth,
blockshape_y:該子塊Y方向的尺寸  MbPartHeight
mb_x,mb_y=4*block_x(block_y)=標準中的x+xS.
mb_nr=currMbAddr
rel_x=xD
block_x=標準中的(x+xS)/4?
blockshape_x=標準中的predPartWidth
getluma4x4Neighbour()的輸出都等於GetNeighbour輸出的1/4,xW/4,yW/4

先調用getluma4x4neighbour來算出block_a,block_b,block_c,block_d的參數(包括有效性、地址、xW、yW、pos_x、pos_y)

判斷block_c在哪幾種情況下無效:(mb_x,mb_y是xN點宏塊內的座標?)
1.16×8時,如果xN,yN在no.1宏塊,那麼block_c無效(16*8時下面的那個宏塊,那麼沒有C塊)
2.mb_x=0,blcokshape_x=8,mb_y!=8,mb_y>0(不是0宏塊)時,c也無效。(即8×8的第2宏塊?)
3.mb_x=8,blockshape_x=8,mb_y!=0,(即8×8的3號宏塊),C無效。

如果C無效,用D的數據替代C。
mvPredType=0;(0:mvp,1:只用A,2只用B,3只用C)
1.如果不是mbaff:rFrameL(左)=refPic中a宏塊的pos_x,pos_y指向點值,rFrameU(上)取出b宏塊點的值,rFrameUR(右上)取出c宏塊點的值。
2.如果是mbaff:
a)currMb是場:那麼rFrameL在A爲場時取block_x,block_y指向的值,爲幀時爲refIdx值乘以2,rFrameU,UR類似
b)currMb是幀,在A爲場時refIdx除以2,爲幀時取block_x,block_y指向的值。

只有一個相鄰塊的參考幀序號和當前參考幀序號相同的情況下:
rFrameL == ref_frame(表示A參考幀序號 = 當前參考幀序號)
如果當前參考幀只參考的和A相同的參考幀,那麼mvPredType=1,如果只同B的,那麼=2,如果只同C的,那麼=3;

以下同標準P121
1)8×16,第0個宏塊,且A參考的同currMb參考的,那麼mvPredType=1
2)8×16,第1個宏塊,且C參考的同currMb參考的,那麼mvPredType=3;
3)16×8,第0個宏塊,且B參考同currMb參考的,那麼mvPredType=2
4)16×8,第1個宏塊,且A參考同currMb參考的,那麼mvPredType=1;

hv爲參數做0、1(兩次循環)(是否0爲x,1爲y)
1)hv=0:mv_a,mv_b, mv_c都取temp_mv[0]
2)hv=1:
a)如果不是mbaff:mv_a,mv_b, mv_c都取temp_mv[1]。
b)如果是mbaff:
i.currMb是場:A爲場,mv_a=tmp_mv[1],A爲幀,mv_a=tmp_mv[1]/2,B,C類似。
ii.currMb是幀:A爲場,mv_a=tmp_mv[1]×2,A爲幀,mv_a=tmp_mv[1]

根據mvPredType不同採取不同的預測方法:
1)mvpred_median模式:如果b和c都無效,那麼pred_vec=mv_a;否則pred_vec=mv_a,mv_b,mv_c的中間的值。
2)mvpred_L模式:pred_vec=mv_a
3)mvpred_U模式:pred_vec=mv_b;
4)mvpred_UR模式:pred_vec=mv_c;

hv=0,pmv_x=pred_vec;
hv=1,pmv_y=pred_vec;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章