]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mpegvideo_motion.c
Rewrite emu_edge functions to have separate src/dst_stride arguments.
[ffmpeg] / libavcodec / mpegvideo_motion.c
index 38517395122053ccdf25df94d2db7ecf55f3a160..09061d8dfe3b49e96a879101ecd1ec9342fa3fb7 100644 (file)
@@ -38,7 +38,8 @@ static void gmc1_motion(MpegEncContext *s,
                         uint8_t **ref_picture)
 {
     uint8_t *ptr;
-    int offset, src_x, src_y, linesize, uvlinesize;
+    int src_x, src_y;
+    ptrdiff_t offset, linesize, uvlinesize;
     int motion_x, motion_y;
     int emu=0;
 
@@ -62,7 +63,9 @@ static void gmc1_motion(MpegEncContext *s,
 
         if(   (unsigned)src_x >= FFMAX(s->h_edge_pos - 17, 0)
            || (unsigned)src_y >= FFMAX(s->v_edge_pos - 17, 0)){
-            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, linesize, 17, 17, src_x, src_y, s->h_edge_pos, s->v_edge_pos);
+            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, linesize,
+                                     ptr, linesize, 17, 17, src_x, src_y,
+                                     s->h_edge_pos, s->v_edge_pos);
             ptr= s->edge_emu_buffer;
         }
 
@@ -99,7 +102,9 @@ static void gmc1_motion(MpegEncContext *s,
     ptr = ref_picture[1] + offset;
         if(   (unsigned)src_x >= FFMAX((s->h_edge_pos>>1) - 9, 0)
            || (unsigned)src_y >= FFMAX((s->v_edge_pos>>1) - 9, 0)){
-            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
+            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, uvlinesize,
+                                     ptr, uvlinesize, 9, 9, src_x, src_y,
+                                     s->h_edge_pos>>1, s->v_edge_pos>>1);
             ptr= s->edge_emu_buffer;
             emu=1;
         }
@@ -107,7 +112,9 @@ static void gmc1_motion(MpegEncContext *s,
 
     ptr = ref_picture[2] + offset;
     if(emu){
-        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, uvlinesize, 9, 9, src_x, src_y, s->h_edge_pos>>1, s->v_edge_pos>>1);
+        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, uvlinesize,
+                                 ptr, uvlinesize, 9, 9, src_x, src_y,
+                                 s->h_edge_pos>>1, s->v_edge_pos>>1);
         ptr= s->edge_emu_buffer;
     }
     s->dsp.gmc1(dest_cr, ptr, uvlinesize, 8, motion_x&15, motion_y&15, 128 - s->no_rounding);
@@ -195,8 +202,9 @@ static inline int hpel_motion(MpegEncContext *s,
     if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
         if(   (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&1) - 8, 0)
            || (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&1) - 8, 0)){
-            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, 9, 9,
-                             src_x, src_y, s->h_edge_pos, s->v_edge_pos);
+            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize,
+                                     src, s->linesize, 9, 9,
+                                     src_x, src_y, s->h_edge_pos, s->v_edge_pos);
             src= s->edge_emu_buffer;
             emu=1;
         }
@@ -215,7 +223,7 @@ void mpeg_motion_internal(MpegEncContext *s,
     uint8_t *ptr_y, *ptr_cb, *ptr_cr;
     int dxy, uvdxy, mx, my, src_x, src_y,
         uvsrc_x, uvsrc_y, v_edge_pos;
-    emuedge_linesize_type uvlinesize, linesize;
+    ptrdiff_t uvlinesize, linesize;
 
 #if 0
 if(s->quarter_sample)
@@ -286,19 +294,19 @@ if(s->quarter_sample)
                         "MPEG motion vector out of boundary (%d %d)\n", src_x, src_y);
                 return;
             }
-            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
-                                17, 17+field_based,
-                                src_x, src_y<<field_based,
-                                s->h_edge_pos, s->v_edge_pos);
+            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize,
+                                     ptr_y, s->linesize, 17, 17+field_based,
+                                     src_x, src_y<<field_based,
+                                     s->h_edge_pos, s->v_edge_pos);
             ptr_y = s->edge_emu_buffer;
             if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
                 uint8_t *uvbuf= s->edge_emu_buffer+18*s->linesize;
-                s->vdsp.emulated_edge_mc(uvbuf ,
+                s->vdsp.emulated_edge_mc(uvbuf, s->uvlinesize,
                                     ptr_cb, s->uvlinesize,
                                     9, 9+field_based,
                                     uvsrc_x, uvsrc_y<<field_based,
                                     s->h_edge_pos>>1, s->v_edge_pos>>1);
-                s->vdsp.emulated_edge_mc(uvbuf+16,
+                s->vdsp.emulated_edge_mc(uvbuf+16, s->uvlinesize,
                                     ptr_cr, s->uvlinesize,
                                     9, 9+field_based,
                                     uvsrc_x, uvsrc_y<<field_based,
@@ -459,7 +467,8 @@ static inline void qpel_motion(MpegEncContext *s,
                                int motion_x, int motion_y, int h)
 {
     uint8_t *ptr_y, *ptr_cb, *ptr_cr;
-    int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos, linesize, uvlinesize;
+    int dxy, uvdxy, mx, my, src_x, src_y, uvsrc_x, uvsrc_y, v_edge_pos;
+    ptrdiff_t linesize, uvlinesize;
 
     dxy = ((motion_y & 3) << 2) | (motion_x & 3);
     src_x = s->mb_x *  16                 + (motion_x >> 2);
@@ -499,20 +508,23 @@ static inline void qpel_motion(MpegEncContext *s,
 
     if(   (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 16, 0)
        || (unsigned)src_y > FFMAX(   v_edge_pos - (motion_y&3) - h , 0)){
-        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y, s->linesize,
-                            17, 17+field_based, src_x, src_y<<field_based,
-                            s->h_edge_pos, s->v_edge_pos);
+        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize,
+                                 ptr_y, s->linesize,
+                                 17, 17+field_based, src_x, src_y<<field_based,
+                                 s->h_edge_pos, s->v_edge_pos);
         ptr_y= s->edge_emu_buffer;
         if(!CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
             uint8_t *uvbuf= s->edge_emu_buffer + 18*s->linesize;
-            s->vdsp.emulated_edge_mc(uvbuf, ptr_cb, s->uvlinesize,
-                                9, 9 + field_based,
-                                uvsrc_x, uvsrc_y<<field_based,
-                                s->h_edge_pos>>1, s->v_edge_pos>>1);
-            s->vdsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize,
-                                9, 9 + field_based,
-                                uvsrc_x, uvsrc_y<<field_based,
-                                s->h_edge_pos>>1, s->v_edge_pos>>1);
+            s->vdsp.emulated_edge_mc(uvbuf, s->uvlinesize,
+                                     ptr_cb, s->uvlinesize,
+                                     9, 9 + field_based,
+                                     uvsrc_x, uvsrc_y<<field_based,
+                                     s->h_edge_pos>>1, s->v_edge_pos>>1);
+            s->vdsp.emulated_edge_mc(uvbuf + 16, s->uvlinesize,
+                                     ptr_cr, s->uvlinesize,
+                                     9, 9 + field_based,
+                                     uvsrc_x, uvsrc_y<<field_based,
+                                     s->h_edge_pos>>1, s->v_edge_pos>>1);
             ptr_cb= uvbuf;
             ptr_cr= uvbuf + 16;
         }
@@ -552,7 +564,8 @@ static void chroma_4mv_motion(MpegEncContext *s,
                               op_pixels_func *pix_op,
                               int mx, int my)
 {
-    int dxy, emu=0, src_x, src_y, offset;
+    int dxy, emu=0, src_x, src_y;
+    ptrdiff_t offset;
     uint8_t *ptr;
 
     /* In case of 8X8, we construct a single chroma motion vector
@@ -578,9 +591,9 @@ static void chroma_4mv_motion(MpegEncContext *s,
     if(s->flags&CODEC_FLAG_EMU_EDGE){
         if(   (unsigned)src_x > FFMAX((s->h_edge_pos>>1) - (dxy &1) - 8, 0)
            || (unsigned)src_y > FFMAX((s->v_edge_pos>>1) - (dxy>>1) - 8, 0)){
-            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
-                                9, 9, src_x, src_y,
-                                s->h_edge_pos>>1, s->v_edge_pos>>1);
+            s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->uvlinesize,
+                                     ptr, s->uvlinesize, 9, 9, src_x, src_y,
+                                     s->h_edge_pos>>1, s->v_edge_pos>>1);
             ptr= s->edge_emu_buffer;
             emu=1;
         }
@@ -589,9 +602,9 @@ static void chroma_4mv_motion(MpegEncContext *s,
 
     ptr = ref_picture[2] + offset;
     if(emu){
-        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
-                            9, 9, src_x, src_y,
-                            s->h_edge_pos>>1, s->v_edge_pos>>1);
+        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->uvlinesize,
+                                 ptr, s->uvlinesize, 9, 9, src_x, src_y,
+                                 s->h_edge_pos>>1, s->v_edge_pos>>1);
         ptr= s->edge_emu_buffer;
     }
     pix_op[dxy](dest_cr, ptr, s->uvlinesize, 8);
@@ -758,10 +771,10 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
                 if(s->flags&CODEC_FLAG_EMU_EDGE){
                     if(   (unsigned)src_x > FFMAX(s->h_edge_pos - (motion_x&3) - 8, 0)
                        || (unsigned)src_y > FFMAX(s->v_edge_pos - (motion_y&3) - 8, 0)){
-                        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, ptr,
-                                            s->linesize, 9, 9,
-                                            src_x, src_y,
-                                            s->h_edge_pos, s->v_edge_pos);
+                        s->vdsp.emulated_edge_mc(s->edge_emu_buffer, s->linesize,
+                                                 ptr, s->linesize, 9, 9,
+                                                 src_x, src_y,
+                                                 s->h_edge_pos, s->v_edge_pos);
                         ptr= s->edge_emu_buffer;
                     }
                 }