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

📄 estimation_common.c

📁 TMS320C6713Xvid视频压缩算法源代码.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
		/* now we're doing diagonal checks near our candidate */		if (*iDirection) {		/* if anything found */			bDirection = *iDirection;			*iDirection = 0;			x = data->currentMV->x; y = data->currentMV->y;			if (bDirection & 3) {	/* our candidate is left or right */				CHECK_CANDIDATE(x, y + iDiamondSize, 8);				CHECK_CANDIDATE(x, y - iDiamondSize, 4);			} else {			/* what remains here is up or down */				CHECK_CANDIDATE(x + iDiamondSize, y, 2);				CHECK_CANDIDATE(x - iDiamondSize, y, 1);			}			if (*iDirection) {				bDirection += *iDirection;				x = data->currentMV->x; y = data->currentMV->y;			}		} else {				/* about to quit, eh? not so fast.... */			switch (bDirection) {			case 2:				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				break;			case 1:				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				break;			case 2 + 4:				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				break;			case 4:				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				break;			case 8:				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				break;			case 1 + 4:				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				break;			case 2 + 8:				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				break;			case 1 + 8:				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				break;			default:		/* 1+2+4+8 == we didn't find anything at all */				CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1 + 4);				CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1 + 8);				CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2 + 4);				CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2 + 8);				break;			}			if (!*iDirection) break;		/* ok, the end. really */			bDirection = *iDirection;			x = data->currentMV->x; y = data->currentMV->y;		}	}}voidxvid_me_SquareSearch(int x, int y, SearchData * const data,					 int bDirection, CheckFunc * const CheckCandidate){	unsigned int * const iDirection = &data->dir;	do {		*iDirection = 0;		if (bDirection & 1) CHECK_CANDIDATE(x - iDiamondSize, y, 1+16+64);		if (bDirection & 2) CHECK_CANDIDATE(x + iDiamondSize, y, 2+32+128);		if (bDirection & 4) CHECK_CANDIDATE(x, y - iDiamondSize, 4+16+32);		if (bDirection & 8) CHECK_CANDIDATE(x, y + iDiamondSize, 8+64+128);		if (bDirection & 16) CHECK_CANDIDATE(x - iDiamondSize, y - iDiamondSize, 1+4+16+32+64);		if (bDirection & 32) CHECK_CANDIDATE(x + iDiamondSize, y - iDiamondSize, 2+4+16+32+128);		if (bDirection & 64) CHECK_CANDIDATE(x - iDiamondSize, y + iDiamondSize, 1+8+16+64+128);		if (bDirection & 128) CHECK_CANDIDATE(x + iDiamondSize, y + iDiamondSize, 2+8+32+64+128);		bDirection = *iDirection;		x = data->currentMV->x; y = data->currentMV->y;	} while (*iDirection);}voidxvid_me_DiamondSearch(int x, int y, SearchData * const data,					  int bDirection, CheckFunc * const CheckCandidate){/* directions: 1 - left (x-1); 2 - right (x+1), 4 - up (y-1); 8 - down (y+1) */	unsigned int * const iDirection = &data->dir;	do {		*iDirection = 0;		if (bDirection & 1) CHECK_CANDIDATE(x - iDiamondSize, y, 1);		if (bDirection & 2) CHECK_CANDIDATE(x + iDiamondSize, y, 2);		if (bDirection & 4) CHECK_CANDIDATE(x, y - iDiamondSize, 4);		if (bDirection & 8) CHECK_CANDIDATE(x, y + iDiamondSize, 8);		/* now we're doing diagonal checks near our candidate */		if (*iDirection) {		/* checking if anything found */			bDirection = *iDirection;			*iDirection = 0;			x = data->currentMV->x; y = data->currentMV->y;			if (bDirection & 3) {	/* our candidate is left or right */				CHECK_CANDIDATE(x, y + iDiamondSize, 8);				CHECK_CANDIDATE(x, y - iDiamondSize, 4);			} else {			/* what remains here is up or down */				CHECK_CANDIDATE(x + iDiamondSize, y, 2);				CHECK_CANDIDATE(x - iDiamondSize, y, 1);			}			bDirection += *iDirection;			x = data->currentMV->x; y = data->currentMV->y;		}	}	while (*iDirection);}voidxvid_me_SubpelRefine(SearchData * const data, CheckFunc * const CheckCandidate){/* Do a half-pel or q-pel refinement */	const VECTOR centerMV = data->qpel_precision ? *data->currentQMV : *data->currentMV;	CHECK_CANDIDATE(centerMV.x, centerMV.y - 1, 0);	CHECK_CANDIDATE(centerMV.x + 1, centerMV.y - 1, 0);	CHECK_CANDIDATE(centerMV.x + 1, centerMV.y, 0);	CHECK_CANDIDATE(centerMV.x + 1, centerMV.y + 1, 0);	CHECK_CANDIDATE(centerMV.x, centerMV.y + 1, 0);	CHECK_CANDIDATE(centerMV.x - 1, centerMV.y + 1, 0);	CHECK_CANDIDATE(centerMV.x - 1, centerMV.y, 0);	CHECK_CANDIDATE(centerMV.x - 1, centerMV.y - 1, 0);}voidSubpelRefine_Fast(SearchData * data, CheckFunc * CheckCandidate){/* Do a fast q-pel refinement */	VECTOR centerMV;	VECTOR second_best;	int best_sad = *data->iMinSAD;	int xo, yo, xo2, yo2;	int size = 2;	data->iMinSAD2 = 0;	/* check all halfpixel positions near our best halfpel position */	centerMV = *data->currentQMV;	*data->iMinSAD = 256 * 4096;	CHECK_CANDIDATE(centerMV.x, centerMV.y - size, 0);	CHECK_CANDIDATE(centerMV.x + size, centerMV.y - size, 0);	CHECK_CANDIDATE(centerMV.x + size, centerMV.y, 0);	CHECK_CANDIDATE(centerMV.x + size, centerMV.y + size, 0);	CHECK_CANDIDATE(centerMV.x, centerMV.y + size, 0);	CHECK_CANDIDATE(centerMV.x - size, centerMV.y + size, 0);	CHECK_CANDIDATE(centerMV.x - size, centerMV.y, 0);	CHECK_CANDIDATE(centerMV.x - size, centerMV.y - size, 0);	second_best = *data->currentQMV;	/* after second_best has been found, go back to the vector we began with */	data->currentQMV[0] = centerMV;	*data->iMinSAD = best_sad;	xo = centerMV.x;	yo = centerMV.y;	xo2 = second_best.x;	yo2 = second_best.y;	data->iMinSAD2 = 256 * 4096;	if (yo == yo2) {		CHECK_CANDIDATE((xo+xo2)>>1, yo, 0);		CHECK_CANDIDATE(xo, yo-1, 0);		CHECK_CANDIDATE(xo, yo+1, 0);		if(best_sad <= data->iMinSAD2) return;		if(data->currentQMV[0].x == data->currentQMV2.x) {			CHECK_CANDIDATE((xo+xo2)>>1, yo-1, 0);			CHECK_CANDIDATE((xo+xo2)>>1, yo+1, 0);		} else {			CHECK_CANDIDATE((xo+xo2)>>1,				(data->currentQMV[0].x == xo) ? data->currentQMV[0].y : data->currentQMV2.y, 0);		}		return;	}	if (xo == xo2) {		CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0);		CHECK_CANDIDATE(xo-1, yo, 0);		CHECK_CANDIDATE(xo+1, yo, 0);		if(best_sad <= data->iMinSAD2) return;		if(data->currentQMV[0].y == data->currentQMV2.y) {			CHECK_CANDIDATE(xo-1, (yo+yo2)>>1, 0);			CHECK_CANDIDATE(xo+1, (yo+yo2)>>1, 0);		} else {			CHECK_CANDIDATE((data->currentQMV[0].y == yo) ? data->currentQMV[0].x : data->currentQMV2.x, (yo+yo2)>>1, 0);		}		return;	}	CHECK_CANDIDATE(xo, (yo+yo2)>>1, 0);	CHECK_CANDIDATE((xo+xo2)>>1, yo, 0);	if(best_sad <= data->iMinSAD2) return;	CHECK_CANDIDATE((xo+xo2)>>1, (yo+yo2)>>1, 0);}

⌨️ 快捷键说明

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