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

📄 image.c

📁 avs-s最新代码,包括编码器和解码器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
}

void init_bot(struct img_par *img, struct inp_par *inp)
{
	int i,j;
	
	img->top_bot = 1; // Yulj 2004.07.20
	img->current_mb_nr = 0;
	
	for(i=0;i<img->width/(2*BLOCK_SIZE)+1;i++)          // set edge to -1, indicate nothing to predict from
  	{
	    img->ipredmode[i+1][0]=-1;
	    img->ipredmode[i+1][img->height/(2*BLOCK_SIZE)+1]=-1;
	}
	for(j=0;j<img->height/(2*BLOCK_SIZE)+1;j++)
	{
	    img->ipredmode[0][j+1]=-1;
	    img->ipredmode[img->width/(2*BLOCK_SIZE)+1][j+1]=-1;
	}
	
	img->ipredmode    [0][0]=-1;
		
	for(i=0; i<img->max_mb_nr; i++)
	{
		mb_data[i].slice_nr = -1; 
	}
	
#ifdef CRPS	
	//核心帧
	if(cur_core_frame_flag)
	{
		mref[0] = mref_fld[0];		
		mref[1] = core_reference_field[2*core_frame_ref_num+1][0];
		mref[2] = core_reference_field[2*core_frame_ref_num][0];
		mref[3] = mref_fld[1];

		mcef[0][0] = mcef_fld[0][0];
		mcef[1][0] = core_reference_field[2*core_frame_ref_num+1][1];
		mcef[2][0] = core_reference_field[2*core_frame_ref_num][1];
		mcef[3][0] = mcef_fld[1][0];

		mcef[0][1] = mcef_fld[0][1];
		mcef[1][1] = core_reference_field[2*core_frame_ref_num+1][2];
		mcef[2][1] = core_reference_field[2*core_frame_ref_num][2];
		mcef[3][1] = mcef_fld[1][1];
	}
	else
	{
#endif		
	//luma
	for (i=0;i<4;i++)
	{
		mref[i] = mref_fld[i]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
	}
	//chroma
	for(j=0;j<4;j++)
		for(i=0;i<2;i++)
	{
		mcef[j][i] = mcef_fld[j][i];       //mcef[ref_index][uv][height][width]
		}
#ifdef CRPS		
	}
#endif
		
	//forward/backward
	for (i=0;i<2;i++)
	{
		mref_fref[i] = mref_fref_fld[i]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
		mref_bref[i] = mref_bref_fld[i];
	}
		
	for(j=0;j<2;j++)
		for(i=0;i<2;i++)
		{
			mcef_fref[j][i] = 	mcef_fref_fld[j][i]; //mcef_fref[ref_index][uv][height/2][width]
			mcef_bref[j][i] = 	mcef_bref_fld[j][i];
		}
			
	imgY = imgY_bot =  current_field[0];
	imgUV = imgUV_bot = &current_field[1];
			
	img->mv = img->mv_bot;
	refFrArr = refFrArr_bot;
			
	img->fw_refFrArr = img->fw_refFrArr_bot;
	img->bw_refFrArr = img->bw_refFrArr_bot;
			
}

