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

📄 macroblock.c

📁 avs-s最新代码,包括编码器和解码器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
				}
				DistanceIndexFw0 = 2*img->imgtr_last_P_frm+1;
				if (DistanceIndexRef == DistanceIndexFw0)
				{
					fw_ref_frame = 0;//fw reference

				}
				else
				{
					fw_ref_frame = 1;

				}
				//DistanceIndexBw
				bw_ref_frame = 0;//bw reference

			}  		  
			if(scale_frame < 0)
			{
				fw_ref_frame = 0;
				bw_ref_frame = 1;
			}

		}
	}
#endif

	fw_ref_idx = fw_ref_frame;
	bw_ref_idx = bw_ref_frame;

	//===== INTER PREDICTION =====
	if (fw_mode || (direct && (fw_ref_frame!=-1)) || skipped)
	{
		if(!img->picture_structure)
			OneComponentChromaPrediction4x4 (fw_pred, pic_pix_x, pic_pix_y, fmv_array , fw_ref_frame, fw_mode, uv, (directforward ?1 :0));
		else
			OneComponentChromaPrediction4x4 (fw_pred, pic_pix_x, pic_pix_y, fmv_array , (directforward ?0 :fw_ref_frame), fw_mode, uv, (directforward ?1 :0));
	}
	if (bw_mode || (direct && (bw_ref_frame!=-1)) ||(direct && !img->picture_structure && (bw_ref_frame ==-1))) 
	{
		//OneComponentChromaPrediction4x4 (bw_pred, pic_pix_x, pic_pix_y, bmv_array,           -1, bw_mode, uv, 0 );
		if(fw_mode && bw_mode)
			OneComponentChromaPrediction4x4_dir (bw_pred, pic_pix_x, pic_pix_y, fmv_array, 
			(!img->picture_structure) ? -2+bw_ref_frame : -1, bw_mode, uv,fw_ref_frame);
		else
			OneComponentChromaPrediction4x4 (bw_pred, pic_pix_x, pic_pix_y, bmv_array, 
			(!img->picture_structure) ? -2+bw_ref_frame : -1, bw_mode, uv,0);
	}

	if (direct || (fw_mode && bw_mode))
	{
		if(!img->picture_structure)
			bw_ref_frame=1-bw_ref_frame;   //cjw used for bw reference buffer address changing 20060112 bw

		fw_ref_num=(img->picture_structure)?(fw_ref_frame):(2*fw_ref_frame);  //cjw 20060112 fw 
		bw_ref_num=(img->picture_structure)?(bw_ref_frame+1):(2*bw_ref_frame+1);  //cjw 20060112 bw

		fw_scale = img->chroma_scale[fw_ref_num];
		fw_shift = img->chroma_shift[fw_ref_num];
		bw_scale = img->chroma_scale[bw_ref_num];
		bw_shift = img->chroma_shift[bw_ref_num];
		for (j=block_y; j<block_y4; j++)
			for (i=block_x; i<block_x4; i++){
				img->mpr[i][j] = (*fpred + *bpred + 1) / 2;

				if(img->LumVarFlag == 1)  //cjw 20051219 Weighted Predition
					img->mpr_weight[i][j] = (Clip1((((*fpred)*fw_scale+16)>>5) + fw_shift)
					+ Clip1((((*bpred)*bw_scale+16)>>5) + bw_shift) + 1) / 2;

				fpred++ ; 
				bpred++ ;
			}
	}
	else if (fw_mode || skipped)  //P fw and B one direction fw
	{

		if(img->type==B_IMG){
			fw_ref_num=(img->picture_structure)?(fw_ref_frame):(2*fw_ref_frame);  //cjw 20060112 B fw 

			fw_scale = img->chroma_scale[fw_ref_num]; 
			fw_shift = img->chroma_shift[fw_ref_num];
		}
		else{   //P fw 
			fw_scale = img->chroma_scale[fw_ref_frame];
			fw_shift = img->chroma_shift[fw_ref_frame];
		}

		for (j=block_y; j<block_y4; j++)
			for (i=block_x; i<block_x4; i++){  
				img->mpr[i][j] = *fpred;

				if((!skipped) &&(img->LumVarFlag == 1))  //cjw 20051219 Weighted Predition
					img->mpr_weight[i][j] = Clip1(((((*fpred)*fw_scale+16)>>5) + fw_shift));

				fpred++;
			}
	}
	else  //B bw 
	{
		if(!img->picture_structure)
			bw_ref_frame=1-bw_ref_frame;

		bw_ref_num=(img->picture_structure)?(bw_ref_frame+1):(2*bw_ref_frame+1);  //cjw 20060112 bw

		bw_scale = img->chroma_scale[bw_ref_num];
		bw_shift = img->chroma_shift[bw_ref_num];
		for (j=block_y; j<block_y4; j++)
			for (i=block_x; i<block_x4; i++){  
				img->mpr[i][j] = *bpred;

				if(img->LumVarFlag == 1)  //cjw 20051219 Weighted Predition
					img->mpr_weight[i][j] = Clip1(((((*bpred)*bw_scale+16)>>5) + bw_shift));

				bpred++;
			}
	}
}

