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

📄 image.c

📁 avs-s最新代码,包括编码器和解码器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
			length = gbuflen;
			startcodepos =  gstartcodepos;
			memcpy ( Buf, gBuf, length );		
		}
		else
		{
			do{			
				StartCodePosition = GetOneUnit(Buf,&startcodepos,&length);    //jlzheng  7.5
#ifdef FLEXPICHEAD
				if((Buf[startcodepos] < SLICE_START_CODE_MAX) && (Buf[startcodepos] >= SLICE_START_CODE_MIN))
				{
					temp = SliceHeader(Buf,startcodepos,length);
					if(slice_picture_header_flag)     //条带有图象头部分参数
					{	
						img->current_mb_nr = temp;
						part_first_slice_read_ok = TRUE;
						return 999;
					}
					else                          //条带无图象头参数
						continue;

				}
#endif
			}while ( ( Buf[startcodepos] != SEQUENCE_HEADER_CODE )
				&& ( Buf[startcodepos] != EXTENSION_START_CODE )
				&& ( Buf[startcodepos] != USER_DATA_START_CODE )
				&& ( Buf[startcodepos] != VIDEO_EDIT_CODE )
				&& ( Buf[startcodepos] != I_PICTURE_START_CODE )
				&& ( Buf[startcodepos] != PB_PICTURE_START_CODE )
				&& ( Buf[startcodepos] != SEQUENCE_END_CODE )
				);
				
		}
		prevPictureheaderloss = 0;
#else
			StartCodePosition = GetOneUnit(Buf,&startcodepos,&length);    //jlzheng  7.5
#endif		
        switch(Buf[startcodepos])
        {
        case SEQUENCE_HEADER_CODE:
            SequenceHeader(Buf,startcodepos,length);
            break;
        case EXTENSION_START_CODE:
            extension_data(Buf,startcodepos,length);
            break;
        case USER_DATA_START_CODE:
            user_data(Buf,startcodepos,length);
            break;
        case VIDEO_EDIT_CODE:
            video_edit_code_data(Buf,startcodepos,length);
            break;
        case I_PICTURE_START_CODE:
            I_Picture_Header(Buf,startcodepos,length);
            calc_picture_distance(img);
            free(Buf);
            return SOP;
        case PB_PICTURE_START_CODE:
            PB_Picture_Header(Buf,startcodepos,length);
            calc_picture_distance(img);
			free(Buf);
			return SOP;
        case SEQUENCE_END_CODE:
            free(Buf);
            return EOS;
            break;
        default:
            if (Buf[startcodepos]>=SLICE_START_CODE_MIN && Buf[startcodepos]<=SLICE_START_CODE_MAX) { 
                break;
            } else {
                printf("Can't find start code");
                free(Buf);
                return EOS;
            }
        }
    }
    
}

