📄 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 + -