📄 block.cpp
字号:
prev_m1 = -1;
for (l = 1; l <= 16; l++){
sad_layr = 65536;
for (m = 0; m < 4; m++){
i = i_min_now + htp[m];
j = j_min_now + vtp[m];
Coffset = i - x_curr + (j - y_curr)*width;
if(l>2&&prev_m1 == m)
{
current_inter_sad = prev_AE1[l-2];
if (current_inter_sad < sad_layr){
sad_layr = current_inter_sad;
i_min_next = i;
j_min_next = j;
prev_m2=prevm[m];
prev_AE1[l]=current_inter_sad;
}
}
else if (i >= -4 && i <= maxX && j >= -4 && j <= maxY){
tmp0=((i - x_curr)<<2)-ip0;
tmp1=((j - y_curr)<<2)-ip1;
current_inter_sad=(lambda*(img->mv_bituse[IABS(tmp0)]+img->mv_bituse[IABS(tmp1)]));
//current_inter_sad += SAD_Macroblock_sub(img,curr, prev+Coffset, sad_layr,current_inter_sad);
current_inter_sad = SAD_Macroblock_sub(img,curr, prev+Coffset, sad_layr,current_inter_sad);
//current_inter_sad = SAD_Macroblock(prev+Coffset, curr, sad_layr);
if (current_inter_sad < best_inter_sad[index]){
mvx0 = i - x_curr;
mvy0 = j - y_curr;
ioffset = Coffset;
best_inter_sad[index] = current_inter_sad ;
}
if (current_inter_sad < sad_layr){
sad_layr = current_inter_sad;
i_min_next = i;
j_min_next = j;
prev_m2 = prevm[m];
prev_AE1[l] = current_inter_sad;
}
}
}
prev_m1 = prev_m2;
i_min_now = i_min_next;
j_min_now = j_min_next;
distortion_2 = distortion_1;
distortion_1 = distortion_0;
distortion_0 = sad_layr;
if (distortion_1 <= distortion_0 && distortion_2 <= distortion_0){
break;
}
}
offset+=ioffset;
x_curr+=mvx0;
y_curr+=mvy0;
#endif
pos=0;
for (i = 1; i < 9; i++)
{
point++;
x=x_curr+point->x;
y=y_curr+point->y;
#ifdef FAST_INTEGER
if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
continue;
#endif
tmp0=(mvx0<<2)+point->x-ip0;
tmp1=(mvy0<<2)+point->y-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
prev=ipol[point->comp] + offset + point->offset;
// current_inter_sad+=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
current_inter_sad=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
if (current_inter_sad < best_inter_sad[index])
{
best_inter_sad[index]=current_inter_sad;
pos=i;
}
}
mvx1 = search[pos].x;
mvy1 = search[pos].y;
offset+=search[pos].offset;
type =search[pos].type;
x_curr+=(mvx1>>1);
y_curr+=(mvy1>>1);
point=qsearch[type];
pos=0;
for (i = 1; i < 9; i++)
{
point++;
x=x_curr+point->x;
y=y_curr+point->y;
#ifdef FAST_INTEGER
if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
continue;
#endif
tmp0=(mvx0<<2)+mvx1+point->x-ip0;
tmp1=(mvy0<<2)+mvy1+point->y-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
prev=ipol[point->comp] + offset + point->offset;
current_inter_sad=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
if (current_inter_sad < best_inter_sad[index])
{
best_inter_sad[index]=current_inter_sad;
pos=i;
}
}
offset+=qsearch[type][pos].offset;
img->offset1[index]=offset;
img->comp1[index] =qsearch[type][pos].comp;
curr_mvx1[index]=(mvx0<<2)+mvx1+qsearch[type][pos].x;
curr_mvy1[index]=(mvy0<<2)+mvy1+qsearch[type][pos].y;
}
current_inter_sad = best_inter_sad[0]+best_inter_sad[1];
if(current_inter_sad < MinCost)
{
img->mb_mode=2;
img->imod=INTRA_MB_INTER;
for(i=0;i<4;i++)
{
tmp_mv[pic_block_y-2][pic_block_x+4+i][0]=curr_mvx1[0];
tmp_mv[pic_block_y-2][pic_block_x+4+i][1]=curr_mvy1[0];
tmp_mv[pic_block_y-1][pic_block_x+4+i][0]=curr_mvx1[0];
tmp_mv[pic_block_y-1][pic_block_x+4+i][1]=curr_mvy1[0];
tmp_mv[pic_block_y][pic_block_x+4+i][0]=curr_mvx1[1];
tmp_mv[pic_block_y][pic_block_x+4+i][1]=curr_mvy1[1];
tmp_mv[pic_block_y+1][pic_block_x+4+i][0]=curr_mvx1[1];
tmp_mv[pic_block_y+1][pic_block_x+4+i][1]=curr_mvy1[1];
intra_mb_pos[pic_block_y-2][pic_block_x+4+i] = 0;
intra_mb_pos[pic_block_y-1][pic_block_x+4+i] = 0;
intra_mb_pos[pic_block_y][pic_block_x+4+i] = 0;
intra_mb_pos[pic_block_y+1][pic_block_x+4+i] = 0;
}
MinCost = current_inter_sad;
}
return MinCost;
}
int motion_search_8x16(struct img_par *img,int MinCost)
{
int i,index;
int vec0_x,vec0_y,vec1_x,vec1_y,vec2_x,vec2_y;
int pic_block_x,pic_block_y,pic_pix_y,pic_pix_x;
int ip0,ip1,ip2,ip3,ip4,ip5;
int best_inter_sad[2],current_inter_sad;
int tmp0,tmp1;
int lambda = QP2QUANT[img->qp-SHIFT_QP];
int x,y,offset,type,pos;
byte* curr;
byte* prev;
Point* point=search;
SAD_TABLE * sadTbl=sadTable;
int maxX=img->width-4;
int maxY=img->height-12;
int sadTimes=25;
int mvx0,mvy0,mvx1,mvy1;
int x_curr,y_curr;
int width=img->width+IMG_PAD_SIZE;
#ifdef FAST_INTEGER
int prev_AE1[17];
int prev_m1,prev_m2=0;
static int prevm[4] = {2, 3, 0, 1};
static int htp[4] = {-1, 0, 1, 0};
static int vtp[4] = {0, 1, 0, -1};
int j_min_now, i_min_now, i_min_next=0, j_min_next=0, sad_layr,Coffset,ioffset=0,l,m,j;
int distortion_0, distortion_1, distortion_2;
#endif
for(index=0;index<2;index++)
{
point=search;
sadTbl=sadTable;
pic_block_y=img->block_y;
pic_pix_y=img->pix_y;
pic_block_x=img->block_x+2*index;
pic_pix_x=img->pix_x+8*index;
x_curr=pic_pix_x;
y_curr=pic_pix_y;
if(index==0)
{
vec0_x=pic_block_x-1;
vec0_y=pic_block_y;
vec1_x=pic_block_x;
vec1_y=pic_block_y-1;
vec2_x=pic_block_x+2;
vec2_y=pic_block_y-1;
if (pic_block_y == 0)
{
vec1_x=vec0_x;
vec2_x=vec0_x;
vec1_y=vec0_y;
vec2_y=vec0_y;
}
//if (vec2_x > (img->width>>2)-1)
//{
// vec2_x=pic_block_x-1;
//}
ip0=tmp_mv[vec0_y][vec0_x+4][0];
ip1=tmp_mv[vec1_y][vec1_x+4][0];
ip2=tmp_mv[vec2_y][vec2_x+4][0];
ip3=tmp_mv[vec0_y][vec0_x+4][1];
ip4=tmp_mv[vec1_y][vec1_x+4][1];
ip5=tmp_mv[vec2_y][vec2_x+4][1];
if(!intra_mb_pos[vec0_y][vec0_x+4])
{
img->mv2[index][0] = ip0;
img->mv2[index][1] = ip3;
}
else
{
if((!intra_mb_pos[vec1_y][vec1_x+4])&&(intra_mb_pos[vec2_y][vec2_x+4]))
{
img->mv2[index][0] = ip1;
img->mv2[index][1] = ip4;
}
else if((intra_mb_pos[vec1_y][vec1_x+4])&&(!intra_mb_pos[vec2_y][vec2_x+4]))
{
img->mv2[index][0] = ip2;
img->mv2[index][1] = ip5;
}
else
{
img->mv2[index][0]=ip0+ip1+ip2-min(min(ip0,ip1),ip2)-max(max(ip0,ip1),ip2);
img->mv2[index][1]=ip3+ip4+ip5-min(min(ip3,ip4),ip5)-max(max(ip3,ip4),ip5);
}
}
}
else
{
vec0_x=pic_block_x-1;
vec0_y=pic_block_y;
vec1_x=pic_block_x;
vec1_y=pic_block_y-1;
vec2_x=pic_block_x+2;
vec2_y=pic_block_y-1;
if (vec2_x > (img->width>>2)-1)
{
vec2_x=pic_block_x-1;
}
if (pic_block_y == 0)
{
//ip0=ip1=ip2=curr_mvx1[0];
//ip3=ip4=ip5=curr_mvy1[0];
img->mv2[index][0] = curr_mvx2[0];
img->mv2[index][1] = curr_mvy2[0];
}
else
{
ip0=curr_mvx2[0];
ip1=tmp_mv[vec1_y][vec1_x+4][0];
ip2=tmp_mv[vec2_y][vec2_x+4][0];
ip3=curr_mvy2[0];
ip4=tmp_mv[vec1_y][vec1_x+4][1];
ip5=tmp_mv[vec2_y][vec2_x+4][1];
if(!intra_mb_pos[vec2_y][vec2_x+4])
{
img->mv2[index][0] = ip2;
img->mv2[index][1] = ip5;
}
else
{
if(intra_mb_pos[vec1_y][vec1_x+4])
{
img->mv2[index][0] = ip0;
img->mv2[index][1] = ip3;
}
else
{
img->mv2[index][0]=ip0+ip1+ip2-min(min(ip0,ip1),ip2)-max(max(ip0,ip1),ip2);
img->mv2[index][1]=ip3+ip4+ip5-min(min(ip3,ip4),ip5)-max(max(ip3,ip4),ip5);
}
}
}
}
ip0=img->mv2[index][0];
ip1=img->mv2[index][1];
offset=width*pic_pix_y+pic_pix_x;
curr=imgY_org + offset;
prev=ipol[0] + offset;
#ifndef FAST_INTEGER
tmp0=-ip0;
tmp1=-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
best_inter_sad[index] = SAD_Macroblock_sub2(img,curr, prev, MAX_VALUE,current_inter_sad);
//best_inter_sad[index] -= lambda * 16;//is 16x16block,here should not
mvx0=0;
mvy0=0;
pos=0;
for (i = 1; i < sadTimes; i++)
{
sadTbl++;
x=x_curr+sadTbl->dx;
y=y_curr+sadTbl->dy;
//if((x<0)||(y<0)||(x>maxX)||(y>maxY))
// continue;
tmp0=(sadTbl->dx<<2)-ip0;
tmp1=(sadTbl->dy<<2)-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
//current_inter_sad += SAD_Macroblock_sub2(img,prev+sadTbl->offset, curr, best_inter_sad[index],current_inter_sad);
current_inter_sad = SAD_Macroblock_sub2(img,prev+sadTbl->offset, curr, best_inter_sad[index],current_inter_sad);
if (current_inter_sad < best_inter_sad[index])
{
pos=i;
best_inter_sad[index] = current_inter_sad;
}
}
mvx0 = sadTable[pos].dx;
mvy0 = sadTable[pos].dy;
offset+=sadTable[pos].offset;
x_curr+=mvx0;
y_curr+=mvy0;
#else
//ioffset=0;
i_min_now = min(maxX,max(-4, x_curr+(ip0>>2)));
j_min_now = min(maxY,max(-4, y_curr+(ip1>>2)));
//i_min_now = x_curr;
//j_min_now = y_curr;
mvx0=i_min_now-x_curr;
mvy0=j_min_now-y_curr;
ioffset=width*mvy0+mvx0;
tmp0=(mvx0<<2)-ip0;
tmp1=(mvy0<<2)-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
best_inter_sad[index] = SAD_Macroblock_sub2(img,curr, prev+j_min_now*width+i_min_now-offset, MAX_VALUE,current_inter_sad);
distortion_0 = distortion_1 = distortion_2 = 65536;
prev_AE1[0] = best_inter_sad[index];
prev_m1 = -1;
for (l = 1; l <= 16; l++){
sad_layr = 65536;
for (m = 0; m < 4; m++){
i = i_min_now + htp[m];
j = j_min_now + vtp[m];
Coffset = i - x_curr + (j - y_curr)*width;
if(l>2&&prev_m1 == m)
{
current_inter_sad = prev_AE1[l-2];
if (current_inter_sad < sad_layr){
sad_layr = current_inter_sad;
i_min_next = i;
j_min_next = j;
prev_m2=prevm[m];
prev_AE1[l]=current_inter_sad;
}
}
else if (i >= -4 && i <= maxX && j >= -4 && j <= maxY){
tmp0=((i - x_curr)<<2)-ip0;
tmp1=((j - y_curr)<<2)-ip1;
current_inter_sad=(lambda*(img->mv_bituse[IABS(tmp0)]+img->mv_bituse[IABS(tmp1)]));
//current_inter_sad += SAD_Macroblock_sub2(img,curr, prev+Coffset, sad_layr,current_inter_sad);
current_inter_sad = SAD_Macroblock_sub2(img,curr, prev+Coffset, sad_layr,current_inter_sad);
//current_inter_sad = SAD_Macroblock(prev+Coffset, curr, sad_layr);
if (current_inter_sad < best_inter_sad[index]){
mvx0 = i - x_curr;
mvy0 = j - y_curr;
ioffset = Coffset;
best_inter_sad[index] = current_inter_sad ;
}
if (current_inter_sad < sad_layr){
sad_layr = current_inter_sad;
i_min_next = i;
j_min_next = j;
prev_m2 = prevm[m];
prev_AE1[l] = current_inter_sad;
}
}
}
prev_m1 = prev_m2;
i_min_now = i_min_next;
j_min_now = j_min_next;
distortion_2 = distortion_1;
distortion_1 = distortion_0;
distortion_0 = sad_layr;
if (distortion_1 <= distortion_0 && distortion_2 <= distortion_0){
break;
}
}
offset+=ioffset;
x_curr+=mvx0;
y_curr+=mvy0;
#endif
pos=0;
for (i = 1; i < 9; i++)
{
point++;
x=x_curr+point->x;
y=y_curr+point->y;
#ifdef FAST_INTEGER
if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
continue;
#endif
tmp0=(mvx0<<2)+point->x-ip0;
tmp1=(mvy0<<2)+point->y-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
prev=ipol[point->comp] + offset + point->offset;
//current_inter_sad+=SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
current_inter_sad = SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
if (current_inter_sad < best_inter_sad[index])
{
best_inter_sad[index]=current_inter_sad;
pos=i;
}
}
mvx1 = search[pos].x;
mvy1 = search[pos].y;
offset+=search[pos].offset;
type =search[pos].type;
x_curr+=(mvx1>>1);
y_curr+=(mvy1>>1);
point=qsearch[type];
pos=0;
for (i = 1; i < 9; i++)
{
point++;
x=x_curr+point->x;
y=y_curr+point->y;
#ifdef FAST_INTEGER
if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
continue;
#endif
tmp0=(mvx0<<2)+mvx1+point->x-ip0;
tmp1=(mvy0<<2)+mvy1+point->y-ip1;
current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
prev=ipol[point->comp] + offset + point->offset;
current_inter_sad = SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
if (current_inter_sad < best_inter_sad[index])
{
best_inter_sad[index]=current_inter_sad;
pos=i;
}
}
offset+=qsearch[type][pos].offset;
img->offset2[index]=offset;
img->comp2[index] =qsearch[type][pos].comp;
curr_mvx2[index]=(mvx0<<2)+mvx1+qsearch[type][pos].x;
curr_mvy2[index]=(mvy0<<2)+mvy1+qsearch[type][pos].y;
}
current_inter_sad = best_inter_sad[0]+best_inter_sad[1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -