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