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

📄 macroblock.c

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


    //=====  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
						

                        for (n=0; n < 2; n++) 
                        {
#if TRACE
                            snprintf(currSE.tracestring, TRACESTRING_SIZE, "FMVD (pred %d)",pmv[n]);
#endif
                            img->subblock_x = i; // position used for context determination
                            img->subblock_y = j; // position used for context determination
                            currSE.value2 = (!bframe ? n : 2*n); // identifies the component; only used for context determination
                            readSyntaxElement_UVLC(&currSE,inp);
                            curr_mvd = currSE.value1; 

                            vec=curr_mvd+pmv[n];           /* find motion vector */

                            // need B support
                            if (!bframe)
                            {
                                for(ii=0;ii<step_h;ii++)
                                    for(jj=0;jj<step_v;jj++)
                                        img->mv[i4+ii+BLOCK_SIZE][j4+jj][n]=vec;				
                            }
                            else      // B frame
                            {        
                                for(ii=0;ii<step_h;ii++)
                                    for(jj=0;jj<step_v;jj++)
                                        img->fw_mv[i4+ii+BLOCK_SIZE][j4+jj][n]=vec;
                            }

                            /* store (oversampled) mvd */
                            for (l=0; l < step_v; l++) 
                                for (m=0; m < step_h; m++)  
                                    currMB->mvd[0][j+l][i+m][n] =  curr_mvd;
                        }
                    }
            }
            else if (currMB->b8mode[k=2*j0+i0]==0)      
            {// direct mode  
                // by Junhao Zheng 2004-08-04 22:00:51  
                //step_v0 = step_h0 = 1;
                for (j=j0; j<j0+step_v0; j++)
                    for (i=i0; i<i0+step_h0; i++)
                    {   

                        ref= refFrArr[img->block_y+j][img->block_x+i];
                        img_block_y = (img->current_mb_nr%2) ? (img->block_y-4)/2:img->block_y/2;

                        if(ref == -1)
                        {

                            //sw             
                            img->fw_refFrArr[img->block_y+j][img->block_x+i]=0; 
                            img->bw_refFrArr[img->block_y+j][img->block_x+i]=0; 
                            j4 = img->block_y+j;
                            i4 = img->block_x+i;  

                            for (ii=0; ii < 2; ii++) 
                            {
                                img->fw_mv[i4+BLOCK_SIZE][j4][ii]=0;
                                img->bw_mv[i4+BLOCK_SIZE][j4][ii]=0;
                            }

                            SetMotionVectorPredictor(img,&(img->fw_mv[i4+BLOCK_SIZE][j4][0]),
                                                     &(img->fw_mv[i4+BLOCK_SIZE][j4][1]),0,img->fw_refFrArr, 
                                                     img->fw_mv,0,0,16,16, 0, 1);
                            SetMotionVectorPredictor(img,&(img->bw_mv[i4+BLOCK_SIZE][j4][0]),
                                                     &(img->bw_mv[i4+BLOCK_SIZE][j4][1]),0,img->bw_refFrArr, 
                                                     img->bw_mv,0,0,16,16, -1, 1);					
                        }
                        else
                        {
#ifndef CRPS
                            frame_no_next_P =2*img->imgtr_next_P;
//                            frame_no_B = 2*img->tr;
							frame_no_B = 2*img->pic_distance;  // Added by Xiaozhen ZHENG, 2007.05.01

                            delta_P = 2* (img->imgtr_next_P - img->imgtr_last_P);
							delta_P = (delta_P + 512)%512;            // Added by Xiaozhen ZHENG, 2007.05.01

                            if(!img->picture_structure)
                            {				  

                                if (img->current_mb_nr_fld < img->PicSizeInMbs) //top field
                                    scale_refframe = 	ref == 0 ? 0 : 1;
                                else
                                    scale_refframe = 	ref == 1 ? 1 : 2; 
                            }
                            else
                                scale_refframe = 0;


                            if(img->picture_structure)
                            {
                                iTRp = (ref+1)*delta_P;
                                iTRp1 = (scale_refframe+1)*delta_P;
                            }else
                            {
                                if (img->current_mb_nr_fld < img->PicSizeInMbs) //top field
                                {
                                    iTRp = delta_P*(ref/2+1)-(ref+1)%2;  //the lates backward reference
                                    iTRp1 = delta_P*(scale_refframe/2+1)-(scale_refframe+1)%2;  //the lates backward reference
                                    bw_ref = 0;
                                }
                                else
                                {
                                    iTRp = 1 + delta_P*((ref+1)/2)-ref%2;
                                    iTRp1 = 1 + delta_P*((scale_refframe+1)/2)-scale_refframe%2;
                                    bw_ref = 1;
                                }
                            }
							iTRd = frame_no_next_P - frame_no_B;
							iTRb = iTRp1 - iTRd;							
#else	

							if(!img->picture_structure)
							{
								if(img->current_mb_nr_fld < img->PicSizeInMbs)
								{
									DistanceIndexCur = 2*img->pic_distance;
									
									if(ref==0)
									{
										DistanceIndexRef = 2*img->imgtr_last_P+1;
										if(img->img_next_is_core_frame)
											DistanceIndexRef = 2*img->img_next_core_frame_ref_distance+1;

									}
									else if(ref==1)
									{
										DistanceIndexRef = 2*img->imgtr_last_P;
										if(img->img_next_is_core_frame)
											DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
									}
									else if(ref==2)
									{
                                        DistanceIndexRef = 2*img->imgtr_last_prev_P+1;
									}
									else//ref==3
									{
										DistanceIndexRef = 2*img->imgtr_last_prev_P;				
									}									
									
									DistanceIndexFw0 = 2*img->imgtr_last_P+1;
									DistanceIndexFw1 = 2*img->imgtr_last_P;
									DistanceIndexBw0 = 2*img->imgtr_next_P;
									DistanceIndexBw1 = 2*img->imgtr_next_P+1;
									//DistanceIndexFw
									if (DistanceIndexRef == DistanceIndexFw0)
									{
										scale_refframe = 0;//fw reference
										DistanceIndexFw = DistanceIndexFw0;
									}
									else
									{
										scale_refframe = 1;
										DistanceIndexFw = DistanceIndexFw1;
									}									
									//DistanceIndexBw
									bw_ref = 0;//bw reference
									DistanceIndexBw = DistanceIndexBw0;

								}
								else
								{
									DistanceIndexCur = 2*img->pic_distance+1;
									if(ref==0)
									{
										DistanceIndexRef = 2*img->imgtr_next_P;

									}
									else if(ref==1)
									{						
                                        DistanceIndexRef = 2*img->imgtr_last_P+1;
										if(img->img_next_is_core_frame)
											DistanceIndexRef = 2*img->img_next_core_frame_ref_distance+1;
									}
									else if(ref==2)
									{
										DistanceIndexRef = 2*img->imgtr_last_P;
										if(img->img_next_is_core_frame)
											DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
									}
									else//ref==3
									{
                                        DistanceIndexRef = 2*img->imgtr_last_prev_P+1;
									}

									DistanceIndexFw0 = 2*img->imgtr_last_P+1;
									DistanceIndexFw1 = 2*img->imgtr_last_P;
									DistanceIndexBw0 = 2*img->imgtr_next_P;
									DistanceIndexBw1 = 2*img->imgtr_next_P+1;
									if (DistanceIndexRef == DistanceIndexFw0)
									{
										scale_refframe = 0;//fw reference
										DistanceIndexFw = DistanceIndexFw0;
									}
									else
									{
										scale_refframe = 1;
										DistanceIndexFw = DistanceIndexFw1;
									}
									//DistanceIndexBw
									bw_ref = 1;//bw reference
									DistanceIndexBw = DistanceIndexBw1;									
								}

							}
							else
							{
								scale_refframe = 0;
								bw_ref = 0;
								DistanceIndexCur = 2*img->pic_distance;
								if(ref==0)
								{
                                   DistanceIndexRef = 2*img->imgtr_last_P;
									if(img->img_next_is_core_frame)
										DistanceIndexRef = 2*img->img_next_core_frame_ref_distance;
								}
								else//ref==1
								{
                                   DistanceIndexRef = 2*img->imgtr_last_prev_P;
								}
								DistanceIndexFw = 2*img->imgtr_last_P;
								DistanceIndexBw = 2*img->imgtr_next_P;								
							}
							BlockDistanceRef = (DistanceIndexBw - DistanceIndexRef+512)%512;
							BlockDistanceFw = (DistanceIndexCur - DistanceIndexFw+512)%512;
							BlockDistanceBw = (DistanceIndexBw - DistanceIndexCur+512)%512;
							iTRp = BlockDistanceRef;
							iTRd = BlockDistanceBw;
							iTRb = BlockDistanceFw;
#endif
						
							// Added by Xiaozhen ZHENG, 2007.05.01
							iTRp  = (iTRp  + 512)%512;
#ifndef CRPS							
							iTRp1 = (iTRp1 + 512)%512;
#endif							
							iTRd  = (iTRd  + 512)%512;
							iTRb  = (iTRb  + 512)%512;
							// Added by Xiaozhen ZHENG, 2007.05.01
							
                            if(!img->picture_structure)
                            {
#ifndef CRPS
                                if (img->current_mb_nr_fld >= img->PicSizeInMbs) 
                                    scale_refframe --;
#endif
                            	
 
                                img->fw_refFrArr[img->block_y+j][img->block_x+i]=scale_refframe; // PLUS2, Krit, 7/06 (used to be + 1)
                                img->bw_refFrArr[img->block_y+j][img->block_x+i]=bw_ref;
                            }
                            else
                            {
                                img->fw_refFrArr[img->block_y+j][img->block_x+i]=0; // PLUS2, Krit, 7/06 (used to be + 1)
                                // by Junhao Zheng 2004-08-04 21:50:38  
                                //img->bw_refFrArr[img->block_y+j][img->block_x+i]=1;
                                img->bw_refFrArr[img->block_y+j][img->block_x+i]=0;
                            }

                            j4 = img->block_y+j;
                            i4 = img->block_x+i;

                            for (ii=0; ii < 2; ii++)
                            {
                                if(img->mv[img->block_x+i+4][img->block_y+j][ii] < 0)
                                {
                                    img->fw_mv[i4+BLOCK_SIZE][j4][ii] =  -(((16384/iTRp)*(1-iTRb*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14);
                                    img->bw_mv[i4+BLOCK_SIZE][j4][ii] = ((16384/iTRp)*(1-iTRd*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14;
                                }
                                else
                                {
                                    img->fw_mv[i4+BLOCK_SIZE][j4][ii] = ((16384/iTRp)*(1+iTRb*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14;
                                    img->bw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1+iTRd*img->mv[img->block_x+i+4][img->block_y+j][ii])-1)>>14);
                                }

#ifdef half_pixel_compensation
	if(!img->picture_structure && ii == 1) 
	{
	  int delt, delt2, delt_bw;
	  MV_compensation_fw_fw(&delt, &delt2, scale_refframe, ref);
	  MV_compensation_fw_bw(&delt, &delt_bw, bw_ref /*1-bw_ref*/, ref); //bw_ref differs to that in encoder
	  assert(delt_bw == 0);
                                if((img->mv[img->block_x+i+4][img->block_y+j][ii] +delt)< 0)
                                {
                                    img->fw_mv[i4+BLOCK_SIZE][j4][ii] =  -(((16384/iTRp)*(1-iTRb*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt2;
                                    img->bw_mv[i4+BLOCK_SIZE][j4][ii] = (((16384/iTRp)*(1-iTRd*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt_bw;
                                }
                                else
                                {
                                    img->fw_mv[i4+BLOCK_SIZE][j4][ii] = (((16384/iTRp)*(1+iTRb*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt2;
                                    img->bw_mv[i4+BLOCK_SIZE][j4][ii] = -(((16384/iTRp)*(1+iTRd*(img->mv[img->block_x+i+4][img->block_y+j][ii]+delt))-1)>>14)-delt_bw;
                                }
	}
#endif
                            }
                        } 
                    }
            }

            img_block_y = img->block_y;

            i0+=max(1,step_h0);
        }
        j0+=max(1,step_v0);
    }


	  //=====  READ BACKWARD MOTION VECTORS =====
  currSE.type = SE_MVD;
  
  currSE.mapping = linfo_se;
  
  img_block_y = img->block_y;
  
  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)) 
	  { j0 += 1; continue;}
	  
	  
	  for (i0=0; i0<2; )
	  {
		  k=2*j0+i0;
		  
		  if ((currMB->b8pdir[k]==1 || currMB->b8pdir[k]==2) && (currMB->b8mode[k]!=0))//has backward vector
		  {
			  mv_mode  = currMB->b8mode[k];
			  step_h   = BLOCK_STEP [mv_mode][0];
			  step_v   = BLOCK_STEP [mv_mode][1];
			  
			  refframe = img->bw_refFrArr[img->block_y+j0][img->block_x+i0]; // always 0
			  
			  use_scaled_mv = 0;

			  if(currMB->b8pdir[k]==2)
			  {
				  fw_refframe = img->fw_refFrArr[img->block_y+j0][img->block_x+i0];
//				  current_tr  = 2*img->tr_frm;   // Commented by Xiaozhen ZHENG, 2007.05.01
				  current_tr  = 2*(img->pic_distance/2);
				  
			  }
			  
			  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;
					  
					  SetMotionVectorPredictor (img, pmv, pmv+1, refframe, img->bw_refFrArr, img->bw_mv, i, j, 8*step_h, 8*step_v, -1, 0);//Lou 1016
					  
					  for (k=0; k < 2; k++) 
					  {
#if TRACE
						  snprintf(currSE.tracestring, TRACESTRING_SIZE, "BMVD (pred %d)",pmv[k]);
#endif
						  img->subblock_x = i; // position used for context determination
						  img

⌨️ 快捷键说明

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