2690 {
2691 int dw = self->
mb_width * block_size;
2692
2693 int hp = motion_h >> 1;
2694 int vp = motion_v >> 1;
2695 int odd_h = (motion_h & 1) == 1;
2696 int odd_v = (motion_v & 1) == 1;
2697
2698 unsigned int si = ((self->
mb_row * block_size) + vp) * dw + (self->
mb_col * block_size) + hp;
2699 unsigned int di = (self->
mb_row * dw + self->
mb_col) * block_size;
2700
2701 unsigned int max_address = (dw * (self->
mb_height * block_size - block_size + 1) - block_size);
2702 if (si > max_address || di > max_address) {
2703 return;
2704 }
2705
2706 #define PLM_MB_CASE(INTERPOLATE, ODD_H, ODD_V, OP) \
2707 case ((INTERPOLATE << 2) | (ODD_H << 1) | (ODD_V)): \
2708 PLM_BLOCK_SET(d, di, dw, si, dw, block_size, OP); \
2709 break
2710
2711 switch ((interpolate << 2) | (odd_h << 1) | (odd_v)) {
2713 PLM_MB_CASE(0, 0, 1, (s[si] + s[si + dw] + 1) >> 1);
2714 PLM_MB_CASE(0, 1, 0, (s[si] + s[si + 1] + 1) >> 1);
2715 PLM_MB_CASE(0, 1, 1, (s[si] + s[si + 1] + s[si + dw] + s[si + dw + 1] + 2) >> 2);
2716
2718 PLM_MB_CASE(1, 0, 1, (d[di] + ((s[si] + s[si + dw] + 1) >> 1) + 1) >> 1);
2719 PLM_MB_CASE(1, 1, 0, (d[di] + ((s[si] + s[si + 1] + 1) >> 1) + 1) >> 1);
2720 PLM_MB_CASE(1, 1, 1, (d[di] + ((s[si] + s[si + 1] + s[si + dw] + s[si + dw + 1] + 2) >> 2) + 1) >> 1);
2721 }
2722
2723 #undef PLM_MB_CASE
2724}
#define PLM_MB_CASE(INTERPOLATE, ODD_H, ODD_V, OP)