⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.c

📁 网络MPEG4IP流媒体开发源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
  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 + -