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

📄 block.cpp

📁 h264编解码.用C++实现了图像的编解码功能。
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  	prev_m1 = -1;
  	for (l = 1; l <= 16; l++){
  		sad_layr = 65536;
  		for (m = 0; m < 4; m++){
  			i = i_min_now + htp[m];
  			j = j_min_now + vtp[m];
  			Coffset = i - x_curr + (j - y_curr)*width;
  			if(l>2&&prev_m1 == m)
  			{
  				current_inter_sad = prev_AE1[l-2];
  				if (current_inter_sad < sad_layr){
  					sad_layr = current_inter_sad;
  					i_min_next = i;
  					j_min_next = j;
  					prev_m2=prevm[m];
  					prev_AE1[l]=current_inter_sad;
  				}
  			}
  			else if (i >= -4 && i <= maxX && j >= -4 && j <= maxY){
  				tmp0=((i - x_curr)<<2)-ip0;
			        tmp1=((j - y_curr)<<2)-ip1;
			        current_inter_sad=(lambda*(img->mv_bituse[IABS(tmp0)]+img->mv_bituse[IABS(tmp1)]));
			        //current_inter_sad += SAD_Macroblock_sub(img,curr, prev+Coffset, sad_layr,current_inter_sad);
					current_inter_sad = SAD_Macroblock_sub(img,curr, prev+Coffset, sad_layr,current_inter_sad);
  				//current_inter_sad = SAD_Macroblock(prev+Coffset, curr, sad_layr);
  				if (current_inter_sad < best_inter_sad[index]){
  					mvx0  = i - x_curr;
  					mvy0  = j - y_curr;
  					ioffset = Coffset;
  					best_inter_sad[index] = current_inter_sad ;
  				}
  				if (current_inter_sad < sad_layr){
  					sad_layr = current_inter_sad;
  					i_min_next = i;
  					j_min_next = j;
  					prev_m2 = prevm[m];
	  				prev_AE1[l] = current_inter_sad;
  				}
  			}
  		}
  		prev_m1 = prev_m2;
  		i_min_now = i_min_next;
  		j_min_now = j_min_next;
  		distortion_2 = distortion_1;
  		distortion_1 = distortion_0;
  		distortion_0 = sad_layr;
  		if (distortion_1 <= distortion_0 && distortion_2 <= distortion_0){
  			break;  			
  		}
  	}
  	offset+=ioffset;
	x_curr+=mvx0;
	y_curr+=mvy0;
#endif
	
	pos=0;
	for (i = 1; i < 9; i++)
	{
		point++;
		x=x_curr+point->x;
		y=y_curr+point->y;
#ifdef FAST_INTEGER
		if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
			continue;
#endif
		
		tmp0=(mvx0<<2)+point->x-ip0;
	        tmp1=(mvy0<<2)+point->y-ip1;
	        current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
		prev=ipol[point->comp] + offset + point->offset;
//		current_inter_sad+=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
		current_inter_sad=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
		if (current_inter_sad < best_inter_sad[index])
		{
			best_inter_sad[index]=current_inter_sad;
			pos=i;
		}
	}
	mvx1 = search[pos].x;
	mvy1 = search[pos].y;
	offset+=search[pos].offset;
	type  =search[pos].type;
	x_curr+=(mvx1>>1);
	y_curr+=(mvy1>>1);
	
	point=qsearch[type];
	pos=0;
	for (i = 1; i < 9; i++)
	{
		point++;
		x=x_curr+point->x;
		y=y_curr+point->y;
#ifdef FAST_INTEGER
		if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
			continue;
#endif
			
		tmp0=(mvx0<<2)+mvx1+point->x-ip0;
        tmp1=(mvy0<<2)+mvy1+point->y-ip1;
        current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
		prev=ipol[point->comp] + offset + point->offset;
		current_inter_sad=SAD_Macroblock_sub(img,prev,curr,best_inter_sad[index],current_inter_sad);
		if (current_inter_sad < best_inter_sad[index])
		{
			best_inter_sad[index]=current_inter_sad;
			pos=i;
		}
	}
	offset+=qsearch[type][pos].offset;
	img->offset1[index]=offset;
	img->comp1[index]  =qsearch[type][pos].comp;
	curr_mvx1[index]=(mvx0<<2)+mvx1+qsearch[type][pos].x;
	curr_mvy1[index]=(mvy0<<2)+mvy1+qsearch[type][pos].y;
    }
	
	current_inter_sad = best_inter_sad[0]+best_inter_sad[1];
	if(current_inter_sad < MinCost) 
	{
	    img->mb_mode=2;
	    img->imod=INTRA_MB_INTER; 
		for(i=0;i<4;i++)
		{
			tmp_mv[pic_block_y-2][pic_block_x+4+i][0]=curr_mvx1[0];
			tmp_mv[pic_block_y-2][pic_block_x+4+i][1]=curr_mvy1[0];
			tmp_mv[pic_block_y-1][pic_block_x+4+i][0]=curr_mvx1[0];
			tmp_mv[pic_block_y-1][pic_block_x+4+i][1]=curr_mvy1[0];
			tmp_mv[pic_block_y][pic_block_x+4+i][0]=curr_mvx1[1];
			tmp_mv[pic_block_y][pic_block_x+4+i][1]=curr_mvy1[1];
			tmp_mv[pic_block_y+1][pic_block_x+4+i][0]=curr_mvx1[1];
			tmp_mv[pic_block_y+1][pic_block_x+4+i][1]=curr_mvy1[1];
			intra_mb_pos[pic_block_y-2][pic_block_x+4+i] = 0;
			intra_mb_pos[pic_block_y-1][pic_block_x+4+i] = 0;
			intra_mb_pos[pic_block_y][pic_block_x+4+i] = 0;
			intra_mb_pos[pic_block_y+1][pic_block_x+4+i] = 0;
		}
	    MinCost = current_inter_sad;
	} 
          	        
  return MinCost;
}

int motion_search_8x16(struct img_par *img,int MinCost)
{
  int i,index;
  int vec0_x,vec0_y,vec1_x,vec1_y,vec2_x,vec2_y;
  int pic_block_x,pic_block_y,pic_pix_y,pic_pix_x;
  int ip0,ip1,ip2,ip3,ip4,ip5;
  int best_inter_sad[2],current_inter_sad;
  int tmp0,tmp1; 
  int lambda = QP2QUANT[img->qp-SHIFT_QP]; 
  int x,y,offset,type,pos;  
        byte* curr;
	byte* prev;
	Point* point=search;
	SAD_TABLE * sadTbl=sadTable;
	int maxX=img->width-4;
	int maxY=img->height-12;
	int sadTimes=25;
	int mvx0,mvy0,mvx1,mvy1; 
	int x_curr,y_curr;
	int width=img->width+IMG_PAD_SIZE;

#ifdef FAST_INTEGER	
	int prev_AE1[17];
	int prev_m1,prev_m2=0;
	static int prevm[4] = {2, 3, 0, 1};
	static int htp[4] = {-1, 0, 1, 0};
	static int vtp[4] = {0, 1, 0, -1};
	int j_min_now, i_min_now, i_min_next=0, j_min_next=0, sad_layr,Coffset,ioffset=0,l,m,j;
	int distortion_0, distortion_1, distortion_2;
#endif
	
  for(index=0;index<2;index++)
  {
	  point=search;
	  sadTbl=sadTable;
	  pic_block_y=img->block_y;
	  pic_pix_y=img->pix_y;
	        
	  pic_block_x=img->block_x+2*index;
	  pic_pix_x=img->pix_x+8*index;
	
	  x_curr=pic_pix_x;
	  y_curr=pic_pix_y;
	                    
	  if(index==0)
	  {
		  vec0_x=pic_block_x-1;
		  vec0_y=pic_block_y;
		  vec1_x=pic_block_x;
		  vec1_y=pic_block_y-1;
		  vec2_x=pic_block_x+2;
		  vec2_y=pic_block_y-1;
		  if (pic_block_y == 0) 
	          {
	            vec1_x=vec0_x;
	            vec2_x=vec0_x;
	            vec1_y=vec0_y;
	            vec2_y=vec0_y;
	          }                
	          //if (vec2_x > (img->width>>2)-1) 
	          //{
	          //  vec2_x=pic_block_x-1;
	          //}
		  	ip0=tmp_mv[vec0_y][vec0_x+4][0];
			ip1=tmp_mv[vec1_y][vec1_x+4][0];
			ip2=tmp_mv[vec2_y][vec2_x+4][0];
			ip3=tmp_mv[vec0_y][vec0_x+4][1];
			ip4=tmp_mv[vec1_y][vec1_x+4][1];
			ip5=tmp_mv[vec2_y][vec2_x+4][1];
		  	if(!intra_mb_pos[vec0_y][vec0_x+4])
			{
				img->mv2[index][0] = ip0;
				img->mv2[index][1] = ip3;
			}
		  	else
		  	{
		  		if((!intra_mb_pos[vec1_y][vec1_x+4])&&(intra_mb_pos[vec2_y][vec2_x+4]))
				{
					img->mv2[index][0] = ip1;
					img->mv2[index][1] = ip4;
				}
				else if((intra_mb_pos[vec1_y][vec1_x+4])&&(!intra_mb_pos[vec2_y][vec2_x+4]))
				{
					img->mv2[index][0] = ip2;
					img->mv2[index][1] = ip5;
				}
				else
				{
					img->mv2[index][0]=ip0+ip1+ip2-min(min(ip0,ip1),ip2)-max(max(ip0,ip1),ip2);
					img->mv2[index][1]=ip3+ip4+ip5-min(min(ip3,ip4),ip5)-max(max(ip3,ip4),ip5);
				}			  				
		  	}
	  }
	  else
	  {
		  vec0_x=pic_block_x-1;
		  vec0_y=pic_block_y;
		  vec1_x=pic_block_x;
		  vec1_y=pic_block_y-1;
		  vec2_x=pic_block_x+2;
		  vec2_y=pic_block_y-1;
		  if (vec2_x > (img->width>>2)-1) 
		  {
			  vec2_x=pic_block_x-1;
		  }
		  if (pic_block_y == 0) 
		  {
			  //ip0=ip1=ip2=curr_mvx1[0];
			  //ip3=ip4=ip5=curr_mvy1[0];
			  img->mv2[index][0] = curr_mvx2[0];
			img->mv2[index][1] = curr_mvy2[0];
		  }
		  else
		  {                	          		  
					ip0=curr_mvx2[0];
            		ip1=tmp_mv[vec1_y][vec1_x+4][0];
					ip2=tmp_mv[vec2_y][vec2_x+4][0];
					ip3=curr_mvy2[0];
            		ip4=tmp_mv[vec1_y][vec1_x+4][1];
            		ip5=tmp_mv[vec2_y][vec2_x+4][1];
            	  
		        
				  if(!intra_mb_pos[vec2_y][vec2_x+4])
				  {
						img->mv2[index][0] = ip2;
						img->mv2[index][1] = ip5;
				  }
				  else
				  {
					  if(intra_mb_pos[vec1_y][vec1_x+4])
					  {
						img->mv2[index][0] = ip0;
						img->mv2[index][1] = ip3;
					  }
					  else
					  {
						img->mv2[index][0]=ip0+ip1+ip2-min(min(ip0,ip1),ip2)-max(max(ip0,ip1),ip2);
						img->mv2[index][1]=ip3+ip4+ip5-min(min(ip3,ip4),ip5)-max(max(ip3,ip4),ip5);
					  }
				  }
		  }
	  }
          ip0=img->mv2[index][0];
          ip1=img->mv2[index][1];
          
        
	
	offset=width*pic_pix_y+pic_pix_x;  
	curr=imgY_org + offset;
	prev=ipol[0] + offset;
#ifndef FAST_INTEGER	
	    tmp0=-ip0;
	    tmp1=-ip1;
	    current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
	    best_inter_sad[index] = SAD_Macroblock_sub2(img,curr, prev, MAX_VALUE,current_inter_sad);
	    //best_inter_sad[index] -= lambda * 16;//is 16x16block,here should not
		mvx0=0;
	    mvy0=0;
        
    
          
	pos=0;
	for (i = 1; i < sadTimes; i++)
	{
		sadTbl++;
		x=x_curr+sadTbl->dx;
		y=y_curr+sadTbl->dy;
		//if((x<0)||(y<0)||(x>maxX)||(y>maxY))
		//	continue;

		tmp0=(sadTbl->dx<<2)-ip0;
		tmp1=(sadTbl->dy<<2)-ip1;
		current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
		//current_inter_sad += SAD_Macroblock_sub2(img,prev+sadTbl->offset, curr, best_inter_sad[index],current_inter_sad);
		current_inter_sad = SAD_Macroblock_sub2(img,prev+sadTbl->offset, curr, best_inter_sad[index],current_inter_sad);
		if (current_inter_sad < best_inter_sad[index])
		{
			pos=i;
			best_inter_sad[index] = current_inter_sad;
		}
	}
	mvx0 = sadTable[pos].dx;
	mvy0 = sadTable[pos].dy;
	offset+=sadTable[pos].offset;
	x_curr+=mvx0;
	y_curr+=mvy0; 
#else
	//ioffset=0;
	i_min_now = min(maxX,max(-4, x_curr+(ip0>>2)));
	j_min_now = min(maxY,max(-4, y_curr+(ip1>>2)));
	//i_min_now = x_curr;
	//j_min_now = y_curr;
	mvx0=i_min_now-x_curr;
	mvy0=j_min_now-y_curr;
	ioffset=width*mvy0+mvx0;
	tmp0=(mvx0<<2)-ip0;
	tmp1=(mvy0<<2)-ip1;
	current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
	best_inter_sad[index] = SAD_Macroblock_sub2(img,curr, prev+j_min_now*width+i_min_now-offset, MAX_VALUE,current_inter_sad);

  	distortion_0 = distortion_1 = distortion_2 = 65536;
  	prev_AE1[0] = best_inter_sad[index];
  	prev_m1 = -1;
  	for (l = 1; l <= 16; l++){
  		sad_layr = 65536;
  		for (m = 0; m < 4; m++){
  			i = i_min_now + htp[m];
  			j = j_min_now + vtp[m];
  			Coffset = i - x_curr + (j - y_curr)*width;
  			if(l>2&&prev_m1 == m)
  			{
  				current_inter_sad = prev_AE1[l-2];
  				if (current_inter_sad < sad_layr){
  					sad_layr = current_inter_sad;
  					i_min_next = i;
  					j_min_next = j;
  					prev_m2=prevm[m];
  					prev_AE1[l]=current_inter_sad;
  				}
  			}
  			else if (i >= -4 && i <= maxX && j >= -4 && j <= maxY){
  				tmp0=((i - x_curr)<<2)-ip0;
			        tmp1=((j - y_curr)<<2)-ip1;
			        current_inter_sad=(lambda*(img->mv_bituse[IABS(tmp0)]+img->mv_bituse[IABS(tmp1)]));
			        //current_inter_sad += SAD_Macroblock_sub2(img,curr, prev+Coffset, sad_layr,current_inter_sad);
					current_inter_sad = SAD_Macroblock_sub2(img,curr, prev+Coffset, sad_layr,current_inter_sad);
  				//current_inter_sad = SAD_Macroblock(prev+Coffset, curr, sad_layr);
  				if (current_inter_sad < best_inter_sad[index]){
  					mvx0  = i - x_curr;
  					mvy0  = j - y_curr;
  					ioffset = Coffset;
  					best_inter_sad[index] = current_inter_sad ;
  				}
  				if (current_inter_sad < sad_layr){
  					sad_layr = current_inter_sad;
  					i_min_next = i;
  					j_min_next = j;
  					prev_m2 = prevm[m];
	  				prev_AE1[l] = current_inter_sad;
  				}
  			}
  		}
  		prev_m1 = prev_m2;
  		i_min_now = i_min_next;
  		j_min_now = j_min_next;
  		distortion_2 = distortion_1;
  		distortion_1 = distortion_0;
  		distortion_0 = sad_layr;
  		if (distortion_1 <= distortion_0 && distortion_2 <= distortion_0){
  			break;  			
  		}
  	}
  	offset+=ioffset;
	x_curr+=mvx0;
	y_curr+=mvy0;
#endif	
	
	pos=0;
	for (i = 1; i < 9; i++)
	{
		point++;
		x=x_curr+point->x;
		y=y_curr+point->y;
#ifdef FAST_INTEGER
		if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
			continue;
#endif
		
		tmp0=(mvx0<<2)+point->x-ip0;
		tmp1=(mvy0<<2)+point->y-ip1;
		current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
		prev=ipol[point->comp] + offset + point->offset;
		//current_inter_sad+=SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
		current_inter_sad = SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
		if (current_inter_sad < best_inter_sad[index])
		{
			best_inter_sad[index]=current_inter_sad;
			pos=i;
		}
	}
	mvx1 = search[pos].x;
	mvy1 = search[pos].y;
	offset+=search[pos].offset;
	type  =search[pos].type;
	x_curr+=(mvx1>>1);
	y_curr+=(mvy1>>1);
	
	point=qsearch[type];
	pos=0;
	for (i = 1; i < 9; i++)
	{
		point++;
		x=x_curr+point->x;
		y=y_curr+point->y;
#ifdef FAST_INTEGER
		if((x<-4)||(y<-4)||(x>maxX)||(y>maxY))
			continue;
#endif
			
		tmp0=(mvx0<<2)+mvx1+point->x-ip0;
        tmp1=(mvy0<<2)+mvy1+point->y-ip1;
        current_inter_sad=(lambda*(img->mv_bituse[absm(tmp0)]+img->mv_bituse[absm(tmp1)]));
		prev=ipol[point->comp] + offset + point->offset;
		current_inter_sad = SAD_Macroblock_sub2(img,prev,curr,best_inter_sad[index],current_inter_sad);
		if (current_inter_sad < best_inter_sad[index])
		{
			best_inter_sad[index]=current_inter_sad;
			pos=i;
		}
	}
	offset+=qsearch[type][pos].offset;
	img->offset2[index]=offset;
	img->comp2[index]  =qsearch[type][pos].comp;
	curr_mvx2[index]=(mvx0<<2)+mvx1+qsearch[type][pos].x;
	curr_mvy2[index]=(mvy0<<2)+mvy1+qsearch[type][pos].y;
    }
	
	current_inter_sad = best_inter_sad[0]+best_inter_sad[1];

⌨️ 快捷键说明

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