| JM86編碼器的一個(gè)主體框架: Main()——>encode_one_frame——>frame_picture——>code_a_picture——>encode_one_slice——>encode_one_macroblock Encode_one_macroblock()幀內部分講解: if (input->rdopt) //hainei_12_19_率失真 { int mb_available_up; int mb_available_left; int mb_available_up_left;
min_rdcost = max_rdcost;
// precompute all new chroma intra prediction modes //++對色度進(jìn)行幀內預測,(并求出最優(yōu)模式hainei) IntraChromaPrediction8x8(&mb_available_up, &mb_available_left, &mb_available_up_left);
//++分別在四種色度模式下進(jìn)行RDO計算,如果是inter模式,因為色度預測模式與SSD計算 //++無(wú)關(guān),因此只需要計算一次(利用currMB->c_ipred_mode == DC_PRED_8條件限制來(lái)實(shí)現) for (currMB->c_ipred_mode=DC_PRED_8; currMB->c_ipred_mode<=PLANE_8; currMB->c_ipred_mode++) { //hainei_09_12_19_intra模式共9種預測模式
// bypass if c_ipred_mode is not allowed if ((currMB->c_ipred_mode==VERT_PRED_8 && !mb_available_up) || (currMB->c_ipred_mode==HOR_PRED_8 && !mb_available_left) || (currMB->c_ipred_mode==PLANE_8 && (!mb_available_left || !mb_available_up || !mb_available_up_left))) continue; //===== GET BEST MACROBLOCK MODE ===== for (ctr16x16=0, index=0; index<7; index++) { mode = mb_mode_table[index];
//--- for INTER16x16 check all prediction directions --- if (mode==1 && img->type==B_SLICE) { best8x8pdir[1][0] = best8x8pdir[1][1] = best8x8pdir[1][2] = best8x8pdir[1][3] = ctr16x16; if (ctr16x16 < 2) index--; ctr16x16++; }
img->NoResidueDirect = 0;
if (valid[mode]) { // bypass if c_ipred_mode not used //++設置當前宏塊類(lèi)型以及其中每個(gè)8*8塊的分割方式和預測方向,每個(gè)4*4塊的參考幀索引 //++該函數在下面的RDCost_for_macroblocks函數內再次調用,進(jìn)行了重復操作 SetModesAndRefframeForBlocks (mode); if (currMB->c_ipred_mode == DC_PRED_8 || //++利用這個(gè)條件限制來(lái)實(shí)現inter模式時(shí)只計算一次RDO (IS_INTRA(currMB) )) { if (RDCost_for_macroblocks (lambda_mode, mode, &min_rdcost)) //++幀內模式時(shí)亮度存在重復計算情況:因為色度預測模式與亮度預測模式無(wú)關(guān),所以在該色度模 { //++式循環(huán)中每次計算得到的intra16*16和intra4*4宏塊類(lèi)型的最佳亮度模式都是完全相同的 //Rate control if(mode == P8x8) { for (i=0; i<16; i++) for(j=0; j<16; j++) diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - mpr8x8[j][i]; }else { for (i=0; i<16; i++) for(j=0; j<16; j++) diffy[j][i] = imgY_org[img->opix_y+j][img->opix_x+i] - pred[j][i]; }
store_macroblock_parameters(mode); //hainei_09_12_20_存儲相關(guān)編碼信息 }//hainei_10_01_23 if (RDCost_for_macroblocks (lambda_mode, mode, &min_rdcost)) }// hainei_10_01_23 if (currMB->c_ipred_mode == DC_PRED_8 }//hainei_10_01_23 if (valid[mode])
…… set_stored_macroblock_parameters(); //在這里取出store_macroblock_paramepers()中存儲中數據 在RDCost_for_macroblocks求取最優(yōu)模式,如果其返回的rdcost小于之前的min-rdcost,則進(jìn)行最優(yōu)模式的更新。執行store_macroblock_parameters將當前的模式信息存儲起來(lái),因為執行下一模式進(jìn)入RDCost_for_macroblocks后會(huì )將當前模式的一些數據覆蓋掉,比如img->cofAC等等。因此要將其保存起來(lái)。之后會(huì )在store_macroblock_parameters恢復。
|
聯(lián)系客服