/*
*************************************************************************
* Function:Chroma residual coding for an macroblock
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void ChromaResidualCoding (int* cr_cbp)
{
	int   uv, block8, block_y, block_x, j, i;
	int   fw_mode, bw_mode, refframe;
	int   skipped = (img->mb_data[img->current_mb_nr].mb_type == 0 && img->type == INTER_IMG);
	int   incr = 1, offset = 0; // For MB level field/frame coding 
	int   incr_x = 1, offset_x = 0; 
	int   bw_ref;
	short   tmp_block_88[8][8];
	int   tmp_cbp_blk;
	int   tmp_block[2][8][8];/*lgp*/
	int   tmp_mpr[2][8][8];/*lgp*/
	int   incr_y=1,off_y=0;/*lgp*/
	int   cbpc=0;/*lgp*/
	int   stage_block8x8_pos=0;/*lgp*/

	//cjw 20051219
	Macroblock *currMB   = &img->mb_data[img->current_mb_nr];
	int IntraPrediction=IS_INTRA (currMB);
	int  direct;

	for (*cr_cbp=0, uv=0; uv<2; uv++)
	{
		//===== prediction of chrominance blocks ===d==
		block8 = 0;
		for (block_y=/*0*/4*(stage_block8x8_pos/2)/*lgp*/; block_y<8; block_y+=4)
			for (block_x=0; block_x<8; block_x+=4, block8++)
			{
				block8 = (block_y/4)*2 + block_x/4;/*lgp*/

				SetModesAndRefframe (block8, &fw_mode, &bw_mode, &refframe, &bw_ref);

				ChromaPrediction4x4 (uv, block_x, block_y, fw_mode, bw_mode, refframe, bw_ref);

				direct    = (fw_mode == 0 && bw_mode == 0 && (img->type==B_IMG));

				// !! start shenyanfei 
				//if(((!IntraPrediction)&&/*cjw*/(!direct)&&(!skipped)&&(img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1))
				//if(((!IntraPrediction)&&(!skipped)&&(!direct)&&(img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1)) //cjw 20051230
				if(((!IntraPrediction)&& (!skipped) && (img->LumVarFlag == 1) && (img->mb_weighting_flag == 1)&&(img->weighting_prediction == 1))  //cjw 20060321
					||((img->LumVarFlag == 1) && (img->mb_weighting_flag == 0))){
						for (j=0; j<4; j++)
							for (i=0; i<4; i++)
								//cjw 20051219 Weighted Predition
								//img->mpr[i+block_x][j+block_y] = img->mpr[i+block_x][j+block_y];
								img->mpr[i+block_x][j+block_y] = img->mpr_weight[i+block_x][j+block_y]; 
					}
					// !! end shenyanfei 

					if (skipped||img->NoResidueDirect)
					{
						for (j=0; j<4; j++)
							for (i=block_x; i<block_x+4; i++)
							{
								imgUV[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] = img->mpr[i][block_y+j];
							}
					}
					else
						for (j=0; j<4; j++)
							for (i=block_x; i<block_x+4; i++)
							{
								tmp_mpr[uv][i][block_y+j] = img->mpr[i][block_y+j];
								tmp_block[uv][block_y+j][i] = imgUV_org[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] - img->mpr[i][block_y+j];
								img->m7[i][block_y+j] = imgUV_org[uv][img->pix_c_y+block_y+incr_y*j+off_y][img->pix_c_x+i] - img->mpr[i][block_y+j];						
							}
			}

			//===== DCT, Quantization, inverse Quantization, IDCT, and Reconstruction =====
			//===== Call function for skip mode in SP frames to properly process frame ====

			if ( !skipped&&!img->NoResidueDirect)
			{
				for (j=0;j<8; j++)
					for (i=0;i<8; i++)
					{
						tmp_block_88[j][i] = img->m7[i][j];
					}
					transform_B8(tmp_block_88);
					//Lou 1013 	scanquant_B8 (QP_SCALE_CR[ img->qp+QP_OFS-MIN_QP],4,4+uv,tmp_block_88,0,cr_cbp,&tmp_cbp_blk);
					scanquant_B8   (QP_SCALE_CR[ img->qp-MIN_QP], 4, 4+uv, tmp_block_88,0,cr_cbp,&tmp_cbp_blk);				  
			}
	}

	//===== update currMB->cbp =====
	img->mb_data[img->current_mb_nr].cbp +=(*cr_cbp);//((*cr_cbp)<<4); /*lgp*dct*/
}


