]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/mpegvideo_motion.c
avcodec: Drop long-deprecated imgconvert.h header
[ffmpeg] / libavcodec / mpegvideo_motion.c
index ea0695323bbf191897e5b7018adae487d7288c51..22948e2a2f7c0461a9bd37c5d04864473dca2e51 100644 (file)
@@ -29,9 +29,9 @@
 #include "msmpeg4.h"
 #include <limits.h>
 
-static inline void gmc1_motion(MpegEncContext *s,
-                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
-                               uint8_t **ref_picture)
+static void gmc1_motion(MpegEncContext *s,
+                        uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
+                        uint8_t **ref_picture)
 {
     uint8_t *ptr;
     int offset, src_x, src_y, linesize, uvlinesize;
@@ -115,9 +115,9 @@ static inline void gmc1_motion(MpegEncContext *s,
     return;
 }
 
-static inline void gmc_motion(MpegEncContext *s,
-                               uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
-                               uint8_t **ref_picture)
+static void gmc_motion(MpegEncContext *s,
+                       uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
+                       uint8_t **ref_picture)
 {
     uint8_t *ptr;
     int linesize, uvlinesize;
@@ -173,11 +173,8 @@ static inline void gmc_motion(MpegEncContext *s,
 
 static inline int hpel_motion(MpegEncContext *s,
                                   uint8_t *dest, uint8_t *src,
-                                  int field_based, int field_select,
                                   int src_x, int src_y,
-                                  int width, int height, int stride,
-                                  int h_edge_pos, int v_edge_pos,
-                                  int w, int h, op_pixels_func *pix_op,
+                                  op_pixels_func *pix_op,
                                   int motion_x, int motion_y)
 {
     int dxy;
@@ -188,26 +185,24 @@ static inline int hpel_motion(MpegEncContext *s,
     src_y += motion_y >> 1;
 
     /* WARNING: do no forget half pels */
-    src_x = av_clip(src_x, -16, width); //FIXME unneeded for emu?
-    if (src_x == width)
+    src_x = av_clip(src_x, -16, s->width); //FIXME unneeded for emu?
+    if (src_x == s->width)
         dxy &= ~1;
-    src_y = av_clip(src_y, -16, height);
-    if (src_y == height)
+    src_y = av_clip(src_y, -16, s->height);
+    if (src_y == s->height)
         dxy &= ~2;
-    src += src_y * stride + src_x;
+    src += src_y * s->linesize + src_x;
 
     if(s->unrestricted_mv && (s->flags&CODEC_FLAG_EMU_EDGE)){
-        if(   (unsigned)src_x > FFMAX(h_edge_pos - (motion_x&1) - w, 0)
-           || (unsigned)src_y > FFMAX(v_edge_pos - (motion_y&1) - h, 0)){
-            s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w+1, (h+1)<<field_based,
-                             src_x, src_y<<field_based, h_edge_pos, s->v_edge_pos);
+        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->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, 9, 9,
+                             src_x, src_y, s->h_edge_pos, s->v_edge_pos);
             src= s->edge_emu_buffer;
             emu=1;
         }
     }
-    if(field_select)
-        src += s->linesize;
-    pix_op[dxy](dest, src, stride, h);
+    pix_op[dxy](dest, src, s->linesize, 8);
     return emu;
 }
 
@@ -339,21 +334,39 @@ if(s->quarter_sample)
     }
 }
 /* apply one mpeg motion vector to the three components */
-static av_always_inline
-void mpeg_motion(MpegEncContext *s,
-                 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
-                 int field_based, int bottom_field, int field_select,
-                 uint8_t **ref_picture, op_pixels_func (*pix_op)[4],
-                 int motion_x, int motion_y, int h, int mb_y)
+static void mpeg_motion(MpegEncContext *s,
+                        uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr,
+                        int field_select, uint8_t **ref_picture,
+                        op_pixels_func (*pix_op)[4],
+                        int motion_x, int motion_y, int h, int mb_y)
+{
+#if !CONFIG_SMALL
+    if(s->out_format == FMT_MPEG1)
+        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0,
+                    field_select, ref_picture, pix_op,
+                    motion_x, motion_y, h, 1, mb_y);
+    else
+#endif
+        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 0, 0,
+                    field_select, ref_picture, pix_op,
+                    motion_x, motion_y, h, 0, mb_y);
+}
+
+static void mpeg_motion_field(MpegEncContext *s, uint8_t *dest_y,
+                              uint8_t *dest_cb, uint8_t *dest_cr,
+                              int bottom_field, int field_select,
+                              uint8_t **ref_picture,
+                              op_pixels_func (*pix_op)[4],
+                              int motion_x, int motion_y, int h, int mb_y)
 {
 #if !CONFIG_SMALL
     if(s->out_format == FMT_MPEG1)
-        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based,
+        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1,
                     bottom_field, field_select, ref_picture, pix_op,
                     motion_x, motion_y, h, 1, mb_y);
     else
 #endif
-        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, field_based,
+        mpeg_motion_internal(s, dest_y, dest_cb, dest_cr, 1,
                     bottom_field, field_select, ref_picture, pix_op,
                     motion_x, motion_y, h, 0, mb_y);
 }