/*
*************************************************************************
* Function:Initializes the parameters for a new frame
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/


void init_frame(struct img_par *img, struct inp_par *inp)
{
  static int first_P = TRUE;
  int i,j;


  img->top_bot = -1; // Yulj 2004.07.20
  last_P_no = last_P_no_frm;
  nextP_tr = nextP_tr_frm;

  if (img->number == 0) // first picture
  {
//    nextP_tr=prevP_tr=img->tr;           // Xiaozhen ZHENG
	  nextP_tr=prevP_tr=img->pic_distance; // Xiaozhen ZHENG, 2007.05.01
  }
  else if(img->type == I_IMG || img->type == P_IMG )
  {
//    nextP_tr=img->tr;             // Commented by Xiaozhen ZHENG, 2007.05.01
	  nextP_tr=img->pic_distance;   // Added by Xiaozhen ZHENG, 2007.05.01
    
    if(first_P) // first P picture
    {
      first_P = FALSE;
      P_interval=nextP_tr-prevP_tr; //! TO 4.11.2001 we get problems here in case the first P-Frame was lost
    }

	//added by  Zheng Xiaozhen, HiSilicon, 2007.03.21 Begin
	if (p_ref)
	    find_snr(snr,img,p_ref);      // if ref sequence exist

	if(pre_img_type == I_IMG){ // I picture
#ifdef BACKGROUND
		if(pre_img_typeb == BACKGROUND_IMG)
			fprintf(stdout,"%3d(G)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
        		FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
		else
			fprintf(stdout,"%3d(I)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
        	FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#else
		fprintf(stdout,"%3d(I)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
        	FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#endif
	}
  	 else if(pre_img_type == P_IMG) // P pictures
     {
         if (pre_img_types == I_IMG){
#ifdef BACKGROUND
             if(pre_img_typeb == BACKGROUND_IMG)
				 fprintf(stdout,"%3d(G)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
					FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);   //jlzheng 7.3
			 else
				 fprintf(stdout,"%3d(I)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
					FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);   //jlzheng 7.3
#else
			fprintf(stdout,"%3d(I)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
             FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);   //jlzheng 7.3
#endif
		 }
		 else{
#ifdef BACKGROUND
			if(pre_img_typeb == BP_IMG)
				fprintf(stdout,"%3d(S)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
					FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
			else
				fprintf(stdout,"%3d(P)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
					FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#else
             fprintf(stdout,"%3d(P)  %3d %5d %7.4f %7.4f %7.4f %5d\n",
             FrameNum, pre_img_tr, pre_img_qp,snr->snr_y,snr->snr_u,snr->snr_v,pre_tmp_time);
#endif
		 } 
	}

	 report_frame(snr,pre_tmp_time);
	//added by  Zheng Xiaozhen, HiSilicon, 2007.03.21 End 

    write_prev_Pframe(img, p_out);  // imgY_prev, imgUV_prev -> file
  }

  // allocate memory for frame buffers
  if (img->number == 0) 
  {
   init_global_buffers(inp, img); 
  }

  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)
  {  	
	  //luma
	mref[0] = core_reference_frame[core_frame_ref_num][0];
	mref[1] = mref_frm[0];
	mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
	mref_bref[0] = mref_bref_frm[0];	
    //chroma
    mcef[0][0] = core_reference_frame[core_frame_ref_num][1];       //mcef[ref_index][uv][height][width]
	mcef[0][1] = core_reference_frame[core_frame_ref_num][2];
	mcef[1][0] = mcef_frm[0][0];
	mcef[1][1] = mcef_frm[0][1];
	mcef_fref[0][0] = 	mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
	mcef_fref[0][1] = 	mcef_fref_frm[0][1];
	mcef_bref[0][0] = 	mcef_bref_frm[0][0];
 	mcef_bref[0][1] =   mcef_bref_frm[0][1]; 
  }
  else
  {
#endif  	
	//luma
	mref[0] = mref_frm[0]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
	mref[1] = mref_frm[1]; 
	mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
	mref_bref[0] = mref_bref_frm[0];
		
	//chroma
	mcef[0][0] = mcef_frm[0][0];       //mcef[ref_index][uv][height][width]
	mcef[0][1] = mcef_frm[0][1];
	mcef[1][0] = mcef_frm[1][0];
	mcef[1][1] = mcef_frm[1][1];

#ifdef BACKGROUND
	mref[2] = background_frame[0];
	mcef[2][0] = background_frame[1];
	mcef[2][1] = background_frame[2];
#endif
		
	mcef_fref[0][0] = 	mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
	mcef_fref[0][1] = 	mcef_fref_frm[0][1];
	mcef_bref[0][0] = 	mcef_bref_frm[0][0];
 	mcef_bref[0][1] =   mcef_bref_frm[0][1]; 
#ifdef CRPS 	
  }
#endif

	imgY = imgY_frm =  current_frame[0];
	imgUV = imgUV_frm =  &current_frame[1];

  	img->mv = img->mv_frm;
	refFrArr = refFrArr_frm;

  	img->fw_refFrArr = img->fw_refFrArr_frm;
  	img->bw_refFrArr = img->bw_refFrArr_frm;
}


void init_frame_buffer()
{
	
//	//luma
//	mref[0] = mref_frm[0]; //mref[ref_index][yuv]height(height/2)][width] ref_index=0,1 for P frame, ref_index = 0,1,2,3 for P field
//	mref[1] = mref_frm[1]; 
//	mref_fref[0] = mref_fref_frm[0]; //mref_fref[ref_index][yuv]height(height/2)][width] ref_index=0 for B frame, ref_index = 0,1 for B field
//	mref_bref[0] = mref_bref_frm[0];
//	
//	//chroma
//	mcef[0][0] = mcef_frm[0][0];       //mcef[ref_index][uv][height][width]
//	mcef[0][1] = mcef_frm[0][1];
//	mcef[1][0] = mcef_frm[1][0];
//	mcef[1][1] = mcef_frm[1][1];
//	
//	mcef_fref[0][0] = 	mcef_fref_frm[0][0]; //mcef_fref[ref_index][uv][height/2][width]
//	mcef_fref[0][1] = 	mcef_fref_frm[0][1];
//	mcef_bref[0][0] = 	mcef_bref_frm[0][0];
//	mcef_bref[0][1] =   mcef_bref_frm[0][1]; 
	
	imgY_frm =  current_frame[0];
	imgUV_frm =  &current_frame[1];
}


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

  img->top_bot = 0; // Yulj 2004.07.20

  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] = core_reference_field[2*core_frame_ref_num+1][0];
		mref[1] = core_reference_field[2*core_frame_ref_num][0];
		mref[2] = mref_fld[0];
		mref[3] = mref_fld[1];

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

		mcef[0][1] = core_reference_field[2*core_frame_ref_num+1][2];
		mcef[1][1] = core_reference_field[2*core_frame_ref_num][2];
		mcef[2][1] = mcef_fld[0][1];
		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_top = current_field[0];
	imgUV = imgUV_top =  &current_field[1];
	
	img->mv = img->mv_top;
	refFrArr = refFrArr_top;
	
	img->fw_refFrArr = img->fw_refFrArr_top;
	img->bw_refFrArr = img->bw_refFrArr_top;
}


void init_top_buffer()
{
	int i,j;
		//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]
	}

	//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_top = current_field[0];
	imgUV_top =  &current_field[1];
	
	img->mv = img->mv_top;
	refFrArr = refFrArr_top;
	
	img->fw_refFrArr = img->fw_refFrArr_top;
	img->bw_refFrArr = img->bw_refFrArr_top;
}

void init_bot_buffer()
{
	//luma
	int i,j;
	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]
	}
	
	//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_bot =  current_field[0];
	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;

⌨️ 快捷键说明

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