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

📄 image.c

📁 avs源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
        for (j = 0; j < img->width / BLOCK_SIZE + 4; j++)
        {
          tmp_fwMV[k][i][j] = 0;
          tmp_bwMV[k][i][j] = 0;
          dfMV[k][i][j] = 0;
          dbMV[k][i][j] = 0;
        }

    for (i = 0; i < img->height / BLOCK_SIZE; i++)
      for (j = 0; j < img->width / BLOCK_SIZE; j++)
      {
        fw_refFrArr[i][j] = bw_refFrArr[i][j] = -1;
      }
		}    
  }
  
  img->total_number_mb = (img->width * img->height) / (MB_BLOCK_SIZE * MB_BLOCK_SIZE); 


}


void init_field ()
{

  img->current_mb_nr = 0;
  img->current_slice_nr = 0;
  stat->bit_slice = 0;
  img->coded_mb_nr = 0;
  
  img->mb_y = img->mb_x = 0;
  img->block_y = img->pix_y = img->pix_c_y = 0; 
  img->block_x = img->pix_x = img->block_c_x = img->pix_c_x = 0;

  //---Yulj 2004.07.15
		{
		int widthMB, heightMB;
		widthMB = img->width  / MB_BLOCK_SIZE;
		heightMB = img->height / MB_BLOCK_SIZE;
		img->mb_no_currSliceLastMB = ( input->slice_row_nr != 0 )
		                           ? min(input->slice_row_nr * widthMB - 1, widthMB * heightMB - 1)
														   : widthMB * heightMB - 1 ;
		}
	//---end.
	
  img->total_number_mb = (img->width * img->height) / (MB_BLOCK_SIZE * MB_BLOCK_SIZE);  
}

/*
*************************************************************************
* Function:Writes reconstructed image(s) to file
           This can be done more elegant!
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

static void write_reconstructed_image ()
{
  int i, j, k;
  int start = 0, inc = 1;
  
  if (p_dec != NULL)
  {
    if (img->type != B_IMG)
    {
      // write reconstructed image (IPPP)
      if (input->successive_Bframe == 0)
      {
        for (i = start; i < img->height; i += inc)
          for (j = 0; j < img->width; j++)
            fputc (imgY[i][j], p_dec);
          
        for (k = 0; k < 2; ++k)
          for (i = start; i < img->height / 2; i += inc)
            for (j = 0; j < img->width / 2; j++)
              fputc (imgUV[k][i][j], p_dec);
      }
      // write reconstructed image (IBPBP) : only intra written
      else if (IMG_NUMBER == 0 && input->successive_Bframe != 0)
      {
        for (i = start; i < img->height; i += inc)
          for (j = 0; j < img->width; j++)
            fputc (imgY[i][j], p_dec);
          
					
        for (k = 0; k < 2; ++k)
          for (i = start; i < img->height / 2; i += inc)
            for (j = 0; j < img->width / 2; j++)
            {
							//imgUV[1][i][j]=0;
						  fputc (imgUV[k][i][j], p_dec);
						}
      }
      
      // next P picture. This is saved with recon B picture after B picture coding
      if (IMG_NUMBER != 0 && input->successive_Bframe != 0)
      {
        for (i = start; i < img->height; i += inc)
          for (j = 0; j < img->width; j++)
            nextP_imgY[i][j] = imgY[i][j];

        for (k = 0; k < 2; ++k)
          for (i = start; i < img->height / 2; i += inc)
            for (j = 0; j < img->width / 2; j++)
              nextP_imgUV[k][i][j] = imgUV[k][i][j];
      }
    }
    else
    {
      for (i = start; i < img->height; i += inc)
        for (j = 0; j < img->width; j++)
          fputc (imgY[i][j], p_dec);

      for (k = 0; k < 2; ++k)
        for (i = start; i < img->height / 2; i += inc)
          for (j = 0; j < img->width / 2; j++)
            fputc (imgUV[k][i][j], p_dec);
            
      // If this is last B frame also store P frame
      if (img->b_frame_to_code == input->successive_Bframe)
      {
        // save P picture
        for (i = start; i < img->height; i += inc)
          for (j = 0; j < img->width; j++)
            fputc (nextP_imgY[i][j], p_dec);

        for (k = 0; k < 2; ++k)
          for (i = start; i < img->height / 2; i += inc)
            for (j = 0; j < img->width / 2; j++)
              fputc (nextP_imgUV[k][i][j], p_dec);
      }
    }
  }
}

/*
*************************************************************************
* Function:Choose interpolation method depending on MV-resolution
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void interpolate_frame_to_fb ()
{                             // write to mref[]
  UnifiedOneForthPix (imgY, imgUV[0], imgUV[1], mref[0]);
}

/*
*************************************************************************
* Function:Upsample 4 times, store them in out4x.  Color is simply copied
* Input:srcy, srcu, srcv, out4y, out4u, out4v
* Output:
* Return: 
* Attention:Side Effects_
     Uses (writes) img4Y_tmp.  This should be moved to a static variable
     in this module
*************************************************************************
*/
#define  IClip( Min, Max, Val) (((Val)<(Min))? (Min):(((Val)>(Max))? (Max):(Val)))

