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

📄 ldecod.c

📁 AVS视频编解码器 能实现视频图像的高效率压缩 能在VC上高速运行
💻 C
📖 第 1 页 / 共 3 页
字号:
		for (i=0; i<4; i++)
			ref_fld[i] = reference_field[i];
		ref_fld[4] = reference_field[5];
 		current_field = reference_field[4];

		//luma for forward
		for (j=0;j<4;j++)//ref_index = 0
		{
			mref_fld[j] = ref_fld[j][0];
		}
		
		//chroma for forward
		for (j=0;j<4;j++)//ref_index = 0
			for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
			{
				mcef_fld[j][i] = ref_fld[j][i+1];
			}
			
		//luma for backward
		//forward/backward reference buffer
		for (i=0; i<2; i++)
		{
			f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
			b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
		}
		for (j=0;j<2;j++)//ref_index = 0 luma = 0
		{
			mref_fref_fld[j] = f_ref_fld[j][0];
			mref_bref_fld[j] = b_ref_fld[j][0];
		}
			
		//chroma for backward
		for (j=0;j<2;j++)//ref_index = 0
			for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
			{
				mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
				mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
			}
	}

		if((mref = (byte***)calloc(4,sizeof(byte**))) == NULL)
			no_mem_exit("alloc_mref: mcef");
		
		if((mcef = (byte****)calloc(4,sizeof(byte***))) == NULL)
			no_mem_exit("alloc_mref: mcef");
		
		for (i=0; i<4; i++)
		if((mcef[i] = (byte***)calloc(2,sizeof(byte**))) == NULL)
			no_mem_exit("alloc_mref: mcef");

	return (memory_size);
}

/*
*************************************************************************
* Function:Free allocated memory of frame size related global buffers
      buffers are defined in global.h, allocated memory is allocated in
      int init_global_buffers()
* Input:Input Parameters struct inp_par *inp, Image Parameters struct img_par *img
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void free_global_buffers(struct inp_par *inp, struct img_par *img)
{
  int  i,j;

  free_mem2D(imgY_prev);
  free_mem3D(imgUV_prev,2);

	if(!progressive_sequence)
	{
	  free (parity_fld);
		for (i=0; i<6; i++)
			for(j=0;j<3; j++)
			{
				free_mem2D(reference_field[i][j]);
			}
	}

	free (mref);
	for (i=0; i<2; i++)
		free (mcef[i]);
	free (mcef);


  free_mem2D (imgY_ref);
  free_mem3D (imgUV_ref,2);

  // free mem, allocated for structure img
  if (mb_data       != NULL) free(mb_data);

  j = (img->width/16)*(img->height/16);
  for (i=0; i<j; i++)
  {
    free (img->intra_block[i]);
  }

  free (img->intra_block);
  free_mem3Dint(img->mv_frm,img->width/B8_SIZE + 4);

  free_mem2Dint (img->ipredmode);

  free_mem3Dint(img->dfMV,img->width/B8_SIZE + 4);
  free_mem3Dint(img->dbMV,img->width/B8_SIZE + 4);


  free_mem2Dint(img->fw_refFrArr_frm);
  free_mem2Dint(img->bw_refFrArr_frm);

  free_mem3Dint(img->fw_mv,img->width/B8_SIZE + 4);
  free_mem3Dint(img->bw_mv,img->width/B8_SIZE + 4);

	for (i=0; i<3; i++)
		for(j=0;j<3; j++)
		{
			free_mem2D(reference_frame[i][j]);
		}

}

int get_direct_mv (int****** mv,int mb_x,int mb_y)
{
  int i, j, k, l;

  if ((*mv = (int*****)calloc(mb_y,sizeof(int****))) == NULL)
    no_mem_exit ("get_mem_mv: mv");
  for (i=0; i<mb_y; i++)
  {
    if (((*mv)[i] = (int****)calloc(mb_x,sizeof(int***))) == NULL)
      no_mem_exit ("get_mem_mv: mv");
    for (j=0; j<mb_x; j++)
    {
      if (((*mv)[i][j] = (int***)calloc(2,sizeof(int**))) == NULL)
        no_mem_exit ("get_mem_mv: mv");
      
      for (k=0; k<2; k++)
      {
        if (((*mv)[i][j][k] = (int**)calloc(2,sizeof(int*))) == NULL)
          no_mem_exit ("get_mem_mv: mv");
        for (l=0; l<2; l++)
          if (((*mv)[i][j][k][l] = (int*)calloc(3,sizeof(int))) == NULL)
            no_mem_exit ("get_mem_mv: mv");
      }
    }
  }
  return mb_x*mb_y*2*2*3*sizeof(int);
}

/*
*************************************************************************
* Function:Free memory from mv
* Input:int****** mv
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void free_direct_mv (int***** mv,int mb_x,int mb_y)
{
  int i, j, k, l;

  for (i=0; i<mb_y; i++)
  {
    for (j=0; j<mb_x; j++)
    {
      for (k=0; k<2; k++)
      {
        for (l=0; l<2; l++)
          free (mv[i][j][k][l]);
	
        free (mv[i][j][k]);
      }
      free (mv[i][j]);
    }
    free (mv[i]);
  }
  free (mv);
}

/*
*************************************************************************
* Function:update the decoder picture buffer
* Input:frame number in the bitstream and the video sequence
* Output:
* Return: 
* Attention:
*************************************************************************
*/


