changeset 1864:9a73e6dc5d68 libavcodec

fix motion compensation with (x+1/2,y+1/2) MVs
author michael
date Fri, 05 Mar 2004 18:44:04 +0000
parents 1b2424e33a14
children 92e94c550def
files dsputil.c dsputil.h vp3.c
diffstat 3 files changed, 26 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/dsputil.c	Fri Mar 05 15:10:56 2004 +0000
+++ b/dsputil.c	Fri Mar 05 18:44:04 2004 +0000
@@ -874,6 +874,13 @@
 #define avg2(a,b) ((a+b+1)>>1)
 #define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
 
+static void put_no_rnd_pixels16_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){
+    put_no_rnd_pixels16_l2(dst, a, b, stride, stride, stride, h);
+}
+
+static void put_no_rnd_pixels8_l2_c(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h){
+    put_no_rnd_pixels8_l2(dst, a, b, stride, stride, stride, h);
+}
 
 static void gmc1_c(uint8_t *dst, uint8_t *src, int stride, int h, int x16, int y16, int rounder)
 {
@@ -3158,6 +3165,9 @@
     dspfunc(avg, 3, 2);
 #undef dspfunc
 
+    c->put_no_rnd_pixels_l2[0]= put_no_rnd_pixels16_l2_c;
+    c->put_no_rnd_pixels_l2[1]= put_no_rnd_pixels8_l2_c;
+
     c->put_tpel_pixels_tab[ 0] = put_tpel_pixels_mc00_c;
     c->put_tpel_pixels_tab[ 1] = put_tpel_pixels_mc10_c;
     c->put_tpel_pixels_tab[ 2] = put_tpel_pixels_mc20_c;
--- a/dsputil.h	Fri Mar 05 15:10:56 2004 +0000
+++ b/dsputil.h	Fri Mar 05 18:44:04 2004 +0000
@@ -204,6 +204,8 @@
      */
     op_pixels_func avg_no_rnd_pixels_tab[2][4];
     
+    void (*put_no_rnd_pixels_l2[2])(uint8_t *block/*align width (8 or 16)*/, const uint8_t *a/*align 1*/, const uint8_t *b/*align 1*/, int line_size, int h);
+    
     /**
      * Thirdpel motion compensation with rounding (a+b+1)>>1.
      * this is an array[12] of motion compensation funcions for the 9 thirdpel positions<br>
--- a/vp3.c	Fri Mar 05 15:10:56 2004 +0000
+++ b/vp3.c	Fri Mar 05 18:44:04 2004 +0000
@@ -2451,15 +2451,24 @@
                         motion_source= temp;
                     }
                 }
+                
 
                 /* first, take care of copying a block from either the
                  * previous or the golden frame */
                 if (s->all_fragments[i].coding_method != MODE_INTRA) {
-
-                    s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
-                        output_plane + s->all_fragments[i].first_pixel,
-                        motion_source,
-                        stride, 8);
+                    //Note, it is possible to implement all MC cases with put_no_rnd_pixels_l2 which would look more like the VP3 source but this would be slower as put_no_rnd_pixels_tab is better optimzed
+                    if(motion_halfpel_index != 3){
+                        s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index](
+                            output_plane + s->all_fragments[i].first_pixel,
+                            motion_source, stride, 8);
+                    }else{
+                        int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1
+                        s->dsp.put_no_rnd_pixels_l2[1](
+                            output_plane + s->all_fragments[i].first_pixel,
+                            motion_source - d, 
+                            motion_source + stride + 1 + d, 
+                            stride, 8);
+                    }
                 }
 
                 /* dequantize the DCT coefficients */