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

📄 image.c

📁 avs-s最新代码,包括编码器和解码器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  else
  {
    img->p_interval = input->jumpd + 1;
    prevP_no = (IMG_NUMBER - 1) * img->p_interval;
    nextP_no = (IMG_NUMBER) * img->p_interval;
    
    img->b_interval =
      (int) ((float) (input->jumpd + 1) / (input->successive_Bframe + 1.0) + 0.49999);
    
    img->tr = prevP_no + img->b_interval * img->b_frame_to_code;      // from prev_P

//	picture_distance = ((IMG_NUMBER - 1) * (input->jumpd + 1) + img->b_interval * img->b_frame_to_code)%256;	//Hisilicon XiaoZhen Zheng 20070327
	
	if(img->Seqheader_flag==1)
		picture_distance = ((IMG_NUMBER - 1) * (input->jumpd + 1) + img->b_interval * img->b_frame_to_code)%256-img->last_picture_distance;	//Hisilicon XiaoZhen Zheng 20070405
	else
		picture_distance = ((IMG_NUMBER - 1) * (input->jumpd + 1) + img->b_interval * img->b_frame_to_code)%256-img->curr_picture_distance;	//Hisilicon XiaoZhen Zheng 20070405
	
//	picture_distance = ((IMG_NUMBER - 1) * (input->jumpd + 1) + img->b_interval * img->b_frame_to_code)%256-img->last_picture_distance;	//Hisilicon XiaoZhen Zheng 20070405
      
    if (img->tr >= nextP_no)
      img->tr = nextP_no - 1;
    
    //Rate control
    if(!input->RCEnable)
      img->qp = input->qpB;
    
    // initialize arrays
	//Commented by qihuafei, 20070927
	/*	if(!img->picture_structure) //field coding
		{
				for (k = 0; k < 2; k++)
					for (i = 0; i < img->height / BLOCK_SIZE; i++)
						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 / B8_SIZE; i++)
							for (j = 0; j < img->width / BLOCK_SIZE; j++)
							{
								fw_refFrArr[i][j] = bw_refFrArr[i][j] = -1;
							}
		}else
	*/
    {
	for (k = 0; k < 2; k++)
      for (i = 0; i < img->height / BLOCK_SIZE; i++)
        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;
        }
	//Modified by qihuafei, 20070928
	if (input->InterlaceCodingOption==FRAME)
	{
		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
  if(!input->slice_set_enable)    //added by mz, 2008.04.07
  {
	  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)
			{
#ifdef BACKGROUND
				if(img->typeb == BACKGROUND_IMG && input->backgroundOutput == 0)
					return;
#endif
				for (i = start; i < img->height; i += inc)
					for (j = 0; j < img->width; j++)
						fputc (imgY[i][j], p_dec);
				//4:0:0 WANGJP START
				if (input->chroma_format)
				{
					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);
				}
				else
				{
					for (k = 0; k < 2; ++k)
						for (i = start; i < img->height / 2; i += inc)
							for (j = 0; j < img->width / 2; j++)
								fputc (128, p_dec);
				}
				//WANGJP END
			}
			// write reconstructed image (IBPBP) : only intra written
			else if (IMG_NUMBER == 0 && input->successive_Bframe != 0)
			{
#ifdef BACKGROUND
				if(img->typeb == BACKGROUND_IMG && input->backgroundOutput == 0)
					return;
#endif
				for (i = start; i < img->height; i += inc)
					for (j = 0; j < img->width; j++)
						fputc (imgY[i][j], p_dec);

				//4:0:0 WANGJP START
				if (input->chroma_format)
				{
					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);
							}
				}
				else
				{
					for (k = 0; k < 2; ++k)
						for (i = start; i < img->height / 2; i += inc)
							for (j = 0; j < img->width / 2; j++)
							{
								fputc (128, p_dec);
							}
				}
				//WANGJP END
			}

			// next P picture. This is saved with recon B picture after B picture coding
			if (IMG_NUMBER != 0 && input->successive_Bframe != 0)
			{
#ifdef BACKGROUND
				nextP_type = img->typeb;	
				nextP_output = input->backgroundOutput;
#endif
				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);

			//4:0:0 WANGJP START
			if (input->chroma_format)
			{
				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);
			}
			else
			{
				for (k = 0; k < 2; ++k)
					for (i = start; i < img->height / 2; i += inc)
						for (j = 0; j < img->width / 2; j++)
							fputc (128, p_dec);
			}
			//WANGJP END

			// If this is last B frame also store P frame
			if (img->b_frame_to_code == input->successive_Bframe)
			{
#ifdef BACKGROUND
				if(nextP_type == BACKGROUND_IMG && nextP_output == 0)
					return;
#endif
				// 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);

				//4:0:0 WANGJP START
				if (input->chroma_format)
				{
					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);
				}
				else
				{
					for (k = 0; k < 2; ++k)
						for (i = start; i < img->height / 2; i += inc)
							for (j = 0; j < img->width / 2; j++)
								fputc (128, p_dec);
				}
				//WANGJP END
			}
		}
	}
}

/*
*************************************************************************
* 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]);

#ifdef BACKGROUND
  if(img->typeb == BACKGROUND_IMG)
		UnifiedOneForthPix (imgY, imgUV[0], imgUV[1], mref_background);
#endif
}

/*
*************************************************************************
* 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;

⌨️ 快捷键说明

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