--- branches/dev-api-4/xvidcore/src/motion/gmc.c 2003/10/01 23:23:01 1161 +++ branches/dev-api-4/xvidcore/src/motion/gmc.c 2004/03/31 13:40:59 1394 @@ -19,7 +19,7 @@ * along with this program ; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: gmc.c,v 1.1.2.6 2003-10-01 23:23:01 edgomez Exp $ + * $Id: gmc.c,v 1.1.2.9 2004-03-31 13:40:59 Skal Exp $ * ****************************************************************************/ @@ -70,12 +70,17 @@ U += dUx; V += dVx; if (u > 0 && u <= W) { ri = MTab[u&15]; Offset = u>>4; } - else if (u > W) Offset = W>>4; - else Offset = -1; + else { + if (u > W) Offset = W>>4; + else Offset = 0; + ri = MTab[0]; + } if (v > 0 && v <= H) { rj = MTab[v&15]; Offset += (v>>4)*srcstride; } - else if (v > H) Offset += (H>>4)*srcstride; - else Offset -= srcstride; + else { + if (v > H) Offset += (H>>4)*srcstride; + rj = MTab[0]; + } f0 = src[Offset + 0]; f0 |= src[Offset + 1] << 16; @@ -131,18 +136,17 @@ ri = MTab[u&15]; Offset = u>>4; } else { - ri = 16; if (u>W) Offset = W>>4; - else Offset = -1; + else Offset = 0; + ri = MTab[0]; } if (v > 0 && v <= H) { rj = MTab[v&15]; Offset += (v>>4)*srcstride; } else { - rj = 16; if (v>H) Offset += (H>>4)*srcstride; - else Offset -= srcstride; + rj = MTab[0]; } f0 = uSrc[Offset + 0]; @@ -214,17 +218,23 @@ int32_t uo = This->Uo + (x<<8); /* ((16*x)<<4) */ int32_t vo = This->Vo + (y<<8); - const uint32_t ri = MTab[uo & 15]; - const uint32_t rj = MTab[vo & 15]; + uint32_t ri = MTab[uo & 15]; + uint32_t rj = MTab[vo & 15]; int i, j; int32_t Offset; - if ((uint32_t)vo<=(uint32_t)H) Offset = (vo>>4)*srcstride; - else if (vo>H) Offset = ( H>>4)*srcstride; - else Offset =-16*srcstride; - if ((uint32_t)uo<=(uint32_t)W) Offset += (uo>>4); - else if (uo>W) Offset += ( W>>4); - else Offset -= 16; + if (vo>=(-16*4) && vo<=H) Offset = (vo>>4)*srcstride; + else { + if (vo>H) Offset = ( H>>4)*srcstride; + else Offset =-16*srcstride; + rj = MTab[0]; + } + if (uo>=(-16*4) && uo<=W) Offset += (uo>>4); + else { + if (uo>W) Offset += (W>>4); + else Offset -= 16; + ri = MTab[0]; + } Dst += 16; @@ -259,17 +269,23 @@ int32_t uo = This->Uco + (x<<7); int32_t vo = This->Vco + (y<<7); - const uint32_t rri = MTab[uo & 15]; - const uint32_t rrj = MTab[vo & 15]; + uint32_t rri = MTab[uo & 15]; + uint32_t rrj = MTab[vo & 15]; int i, j; int32_t Offset; - if ((uint32_t)vo<=(uint32_t)H) Offset = (vo>>4)*srcstride; - else if (vo>H) Offset = ( H>>4)*srcstride; - else Offset =-8*srcstride; - if ((uint32_t)uo<=(uint32_t)W) Offset += (uo>>4); - else if (uo>W) Offset += (W>>4); - else Offset -= 8; + if (vo>=(-8*4) && vo<=H) Offset = (vo>>4)*srcstride; + else { + if (vo>H) Offset = ( H>>4)*srcstride; + else Offset =-8*srcstride; + rrj = MTab[0]; + } + if (uo>=(-8*4) && uo<=W) Offset += (uo>>4); + else { + if (uo>W) Offset += ( W>>4); + else Offset -= 8; + rri = MTab[0]; + } uDst += 8; vDst += 8; @@ -325,16 +341,15 @@ gmc->num_wp = nb_pts; /* reduce the number of points, if possible */ - if (nb_pts<3 || (pts->duv[2].x==-pts->duv[1].y && pts->duv[2].y==pts->duv[1].x)) { - if (nb_pts<2 || (pts->duv[1].x==0 && pts->duv[1].y==0)) { - if (nb_pts<1 || (pts->duv[0].x==0 && pts->duv[0].y==0)) { - nb_pts = 0; - } - else nb_pts = 1; - } - else nb_pts = 2; - } - else nb_pts = 3; + if (nb_pts<2 || (pts->duv[2].x==0 && pts->duv[2].y==0 && pts->duv[1].x==0 && pts->duv[1].y==0 )) { + if (nb_pts<2 || (pts->duv[1].x==0 && pts->duv[1].y==0)) { + if (nb_pts<1 || (pts->duv[0].x==0 && pts->duv[0].y==0)) { + nb_pts = 0; + } + else nb_pts = 1; + } + else nb_pts = 2; + } /* now, nb_pts stores the actual number of points required for interpolation */ @@ -364,15 +379,11 @@ gmc->dU[0] = 16*Ws + RDIV( 8*Ws*pts->duv[1].x, width ); /* dU/dx */ gmc->dV[0] = RDIV( 8*Ws*pts->duv[1].y, width ); /* dV/dx */ -/* disabled, because possibly buggy? */ - -#if 0 if (nb_pts==2) { gmc->dU[1] = -gmc->dV[0]; /* -Sin */ gmc->dV[1] = gmc->dU[0] ; /* Cos */ } else -#endif { const int Beta = log2bin(height-1); const int Hs = 1<