@@ -428,11 +441,9 @@ static inline void obmc_motion(MpegEncContext *s,
             ptr[i]= ptr[MID];
         }else{
             ptr[i]= s->obmc_scratchpad + 8*(i&1) + s->linesize*8*(i>>1);
-            hpel_motion(s, ptr[i], src, 0, 0,
+            hpel_motion(s, ptr[i], src,
                         src_x, src_y,
-                        s->width, s->height, s->linesize,
-                        s->h_edge_pos, s->v_edge_pos,
-                        8, 8, pix_op,
+                        pix_op,
                         mv[i][0], mv[i][1]);
         }
     }
@@ -535,11 +546,12 @@ static inline void qpel_motion(MpegEncContext *s,
 /**
  * h263 chroma 4mv motion compensation.
  */
-static inline void chroma_4mv_motion(MpegEncContext *s,
-                                     uint8_t *dest_cb, uint8_t *dest_cr,
-                                     uint8_t **ref_picture,
-                                     op_pixels_func *pix_op,
-                                     int mx, int my){
+static void chroma_4mv_motion(MpegEncContext *s,
+                              uint8_t *dest_cb, uint8_t *dest_cr,
+                              uint8_t **ref_picture,
+                              op_pixels_func *pix_op,
+                              int mx, int my)
+{
     int dxy, emu=0, src_x, src_y, offset;
     uint8_t *ptr;
 
@@ -708,8 +720,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
                         s->mv[dir][0][0], s->mv[dir][0][1], 16);
         }else
         {
-            mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                        0, 0, 0,
+            mpeg_motion(s, dest_y, dest_cb, dest_cr, 0,
                         ref_picture, pix_op,
                         s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y);
         }
@@ -755,11 +766,9 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
         }else{
             for(i=0;i<4;i++) {
                 hpel_motion(s, dest_y + ((i & 1) * 8) + (i >> 1) * 8 * s->linesize,
-                            ref_picture[0], 0, 0,
+                            ref_picture[0],
                             mb_x * 16 + (i & 1) * 8, mb_y * 16 + (i >>1) * 8,
-                            s->width, s->height, s->linesize,
-                            s->h_edge_pos, s->v_edge_pos,
-                            8, 8, pix_op[1],
+                            pix_op[1],
                             s->mv[dir][i][0], s->mv[dir][i][1]);
 
                 mx += s->mv[dir][i][0];
@@ -782,15 +791,15 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
                 }
             }else{
                 /* top field */
-                mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                            1, 0, s->field_select[dir][0],
-                            ref_picture, pix_op,
-                            s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y);
+                mpeg_motion_field(s, dest_y, dest_cb, dest_cr,
+                                  0, s->field_select[dir][0],
+                                  ref_picture, pix_op,
+                                  s->mv[dir][0][0], s->mv[dir][0][1], 8, mb_y);
                 /* bottom field */
-                mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                            1, 1, s->field_select[dir][1],
-                            ref_picture, pix_op,
-                            s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y);
+                mpeg_motion_field(s, dest_y, dest_cb, dest_cr,
+                                  1, s->field_select[dir][1],
+                                  ref_picture, pix_op,
+                                  s->mv[dir][1][0], s->mv[dir][1][1], 8, mb_y);
             }
         } else {
             if(s->picture_structure != s->field_select[dir][0] + 1 && s->pict_type != AV_PICTURE_TYPE_B && !s->first_field){
@@ -798,7 +807,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
             }
 
             mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                        0, 0, s->field_select[dir][0],
+                        s->field_select[dir][0],
                         ref_picture, pix_op,
                         s->mv[dir][0][0], s->mv[dir][0][1], 16, mb_y>>1);
         }
@@ -815,7 +824,7 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
             }
 
             mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                        0, 0, s->field_select[dir][i],
+                        s->field_select[dir][i],
                         ref2picture, pix_op,
                         s->mv[dir][i][0], s->mv[dir][i][1] + 16*i, 8, mb_y>>1);
 
@@ -829,17 +838,17 @@ static av_always_inline void MPV_motion_internal(MpegEncContext *s,
             for(i=0; i<2; i++){
                 int j;
                 for(j=0; j<2; j++){
-                    mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                                1, j, j^i,
-                                ref_picture, pix_op,
-                                s->mv[dir][2*i + j][0], s->mv[dir][2*i + j][1], 8, mb_y);
+                    mpeg_motion_field(s, dest_y, dest_cb, dest_cr,
+                                      j, j^i, ref_picture, pix_op,
+                                      s->mv[dir][2*i + j][0],
+                                      s->mv[dir][2*i + j][1], 8, mb_y);
                 }
                 pix_op = s->dsp.avg_pixels_tab;
             }
         }else{
             for(i=0; i<2; i++){
                 mpeg_motion(s, dest_y, dest_cb, dest_cr,
-                            0, 0, s->picture_structure != i+1,
+                            s->picture_structure != i+1,
                             ref_picture, pix_op,
                             s->mv[dir][2*i][0],s->mv[dir][2*i][1],16, mb_y>>1);