static void UnifiedOneForthPix (pel_t ** imgY, pel_t ** imgU, pel_t ** imgV,
                                pel_t ** out4Y)
{
    int is;
    int i, j;// j4;
    int ie2, je2, jj, maxy;

    //horizonal 1/2 interpolation
    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 = IClip (0, img->height - 1, j);
            is = 5 * (imgY[jj][IClip (0, img->width - 1, i)] + imgY[jj][IClip (0, img->width - 1, i + 1)]) +
                   - (imgY[jj][IClip (0, img->width - 1, i - 1)] + imgY[jj][IClip (0, img->width - 1, i + 2)]);
            //store horizonal 1/2 pixel value
            img4Y_tmp[(j + IMG_PAD_SIZE)*4][(i + IMG_PAD_SIZE) * 4 + 2] = is;
            //store 1/1 pixel vaule
            img4Y_tmp[(j + IMG_PAD_SIZE)*4][(i + IMG_PAD_SIZE) * 4] = imgY[IClip (0, img->height - 1, j)][IClip (0, img->width - 1, i)]*8;
        }

    //vertical 1/2 interpolation
    for (i = 0; i < (img->width + 2 * IMG_PAD_SIZE) * 4; i+=2)
    {
        for (j = 0; j < (img->height + 2 * IMG_PAD_SIZE) * 4; j+=4)
        {
            maxy = (img->height + 2 * IMG_PAD_SIZE) * 4 - 4;
            is = 5 * (img4Y_tmp[j][i] + img4Y_tmp[min (maxy, j + 4)][i])
                   - (img4Y_tmp[max (0, j - 4)][i] + img4Y_tmp[min (maxy, j + 8)][i]);
            img4Y_tmp[j + 2][i] =is;
        }
        for (j = 0; j < (img->height + 2 * IMG_PAD_SIZE) * 4; j+=4)
        {
            img4Y_tmp[j][i] =img4Y_tmp[j][i]*8;
        }
    }
        // 1/4 pix
    ie2 = (img->width  + 2 * IMG_PAD_SIZE - 1) * 4;
    je2 = (img->height + 2 * IMG_PAD_SIZE - 1) * 4;

    //horizonal 1/4 interpolation
    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
        for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i += 2)
        {
            //  '-'
            img4Y_tmp[j][i+1]=IClip (0,255,
                                       (int) ((1* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i-2)] +
                                               7* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i  )] +
                                               7* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i+2)] +
                                               1* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i+4)] + 512)/ 1024)
                                    );
        }

     //vertical 1/4 interpolation
     for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i++)
     {
            for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
            {
                // '|'
                if (i % 2 == 0)
                {
                    img4Y_tmp[j+1][i]=IClip(0,255,
                                            (int) ((1* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j-2)][i] +
                                                    7* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j  )][i] +
                                                    7* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j+2)][i] +
                                                    1* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j+4)][i] + 512) / 1024)
                                            );
                }

                else if (j % 4 == 0 && i % 4 == 1)
                {
                    // '\'
                    img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j+2][i+1] + img4Y_tmp[j][i-1] + 64) / 128)
                                            );
                }
                else if(j % 4 == 2 && i % 4 == 3){
                   img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j][i-1]
                                                    + img4Y_tmp[min((img->height + 2 * IMG_PAD_SIZE - 1) * 4, j+2)][min((img->width + 2 * IMG_PAD_SIZE - 1) * 4, i+1)] + 64 )/ 128)
                                                    );

                }
                else if(j % 4 == 0 && i % 4 == 3)
                {
                    //  '/'
                    img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j+2][i-1]
                                            + img4Y_tmp[j][min((img->width + 2 * IMG_PAD_SIZE - 1) * 4, i+1)] + 64) / 128)
                                            );
                }
                else if(j % 4 == 2 && i % 4 == 1){
                    //  '/'
                   img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j][i+1]
                                            + img4Y_tmp[min((img->height + 2 * IMG_PAD_SIZE - 1) * 4, j+2)][i-1] + 64) / 128)
                                            );
                }

            }
        }


    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
               for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i += 2)
               {
                  img4Y_tmp[j][i]=IClip(0, 255, (int) (img4Y_tmp[j][i] + 32) / 64);
               }


    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j ++)
        for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i ++)
        {
           PutPel_14 (out4Y, j - IMG_PAD_SIZE * 4, i - IMG_PAD_SIZE * 4, (pel_t) img4Y_tmp[j][i]);
        }
}

