📄 image.c
字号:
if((str1 != 0) && (str2 != 0))
{
/*
* Copy one line of 4+4 reconstruction pels into the filtering buffer.
*/
for(k=0;k<8;k++)
img->li[k]=imgY_tmp[y-4+k][x];
/*
* Check for longer filtering on macroblock border if either block is intracoded.
*/
if(!(y4%4) && (str1 == 3 || str2 == 3))
{
if(loop(img,str1,str2, 1, 0)){
imgY_tmp[y-4+6][x] = img->lu[6];
imgY[y-3][x] = img->lu[1];
imgY[y+2][x] = img->lu[6];
}
}
else
loop(img,str1,str2, 0, 0);
/*
* Place back the filtered values into the filtered reconstruction buffer.
*/
for (k=2;k<6;k++)
imgY[y-4+k][x]=img->lu[k];
}
}
}
/* chroma */
for (uv=0;uv<2;uv++)
{
/* horizontal chroma */
for(y=0;y<img->height_cr;y++)
for(x=0;x<img->width_cr;x++)
imgUV_tmp[uv][y][x]=imgUV[uv][y][x];
for(y=0;y<img->height_cr;y++)
{
y4=y/4;
for(x=4;x<img->width_cr;x=x+4)
{
x4=x/4;
str1 = loopc[x4][y4+1];
str2 = loopc[x4+1][y4+1];
if((str1 != 0) && (str2 != 0))
{
/*
* Copy one line of 4+4 reconstruction pels into the filtering buffer.
*/
for(k=0;k<8;k++)
img->li[k]=imgUV_tmp[uv][y][x-4+k];
/*
* Check for longer filtering on macroblock border if either block is intracoded.
*/
if(!(x4%2) && (loopb[2*x4][2*y4+1] == 3 || loopb[2*x4+1][2*y4+1] == 3))
loop(img,str1,str2, 1, 1);
else
loop(img,str1,str2, 0, 1);
/*
* Place back the filtered values into the filtered reconstruction buffer.
*/
for (k=2;k<6;k++)
imgUV[uv][y][x-4+k]=img->lu[k];
}
}
}
/* vertical chroma */
for(y=0;y<img->height_cr;y++)
for(x=0;x<img->width_cr;x++)
imgUV_tmp[uv][y][x]=imgUV[uv][y][x];
for(x=0;x<img->width_cr;x++)
{
x4=x/4;
for(y=4;y<img->height_cr;y=y+4)
{
y4=y/4;
str1 = loopc[x4+1][y4];
str2 = loopc[x4+1][y4+1];
if((str1 != 0) && (str2 != 0))
{
/*
* Copy one line of 4+4 reconstruction pels into the filtering buffer.
*/
for(k=0;k<8;k++)
img->li[k]=imgUV_tmp[uv][y-4+k][x];
/*
* Check for longer filtering on macroblock border if either block is intracoded.
*/
if(!(y4%2) && (loopb[2*x4+1][2*y4] == 3 || loopb[2*x4+1][2*y4+1] == 3))
loop(img,str1,str2, 1, 1);
else
loop(img,str1,str2, 0, 1);
/*
* Place back the filtered values into the filtered reconstruction buffer.
*/
for (k=2;k<6;k++)
imgUV[uv][y-4+k][x]=img->lu[k];
}
}
}
}
}
/*!
* \fn loop()
* \brief Filter 4 or 6 from 8 pix input
*/
int loop(struct img_par *img, int ibl, int ibr, int longFilt, int chroma)
{
int
delta, halfLim, dr, dl, i, truncLimLeft, truncLimRight,
diff, clip, clip_left, clip_right;
/* Limit the difference between filtered and nonfiltered based
* on QP and strength
*/
clip_left = FILTER_STR[img->qp][ibl];
clip_right = FILTER_STR[img->qp][ibr];
/* The step across the block boundaries */
delta = abs(img->li[3]-img->li[4]);
/* Find overall activity parameter (n/2) */
halfLim = overallActivity[delta];
/* Truncate left limit to 2 for small stengths */
if (ibl <= 1)
truncLimLeft = (halfLim > 2) ? 2 : halfLim;
else
truncLimLeft = halfLim;
/* Truncate right limit to 2 for small stengths */
if (ibr <= 1)
truncLimRight = (halfLim > 2) ? 2 : halfLim;
else
truncLimRight = halfLim;
/* Find right activity parameter dr */
for (dr=1; dr<truncLimRight; dr++)
{
if (dr*abs(img->li[4]-img->li[4+dr]) > beta)
break;
}
/* Find left activity parameter dl */
for (dl=1; dl<truncLimLeft; dl++)
{
if (dl*abs(img->li[3]-img->li[3-dl]) > beta)
break;
}
if(dr < 2 || dl < 2)
{
/* no filtering when either one of activity params is below two */
img->lu[2] = img->li[2];
img->lu[3] = img->li[3];
img->lu[4] = img->li[4];
img->lu[5] = img->li[5];
return 0;
}
if(longFilt)
{
if(dr == 3 && dl == 3 &&
delta >= 2 && delta < img->qp/4)
{
if(chroma)
{
img->lu[3] = (25*(img->li[1] + img->li[5]) + 26*(img->li[2] + img->li[3] + img->li[4]) + 64) >> 7;
img->lu[2] = (25*(img->li[0] + img->li[4]) + 26*(img->li[1] + img->li[2] + img->lu[3]) + 64) >> 7;
img->lu[4] = (25*(img->li[2] + img->li[6]) + 26*(img->li[3] + img->li[4] + img->li[5]) + 64) >> 7;
img->lu[5] = (25*(img->li[3] + img->li[7]) + 26*(img->lu[4] + img->li[5] + img->li[6]) + 64) >> 7;
return 0;
}
else
{
img->lu[3] = (25*(img->li[1] + img->li[5]) + 26*(img->li[2] + img->li[3] + img->li[4]) + 64) >> 7;
img->lu[2] = (25*(img->li[0] + img->li[4]) + 26*(img->li[1] + img->li[2] + img->lu[3]) + 64) >> 7;
img->lu[1] = (25*(img->li[1] + img->lu[3]) + 26*(img->li[0] + img->li[1] + img->lu[2]) + 64) >> 7;
img->lu[4] = (25*(img->li[2] + img->li[6]) + 26*(img->li[3] + img->li[4] + img->li[5]) + 64) >> 7;
img->lu[5] = (25*(img->li[3] + img->li[7]) + 26*(img->lu[4] + img->li[5] + img->li[6]) + 64) >> 7;
img->lu[6] = (25*(img->lu[4] + img->li[6]) + 26*(img->lu[5] + img->li[6] + img->li[7]) + 64) >> 7;
return 1;
}
}
}
/* Filter pixels at the edge */
img->lu[4] = (21*(img->li[3] + img->li[5]) + 22*img->li[4] + 32) >> 6;
img->lu[3] = (21*(img->li[2] + img->li[4]) + 22*img->li[3] + 32) >> 6;
if(dr == 3)
img->lu[5] = (21*(img->lu[4] + img->li[6]) + 22*img->li[5] + 32) >> 6;
else
img->lu[5] = img->li[5];
if(dl == 3)
img->lu[2] = (21*(img->li[1] + img->lu[3]) + 22*img->li[2] + 32) >> 6;
else
img->lu[2] = img->li[2];
/* Clipping parameter depends on one table and left and right act params */
clip = (clip_left + clip_right + dl + dr) / 2;
/* Pixels at the edge are clipped differently */
for (i=3; i<=4; i++)
{
diff = (int)img->lu[i] - (int)img->li[i];
if (diff)
{
if (diff > clip)
diff = clip;
else if (diff < -clip)
diff = -clip;
img->lu[i] = img->li[i] + diff;
}
}
/* pixel from left is clipped */
diff = (int)img->lu[2] - (int)img->li[2];
if (diff)
{
if (diff > clip_left)
diff = clip_left;
else if (diff < -clip_left)
diff = -clip_left;
img->lu[2] = img->li[2] + diff;
}
/* pixel from right is clipped */
diff = (int)img->lu[5] - (int)img->li[5];
if (diff)
{
if (diff > clip_right)
diff = clip_right;
else if (diff < -clip_right)
diff = -clip_right;
img->lu[5] = img->li[5] + diff;
}
return 0;
}
/************************************************************************
*
* Name : get_pixel()
*
* Description: Direct interpolation of a specific subpel position
*
* Author: Thomas Wedi, 12.01.2001 <wedi@tnt.uni-hannover.de>
*
* Remarks: A further significant complexity reduction is possible
* if the direct interpolation is not performed on pixel basis
* but on block basis,
*
************************************************************************/
byte get_pixel(int ref_frame,int x_pos, int y_pos, struct img_par *img)
{
switch(img->mv_res)
{
case 0:
return(get_quarterpel_pixel(ref_frame,x_pos,y_pos,img));
case 1:
return(get_eighthpel_pixel(ref_frame,x_pos,y_pos,img));
default:
printf("\n wrong mv-resolution: %d \n",img->mv_res);
exit(1);
}
}
byte get_quarterpel_pixel(int ref_frame,int x_pos, int y_pos, struct img_par *img)
{
int dx=0, x=0;
int dy=0, y=0;
int maxold_x=0,maxold_y=0;
int result=0;
int pres_x=0;
int pres_y=0;
x_pos = max (0, min (x_pos, img->width *4-1));
y_pos = max (0, min (y_pos, img->height*4-1));
/**********************/
/* applied filters */
/* */
/* X 2 3 2 X */
/* 2 6 7 6 */
/* 3 7 5 7 */
/* 2 6 7 6 */
/* X X */
/* */
/* X-fullpel positon */
/* */
/**********************/
dx = x_pos%4;
dy = y_pos%4;
maxold_x=img->width-1;
maxold_y=img->height-1;
if(dx==0&&dy==0) /* fullpel position */
{
pres_y=y_pos/4;
pres_x=x_pos/4;
result=mref[ref_frame][pres_y][pres_x];
return result;
}
else if(dx==3&&dy==3) /* funny position */
{
pres_y=y_pos/4;
pres_x=x_pos/4;
result=(mref[ref_frame][pres_y ][pres_x ]+
mref[ref_frame][pres_y ][min(maxold_x,pres_x+1)]+
mref[ref_frame][min(maxold_y,pres_y+1)][min(maxold_x,pres_x+1)]+
mref[ref_frame][min(maxold_y,pres_y+1)][pres_x ]+2)/4;
return result;
}
else /* other positions */
{
if(x_pos==img->width*4-1)
dx=2;
if(y_pos==img->height*4-1)
dy=2;
if(dx==1&&dy==0)
{
pres_y=y_pos/4;
for(x=-2;x<4;x++)
{
pres_x=max(0,min(maxold_x,x_pos/4+x));
result+=mref[ref_frame][pres_y][pres_x]*two[x+2];
}
}
else if(dx==0&&dy==1)
{
pres_x=x_pos/4;
for(y=-2;y<4;y++)
{
pres_y=max(0,min(maxold_y,y_pos/4+y));
result+=mref[ref_frame][pres_y][pres_x]*two[y+2];
}
}
else if(dx==2&&dy==0)
{
pres_y=y_pos/4;
for(x=-2;x<4;x++)
{
pres_x=max(0,min(maxold_x,x_pos/4+x));
result+=mref[ref_frame][pres_y][pres_x]*three[x+2];
}
}
else if(dx==0&&dy==2)
{
pres_x=x_pos/4;
for(y=-2;y<4;y++)
{
pres_y=max(0,min(maxold_y,y_pos/4+y));
result+=mref[ref_frame][pres_y][pres_x]*three[y+2];
}
}
else if(dx==3&&dy==0)
{
pres_y=y_pos/4;
for(x=-2;x<4;x++)
{
pres_x=max(0,min(maxold_x,x_pos/4+x));
result+=mref[ref_frame][pres_y][pres_x]*two[3-x]; /* four */
}
}
else if(dx==0&&dy==3)
{
pres_x=x_pos/4;
for(y=-2;y<4;y++)
{
pres_y=max(0,min(maxold_y,y_pos/4+y));
result+=mref[ref_frame][pres_y][pres_x]*two[3-y]; /* four */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -