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

📄 macroblock.c

📁 AVS视频编解码器 能实现视频图像的高效率压缩 能在VC上高速运行
💻 C
📖 第 1 页 / 共 5 页
字号:
					for (jjj=0;jjj<4;jjj++)
						img->cof[i][j][iii][jjj]=0;
		}
		
		
		img_block_y   = img->block_y; 
		
		if (zeroMotionAbove || zeroMotionLeft)
		{
			for(i=0;i<2;i++)
				for(j=0;j<2;j++)
				{
					img->mv[img->block_x+i+BLOCK_SIZE][img->block_y+j][0] = 0;
					img->mv[img->block_x+i+BLOCK_SIZE][img->block_y+j][1] = 0;
				}
		}
		else
		{
			SetMotionVectorPredictor (img, pmv, pmv+1, 0, refFrArr, img->mv, 0, 0, 16, 16, 0, 0);//Lou 1016
			for(i=0;i<2;i++)
				for(j=0;j<2;j++)
				{
					img->mv[img->block_x+i+BLOCK_SIZE][img_block_y+j][0] = pmv[0];
					img->mv[img->block_x+i+BLOCK_SIZE][img_block_y+j][1] = pmv[1];
				}
		}
		
		for (j=0; j<2;j++)
			for (i=0; i<2;i++)
			{
				refFrArr_frm[img->block_y+j][img->block_x+i] = 0;
			}
			
		return DECODE_MB;
	}

	readReferenceIndex(img, inp); 
	readMotionVector (img, inp);
	
	// !! start shenyanfei cjw
	//if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 0)){ //cjw 20051219
	//if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 1)&&(!IS_COPY(currMB))&&(!IS_DIRECT(currMB))){ //cjw20051230 for skip MB 
	if((!IS_INTRA(currMB)) && (img->slice_weighting_flag == 1) && (img->mb_weighting_flag == 1)&&(!IS_COPY(currMB))){ //cjw20060321 skip no WP, direct WP
		img->weighting_prediction = u_v(1,"MB weighting_prediction");  //cjw 20051219
	}
	// !! end shenyanfei cjw

	// read CBP if not new intra mode
  if (!(IS_COPY (currMB) || (IS_DIRECT (currMB) && img->cod_counter >= 0)))
  {

    if (IS_OLDINTRA (currMB) || currMB->mb_type == SI4MB )   currSE.type = SE_CBP_INTRA;
    else                        currSE.type = SE_CBP_INTER;
    
    if (IS_OLDINTRA (currMB) || currMB->mb_type == SI4MB)  
      currSE.mapping = linfo_cbp_intra;
    else                       
      currSE.mapping = linfo_cbp_inter;
    
    
#if TRACE
    snprintf(currSE.tracestring, TRACESTRING_SIZE, "CBP");
#endif
    
    if(img->type==I_IMG||IS_INTER(currMB)) // qhg
	{
		currSE.golomb_maxlevels = 0;
		readSyntaxElement_UVLC(&currSE,inp);
		currMB->cbp = currSE.value1;
    }
    // Delta quant only if nonzero coeffs
    if (!fixqp&&currMB->cbp !=0)
    {
      if (IS_INTER (currMB))  currSE.type = SE_DELTA_QUANT_INTER;
      else                    currSE.type = SE_DELTA_QUANT_INTRA;
      
      currSE.mapping = linfo_se;
      
#if TRACE
      snprintf(currSE.tracestring, TRACESTRING_SIZE, "Delta quant ");
#endif
      readSyntaxElement_UVLC(&currSE,inp);
      currMB->delta_quant = currSE.value1;
      img->qp= (img->qp-MIN_QP+currMB->delta_quant+(MAX_QP-MIN_QP+1))%(MAX_QP-MIN_QP+1)+MIN_QP; //discussed by cjw AVS Zhuhai 20070123
    }

	if (fixqp)
	{
		currMB->delta_quant = 0;
		img->qp= (img->qp-MIN_QP+currMB->delta_quant+(MAX_QP-MIN_QP+1))%(MAX_QP-MIN_QP+1)+MIN_QP;
		
	}

  }
  // read CBP and Coeffs  ***************************************************************
  readCBPandCoeffsFromNAL (img,inp);
  
  return DECODE_MB;
}