static void UnifiedOneForthPix_old (pel_t ** imgY, pel_t ** imgU, pel_t ** imgV,
                                pel_t ** out4Y)
{
    int is;
    int i, j;// j4;
    int ie2, je2, jj, maxy;

    //horizonal 1/2 interpolation
    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 = IClip (0, img->height - 1, j);
            is = 5 * (imgY[jj][IClip (0, img->width - 1, i)] + imgY[jj][IClip (0, img->width - 1, i + 1)]) +
                   - (imgY[jj][IClip (0, img->width - 1, i - 1)] + imgY[jj][IClip (0, img->width - 1, i + 2)]);
            //store horizonal 1/2 pixel value
            img4Y_tmp[(j + IMG_PAD_SIZE)*4][(i + IMG_PAD_SIZE) * 4 + 2] = is;
            //store 1/1 pixel vaule
            img4Y_tmp[(j + IMG_PAD_SIZE)*4][(i + IMG_PAD_SIZE) * 4] = imgY[IClip (0, img->height - 1, j)][IClip (0, img->width - 1, i)]*8;
        }

    //vertical 1/2 interpolation
    for (i = 0; i < (img->width + 2 * IMG_PAD_SIZE) * 4; i+=2)
    {
        for (j = 0; j < (img->height + 2 * IMG_PAD_SIZE) * 4; j+=4)
        {
            maxy = (img->height + 2 * IMG_PAD_SIZE) * 4 - 4;
            is = 5 * (img4Y_tmp[j][i] + img4Y_tmp[min (maxy, j + 4)][i])
                   - (img4Y_tmp[max (0, j - 4)][i] + img4Y_tmp[min (maxy, j + 8)][i]);
            img4Y_tmp[j + 2][i] =is;
        }
        for (j = 0; j < (img->height + 2 * IMG_PAD_SIZE) * 4; j+=4)
        {
            img4Y_tmp[j][i] =img4Y_tmp[j][i]*8;
        }
    }
        // 1/4 pix
    ie2 = (img->width  + 2 * IMG_PAD_SIZE - 1) * 4;
    je2 = (img->height + 2 * IMG_PAD_SIZE - 1) * 4;

    //horizonal 1/4 interpolation
    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
        for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i += 2)
        {
            //  '-'
            img4Y_tmp[j][i+1]=IClip (0,255,
                                       (int) ((1* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i-2)] +
                                               7* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i  )] +
                                               7* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i+2)] +
                                               1* img4Y_tmp[j][IClip (0, (img->width + 2 * IMG_PAD_SIZE) * 4 - 2, i+4)] + 512)/ 1024)
                                    );
        }

     //vertical 1/4 interpolation
     for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i++)
     {
            for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
            {
                // '|'
                if (i % 2 == 0)
                {
                    img4Y_tmp[j+1][i]=IClip(0,255,
                                            (int) ((1* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j-2)][i] +
                                                    7* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j  )][i] +
                                                    7* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j+2)][i] +
                                                    1* img4Y_tmp[IClip (0, (img->height + 2 * IMG_PAD_SIZE) * 4 - 2, j+4)][i] + 512) / 1024)
                                            );
                }

                else if (j % 4 == 0 && i % 4 == 1)
                {
                    // '\'
                    img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j+2][i+1] + img4Y_tmp[j][i-1] + 64) / 128)
                                            );
                }
                else if(j % 4 == 2 && i % 4 == 3){
                   img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j][i-1]
                                                    + img4Y_tmp[min((img->height + 2 * IMG_PAD_SIZE - 1) * 4, j+2)][min((img->width + 2 * IMG_PAD_SIZE - 1) * 4, i+1)] + 64 )/ 128)
                                                    );

                }
                else if(j % 4 == 0 && i % 4 == 3)
                {
                    //  '/'
                    img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j+2][i-1]
                                            + img4Y_tmp[j][min((img->width + 2 * IMG_PAD_SIZE - 1) * 4, i+1)] + 64) / 128)
                                            );
                }
                else if(j % 4 == 2 && i % 4 == 1){
                    //  '/'
                   img4Y_tmp[j+1][i]=IClip(0, 255,
                                            (int) ((img4Y_tmp[j][i+1]
                                            + img4Y_tmp[min((img->height + 2 * IMG_PAD_SIZE - 1) * 4, j+2)][i-1] + 64) / 128)
                                            );
                }

            }
        }


    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j += 2)
               for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i += 2)
               {
                  img4Y_tmp[j][i]=IClip(0, 255, (int) (img4Y_tmp[j][i] + 32) / 64);
               }


    for (j = 0; j < (img->height  + 2 * IMG_PAD_SIZE)*4; j ++)
        for (i = 0; i < (img->width  + 2 * IMG_PAD_SIZE)*4; i ++)
        {
           PutPel_14 (out4Y, j - IMG_PAD_SIZE * 4, i - IMG_PAD_SIZE * 4 ,img4Y_tmp[j][i]);
        }
}

/*
*************************************************************************
* Function:Find SNR for all three components
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

static 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[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++)
    {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -