Merge commit '95587859cc69e5abe37c9e3af48008032d98e262' into HEAD
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Oct 2013 12:51:00 +0000 (14:51 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 16 Oct 2013 12:51:00 +0000 (14:51 +0200)
* commit '95587859cc69e5abe37c9e3af48008032d98e262':
  mpegvideo: Move obmc in a separate function

Conflicts:
libavcodec/mpegvideo_motion.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/mpegvideo_motion.c

@@@ -660,6 -660,93 +660,93 @@@ static inline void prefetch_motion(Mpeg
      s->vdsp.prefetch(pix[1] + off, pix[2] - pix[1], 2);
  }
  
 -    assert(!s->mb_skipped);
+ static inline void apply_obmc(MpegEncContext *s,
+                               uint8_t *dest_y,
+                               uint8_t *dest_cb,
+                               uint8_t *dest_cr,
+                               uint8_t **ref_picture,
+                               op_pixels_func (*pix_op)[4])
+ {
+     LOCAL_ALIGNED_8(int16_t, mv_cache, [4], [4][2]);
+     Picture *cur_frame   = &s->current_picture;
+     int mb_x = s->mb_x;
+     int mb_y = s->mb_y;
+     const int xy         = mb_x + mb_y * s->mb_stride;
+     const int mot_stride = s->b8_stride;
+     const int mot_xy     = mb_x * 2 + mb_y * 2 * mot_stride;
+     int mx, my, i;
++    av_assert2(!s->mb_skipped);
+     AV_COPY32(mv_cache[1][1], cur_frame->motion_val[0][mot_xy]);
+     AV_COPY32(mv_cache[1][2], cur_frame->motion_val[0][mot_xy + 1]);
+     AV_COPY32(mv_cache[2][1],
+               cur_frame->motion_val[0][mot_xy + mot_stride]);
+     AV_COPY32(mv_cache[2][2],
+               cur_frame->motion_val[0][mot_xy + mot_stride + 1]);
+     AV_COPY32(mv_cache[3][1],
+               cur_frame->motion_val[0][mot_xy + mot_stride]);
+     AV_COPY32(mv_cache[3][2],
+               cur_frame->motion_val[0][mot_xy + mot_stride + 1]);
+     if (mb_y == 0 || IS_INTRA(cur_frame->mb_type[xy - s->mb_stride])) {
+         AV_COPY32(mv_cache[0][1], mv_cache[1][1]);
+         AV_COPY32(mv_cache[0][2], mv_cache[1][2]);
+     } else {
+         AV_COPY32(mv_cache[0][1],
+                   cur_frame->motion_val[0][mot_xy - mot_stride]);
+         AV_COPY32(mv_cache[0][2],
+                   cur_frame->motion_val[0][mot_xy - mot_stride + 1]);
+     }
+     if (mb_x == 0 || IS_INTRA(cur_frame->mb_type[xy - 1])) {
+         AV_COPY32(mv_cache[1][0], mv_cache[1][1]);
+         AV_COPY32(mv_cache[2][0], mv_cache[2][1]);
+     } else {
+         AV_COPY32(mv_cache[1][0], cur_frame->motion_val[0][mot_xy - 1]);
+         AV_COPY32(mv_cache[2][0],
+                   cur_frame->motion_val[0][mot_xy - 1 + mot_stride]);
+     }
+     if (mb_x + 1 >= s->mb_width || IS_INTRA(cur_frame->mb_type[xy + 1])) {
+         AV_COPY32(mv_cache[1][3], mv_cache[1][2]);
+         AV_COPY32(mv_cache[2][3], mv_cache[2][2]);
+     } else {
+         AV_COPY32(mv_cache[1][3], cur_frame->motion_val[0][mot_xy + 2]);
+         AV_COPY32(mv_cache[2][3],
+                   cur_frame->motion_val[0][mot_xy + 2 + mot_stride]);
+     }
+     mx = 0;
+     my = 0;
+     for (i = 0; i < 4; i++) {
+         const int x      = (i & 1) + 1;
+         const int y      = (i >> 1) + 1;
+         int16_t mv[5][2] = {
+             { mv_cache[y][x][0],     mv_cache[y][x][1]         },
+             { mv_cache[y - 1][x][0], mv_cache[y - 1][x][1]     },
+             { mv_cache[y][x - 1][0], mv_cache[y][x - 1][1]     },
+             { mv_cache[y][x + 1][0], mv_cache[y][x + 1][1]     },
+             { mv_cache[y + 1][x][0], mv_cache[y + 1][x][1]     }
+         };
+         // FIXME cleanup
+         obmc_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
+                     ref_picture[0],
+                     mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >> 1) * 8,
+                     pix_op[1],
+                     mv);
+         mx += mv[0][0];
+         my += mv[0][1];
+     }
+     if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
+         chroma_4mv_motion(s, dest_cb, dest_cr,
+                           ref_picture, pix_op[1],
+                           mx, my);
+ }
  /**
   * motion compensation of a single macroblock
   * @param s context