H.264avs解碼

讀入配置文件中的信息
打開文件初始化   InputStream pIRABS;
NextStartCode()找到是(001)的起始碼,這個過程能將stuffing bits 去掉,同時測試buffer的充滿情況
getoneunit()將兩個起始碼中間的bits流拿出來然後將頭信息讀出來
mv[2][2][2][2]    猜測前後向 4個宏塊 x y座標

direction currMB->b8pdir[k]==2    -1沒有運動矢量   0前向 1後向 2雙向   direction
IS_INTRA(currMB) == i8×8 i16×16
IS_DIRECT (currMB)==skip?????
currMB->b8mode[k] ==0是direct的??
IS_P8*8 是幀內?
currMB->mb_type是整個宏塊的信息
currMB->b8mode[k]是每個宏塊的mode
if(refFrArr[j4][i4] == -1) // next P is intra mode   等於-1是intramode

不同的模式不同的初始化模式

mbmode==-1   i宏塊
mbmode==1    p宏塊
mbmode==2 雙向
遊程編碼的宏塊的個數
#define P8x8     8

mb_type控制是16×16還是8×8等
mv_type控制是雙向還是後向等

則mvFw_x = -(((16384/BlockDistanceRef)?(1-mvRef_x? BlockDistanceFw)-1)>>14)
   img->fw_mv[i4+BLOCK_SIZE][j4][ii] =   -(((16384/iTRp)*(1-iTRb*img->mv[img->block_x+i+4][img->block_y+j][0])-1)>>14);

if (IS_DIRECT (currMB) && img->cod_counter >= 0)
    int i, j, iii, jjj;
    currMB->cbp = 0;
read_one_macroblock:
I幀:讀取一個宏塊的係數
decode_macroblock:
I幀:幀內預測值的獲得   反DCT變換   將值寫到輸出的矩陣當中

img->ipredmode[img->width/B8_SIZE +2 ][ vertical_size/B8_SIZE +2]
currse->grad 是指數哥倫布編碼的K值
refFrArr[img->8width][img->8height]   //參考索引值的存放
mref是將最後的參考幀傳入參考幀的內插在這個函數鎮南關
ref_frm[0] ,ref_frm[1]   是前向的兩個pi幀

ref_frm[0] = reference_frame[0]
ref_frm[1] = reference_frame[1];
current_frame = reference_frame[2]; //這塊應該有用的

解碼當中有在p幀當中有***ref_frm[2]    ref_frm[0]是最近的一幀中的所有的YUV信息
B幀當中有 ***f_ref_frm[2]   ***b_ref_frm[2]   來存放前後參考幀中的YUV值
P幀中的**mref_frm[2]存放的是參考的y分量的值   **mref_frm[2][2]存放的是兩個UV的分量
B幀當中有**mref_fref_frm[2]   **mref_bref_frm[2] 存放的是參考的y分量
**mcef_fref_frm[2][2],**mcef_bref_frm[2][2]存放的是參考分量的uv分量

reference_field是場編碼的時候用的
**mref_fld[4]爲存放的場編碼的時候用到的四個參考場
mref mcef是場模式下的存放結構

同過傳指針來避免值的重複拷貝是一種好的方法

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