# HG changeset patch # User michael # Date 1078512244 0 # Node ID 9a73e6dc5d68ba312a0f0f7537c359cb07a763c9 # Parent 1b2424e33a14e1602002f9dafaed8a999ea8a95f fix motion compensation with (x+1/2,y+1/2) MVs diff -r 1b2424e33a14 -r 9a73e6dc5d68 dsputil.c --- 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; diff -r 1b2424e33a14 -r 9a73e6dc5d68 dsputil.h --- 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
diff -r 1b2424e33a14 -r 9a73e6dc5d68 vp3.c --- 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 */