1960 |
|
|
1961 |
int i = 255, mask; |
int i = 255, mask; |
1962 |
VECTOR pmv[3]; |
VECTOR pmv[3]; |
|
|
|
1963 |
*(Data->iMinSAD) = MV_MAX_ERROR; |
*(Data->iMinSAD) = MV_MAX_ERROR; |
1964 |
Data->predMV = get_pmv2(pMBs, pParam->mb_width, 0, x, y, 0); |
|
1965 |
|
//median is only used as prediction. it doesn't have to be real |
1966 |
|
if (x == 1 && y == 1) Data->predMV.x = Data->predMV.y = 0; |
1967 |
|
else |
1968 |
|
if (x == 1) //left macroblock does not have any vector now |
1969 |
|
Data->predMV = (pMB - pParam->mb_width)->mvs[0]; // top instead of median |
1970 |
|
else if (y == 1) // top macroblock don't have it's vector |
1971 |
|
Data->predMV = (pMB - 1)->mvs[0]; // left instead of median |
1972 |
|
else Data->predMV = get_pmv2(pMBs, pParam->mb_width, 0, x, y, 0); //else median |
1973 |
|
|
1974 |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16, |
get_range(&Data->min_dx, &Data->max_dx, &Data->min_dy, &Data->max_dy, x, y, 16, |
1975 |
pParam->width, pParam->height, Data->iFcode, pParam->m_quarterpel); |
pParam->width, pParam->height, Data->iFcode, pParam->m_quarterpel); |
1976 |
|
|
1977 |
Data->Cur = pCur + (x + y * pParam->edged_width) * 16; |
Data->Cur = pCur + (x + y * pParam->edged_width) * 16; |
1978 |
Data->Ref = pRef + (x + y * pParam->edged_width) * 16; |
Data->Ref = pRef + (x + y * pParam->edged_width) * 16; |
1979 |
|
|
|
CheckCandidate = CheckCandidate16no4vI; |
|
|
|
|
1980 |
pmv[1].x = EVEN(pMB->mvs[0].x); |
pmv[1].x = EVEN(pMB->mvs[0].x); |
1981 |
pmv[1].y = EVEN(pMB->mvs[0].y); |
pmv[1].y = EVEN(pMB->mvs[0].y); |
1982 |
pmv[0].x = EVEN(Data->predMV.x); |
pmv[2].x = EVEN(Data->predMV.x); |
1983 |
pmv[0].y = EVEN(Data->predMV.y); |
pmv[2].y = EVEN(Data->predMV.y); |
1984 |
pmv[2].x = pmv[2].y = 0; |
pmv[0].x = pmv[0].y = 0; |
1985 |
|
|
1986 |
|
(*CheckCandidate)(0, 0, 255, &i, Data); |
1987 |
|
|
1988 |
|
//early skip for 0,0 |
1989 |
|
if (*Data->iMinSAD < MAX_SAD00_FOR_SKIP * 4) { |
1990 |
|
pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = Data->currentMV[0]; |
1991 |
|
pMB->mode = MODE_NOT_CODED; |
1992 |
|
return 0; |
1993 |
|
} |
1994 |
|
|
|
CheckCandidate16no4vI(pmv[0].x, pmv[0].y, 255, &i, Data); |
|
1995 |
if (!(mask = make_mask(pmv, 1))) |
if (!(mask = make_mask(pmv, 1))) |
1996 |
CheckCandidate16no4vI(pmv[1].x, pmv[1].y, mask, &i, Data); |
(*CheckCandidate)(pmv[1].x, pmv[1].y, mask, &i, Data); |
1997 |
if (!(mask = make_mask(pmv, 2))) |
if (!(mask = make_mask(pmv, 2))) |
1998 |
CheckCandidate16no4vI(0, 0, mask, &i, Data); |
(*CheckCandidate)(pmv[2].x, pmv[2].y, mask, &i, Data); |
1999 |
|
|
2000 |
|
if (*Data->iMinSAD > MAX_SAD00_FOR_SKIP * 4) // diamond only if needed |
2001 |
DiamondSearch(Data->currentMV->x, Data->currentMV->y, Data, i); |
DiamondSearch(Data->currentMV->x, Data->currentMV->y, Data, i); |
2002 |
|
|
2003 |
pMB->mvs[0] = *Data->currentMV; |
pMB->mvs[0] = pMB->mvs[1] = pMB->mvs[2] = pMB->mvs[3] = Data->currentMV[0]; |
2004 |
pMB->mode = MODE_INTER; |
pMB->mode = MODE_INTER; |
|
|
|
2005 |
return *(Data->iMinSAD); |
return *(Data->iMinSAD); |
2006 |
} |
} |
2007 |
|
|
2025 |
Data.currentMV = ¤tMV; |
Data.currentMV = ¤tMV; |
2026 |
Data.iMinSAD = &iMinSAD; |
Data.iMinSAD = &iMinSAD; |
2027 |
Data.iFcode = iFcode; |
Data.iFcode = iFcode; |
2028 |
|
CheckCandidate = CheckCandidate16no4vI; |
2029 |
|
|
2030 |
if (sadInit) (*sadInit) (); |
if (sadInit) (*sadInit) (); |
2031 |
|
|