void read_ipred_block_modes(struct img_par *img,struct inp_par *inp,int b8)
{
  int bi,bj,dec;
  SyntaxElement currSE;
  Macroblock *currMB;
  int j2;
  int mostProbableIntraPredMode;
  int upIntraPredMode;
  int leftIntraPredMode;
  int IntraChromaPredModeFlag;
	int MBRowSize = img->width / MB_BLOCK_SIZE;
  
  currMB=mb_data+img->current_mb_nr;//current_mb_nr;
  IntraChromaPredModeFlag = IS_INTRA(currMB);
  
  currSE.type = SE_INTRAPREDMODE;
#if TRACE
  strncpy(currSE.tracestring, "Ipred Mode", TRACESTRING_SIZE);
#endif
  
	if(b8<4)
	{		
		if( currMB->b8mode[b8]==IBLOCK )
		{
			IntraChromaPredModeFlag = 1;
			//get from stream
			readSyntaxElement_Intra8x8PredictionMode(&currSE);
			
			//get from array and decode
			bi = img->block_x + (b8&1);
			bj = img->block_y + (b8/2);
			
			upIntraPredMode            = img->ipredmode[bi+1][bj];
			leftIntraPredMode          = img->ipredmode[bi][bj+1];
			mostProbableIntraPredMode  = (upIntraPredMode < 0 || leftIntraPredMode < 0) ? DC_PRED : upIntraPredMode < leftIntraPredMode ? upIntraPredMode : leftIntraPredMode;
			
			dec = (currSE.value1 == -1) ? mostProbableIntraPredMode : currSE.value1 + (currSE.value1 >= mostProbableIntraPredMode);
			
			//set
			img->ipredmode[1+bi][1+bj]=dec;
			j2 = bj;
		}
	}	
	else if( b8==4&&currMB->b8mode[b8-3]==IBLOCK)
	{
		
	    currSE.type = SE_INTRAPREDMODE;
#if TRACE
    strncpy(currSE.tracestring, "Chroma intra pred mode", TRACESTRING_SIZE);
#endif
    
	    currSE.mapping = linfo_ue;
    
	    readSyntaxElement_UVLC(&currSE,inp);
	    currMB->c_ipred_mode = currSE.value1;

	    if (currSE.value1 < DC_PRED_8 || currSE.value1 > PLANE_8)
	    {
	      printf("%d\n", img->current_mb_nr);
	      error("illegal chroma intra pred mode!\n", 600);
	    }
	 }
}

/*
*************************************************************************
* Function:Set context for reference frames
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/

int BType2CtxRef (int btype)
{
  if (btype<4)
    return 0;
  else
    return 1;
}

/*
*************************************************************************
* Function:
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/
void readReferenceIndex(struct img_par *img, struct inp_par *inp)
{
    int i,j,k;
    // int mb_nr           = img->current_mb_nr; //GB Falsch
    Macroblock *currMB  = &mb_data[img->current_mb_nr];
    SyntaxElement currSE;
    int bframe          = (img->type==B_IMG);
    int partmode        = (IS_P8x8(currMB)?4:currMB->mb_type);
    int step_h0         = BLOCK_STEP [partmode][0];
    int step_v0         = BLOCK_STEP [partmode][1];

    int i0, j0, refframe;
    int **fwRefFrArr = img->fw_refFrArr;
    int **bwRefFrArr = img->bw_refFrArr;
    int  ***fw_mv = img->fw_mv;
    int  ***bw_mv = img->bw_mv;
    //int  **moving_block_dir = moving_block; 
    int flag_mode;

    //  If multiple ref. frames, read reference frame for the MB *********************************
    flag_mode = 0;

    currSE.type = SE_REFFRAME;
    currSE.mapping = linfo_ue;

	if(currMB->mb_type!=I4MB)
	{				
		step_h0         = (BLOCK_STEP[IS_P8x8(currMB) ? 4 : currMB->mb_type][0]);
		step_v0         = (BLOCK_STEP[IS_P8x8(currMB) ? 4 : currMB->mb_type][1]);
	}

    // !! shenyanfei 
    for (j0=0; j0<2; )
    {
        if((currMB->mb_type==I4MB&&j0==0)) 
        { j0 += 1; continue;}

        for (i0=0; i0<2; )
        {				
            k=2*j0+i0;
            if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && currMB->b8mode[k]!=0)
            {
                img->subblock_x = i0;
                img->subblock_y = j0;

                if ((!picture_reference_flag&&img->type==P_IMG && img->types!=I_IMG) || (/*modifyby xfwang 2004.7.29*/!picture_reference_flag&&!img->picture_structure && img->types!=I_IMG)) //&&!img->allrefzero)//del by xfwang 2004.7.29
                {
#if TRACE
                    strncpy(currSE.tracestring,  "Fwd ref frame no ", TRACESTRING_SIZE);
#endif
                    currSE.context = BType2CtxRef (currMB->b8mode[k]);

                    if(img->picture_structure || bframe)
                        currSE.len = 1;
                    else
                        currSE.len = 2;

                    readSyntaxElement_FLC(&currSE);
                    refframe = currSE.value1;
                }
                else
                {
                    refframe = 0;
                }

                if (!bframe)
                {
                    for (j=j0; j<j0+step_v0;j++)
                        for (i=i0; i<i0+step_h0;i++)
                            refFrArr[img->block_y+j][img->block_x+i] = refframe;
                }
                else // !! for B frame shenyanfei 
                {
                    for (j=j0; j<j0+step_v0;j++)
                        for (i=i0; i<i0+step_h0;i++)
                            img->fw_refFrArr[img->block_y+j][img->block_x+i] = refframe;

                    if (currMB->b8pdir[k]==2 && !img->picture_structure)
                    {
                        for (j=j0; j<j0+step_v0;j++)
                            for (i=i0; i<i0+step_h0;i++)
                                img->bw_refFrArr[img->block_y+j][img->block_x+i] = 1-refframe;
                    }
                }
            }
            i0+=max(1,step_h0);
        }
        j0+=max(1,step_v0);
    }

	for (j0=0; j0<2; )
	{
		if((currMB->mb_type==I4MB&&j0==0)) 
		{ j0 += 1; continue;}
		
		for (i0=0; i0<2; )
		{				
			k=2*j0+i0;
				if ((currMB->b8pdir[k]==1) && currMB->b8mode[k]!=0)
				{
					img->subblock_x = i0;
					img->subblock_y = j0;
					
					if (img->type==B_IMG && !img->picture_structure&&/*modifyby xfwang 2004.7.29*/!picture_reference_flag) //&&!img->allrefzero)//del by xfwang 2004.7.29
					{
	#if TRACE
						strncpy(currSE.tracestring,  "Bwd ref frame no ", TRACESTRING_SIZE);
	#endif
						currSE.context = BType2CtxRef (currMB->b8mode[k]);
						
						if(img->picture_structure || bframe)
							currSE.len = 1;
						else
							currSE.len = 2;
						
						readSyntaxElement_FLC(&currSE);						
						refframe = currSE.value1;
					}
					else
					{
						refframe = 0;
					}
					
					for (j=j0; j<j0+step_v0;j++)
						for (i=i0; i<i0+step_h0;i++)
							img->bw_refFrArr[img->block_y+j][img->block_x+i] = refframe;
				} 
				
				i0+=max(1,step_h0);
			}
			j0+=max(1,step_v0);
	}
}

/*
*************************************************************************
* Function:
* Input:
* Output:
* Return: 
* Attention:
*************************************************************************
*/
void readMotionVector(struct img_par *img, struct inp_par *inp)
{
    int i,j,k,l,m,n;
    int step_h,step_v;
    int curr_mvd;
    // int mb_nr           = img->current_mb_nr; //GB Falsch
    Macroblock *currMB  = &mb_data[img->current_mb_nr];
    SyntaxElement currSE;
    int bframe          = (img->type==B_IMG);
    int partmode        = (IS_P8x8(currMB)?4:currMB->mb_type);
    int step_h0         = BLOCK_STEP [partmode][0];
    int step_v0         = BLOCK_STEP [partmode][1];

    int mv_mode, i0, j0, refframe;
    int pmv[2];
    int j4, i4, ii,jj;
    int vec;

    int iTRb,iTRp,iTRd;
    int mv_scale;
    int frame_no_next_P, frame_no_B, delta_P;
    int ref;
    int img_block_y;
    int use_scaled_mv;
    int fw_refframe,current_tr;

    int **fwRefFrArr = img->fw_refFrArr;
    int **bwRefFrArr = img->bw_refFrArr;
    int  ***fw_mv = img->fw_mv;
    int  ***bw_mv = img->bw_mv;
    int	scale_refframe,iTRp1,bw_ref;

    if (bframe && IS_P8x8 (currMB))
    {
        for (i=0;i<4;i++)
        {
            if (currMB->b8mode[i] == 0)
            {
                for(j=i/2;j<i/2+1;j++)
                {
                    for(k=(i%2);k<(i%2)+1;k++)
                    {
                        //sw
                        img->fw_refFrArr[img->block_y + j][img->block_x + k] = 0;
                        img->bw_refFrArr[img->block_y + j][img->block_x + k] = 0; 
                    }
                }
            }
        }
    } 


    //=====  READ FORWARD MOTION VECTORS =====
    currSE.type = SE_MVD;

    currSE.mapping = linfo_se;

    for (j0=0; j0<2; )
    {
        if(currMB->mb_type!=I4MB)
        {				
            step_h0         = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][0]);
            step_v0         = (BLOCK_STEP[(currMB->mb_type==P8x8)? 4 : currMB->mb_type][1]);
        }

        if((currMB->mb_type==I4MB&&j0==0)) // for  by jhzheng [2004/08/02]
        { j0 += 1; continue;}
		//{break;}


        for (i0=0; i0<2; )
        {
            k=2*j0+i0;
            if ((currMB->b8pdir[k]==0 || currMB->b8pdir[k]==2) && (currMB->b8mode[k] !=0))//has forward vector
            {
                mv_mode  = currMB->b8mode[k];
                step_h   = BLOCK_STEP [mv_mode][0];
                step_v   = BLOCK_STEP [mv_mode][1];

                if (!bframe)  refframe = refFrArr        [img->block_y+j0][img->block_x+i0];
                else                                     refframe = img->fw_refFrArr[img->block_y+j0][img->block_x+i0];


                for (j=j0; j<j0+step_v0; j+=step_v)
                    for (i=i0; i<i0+step_h0; i+=step_h)
                    {
                        j4 = img->block_y+j;
                        i4 = img->block_x+i;

                        // first make mv-prediction
                        if (!bframe)  
                            SetMotionVectorPredictor (img, pmv, pmv+1, refframe, refFrArr,         img->mv,    i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016
                        else               
                            SetMotionVectorPredictor (img, pmv, pmv+1, refframe, img->fw_refFrArr, img->fw_mv, i, j, 8*step_h, 8*step_v, 0, 0);//Lou 1016

⌨️ 快捷键说明

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