📄 mv-search.c
字号:
best_inter_sad = FastFullIntegerSearch (mv_mul, ip0, ip1, curr_search_range, refindex, blocktype, mb_x, mb_y, ¢er_h2, ¢er_v2, pic_pix_x, pic_pix_y, lambda);#endif // _FAST_FULL_ME_ // Adjust center to 1/4 pel positions center_h2 *=4; center_v2 *=4; if ((pic4_pix_x + center_h2 > 1) && (pic4_pix_y + center_v2 > 1) && (pic4_pix_x + center_h2 < 4*(img->width - blockshape_x + 1) - 2) && (pic4_pix_y + center_v2 < 4*(img->height - blockshape_y + 1) - 2) ) PelY_14 = FastPelY_14; else PelY_14 = UMVPelY_14; // 1/2 pixel search. In this version the search is over 9 vector positions. best_inter_sad = HalfPelSearch (pic4_pix_x, pic4_pix_y, mv_mul, blockshape_x, blockshape_y, &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2, ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x, block_y, ref_frame, pic_block_x, pic_block_y, lambda); // 1/4 pixel search. if ((pic4_pix_x + s_pos_x2 > 0) && (pic4_pix_y + s_pos_y2 > 0) && (pic4_pix_x + s_pos_x2 < 4*(img->width - blockshape_x + 1) - 1) && (pic4_pix_y + s_pos_y2 < 4*(img->height - blockshape_y + 1) - 1) ) PelY_14 = FastPelY_14; else PelY_14 = UMVPelY_14; best_inter_sad = QuarterPelSearch (pic4_pix_x, pic4_pix_y, mv_mul, blockshape_x, blockshape_y, &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2, ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x, block_y, ref_frame, pic_block_x, pic_block_y, best_inter_sad, lambda); // 1/8 pixel search. if(input->mv_res) { pic8_pix_x=2*pic4_pix_x; pic8_pix_y=2*pic4_pix_y; if ((pic8_pix_x + s_pos_x2 > 0) && (pic8_pix_y + s_pos_y2 > 0) && (pic8_pix_x + s_pos_x2 < 8*(img->width - blockshape_x + 1) - 2) && (pic8_pix_y + s_pos_y2 < 8*(img->height - blockshape_y + 1) - 2) ) PelY_18 = FastPelY_18; else PelY_18 = UMVPelY_18; best_inter_sad = EighthPelSearch(pic8_pix_x, pic8_pix_y, mv_mul, blockshape_x, blockshape_y, &s_pos_x1, &s_pos_y1, &s_pos_x2, &s_pos_y2, center_h2, center_v2, ip0, ip1, blocktype, mo, CurrRefPic, tmp_mv, all_mv, block_x, block_y, ref_frame, pic_block_x, pic_block_y, best_inter_sad, lambda); } tot_inter_sad += best_inter_sad; } } return tot_inter_sad;}/*! ************************************************************************ * \brief * motion search for P-frames ************************************************************************ */int motion_search(int tot_intra_sad){ int predframe_no, min_inter_sad, hv, i, j; predframe_no = UnifiedMotionSearch(tot_intra_sad, refFrArr, tmp_mv, img->mv, &img->mb_mode, &img->blc_size_h, &img->blc_size_v, &img->multframe_no, PFRAME, &min_inter_sad, img->all_mv); // tot_intra_sad is now the minimum SAD for intra. min_inter_sad is the best (min) SAD for inter (see above). // Inter/intra is determined depending on which is smallest if (tot_intra_sad < min_inter_sad) { img->mb_mode=img->imod+8*img->type; // set intra mode in inter frame for (hv=0; hv < 2; hv++) for (i=0; i < 4; i++) for (j=0; j < 4; j++) tmp_mv[hv][img->block_y+j][img->block_x+i+4]=0; } else { img->mb_data[img->current_mb_nr].intraOrInter = INTER_MB; img->imod=INTRA_MB_INTER; // Set inter mode for (hv=0; hv < 2; hv++) for (i=0; i < 4; i++) for (j=0; j < 4; j++) tmp_mv[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][predframe_no][img->mb_mode][hv]; } return predframe_no;};/*! ************************************************************************ * \brief * forward motion search for B-frames ************************************************************************ */int get_fwMV(int *min_fw_sad, int tot_intra_sad){ int fw_predframe_no, hv, i, j; fw_predframe_no = UnifiedMotionSearch(tot_intra_sad, fw_refFrArr, tmp_fwMV, img->p_fwMV, &img->fw_mb_mode, &img->fw_blc_size_h, &img->fw_blc_size_v, &img->fw_multframe_no, B_FORWARD, min_fw_sad, img->all_mv); // save forward MV to tmp_fwMV for (hv=0; hv < 2; hv++) for (i=0; i < 4; i++) for (j=0; j < 4; j++) { if(img->fw_mb_mode==1) tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][fw_predframe_no][1][hv]; else tmp_fwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][fw_predframe_no][(img->fw_mb_mode)/2][hv]; } return fw_predframe_no;}/*! ************************************************************************ * \brief * backward motion search for B-frames ************************************************************************ */void get_bwMV(int *min_bw_sad){ int bw_predframe_no, hv, i, j; bw_predframe_no = UnifiedMotionSearch(MAX_VALUE, bw_refFrArr, tmp_bwMV, img->p_bwMV, &img->bw_mb_mode, &img->bw_blc_size_h, &img->bw_blc_size_v, &img->bw_multframe_no, B_BACKWARD, min_bw_sad, img->all_mv); // save backward MV to tmp_bwMV for (hv=0; hv < 2; hv++) for (i=0; i < 4; i++) for (j=0; j < 4; j++) { if(img->bw_mb_mode==2) tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][bw_predframe_no][1][hv]; else tmp_bwMV[hv][img->block_y+j][img->block_x+i+4]=img->all_mv[i][j][bw_predframe_no][(img->bw_mb_mode-1)/2][hv]; }}/*! ************************************************************************ * \brief * Do hadamard transform or normal SAD calculation. * If Hadamard=1 4x4 Hadamard transform is performed and SAD of transform * levels is calculated * * \par Input: * hadamard=0 : normal SAD \n * hadamard=1 : 4x4 Hadamard transform is performed and SAD of transform * levels is calculated * * \par Output: * SAD/hadamard transform value * * \note * This function was optimized by manual loop unrolling and pointer arithmetic ************************************************************************ */int find_sad(int hadamard, int m7[16][16]){ int i, j,x, y, best_sad,current_sad; int m1[BLOCK_SIZE*BLOCK_SIZE], m[BLOCK_SIZE*BLOCK_SIZE], *mp;#ifdef COMPLEXITY SadCalls++;#endif current_sad=0; if (hadamard != 0) { best_sad=0;// Copy img->m7[][] into local variable, to avoid costly address arithmetic and cache misses mp=m; for (y=0; y<BLOCK_SIZE; y++) for (x=0; x<BLOCK_SIZE; x++) *mp++= m7[y][x]; m1[0] = m[0] + m[12]; m1[4] = m[4] + m[8]; m1[8] = m[4] - m[8]; m1[12]= m[0] - m[12]; m1[1] = m[1] + m[13]; m1[5] = m[5] + m[9]; m1[9] = m[5] - m[9]; m1[13]= m[1] - m[13]; m1[2] = m[2] + m[14]; m1[6] = m[6] + m[10]; m1[10]= m[6] - m[10]; m1[14]= m[2] - m[14]; m1[3] = m[3] + m[15]; m1[7] = m[7] + m[11]; m1[11]= m[7] - m[11]; m1[15]= m[3] - m[15]; m[0] = m1[0] + m1[4]; m[8] = m1[0] - m1[4]; m[4] = m1[8] + m1[12]; m[12]= m1[12]- m1[8]; m[1] = m1[1] + m1[5]; m[9] = m1[1] - m1[5]; m[5] = m1[9] + m1[13]; m[13]= m1[13]- m1[9]; m[2] = m1[2] + m1[6]; m[10] = m1[2] - m1[6]; m[6] = m1[10] + m1[14]; m[14]= m1[14]- m1[10]; m[3] = m1[3] + m1[7]; m[11]= m1[3] - m1[7]; m[7] = m1[11]+ m1[15]; m[15]= m1[15]- m1[11]; m1[0] = m[0] + m[3]; m1[1] = m[1] + m[2]; m1[2] = m[1] - m[2]; m1[3] = m[0] - m[3]; m1[4] = m[4] + m[7]; m1[5] = m[5] + m[6]; m1[6] = m[5] - m[6]; m1[7] = m[4] - m[7]; m1[8] = m[8] + m[11]; m1[9] = m[9] + m[10]; m1[10]= m[9] - m[10]; m1[11]= m[8] - m[11]; m1[12]= m[12]+ m[15]; m1[13]= m[13]+ m[14]; m1[14]= m[13]- m[14]; m1[15]= m[12]- m[15]; m[0] = m1[0] + m1[1]; m[1] = m1[0] - m1[1]; m[2] = m1[2] + m1[3]; m[3] = m1[3] - m1[2]; m[4] = m1[4] + m1[5]; m[5] = m1[4] - m1[5]; m[6] = m1[6] + m1[7]; m[7] = m1[7] - m1[6]; m[8] = m1[8] + m1[9]; m[9] = m1[8] - m1[9]; m[10]= m1[10]+ m1[11]; m[11]= m1[11]- m1[10]; m[12]= m1[12]+ m1[13]; m[13]= m1[12]- m1[13]; m[14]= m1[14]+ m1[15]; m[15]= m1[15]- m1[14]; // Note: we cannot use ByteAbs() here because the absolute values can be bigger // than +- 256. WOuld either need to enhance ByteAbs to WordAbs (or something) // or leave it as is (use of absm*( macro) for (j=0; j< BLOCK_SIZE * BLOCK_SIZE; j++) best_sad += absm (m[j]); /* Calculation of normalized Hadamard transforms would require divison by 4 here. However,we flevel that divison by 2 is better (assuming we give the same penalty for bituse for Hadamard=0 and 1) */ current_sad += best_sad/2; } else { register int *p; { for (i=0;i<4;i++) { p = m7[i]; for (j=0;j<4;j++) current_sad+=ByteAbs(*p++); } } } return current_sad;}/*! ************************************************************************ * \brief * control the sign of a with b ************************************************************************ */int sign(int a,int b){ int x; x=absm(a); if (b >= 0) return x; else return -x;}static int ByteAbsLookup[] = { 255,254,253,252,251,250,249,248,247,246,245,244,243,242,241,240, 239,238,237,236,235,234,233,232,231,230,229,228,227,226,225,224, 223,222,221,220,219,218,217,216,215,214,213,212,211,210,209,208, 207,206,205,204,203,202,201,200,199,198,197,196,195,194,193,192, 191,190,189,188,187,186,185,184,183,182,181,180,179,178,177,176, 175,174,173,172,171,170,169,168,167,166,165,164,163,162,161,160, 159,158,157,156,155,154,153,152,151,150,149,148,147,146,145,144, 143,142,141,140,139,138,137,136,135,134,133,132,131,130,129,128, 127,126,125,124,123,122,121,120,119,118,117,116,115,114,113,112, 111,110,109,108,107,106,105,104,103,102,101,100, 99, 98, 97, 96, 95, 94, 93, 92, 91, 90, 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111,112, 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128, 129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144, 145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160, 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, 193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208, 209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224, 225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240, 241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 };__inline int ByteAbs (int foo){ return ByteAbsLookup [foo+255];}void InitMotionVectorSearchModule (){ int i,j,k,l,l2; // Set up the static pointer for MV_bituse; MVBitUse = img->mv_bituse; // initialize Spiral Search statics k=1; for (l=1; l < 41; l++) { l2=l+l; for (i=-l+1; i < l; i++) { for (j=-l; j < l+1; j += l2) { SpiralX[k] = i; SpiralY[k] = j; k++; } } for (j=-l; j <= l; j++) { for (i=-l;i <= l; i += l2) { SpiralX[k] = i; SpiralY[k] = j; k++; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -