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

📄 main.cpp

📁 H.264运动搜索算法代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if(mv1.dx==mv2.dx && mv1.dy==mv2.dy)
		return 1;
	else
		return 0;
}
void search_PMVFAST(const int x,const int y,const int heigth,const int width)
{
	const int ox=x*BLOCK_HEIGTH,oy=y*BLOCK_WIDTH;
	const int LDS[9][2]={{0,0},{0,2},{-1,1},{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1}};
	const int SDS[5][2]={{0,0},{0,1},{-1,0},{0,-1},{1,0}};
	uint32 sad=0xffffff;
	MV mv={0,0},pre_mv[10];int mvx,mvy;

	int thresa=512,thresb=1024,Found=0,PredEq=0;
	if(x>0 && y>0)
	{
		thresa=MIN(frame_info.sad[x-1][y],frame_info.sad[x][y-1]);
		thresa=MIN(thresa,frame_info.sad[x-1][y+1]);
		thresb=thresa+256;
		if(thresa<512) thresa=512;
		if(thresa>1024)thresa=1024;
		if(thresb>1792)thresb=1792;
	}
	Get_MVp(x,y,pre_mv,mvx,mvy);
	if(x>0 && equal_mv(pre_mv[0],pre_mv[1]) && equal_mv(pre_mv[0],pre_mv[2]) )
		PredEq=1;

	int Distance=abs(mvx)+abs(mvy);
	if( PredEq==1 && mvx==pre_mv[4].dx && mvy==pre_mv[4].dy )
		Found=2;

	CHECK_ONE_PIXEL(mvx,mvy)
	if( equal_mv(mv,pre_mv[4]) && sad<frame_info.prev_sad[x][y] )
		goto END;
	if(sad<256) 
		goto END;
	CHECK_ONE_PIXEL(0,0)
	CHECK_ONE_PIXEL(pre_mv[0].dx,pre_mv[0].dy)
	CHECK_ONE_PIXEL(pre_mv[1].dx,pre_mv[1].dy)
	CHECK_ONE_PIXEL(pre_mv[2].dx,pre_mv[2].dy)
	CHECK_ONE_PIXEL(pre_mv[4].dx,pre_mv[4].dy)
	if(sad<thresa)
		goto END;
	if( equal_mv(mv,pre_mv[4]) && sad<frame_info.prev_sad[x][y] )
		goto END;
	if( Distance>0 || thresb<1536 || PredEq==1 )
		goto SMALL_SEARCH;
	PATTERN_SEARCH(LDS,9,Found!=2)
SMALL_SEARCH:
	PATTERN_SEARCH(SDS,5,Found!=2)
END:
	frame_info.mv[x][y]=mv;
	frame_info.sad[x][y]=sad;
	frame_info.frame_sad+=sad;
}
void search_CDHS(const int x,const int y,const int heigth,const int width)
{
	const int ox=x*BLOCK_HEIGTH,oy=y*BLOCK_WIDTH;
	const int LCS[9][2]={{0,0},{0,1},{-1,0},{0,-1},{1,0},{0,2},{-2,0},{0,-2},{2,0}};
	const int LDS[9][2]={{0,0},{0,2},{-1,1},{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1}};
	const int SDS[5][2]={{0,0},{0,1},{-1,0},{0,-1},{1,0}};
	const int HHS[7][2]={{0,0},{0,2},{0,-2},{1,1},{1,-1},{-1,1},{-1,-1}};
	const int VHS[7][2]={{0,0},{2,0},{-2,0},{1,1},{1,-1},{-1,1},{-1,-1}};
	uint32 sad=0xffffff;
	MV mv={0,0},mv_tmp;int mvx,mvy,flag;

	PATTERN_SEARCH(SDS,5,0)
	if(mv.dx==0&&mv.dy==0)goto END;
	PATTERN_SEARCH(SDS,5,0)
	if(abs(mv.dx)+abs(mv.dy)==1)goto END;
	mv_tmp=mv;mv.dx=mv.dy=0;
	PATTERN_SEARCH(LCS,9,0)
	if(mv.dx==0&&mv.dy==0) mv=mv_tmp;
	if(abs(mv.dx)==1 && abs(mv.dy)==1)
		flag=0;
	else if(abs(mv.dx)==0 && abs(mv.dy)==2)
		flag=1;
	else if(abs(mv.dx)==2 && abs(mv.dy)==0)
		flag=2;
	else
		printf("error\n");
	do
	{
		mvx=mv.dx;mvy=mv.dy;
		if(flag==0)
		{
			for(int i=0;i<9;i++)
			{
				if(SAD(ox,oy,mvx+LDS[i][0],mvy+LDS[i][1],heigth,width,sad)==1)
				{
					mv.dx=mvx+LDS[i][0];mv.dy=mvy+LDS[i][1];
					if		(abs(LDS[i][1])==2) flag=1;
					else if	(abs(LDS[i][0])==2) flag=2;
					else						flag=0;
				}
			}
		}
		else if(flag==1)
		{
			for(int i=0;i<7;i++)
			{
				if(SAD(ox,oy,mvx+HHS[i][0],mvy+HHS[i][1],heigth,width,sad)==1)
				{
					mv.dx=mvx+HHS[i][0];mv.dy=mvy+HHS[i][1];
					flag = abs(HHS[i][1])==2 ? 1 : 0;
				}
			}
		}
		else
		{
			for(int i=0;i<7;i++)
			{
				if(SAD(ox,oy,mvx+VHS[i][0],mvy+VHS[i][1],heigth,width,sad)==1)
				{
					mv.dx=mvx+VHS[i][0];mv.dy=mvy+VHS[i][1];
					flag = abs(VHS[i][0])==2 ? 2 : 0;
				}
			}
		}
	}while ( mv.dx!=mvx || mv.dy!=mvy );
	PATTERN_SEARCH(SDS,5,0)
END:
	frame_info.mv[x][y]=mv;
	frame_info.sad[x][y]=sad;
	frame_info.frame_sad+=sad;
}
void search_AVPS(const int x,const int y,const int heigth,const int width)
{
	const int ox=x*BLOCK_HEIGTH,oy=y*BLOCK_WIDTH;
	const int LDS[9][2]={{0,0},{0,2},{-1,1},{-2,0},{-1,-1},{0,-2},{1,-1},{2,0},{1,1}};
	const int SDS[5][2]={{0,0},{0,1},{-1,0},{0,-1},{1,0}};
	const int LHS[7][2]={{0,0},{0,2},{-2,1},{-2,-1},{0,-2},{2,-1},{2,1}};
	const int SHS[9][2]={{0,0},{0,1},{-1,0},{0,-1},{1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
	const int L4SS[9][2]={{0,0},{0,2},{-2,2},{-2,0},{-2,-2},{0,-2},{2,-2},{2,0},{2,2}};
	const int S4SS[9][2]={{0,0},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}};
	uint32 sad=0xffffff;
	MV mv={0,0},pre_mv[10];uint32 pre_sad[10];int mvx,mvy;

	int thresa=512,thresb=1024,PredEq=0;
	Get_MVp(x,y,pre_mv,mvx,mvy,pre_sad);
	int sad_max=0xffffff,sad_min=0;
	if(x>0 && y>0)
	{
		if(equal_mv(mv,pre_mv[0]))			
			sad_min=MAX(sad_min,pre_sad[0])
		else
			sad_max=MIN(sad_max,pre_sad[0]);
		if(equal_mv(mv,pre_mv[1]))			
			sad_min=MAX(sad_min,pre_sad[1])
		else
			sad_max=MIN(sad_max,pre_sad[1]);                                                                                                                                                                                                                        
		if(equal_mv(mv,pre_mv[2]))			
			sad_min=MAX(sad_min,pre_sad[2])
		else
			sad_max=MIN(sad_max,pre_sad[2]);
//		if(equal_mv(mv,pre_mv[3]))			
//			sad_min=MAX(sad_min,pre_sad[3])
//		else
//			sad_max=MIN(sad_max,pre_sad[3]);
		if(sad_min==0)sad_min=512;
		if(sad_max==0xffffff)sad_max=512;
		thresa=MAX(sad_max,sad_min);
				
		sad_max=MAX(pre_sad[0],pre_sad[1]);
		sad_max=MAX(sad_max,pre_sad[2]);
		sad_max=MAX(sad_max,pre_sad[3]);
		sad_min=MIN(pre_sad[0],pre_sad[1]);
		sad_min=MIN(sad_min,pre_sad[2]);
		sad_min=MIN(sad_min,pre_sad[3]);

		thresb=MAX(sad_max,thresa+256);
		if(thresa<512) thresa=512;
		if(thresa>1024)thresa=1024;
		if(thresb>1792)thresb=1792;
	}
	else
	{
		sad_min=0;
		sad_max=2048;
	}
	if(x>0 && equal_mv(pre_mv[0],pre_mv[1]) && equal_mv(pre_mv[0],pre_mv[2]) )
		PredEq=1;

	CHECK_ONE_PIXEL(mvx,mvy)
	if(sad<256)
		goto END;
	CHECK_ONE_PIXEL(0,0)
	CHECK_ONE_PIXEL(pre_mv[0].dx,pre_mv[0].dy)
	CHECK_ONE_PIXEL(pre_mv[1].dx,pre_mv[1].dy)
	CHECK_ONE_PIXEL(pre_mv[2].dx,pre_mv[2].dy)
	CHECK_ONE_PIXEL(pre_mv[4].dx,pre_mv[4].dy)
	if(sad<thresa)
		goto END;
	if(sad<thresb||sad_max-sad_min<256||(x>0&&y>0&&Get_Mv_Length(x,y,pre_mv,mvx,mvy)<2))
		goto SMALL_SEARCH2;
	else
	{
		CHECK_ONE_PIXEL(pre_mv[5].dx,pre_mv[5].dy)
		goto LARGE_SEARCH0;
	}
//	{
//	CHECK_ONE_PIXEL(pre_mv[5].dx,pre_mv[5].dy)
//	PATTERN_SEARCH(LHS,7,1)
//	int sad_sub=0xffffff;mvx=mvy=0;
//	for(int i=1;i<7;i++)
//	{
//		int dx=mv.dx+LHS[i][0],dy=mv.dy+LHS[i][1];
//		const int rx=ox+dx,ry=oy+dy;
//		if( abs(dx)>MAX_MOTION || abs(dy)>MAX_MOTION)
//			continue;
//		if( rx<0 || ry<0 || rx+heigth>XX || ry+width>YY )
//			continue;
//		if( flag_search[dx][dy]<sad_sub )
//		{
//			sad_sub=flag_search[dx][dy];
//			mvx=LHS[i][0];mvy=LHS[i][1];
//		}
//	}
//	int shsxy[3][2];
//	if(mvx==0)
//	{
//		shsxy[0][0]=-1;shsxy[1][0]=0;shsxy[2][0]=1;shsxy[0][1]=shsxy[1][1]=shsxy[2][1]=mvy/2;
//	}
//	else
//	{
//		shsxy[0][0]=mvx/2;shsxy[0][1]=mvy;
//		shsxy[1][0]=mvx/2;shsxy[1][1]=0;
//		shsxy[2][0]=    0;shsxy[2][1]=mvy;
//	}
//	PATTERN_SEARCH(shsxy,3,0);
//	PATTERN_SEARCH(SDS,5,0);
//	goto END;
//	}
LARGE_SEARCH0:
	PATTERN_SEARCH(LDS,9,1)
	PATTERN_SEARCH(SDS,5,0)
	goto END;
LARGE_SEARCH1:
	PATTERN_SEARCH(LHS,7,1)
	PATTERN_SEARCH(SHS,9,0)
	goto END;
LARGE_SEARCH2:
	PATTERN_SEARCH(L4SS,9,1)
	PATTERN_SEARCH(S4SS,9,0)
	goto END;
SMALL_SEARCH0:
	PATTERN_SEARCH(SHS,9,1)
		goto END;
SMALL_SEARCH1:
	PATTERN_SEARCH(SDS,5,1)
		goto END;
SMALL_SEARCH2:
	do
	{
		MV tmp_mv=mv;uint32 tmp_sad=sad;
		mvx=mv.dx;mvy=mv.dy;sad=0xffffff;
		for(int i=1;i<5;i++)
		{
			if(SAD(ox,oy,mvx+SDS[i][0],mvy+SDS[i][1],heigth,width,sad)==1)
			{
				mv.dx=mvx+SDS[i][0];mv.dy=mvy+SDS[i][1];
			}
		}
		if(sad<tmp_sad)
			continue;
		if(sad/(float)tmp_sad>1.15)
		{
			mv=tmp_mv;sad=tmp_sad;
			break;
		}
		if(mv.dy!=mvy)
		{
			CHECK_ONE_PIXEL(mv.dx-1,mv.dy)
			CHECK_ONE_PIXEL(mv.dx+1,mv.dy)
		}
		if(mv.dx!=mvx)
		{
			CHECK_ONE_PIXEL(mv.dx,mv.dy-1)
			CHECK_ONE_PIXEL(mv.dx,mv.dy+1)
		}
		if(sad>=tmp_sad)
		{
			mv=tmp_mv;sad=tmp_sad;
			break;
		}
	}while ( 1 );
	goto END;
END:
	frame_info.mv[x][y]=mv;
	frame_info.sad[x][y]=sad;
	frame_info.frame_sad+=sad;
}
#undef PATTERN_SEARCH
void main()
{
	int num;
	if((fp_cur = fopen(OPEN_FILE,"rb"))==NULL)	return;
	if((fp_ref = fopen( REF_FILE,"rb"))==NULL)	return;
	frame_info.sum_pot=frame_info.sum_sad=frame_info.sum_sse=0;
	frame_info.mv=_mv_buffer[0];frame_info.prev_mv=_mv_buffer[1];
	printf("frame\tcost\tpsnr\n");
	for(num=0;num<100;num++)
	{
		int i,j;
		fseek(fp_cur,XX*YY*3/2*(num+1),SEEK_SET);
		if(fread(current_frame[0],XX*YY,1,fp_cur)==0)break;
		fseek(fp_ref,XX*YY*3/2*(num+0),SEEK_SET);
		if(fread(	 ref_frame[0],XX*YY,1,fp_ref)==0)break;
		frame_info.frame_pot=frame_info.frame_sad=frame_info.frame_sse=0;
		for( i=0;i<X;i++)
		{
			for( j=0;j<Y;j++)
			{
				memset(_flag_search,0,SEARCH_RANGE*SEARCH_RANGE);
				search_AVPS(i,j,BLOCK_HEIGTH,BLOCK_WIDTH);
				rebuilt(i,j,BLOCK_HEIGTH,BLOCK_WIDTH);
			}
		}
		frame_info.sum_pot+=frame_info.frame_pot;
		frame_info.sum_sad+=frame_info.frame_sad;
		frame_info.sum_sse+=frame_info.frame_sse;
		MV (*mv_tmp)[Y]=frame_info.mv;frame_info.mv=frame_info.prev_mv;frame_info.prev_mv=mv_tmp;
		memcpy(frame_info.prev_sad,frame_info.sad,X*Y*sizeof(uint32));
		printf("%d\t%.2f\t%.2f\n",num,(float)frame_info.frame_pot/X/Y,10*log10(XX*YY*255*255.0/frame_info.frame_sse));
	}
	printf("\nAvg:\t%.2f\t%.2f\n",(float)frame_info.sum_pot/X/Y/num,10*log10(XX*YY*255*255.0*num/frame_info.sum_sse));
	fclose(fp_cur);fclose(fp_ref);
}

⌨️ 快捷键说明

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