/*
*************************************************************************
* Function:
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void split_field_top()
{
  int i;

  imgY = imgY_top;
  imgUV = imgUV_top;
  
  for (i=0; i<img->height; i++)
  {
    memcpy(imgY[i], imgY_frm[i*2], img->width); 
  }
  
  for (i=0; i<img->height_cr; i++)
  {
    memcpy(imgUV[0][i], imgUV_frm[0][i*2], img->width_cr);
    memcpy(imgUV[1][i], imgUV_frm[1][i*2], img->width_cr);
  }
}

  
/*
*************************************************************************
* Function:extract bottom field from a frame 
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void split_field_bot()
{
  int i;
	
  imgY = imgY_bot;
  imgUV = imgUV_bot;
    
  for (i=0; i<img->height; i++)
  {
    memcpy(imgY[i], imgY_frm[i*2 + 1], img->width);
  }
  
  for (i=0; i<img->height_cr; i++)
  {
    memcpy(imgUV[0][i], imgUV_frm[0][i*2 + 1], img->width_cr);
    memcpy(imgUV[1][i], imgUV_frm[1][i*2 + 1], img->width_cr);
  }
}


/*
*************************************************************************
* Function:decodes one picture
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void picture_data(struct img_par *img,struct inp_par *inp)
{
#ifdef ERROR_CONTROL	
	//核心帧
	int tmp = 0;	
	int i = 0;
	int pixelX = 0, pixelY = 0;
	unsigned char MBisProcessed[MAX_MB_NR] = {0};
#endif
	unsigned char *Buf;
	int startcodepos,length; 
	const int mb_nr = img->current_mb_nr;
	int mb_width = img->width/16;
    	Macroblock *currMB = &mb_data[mb_nr];

#ifdef FLEXPICHEAD
	int last_okmb_pos = 0;
	int last_errormb_pos = 0;
	int mb_height = img->height/16;
     if(part_first_slice_read_ok)
	 {
		 currStream->frame_bitoffset = currStream->frame_bitoffset;                 
		 CopyFromPreviousFrame(0, img->current_mb_nr-1);
	 }
	 else 
#endif
		 currStream->frame_bitoffset = 0;
	//currStream->frame_bitoffset = 0; // jlzheng 6.30          
	currentbitoffset = currStream->frame_bitoffset;   // jlzheng 6.30
    img->current_slice_nr = -1;             // jlzheng 6.30	
	currentbitoffset = currStream->frame_bitoffset;   // jlzheng 6.30
//	currStream->frame_bitoffset = 0;                  // jlzheng 6.30
	if ((Buf = (char*)calloc (MAX_CODED_FRAME_SIZE , sizeof(char))) == NULL) 
		no_mem_exit("GetAnnexbNALU: Buf");	 //jlzheng  6.30

   	img->cod_counter=-1;

  while (img->current_mb_nr<img->PicSizeInMbs) // loop over macroblocks
  {
	  //decode slice header   jlzheng 6.30
	  if(slice_set_enable || (!slice_set_enable&&img->current_mb_nr%mb_width ==0)) //added by mz, 2008.04
	  {
		  if(img->cod_counter<=0)
		  {
#ifdef FLEXPICHEAD			
			  if(!part_first_slice_read_ok)
			  { 
#endif
				  if(checkstartcode())
				  {
					  GetOneUnit(Buf,&startcodepos,&length);
	#ifdef ERROR_CONTROL
					  //错误保护
					  if (  ( Buf[startcodepos] == SEQUENCE_HEADER_CODE)
						  || ( Buf[startcodepos] == I_PICTURE_START_CODE)
						  || ( Buf[startcodepos] == PB_PICTURE_START_CODE ) )
					  {
						  prevPictureheaderloss = 1;
						  memcpy ( gBuf, Buf, length );
						  gbuflen = length;
						  gstartcodepos = startcodepos;
						  img->current_mb_nr = 0;
#ifdef FLEXPICHEAD						  
						  last_errormb_pos = img->PicSizeInMbs;
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
						  break;
					  }
					  
					  tmp = SliceHeader(Buf,startcodepos,length);	
#ifdef FLEXPICHEAD
					  if(tmp>mb_width*mb_height || tmp < 0)
					  {
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);//需要处理缺帧头的情况
						  break;
					  }
#endif
					  if ( MBisProcessed[tmp]==1)
					  {
#ifdef FLEXPICHEAD
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
						  break;
					  }				  
					  img->current_mb_nr = tmp;
					  //错误保护 end
#ifdef FLEXPICHEAD
					  if (img->current_mb_nr != last_okmb_pos)//有SLICE丢失
							CopyFromPreviousFrame(last_okmb_pos, img->current_mb_nr-1);
#endif
					  
	#else				  
						SliceHeader(Buf,startcodepos,length);
	#endif					
					  img->current_slice_nr++;
					  img->cod_counter = -1; // Yulj 2004.07.15
				  }
#ifdef FLEXPICHEAD
			  }
			   part_first_slice_read_ok = FALSE;
#endif
		  }
	  }  //decode slice header   

    if(img->current_mb_nr == 0)
		img->current_slice_nr = 0;
	mb_data[img->current_mb_nr].slice_nr = img->current_slice_nr;     // jlzheng 6.30
    //added by mz, 2008.04
	if(slice_set_enable)
		mb_data[img->current_mb_nr].slice_set_index = img->current_slice_set_index;


#if TRACE
    // Here was the slice nr from the mb_data used.  This slice number is only set after 
    // the reconstruction of an MB and hence here not yet valid
    fprintf(p_trace,"\n*********** Pic: %i (I/P) MB: %i Slice: %i Type %d **********\n", img->tr, img->current_mb_nr, img->current_slice_nr, img->type);
#endif
    
    // Initializes the current macroblock
    start_macroblock(img,inp);
    // Get the syntax elements from the NAL
    read_one_macroblock(img,inp);
#ifdef ERROR_CONTROL
		//错误保护
		if( bBitstreamErr )
		{
			break;
		}
#endif		
    // decode one macroblock
    decode_one_macroblock(img,inp);
#ifdef ERROR_CONTROL
	  //错误保护
		MBisProcessed[img->current_mb_nr] = 1;
#endif		
    img->current_mb_nr++;
	
#ifdef FLEXPICHEAD	
	last_okmb_pos = img->current_mb_nr;
#endif
  }

  free(Buf);

  DeblockFrame (img, imgY, imgUV);

#ifdef BACKGROUND
	{
		int j;
		int i;
		if(img->type == P_IMG && img->typeb == BP_IMG){
			for(j = 0; j < img->height/8; j++)
				for(i = 0; i < img->width/8; i++)
					refFrArr[j][i] = -1;
		}
			
	}
#endif

}


void top_field(struct img_par *img,struct inp_par *inp)
{
#ifdef ERROR_CONTROL
  //错误保护
	int tmp = 0;	
	int i = 0;
	int pixelX = 0, pixelY = 0;
	unsigned char MBisProcessed[MAX_MB_NR/2] = {0};
#endif	
  	unsigned char *Buf;
	int startcodepos,length; 
	const int mb_nr = img->current_mb_nr;
	int mb_width = img->width/16;
	
    	Macroblock *currMB = &mb_data[mb_nr];

#ifdef FLEXPICHEAD
	int last_okmb_pos = 0;
	int last_errormb_pos = 0;
	int mb_height = img->height/16;
	
     if(part_first_slice_read_ok)
	 {
		 currStream->frame_bitoffset = currStream->frame_bitoffset;                 
		 CopyFromPreviousFrame(0, img->current_mb_nr-1);
	 }
	 else 
#endif
		 currStream->frame_bitoffset = 0;
         
	currentbitoffset = currStream->frame_bitoffset;   // jlzheng 6.30
	
    	img->current_slice_nr = -1;             // jlzheng 6.30
	currentbitoffset = currStream->frame_bitoffset;   // jlzheng 6.30
//	currStream->frame_bitoffset = 0; 
	if ((Buf = (char*)calloc (MAX_CODED_FRAME_SIZE , sizeof(char))) == NULL)
		no_mem_exit("GetAnnexbNALU: Buf");	 //jlzheng

	img->cod_counter=-1;
	
	
  while (img->current_mb_nr<img->PicSizeInMbs) // loop over macroblocks
  {
      //decode slice header   jlzheng 6.30
	  if(slice_set_enable ||(!slice_set_enable&&img->current_mb_nr%mb_width ==0))  //added by mz, 2008.04
	  {
		  if(img->cod_counter<=0)
		  {
#ifdef FLEXPICHEAD			
			  if(!part_first_slice_read_ok)
			  { 
#endif
				  if(checkstartcode())
				  {
					  GetOneUnit(Buf,&startcodepos,&length);

	#ifdef ERROR_CONTROL
			  		//错误保护
					  if (  ( Buf[startcodepos] == SEQUENCE_HEADER_CODE)
						  || ( Buf[startcodepos] == I_PICTURE_START_CODE)
						  || ( Buf[startcodepos] == PB_PICTURE_START_CODE ) )
					  {
						  prevPictureheaderloss = 1;
						  memcpy ( gBuf, Buf, length );
						  gbuflen = length;
						  gstartcodepos = startcodepos;
						  img->current_mb_nr = 0;
#ifdef FLEXPICHEAD						  
						  last_errormb_pos = img->PicSizeInMbs;
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
						  break;
					  }				  

					  tmp = SliceHeader ( Buf, startcodepos, length );
#ifdef FLEXPICHEAD
					  if(tmp>mb_width*mb_height || tmp < 0)
					  {
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);//需要处理缺帧头的情况
						  break;
					  }
#endif
					  if ( ( MBisProcessed[tmp] == 1 ) || ( tmp >= img->PicSizeInMbs ) || ( tmp < 0 ) )
					  {
#ifdef FLEXPICHEAD
						  CopyFromPreviousFrame(last_okmb_pos, img->PicSizeInMbs-1);
#endif
						  break;
					  }				  
					  img->current_mb_nr = tmp;
					  //错误保护end
#ifdef FLEXPICHEAD
					  if (img->current_mb_nr != last_okmb_pos)//有SLICE丢失
							CopyFromPreviousFrame(last_okmb_pos, img->current_mb_nr-1);
#endif
	#else
						SliceHeader(Buf,startcodepos,length);				  
	#endif				  
					  img->current_slice_nr++;
					  img->cod_counter = -1; // Yulj 2004.07.15
				  }
#ifdef FLEXPICHEAD
			  }
			   part_first_slice_read_ok = FALSE;
#endif
		  }
	  }  //decode slice header 

	if(img->current_mb_nr == 0)
    img->current_slice_nr = 0;
	mb_data[img->current_mb_nr].slice_nr = img->current_slice_nr;   // jlzheng 6.30
	//added by mz, 2008.04
	if(slice_set_enable)
		mb_data[img->current_mb_nr].slice_set_index = img->current_slice_set_index;

		
#if TRACE
    // Here was the slice nr from the mb_data used.  This slice number is only set after 
    // the reconstruction of an MB and hence here not yet valid

⌨️ 快捷键说明

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