diff options
author | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2003-01-10 11:54:10 +0000 |
---|---|---|
committer | Miguel Freitas <miguelfreitas@users.sourceforge.net> | 2003-01-10 11:54:10 +0000 |
commit | a4318a6700f307c76487a66a196860986bd1b781 (patch) | |
tree | 514674867baab1fbecb714b7d1a38c6ac2a8deba | |
parent | 54c717651cff3ee62d2480138787421867daf29f (diff) | |
download | xine-lib-a4318a6700f307c76487a66a196860986bd1b781.tar.gz xine-lib-a4318a6700f307c76487a66a196860986bd1b781.tar.bz2 |
merging complete fix from libmpeg2 cvs
CVS patchset: 3850
CVS date: 2003/01/10 11:54:10
-rw-r--r-- | src/libmpeg2/slice.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/src/libmpeg2/slice.c b/src/libmpeg2/slice.c index 7739ef067..74de597dc 100644 --- a/src/libmpeg2/slice.c +++ b/src/libmpeg2/slice.c @@ -993,11 +993,13 @@ static inline void slice_non_intra_DCT (picture_t * picture, uint8_t * dest, #define MOTION(table,ref,motion_x,motion_y,size,y) \ pos_x = 2 * picture->offset + motion_x; \ pos_y = 2 * picture->v_offset + motion_y + 2 * y; \ - if ((pos_x > picture->limit_x) || (pos_y > picture->limit_y_ ## size)) { \ - if (pos_x > picture->limit_x) \ - pos_x = (((int)pos_x) < 0) ? 0 : picture->limit_x; \ - if (pos_y > picture->limit_y_ ## size) \ - pos_y = (((int)pos_y) < 0) ? 0 : picture->limit_y_ ## size; \ + if (pos_x > picture->limit_x) { \ + pos_x = ((int)pos_x < 0) ? 0 : picture->limit_x; \ + motion_x = pos_x - 2 * picture->offset; \ + } \ + if (pos_y > picture->limit_y_ ## size){ \ + pos_y = ((int)pos_y < 0) ? 0 : picture->limit_y_ ## size; \ + motion_y = pos_y - 2 * picture->v_offset - 2 * y; \ } \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ table[xy_half] (picture->dest[0] + y * picture->pitches[0] + \ @@ -1020,11 +1022,13 @@ static inline void slice_non_intra_DCT (picture_t * picture, uint8_t * dest, #define MOTION_FIELD(table,ref,motion_x,motion_y,dest_field,op,src_field) \ pos_x = 2 * picture->offset + motion_x; \ pos_y = picture->v_offset + motion_y; \ - if ((pos_x > picture->limit_x) || (pos_y > picture->limit_y)) { \ - if (pos_x > picture->limit_x) \ - pos_x = (((int)pos_x) < 0) ? 0 : picture->limit_x; \ - if (pos_y > picture->limit_y) \ - pos_y = (((int)pos_y) < 0) ? 0 : picture->limit_y; \ + if (pos_x > picture->limit_x) { \ + pos_x = ((int)pos_x < 0) ? 0 : picture->limit_x; \ + motion_x = pos_x - 2 * picture->offset; \ + } \ + if (pos_y > picture->limit_y){ \ + pos_y = ((int)pos_y < 0) ? 0 : picture->limit_y; \ + motion_y = pos_y - picture->v_offset; \ } \ xy_half = ((pos_y & 1) << 1) | (pos_x & 1); \ table[xy_half] (picture->dest[0] + dest_field * picture->pitches[0] + \ @@ -1185,9 +1189,18 @@ static void motion_fr_dmv (picture_t * picture, motion_t * motion, other_y = ((motion_y * m + (motion_y > 0)) >> 1) + dmv_y + 1; MOTION_FIELD (mpeg2_mc.put, motion->ref[0], other_x, other_y, 1, & ~1, 0); - xy_half = ((motion_y & 1) << 1) | (motion_x & 1); - offset = (picture->offset + (motion_x >> 1) + - (picture->v_offset + (motion_y & ~1)) * picture->pitches[0]); + pos_x = 2 * picture->offset + motion_x; + pos_y = picture->v_offset + motion_y; + if(pos_x > picture->limit_x){ + pos_x = ((int)pos_x < 0) ? 0 : picture->limit_x; + motion_x = pos_x - 2 * picture->offset; + } + if(pos_y > picture->limit_y){ + pos_y = ((int)pos_y < 0) ? 0 : picture->limit_y; + motion_y = pos_y - picture->v_offset; + } + xy_half = ((pos_y & 1) << 1) | (pos_x & 1); + offset = (pos_x >> 1) + (pos_y & ~1) * picture->pitches[0]; mpeg2_mc.avg[xy_half] (picture->dest[0] + picture->offset, motion->ref[0][0] + offset, 2 * picture->pitches[0], 8); |