📄 image.c
字号:
for (j=-IMG_PAD_SIZE; j < img->height+IMG_PAD_SIZE; j++)
{
for (i=-IMG_PAD_SIZE; i < img->width+IMG_PAD_SIZE; i++)
{
jj = max(0,min(img->height-1,j));
is=(ONE_FOURTH_TAP[0][0]*(imgY[jj][max(0,min(img->width-1,i ))]+imgY[jj][max(0,min(img->width-1,i+1))])+
ONE_FOURTH_TAP[1][0]*(imgY[jj][max(0,min(img->width-1,i-1))]+imgY[jj][max(0,min(img->width-1,i+2))])+
ONE_FOURTH_TAP[2][0]*(imgY[jj][max(0,min(img->width-1,i-2))]+imgY[jj][max(0,min(img->width-1,i+3))]));
img4Y_tmp[j+IMG_PAD_SIZE][(i+IMG_PAD_SIZE)*2 ]=imgY[jj][max(0,min(img->width-1,i))]*1024; // 1/1 pix pos
img4Y_tmp[j+IMG_PAD_SIZE][(i+IMG_PAD_SIZE)*2+1]=is*32; // 1/2 pix pos
}
}
for (i=0; i < (img->width+2*IMG_PAD_SIZE)*2; i++)
{
for (j=0; j < img->height+2*IMG_PAD_SIZE; j++)
{
j4=j*4;
maxy = img->height+2*IMG_PAD_SIZE-1;
// change for TML4, use 6 TAP vertical filter
is=(ONE_FOURTH_TAP[0][0]*(img4Y_tmp[j ][i]+img4Y_tmp[min(maxy,j+1)][i])+
ONE_FOURTH_TAP[1][0]*(img4Y_tmp[max(0,j-1)][i]+img4Y_tmp[min(maxy,j+2)][i])+
ONE_FOURTH_TAP[2][0]*(img4Y_tmp[max(0,j-2)][i]+img4Y_tmp[min(maxy,j+3)][i]))/32;
PutPel_14 (out4Y, (j-IMG_PAD_SIZE)*4, (i-IMG_PAD_SIZE*2)*2,(pel_t) max(0,min(255,(int)((img4Y_tmp[j][i]+512)/1024)))); // 1/2 pix
PutPel_14 (out4Y, (j-IMG_PAD_SIZE)*4+2, (i-IMG_PAD_SIZE*2)*2,(pel_t) max(0,min(255,(int)((is+512)/1024)))); // 1/2 pix
}
}
/* 1/4 pix */
/* luma */
ie2=(img->width+2*IMG_PAD_SIZE-1)*4;
je2=(img->height+2*IMG_PAD_SIZE-1)*4;
for (j=0;j<je2+4;j+=2)
for (i=0;i<ie2+3;i+=2) {
/* '-' */
PutPel_14 (out4Y, j-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4+1, (pel_t) (max(0,min(255,(int)(FastPelY_14(out4Y, j-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4)+FastPelY_14(out4Y, j-IMG_PAD_SIZE*4, min(ie2+2,i+2)-IMG_PAD_SIZE*4))/2))));
}
for (i=0;i<ie2+4;i++)
{
for (j=0;j<je2+3;j+=2)
{
if( i%2 == 0 ) {
/* '|' */
PutPel_14 (out4Y, j-IMG_PAD_SIZE*4+1, i-IMG_PAD_SIZE*4, (pel_t)(max(0,min(255,(int)(FastPelY_14(out4Y, j-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4)+FastPelY_14(out4Y, min(je2+2,j+2)-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4))/2))));
}
else if( ((i&3) == 3)&&(((j+1)&3) == 3))
{
/* "funny posision" */
PutPel_14 (out4Y, j-IMG_PAD_SIZE*4+1, i-IMG_PAD_SIZE*4, (pel_t) ((
FastPelY_14 (out4Y, j-IMG_PAD_SIZE*4-2, i-IMG_PAD_SIZE*4-3) +
FastPelY_14 (out4Y, min(je2,j+2)-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4-3) +
FastPelY_14 (out4Y, j-IMG_PAD_SIZE*4-2, min(ie2,i+1)-IMG_PAD_SIZE*4) +
FastPelY_14 (out4Y, min(je2,j+2)-IMG_PAD_SIZE*4, min(ie2,i+1)-IMG_PAD_SIZE*4)
+ 2 )/4));
}
else if ((j%4 == 0 && i%4 == 1) || (j%4 == 2 && i%4 == 3)) {
/* '/' */
PutPel_14 (out4Y, j-IMG_PAD_SIZE*4+1, i-IMG_PAD_SIZE*4, (pel_t)(max(0,min(255,(int)(
FastPelY_14 (out4Y, j-IMG_PAD_SIZE*4, min(ie2+2,i+1)-IMG_PAD_SIZE*4) +
FastPelY_14(out4Y, min(je2+2,j+2)-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4-1))/2))));
}
else {
/* '\' */
PutPel_14 (out4Y, j-IMG_PAD_SIZE*4+1, i-IMG_PAD_SIZE*4, (pel_t)(max(0,min(255,(int)(
FastPelY_14 (out4Y, j-IMG_PAD_SIZE*4, i-IMG_PAD_SIZE*4-1) +
FastPelY_14(out4Y, min(je2+2,j+2)-IMG_PAD_SIZE*4, min(ie2+2,i+1)-IMG_PAD_SIZE*4))/2))));
}
}
}
/* Chroma: */
for (j=0; j < img->height_cr; j++) {
memcpy(outU[j],imgUV[0][j],img->width_cr); // just copy 1/1 pix, interpolate "online"
memcpy(outV[j],imgUV[1][j],img->width_cr);
}
// Generate 1/1th pel representation (used for integer pel MV search)
GenerateFullPelRepresentation (out4Y, ref11, img->width, img->height);
}
/*!
************************************************************************
* \brief
* Upsample 4 times for 1/8-pel estimation and store in buffer
* for multiple reference frames. 1/8-pel resolution is calculated
* during the motion estimation on the fly with bilinear interpolation.
*
************************************************************************
*/
void oneeighthpix(int prior_B_frame)
{
static int h1[8] = { -3, 12, -37, 229, 71, -21, 6, -1 };
static int h2[8] = { -3, 12, -39, 158, 158, -39, 12, -3 };
static int h3[8] = { -1, 6, -21, 71, 229, -37, 12, -3 };
int uv,x,y,y1,x4,y4,x4p;
int nx_out, ny_out, nx_1, ny_1, maxy;
int i0,i1,i2,i3;
img->frame_cycle=img->number % img->buf_cycle; /*GH input->no_multpred used insteadof MAX_MULT_PRED
frame buffer size = input->no_multpred+1*/
nx_out = 4*img->width;
ny_out = 4*img->height;
nx_1 = img->width-1;
ny_1 = img->height-1;
//horizontal filtering filtering
for(y=-IMG_PAD_SIZE;y<img->height+IMG_PAD_SIZE;y++)
{
for(x=-IMG_PAD_SIZE;x<img->width+IMG_PAD_SIZE;x++)
{
y1 = max(0,min(ny_1,y));
i0=(256*imgY[y1][max(0,min(nx_1,x))]);
i1=(
h1[0]* imgY[y1][max(0,min(nx_1,x-3))] +
h1[1]* imgY[y1][max(0,min(nx_1,x-2))] +
h1[2]* imgY[y1][max(0,min(nx_1,x-1))] +
h1[3]* imgY[y1][max(0,min(nx_1,x ))] +
h1[4]* imgY[y1][max(0,min(nx_1,x+1))] +
h1[5]* imgY[y1][max(0,min(nx_1,x+2))] +
h1[6]* imgY[y1][max(0,min(nx_1,x+3))] +
h1[7]* imgY[y1][max(0,min(nx_1,x+4))] );
i2=(
h2[0]* imgY[y1][max(0,min(nx_1,x-3))] +
h2[1]* imgY[y1][max(0,min(nx_1,x-2))] +
h2[2]* imgY[y1][max(0,min(nx_1,x-1))] +
h2[3]* imgY[y1][max(0,min(nx_1,x ))] +
h2[4]* imgY[y1][max(0,min(nx_1,x+1))] +
h2[5]* imgY[y1][max(0,min(nx_1,x+2))] +
h2[6]* imgY[y1][max(0,min(nx_1,x+3))] +
h2[7]* imgY[y1][max(0,min(nx_1,x+4))] );
i3=(
h3[0]* imgY[y1][max(0,min(nx_1,x-3))] +
h3[1]* imgY[y1][max(0,min(nx_1,x-2))] +
h3[2]* imgY[y1][max(0,min(nx_1,x-1))] +
h3[3]* imgY[y1][max(0,min(nx_1,x ))] +
h3[4]* imgY[y1][max(0,min(nx_1,x+1))] +
h3[5]* imgY[y1][max(0,min(nx_1,x+2))] +
h3[6]* imgY[y1][max(0,min(nx_1,x+3))] +
h3[7]* imgY[y1][max(0,min(nx_1,x+4))] );
x4=(x+IMG_PAD_SIZE)*4;
img4Y_tmp[y+IMG_PAD_SIZE][x4 ] = i0;
img4Y_tmp[y+IMG_PAD_SIZE][x4+1] = i1;
img4Y_tmp[y+IMG_PAD_SIZE][x4+2] = i2;
img4Y_tmp[y+IMG_PAD_SIZE][x4+3] = i3;
}
}
maxy = img->height+2*IMG_PAD_SIZE-1;
for(x4=0;x4<nx_out+2*IMG_PAD_SIZE*4;x4++)
{
for(y=0;y<=maxy;y++)
{
i0=(long int)(img4Y_tmp[y][x4]+256/2)/256;
i1=(long int)(
h1[0]* img4Y_tmp[max(0 ,y-3)][x4]+
h1[1]* img4Y_tmp[max(0 ,y-2)][x4]+
h1[2]* img4Y_tmp[max(0 ,y-1)][x4]+
h1[3]* img4Y_tmp[y][x4] +
h1[4]* img4Y_tmp[min(maxy,y+1)][x4]+
h1[5]* img4Y_tmp[min(maxy,y+2)][x4]+
h1[6]* img4Y_tmp[min(maxy,y+3)][x4]+
h1[7]* img4Y_tmp[min(maxy,y+4)][x4]+ 256*256/2 ) / (256*256);
i2=(long int)(
h2[0]* img4Y_tmp[max(0 ,y-3)][x4]+
h2[1]* img4Y_tmp[max(0 ,y-2)][x4]+
h2[2]* img4Y_tmp[max(0 ,y-1)][x4]+
h2[3]* img4Y_tmp[y][x4] +
h2[4]* img4Y_tmp[min(maxy,y+1)][x4]+
h2[5]* img4Y_tmp[min(maxy,y+2)][x4]+
h2[6]* img4Y_tmp[min(maxy,y+3)][x4]+
h2[7]* img4Y_tmp[min(maxy,y+4)][x4]+ 256*256/2 ) / (256*256);
i3=(long int)(
h3[0]* img4Y_tmp[max(0 ,y-3)][x4]+
h3[1]* img4Y_tmp[max(0 ,y-2)][x4]+
h3[2]* img4Y_tmp[max(0 ,y-1)][x4]+
h3[3]* img4Y_tmp[y][x4] +
h3[4]* img4Y_tmp[min(maxy,y+1)][x4]+
h3[5]* img4Y_tmp[min(maxy,y+2)][x4]+
h3[6]* img4Y_tmp[min(maxy,y+3)][x4]+
h3[7]* img4Y_tmp[min(maxy,y+4)][x4]+ 256*256/2 ) / (256*256);
y4 = (y-IMG_PAD_SIZE)*4;
x4p = x4-IMG_PAD_SIZE*4;
if(prior_B_frame)
{
PutPel_14 (mref_P, y4, x4p, (pel_t) max(0,min(255,i0)));
PutPel_14 (mref_P, y4+1, x4p, (pel_t) max(0,min(255,i1)));
PutPel_14 (mref_P, y4+2, x4p, (pel_t) max(0,min(255,i2)));
PutPel_14 (mref_P, y4+3, x4p, (pel_t) max(0,min(255,i3)));
}
else
{
PutPel_14 (mref[img->frame_cycle], y4, x4p, (pel_t) max(0,min(255,i0)));
PutPel_14 (mref[img->frame_cycle], y4+1, x4p, (pel_t) max(0,min(255,i1)));
PutPel_14 (mref[img->frame_cycle], y4+2, x4p, (pel_t) max(0,min(255,i2)));
PutPel_14 (mref[img->frame_cycle], y4+3, x4p, (pel_t) max(0,min(255,i3)));
}
}
}
if(!prior_B_frame)
{
for(y=0;y<img->height;y++)
for(x=0;x<img->width;x++)
PutPel_11 (Refbuf11[img->frame_cycle], y, x, FastPelY_14 (mref[img->frame_cycle], y*4, x*4));
}
// Chroma and full pel representation:
if(prior_B_frame)
{
for (uv=0; uv < 2; uv++)
for (y=0; y < img->height_cr; y++)
memcpy(mcef_P[uv][y],imgUV[uv][y],img->width_cr); // just copy 1/1 pix, interpolate "online"
GenerateFullPelRepresentation (mref_P, Refbuf11_P, img->width, img->height);
}
else
{
for (uv=0; uv < 2; uv++)
for (y=0; y < img->height_cr; y++)
memcpy(mcef[img->frame_cycle][uv][y],imgUV[uv][y],img->width_cr); // just copy 1/1 pix, interpolate "online"
GenerateFullPelRepresentation (mref[img->frame_cycle], Refbuf11[img->frame_cycle], img->width, img->height);
}
// Generate 1/1th pel representation (used for integer pel MV search)
}
/*!
************************************************************************
* \brief
* Find SNR for all three components
************************************************************************
*/
void find_snr()
{
int i,j;
int diff_y,diff_u,diff_v;
int impix;
// Calculate PSNR for Y, U and V.
// Luma.
impix = img->height*img->width;
diff_y=0;
for (i=0; i < img->width; ++i)
{
for (j=0; j < img->height; ++j)
{
diff_y += img->quad[abs(imgY_org[j][i]-imgY[j][i])];
}
}
// Chroma.
diff_u=0;
diff_v=0;
for (i=0; i < img->width_cr; i++)
{
for (j=0; j < img->height_cr; j++)
{
diff_u += img->quad[abs(imgUV_org[0][j][i]-imgUV[0][j][i])];
diff_v += img->quad[abs(imgUV_org[1][j][i]-imgUV[1][j][i])];
}
}
// Collecting SNR statistics
if (diff_y != 0)
{
snr->snr_y=(float)(10*log10(65025*(float)impix/(float)diff_y)); // luma snr for current frame
snr->snr_u=(float)(10*log10(65025*(float)impix/(float)(4*diff_u))); // u croma snr for current frame, 1/4 of luma samples
snr->snr_v=(float)(10*log10(65025*(float)impix/(float)(4*diff_v))); // v croma snr for current frame, 1/4 of luma samples
}
if (img->number == 0)
{
snr->snr_y1=(float)(10*log10(65025*(float)impix/(float)diff_y)); // keep luma snr for first frame
snr->snr_u1=(float)(10*log10(65025*(float)impix/(float)(4*diff_u))); // keep croma u snr for first frame
snr->snr_v1=(float)(10*log10(65025*(float)impix/(float)(4*diff_v))); // keep croma v snr for first frame
snr->snr_ya=snr->snr_y1;
snr->snr_ua=snr->snr_u1;
snr->snr_va=snr->snr_v1;
}
// B pictures
else
{
snr->snr_ya=(float)(snr->snr_ya*(img->number+Bframe_ctr)+snr->snr_y)/(img->number+Bframe_ctr+1); // average snr lume for all frames inc. first
snr->snr_ua=(float)(snr->snr_ua*(img->number+Bframe_ctr)+snr->snr_u)/(img->number+Bframe_ctr+1); // average snr u croma for all frames inc. first
snr->snr_va=(float)(snr->snr_va*(img->number+Bframe_ctr)+snr->snr_v)/(img->number+Bframe_ctr+1); // average snr v croma for all frames inc. first
}
}
/*!
************************************************************************
* \brief
* Just a placebo
************************************************************************
*/
Boolean dummy_slice_too_big(int bits_slice)
{
return FALSE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -