|
|
b_dy = (b_dy >> 3) + roundtab_76[b_dy & 0xf]; | b_dy = (b_dy >> 3) + roundtab_76[b_dy & 0xf]; |
b_dx = (b_dx >> 3) + roundtab_76[b_dx & 0xf]; | b_dx = (b_dx >> 3) + roundtab_76[b_dx & 0xf]; |
| |
|
/* 64-bit Fix: |
|
* The variables y, stride and x are unsigned, while dy and dy are signed. If |
|
* e.g. dy is < -1, the factor dy/2 becomes < 0. But because y is unsigned, the |
|
* -1 value will be 'promoted' to the unsigned 0xffffffff. This is no problem on |
|
* 32 bit platforms, because adding 0xffffffff to a char pointer or adding -1 |
|
* the same. But on 64bit this is no longer the case. So we have to really use |
|
* signed variables here (note that we assume that the unsiged values are |
|
* below 0x80000000, which should be true, because otherwise all kind of |
|
* other problems will additionally pop up). |
|
*/ |
sum = sad8bi(pCur->u + 8 * x + 8 * y * stride, | sum = sad8bi(pCur->u + 8 * x + 8 * y * stride, |
f_Ref->u + (y*8 + dy/2) * stride + x*8 + dx/2, |
f_Ref->u + ((int) y*8 + dy/2) * (int) stride + (int) x*8 + dx/2, |
b_Ref->u + (y*8 + b_dy/2) * stride + x*8 + b_dx/2, |
b_Ref->u + ((int) y*8 + b_dy/2) * (int) stride + (int) x*8 + b_dx/2, |
stride); | stride); |
| |
if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ | if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ |
| |
sum += sad8bi(pCur->v + 8*x + 8 * y * stride, | sum += sad8bi(pCur->v + 8*x + 8 * y * stride, |
f_Ref->v + (y*8 + dy/2) * stride + x*8 + dx/2, |
f_Ref->v + ((int) y*8 + dy/2) * (int) stride + (int) x*8 + dx/2, |
b_Ref->v + (y*8 + b_dy/2) * stride + x*8 + b_dx/2, |
b_Ref->v + ((int) y*8 + b_dy/2) * (int) stride + (int) x*8 + b_dx/2, |
stride); | stride); |
| |
if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ | if (sum >= MAX_CHROMA_SAD_FOR_SKIP * (int)Data->iQuant) return; /* no skip */ |