/*
*************************************************************************
* Function:Predict an intra chroma 8x8 block
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

void IntraChromaPrediction8x8 (int *mb_up, int *mb_left, int*mb_up_left)
{
	Macroblock *currMB = &img->mb_data[img->current_mb_nr];
	unsigned char edgepixu[40]= {0};
#define EPU (edgepixu+20)
	unsigned char edgepixv[40]= {0};
#define EPV (edgepixv+20)
	int last_pix,new_pix;
	int bs_x=8;
	int bs_y=8;
	int x, y;

	int     i, j, k;
	pel_t** image;
	int     block_x, block_y, b4;
	int     img_cx            = img->pix_c_x;
	int     img_cy            = img->pix_c_y;
	int     img_cx_1          = img->pix_c_x-1;
	int     img_cx_4          = img->pix_c_x+4;
	int     img_cy_1          = img->pix_c_y-1;
	int     img_cy_4          = img->pix_c_y+4;
	int     b8_x              = img->pix_c_x/4;
	int     b8_y              = img->pix_c_y/4;
	int     mb_nr             = img->current_mb_nr;
	int     mb_width          = img->width/16;
	/*
	int     mb_available_up   = (img_cy/BLOCK_SIZE == 0 || (img_cy/BLOCK_SIZE >0 && img->ipredmode[1+b8_x][1+b8_y-1]<0)) ? 0 : 1;
	int     mb_available_left = (img_cx/BLOCK_SIZE == 0 || (img_cx/BLOCK_SIZE >0 && img->ipredmode[1+b8_x - 1][1+b8_y]<0)) ? 0 : 1;
	int     mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 || (img_cy/BLOCK_SIZE >0 && img->ipredmode[1+b8_x][1+b8_y-1]<0) || 
	(img_cx/BLOCK_SIZE >0 && img->ipredmode[1+b8_x - 1][1+b8_y]<0)) ? 0 : 1;
	int     mb_available_up_right= (img_cy > 0)&&(b8_x<(img->width_cr/BLOCK_SIZE-2))&&(img->ipredmode[1+b8_x+1][1+b8_y-1]>=0);
	int	  mb_available_left_down=(img_cx > 0)&&(b8_y<(img->height_cr/BLOCK_SIZE-2))&&(img->ipredmode[1+b8_x - 1][1+b8_y+1]>=0);
	//by oliver according to 1658*/
	/***********************************/
	int	mb_available_up_right=((img_cy==0)||(b8_x>=(img->width_cr/BLOCK_SIZE-2))) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width+1].slice_nr);
	int  mb_available_left_down=((img_cx==0)||(b8_y>=(img->height_cr/BLOCK_SIZE-2))) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr+mb_width-1].slice_nr);
	int mb_available_up   = (img_cy == 0) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width].slice_nr);
	int mb_available_left = (img_cx == 0) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-1].slice_nr);
	int mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 ) ? 0 : (img->mb_data[img->current_mb_nr].slice_nr == img->mb_data[img->current_mb_nr-mb_width-1].slice_nr);

	//changed by oliver 0512

	int     ih,iv;
	int     ib,ic,iaa;
	int     uv;
	int     hline[8], vline[8];
	int     mode;
	int     best_mode = DC_PRED_8;         //just an initilaization here, should always be overwritten
	int     cost;
	int     min_cost;
	int     diff[16];
	int     incr_y=1,off_y=0;/*lgp*/
	int     stage_block8x8_pos=0;/*lgp*/

	if(input->slice_set_enable)   //added by mz, 2008.04
	{
		mb_available_up_right = ((img_cy==0)||(b8_x>=(img->width_cr/BLOCK_SIZE-2))) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width+1].slice_set_index );
		mb_available_left_down = ((img_cx==0)||(b8_y>=(img->height_cr/BLOCK_SIZE-2))) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr+mb_width-1].slice_set_index );
		mb_available_up   = (img_cy == 0) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width].slice_set_index );
		mb_available_left = (img_cx == 0) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-1].slice_set_index );
		mb_available_up_left = (img_cx/BLOCK_SIZE == 0 || img_cy/BLOCK_SIZE == 0 ) ? 0 : ( img->mb_data[img->current_mb_nr].slice_set_index == img->mb_data[img->current_mb_nr-mb_width-1].slice_set_index );
	}

	if (mb_up)
		*mb_up = mb_available_up;
	if (mb_left)
		*mb_left = mb_available_left;
	if( mb_up_left )
		*mb_up_left = mb_available_up_left;

	// compute all chroma intra prediction modes for both U and V

	uv=0;

	if(mb_available_up)
	{
		for(x=0;x<bs_x;x++)
			EPU[x+1]=imgUV[uv][img_cy-1][img_cx+x];

		/*
		for(x=0;x<bs_y;x++)
		EPU[1+x+bs_x]=EPU[bs_x];*/

		if(mb_available_up_right){
			for(x=0;x<bs_y;x++)
				EPU[1+x+bs_x]=imgUV[uv][img_cy-1][img_cx+bs_x+x];
		}
		else{
			for(x=0;x<bs_y;x++)	
				EPU[1+x+bs_x]=EPU[bs_x];  //bs_x=8; EPU[9~16]=r[8]  
		}
		//by oliver according to 1658

		EPU[0]=imgUV[uv][img_cy-1][img_cx];
	}
	if(mb_available_left)
	{
		for(y=0;y<bs_y;y++)
			EPU[-1-y]=imgUV[uv][img_cy+y][img_cx-1];

		for(y=0;y<bs_x;y++)
			EPU[-1-y-bs_y]=EPU[-bs_y];

		EPU[0]=imgUV[uv][img_cy][img_cx-1];
	}

	if(!input->slice_set_enable)   //added by mz, 2008.04
	{
		if(mb_available_up&&mb_available_left)
			EPU[0]=imgUV[uv][img_cy-1][img_cx-1];
	}
	else
	{
		if(mb_available_up_left)
			EPU[0]=imgUV[uv][img_cy-1][img_cx-1];
		else if(mb_available_up)
			EPU[0]=imgUV[uv][img_cy-1][img_cx];
		else if(mb_available_left)
			EPU[0]=imgUV[uv][img_cy][img_cx-1];
	}

	//lowpass (Those emlements that are not needed will not disturb)
	last_pix=EPU[-8];
	for(i=-8;i<=8;i++)
	{
		new_pix=( last_pix + (EPU[i]<<1) + EPU[i+1] + 2 )>>2;
		last_pix=EPU[i];
		EPU[i]=(unsigned char)new_pix;
	}


	uv=1;

	if(mb_available_up)
	{
		for(x=0;x<bs_x;x++)
			EPV[x+1]=imgUV[uv][img_cy-1][img_cx+x];

		/*
		for(x=0;x<bs_y;x++)
		EPV[1+x+bs_x]=EPV[bs_x];*/

		if(mb_available_up_right){
			for(x=0;x<bs_y;x++)
				EPV[1+x+bs_x]=imgUV[uv][img_cy-1][img_cx+bs_x+x];
		}
		else{
			for(x=0;x<bs_y;x++)	
				EPV[1+x+bs_x]=EPV[bs_x];  //bs_x=8; EPV[9~16]=r[8]  
		}
		//by oliver according to 1658

		EPV[0]=imgUV[uv][img_cy-1][img_cx];
	}
	if(mb_available_left)
	{
		for(y=0;y<bs_y;y++)
			EPV[-1-y]=imgUV[uv][img_cy+y][img_cx-1];

		for(y=0;y<bs_x;y++)
			EPV[-1-y-bs_y]=EPV[-bs_y];

		EPV[0]=imgUV[uv][img_cy][img_cx-1];
	}

	if(!input->slice_set_enable)    //added by mz, 2008.04
	{
		if(mb_available_up&&mb_available_left)
			EPV[0]=imgUV[uv][img_cy-1][img_cx-1];
	}
	else
	{
		if(mb_available_up_left)
			EPV[0]=imgUV[uv][img_cy-1][img_cx-1];
		else if(mb_available_up)
			EPV[0]=imgUV[uv][img_cy-1][img_cx];
		else if(mb_available_left)
			EPV[0]=imgUV[uv][img_cy][img_cx-1];			
	}

	//lowpass (Those emlements that are not needed will not disturb)
	last_pix=EPV[-8];
	for(i=-8;i<=8;i++)
	{
		new_pix=( last_pix + (EPV[i]<<1) + EPV[i+1] + 2 )>>2;
		la

⌨️ 快捷键说明

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