diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 900d8ce00c..dade959adb 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -276,16 +276,15 @@ void h263_encode_mb(MpegEncContext * s, static inline int mid_pred(int a, int b, int c) { int vmin, vmax; - vmin = a; + vmax = vmin = a; if (b < vmin) vmin = b; + else + vmax = b; + if (c < vmin) vmin = c; - - vmax = a; - if (b > vmax) - vmax = b; - if (c > vmax) + else if (c > vmax) vmax = c; return a + b + c - vmin - vmax; @@ -294,38 +293,39 @@ static inline int mid_pred(int a, int b, int c) INT16 *h263_pred_motion(MpegEncContext * s, int block, int *px, int *py) { - int x, y, wrap; + int xy, y, wrap; INT16 *A, *B, *C, *mot_val; - x = 2 * s->mb_x + 1 + (block & 1); - y = 2 * s->mb_y + 1 + ((block >> 1) & 1); wrap = 2 * s->mb_width + 2; + y = xy = 2 * s->mb_y + 1 + ((block >> 1) & 1); // y + xy *= wrap; // y * wrap + xy += 2 * s->mb_x + 1 + (block & 1); // x + y * wrap - mot_val = s->motion_val[(x) + (y) * wrap]; + mot_val = s->motion_val[xy]; /* special case for first line */ if (y == 1 || s->first_slice_line || s->first_gob_line) { - A = s->motion_val[(x-1) + (y) * wrap]; + A = s->motion_val[xy - 1]; *px = A[0]; *py = A[1]; } else { switch(block) { default: case 0: - A = s->motion_val[(x-1) + (y) * wrap]; - B = s->motion_val[(x) + (y-1) * wrap]; - C = s->motion_val[(x+2) + (y-1) * wrap]; + A = s->motion_val[xy - 1]; + B = s->motion_val[xy - wrap]; + C = s->motion_val[xy + 2 - wrap]; break; case 1: case 2: - A = s->motion_val[(x-1) + (y) * wrap]; - B = s->motion_val[(x) + (y-1) * wrap]; - C = s->motion_val[(x+1) + (y-1) * wrap]; + A = s->motion_val[xy - 1]; + B = s->motion_val[xy - wrap]; + C = s->motion_val[xy + 1 - wrap]; break; case 3: - A = s->motion_val[(x-1) + (y) * wrap]; - B = s->motion_val[(x-1) + (y-1) * wrap]; - C = s->motion_val[(x) + (y-1) * wrap]; + A = s->motion_val[xy - 1]; + B = s->motion_val[xy - 1 - wrap]; + C = s->motion_val[xy - wrap]; break; } *px = mid_pred(A[0], B[0], C[0]); @@ -538,20 +538,22 @@ void h263_dc_scale(MpegEncContext * s) static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *dir_ptr) { - int a, b, c, x, y, wrap, pred, scale; + int a, b, c, xy, wrap, pred, scale; UINT16 *dc_val; /* find prediction */ if (n < 4) { - x = 2 * s->mb_x + 1 + (n & 1); - y = 2 * s->mb_y + 1 + ((n & 2) >> 1); wrap = s->mb_width * 2 + 2; + xy = 2 * s->mb_y + 1 + ((n & 2) >> 1); + xy *= wrap; + xy += 2 * s->mb_x + 1 + (n & 1); dc_val = s->dc_val[0]; scale = s->y_dc_scale; } else { - x = s->mb_x + 1; - y = s->mb_y + 1; wrap = s->mb_width + 2; + xy = s->mb_y + 1; + xy *= wrap; + xy += s->mb_x + 1; dc_val = s->dc_val[n - 4 + 1]; scale = s->c_dc_scale; } @@ -559,9 +561,9 @@ static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *di /* B C * A X */ - a = dc_val[(x - 1) + (y) * wrap]; - b = dc_val[(x - 1) + (y - 1) * wrap]; - c = dc_val[(x) + (y - 1) * wrap]; + a = dc_val[xy - 1]; + b = dc_val[xy - 1 - wrap]; + c = dc_val[xy - wrap]; if (abs(a - b) < abs(b - c)) { pred = c; @@ -574,7 +576,7 @@ static int mpeg4_pred_dc(MpegEncContext * s, int n, UINT16 **dc_val_ptr, int *di pred = (pred + (scale >> 1)) / scale; /* prepare address for prediction update */ - *dc_val_ptr = &dc_val[(x) + (y) * wrap]; + *dc_val_ptr = &dc_val[xy]; return pred; }