void Update_Picture_Buffers()
{ 
	unsigned char ***tmp;
	int i,j;
	
	tmp = ref_frm[1];       //ref[ref_index][yuv][height(height/2)][width] ref_index = 0,1 for P frame, ref_index = 0,1,2,3 for B frame
	ref_frm[1] = ref_frm[0];    // ref_index = 0, for B frame, ref_index = 0,1 for B field
	ref_frm[0] = current_frame;
	
	current_frame = tmp;	
	
	//forward/backward reference buffer
	f_ref_frm[0] = ref_frm[1]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
	b_ref_frm[0] = ref_frm[0]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
	
	//luma for forward
	for (j=0;j<2;j++)//ref_index = 0
	{
		mref_frm[j] = ref_frm[j][0];
	}
	
	//chroma for forward
	for (j=0;j<2;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_frm[j][i] = ref_frm[j][i+1];
		}
		
	//luma for backward
	for (j=0;j<1;j++)//ref_index = 0 luma = 0
	{
		mref_fref_frm[j] = f_ref_frm[j][0];
		mref_bref_frm[j] = b_ref_frm[j][0];
	}
	
	//chroma for backward
	for (j=0;j<1;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_fref_frm[j][i] = f_ref_frm[j][i+1];
			mcef_bref_frm[j][i] = b_ref_frm[j][i+1];
		}
}


void Update_Picture_top_field()
{ 
	unsigned char ***tmp;
	int i,j;
		
	//forward reference frame buffer
	tmp = ref_fld[4];
	
	  for (i=4; i>0; i--)
		ref_fld[i] = ref_fld[i-1];
	  
		ref_fld[0] = current_field;
		current_field = tmp;

		//forward/backward reference buffer
	  for (i=0; i<2; i++)
		{
		  f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
		  b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
		}
		
	//luma for forward
	for (j=0;j<4;j++)//ref_index = 0
	{
		mref_fld[j] = ref_fld[j][0];
	}
	
	//chroma for forward
	for (j=0;j<4;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_fld[j][i] = ref_fld[j][i+1];
		}
		
	//luma for backward
	for (j=0;j<2;j++)//ref_index = 0 luma = 0
	{
		mref_fref_fld[j] = f_ref_fld[j][0];
		mref_bref_fld[j] = b_ref_fld[j][0];
	}
	
	//chroma for backward
	for (j=0;j<2;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
			mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
		}
}

void Update_Picture_bot_field()
{ 
	unsigned char ***tmp;
	int i,j;
		
	//forward reference frame buffer
	tmp = ref_fld[4];
	
	for (i=4; i>0; i--)
		ref_fld[i] = ref_fld[i-1];

	ref_fld[0] = current_field;
	current_field = tmp;
		
	//forward/backward reference buffer
	for (i=0; i<2; i++)
	{
		f_ref_fld[i] = ref_fld[i+2]; //f_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
		b_ref_fld[i] = ref_fld[1-i]; //b_ref_frm[ref_index][yuv][height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
	}
	
	//luma for forward
	for (j=0;j<4;j++)//ref_index = 0
	{
		mref_fld[j] = ref_fld[j][0];
	}
	
	//chroma for forward
	for (j=0;j<4;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_fld[j][i] = ref_fld[j][i+1];
		}
		
	//luma for backward		
	for (j=0;j<2;j++)//ref_index = 0 luma = 0
	{
		mref_fref_fld[j] = f_ref_fld[j][0];
		mref_bref_fld[j] = b_ref_fld[j][0];
	}
	
	//chroma for backward
	for (j=0;j<2;j++)//ref_index = 0
		for (i=0;i<2;i++) // chroma uv =0,1; 1,2 for reference_frame
		{
			mcef_fref_fld[j][i] = f_ref_fld[j][i+1];
			mcef_bref_fld[j][i] = b_ref_fld[j][i+1];
		}
}

⌨️ 快捷键说明

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