[XviD-devel] About generate_GMCparameters() function

=?big5?q?anukeey?= anukeey at yahoo.com.tw
Wed Jun 11 18:08:16 CEST 2003


Hi all:
I'm a newbei of xvid.
I suffered some problems with this function: 
void generate_GMCparameters( const int num_wp, const
int res, const WARPPOINTS *const warp,const int width,
const int height, GMC_DATA *const gmc)
{
	const int du0 = warp->duv[0].x;
	const int dv0 = warp->duv[0].y;
	const int du1 = warp->duv[1].x;
	const int dv1 = warp->duv[1].y;
	const int du2 = warp->duv[2].x;
	const int dv2 = warp->duv[2].y;

	gmc->W = width;
	gmc->H = height;

	gmc->rho = 4 - log2bin(res-1);  // = {3,2,1,0} for
res={2,4,8,16}

	gmc->alpha = log2bin(gmc->W-1);
	gmc->Ws = (1 << gmc->alpha);

	gmc->dxF = 16*gmc->Ws + RDIV( 8*gmc->Ws*du1, gmc->W
);
	gmc->dxG = RDIV( 8*gmc->Ws*dv1, gmc->W );
	gmc->Fo  = (res*du0 + 1) << (gmc->alpha+gmc->rho-1);
	gmc->Go  = (res*dv0 + 1) << (gmc->alpha+gmc->rho-1);

	if (num_wp==2) {
		gmc->dyF = -gmc->dxG;
		gmc->dyG =  gmc->dxF;
	} else if (num_wp==3) {
		gmc->beta = log2bin(gmc->H-1);
		gmc->Hs = (1 << gmc->beta);
		gmc->dyF =			 RDIV( 8*gmc->Hs*du2, gmc->H );
		gmc->dyG = 16*gmc->Hs + RDIV( 8*gmc->Hs*dv2, gmc->H
);
		if (gmc->beta > gmc->alpha) {
			gmc->dxF <<= (gmc->beta - gmc->alpha);
			gmc->dxG <<= (gmc->beta - gmc->alpha);
			gmc->alpha = gmc->beta;
			gmc->Ws = 1<< gmc->beta;
		} else {
			gmc->dyF <<= gmc->alpha - gmc->beta;
			gmc->dyG <<= gmc->alpha - gmc->beta;
		}
	}

	gmc->cFo = gmc->dxF + gmc->dyF + (1 <<
(gmc->alpha+gmc->rho+1));
	gmc->cFo += 16*gmc->Ws*(du0-1);

	gmc->cGo = gmc->dxG + gmc->dyG + (1 <<
(gmc->alpha+gmc->rho+1));
	gmc->cGo += 16*gmc->Ws*(dv0-1);
}

How to trace it with the spec ?
Thanks.

anukeey

-----------------------------------------------------------------
¨C¤Ñ³£ Yahoo!©_¼¯
¸Ó´«¤u§@¤F¶Ü? - À°§Aºâ¥X³Ì¦X¾Aªº¨D¾¤è¦V
http://fate.yahoo.com.tw/


More information about the XviD-devel mailing list