diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2010-04-02 12:34:08 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2010-04-02 12:34:08 +0000 |
commit | a69220cce0aea2d5e017cb1d15b894f7e9cd3e1b (patch) | |
tree | 95f0f748022b2d64bccd37e065d318105cc72042 | |
parent | 4bebf2cf64ef64ac419a9bbc6f2cdecbdb4c08a4 (diff) | |
download | ffmpeg-a69220cce0aea2d5e017cb1d15b894f7e9cd3e1b.tar.gz |
Change bidir refine hash code so we only need to perform a single
hash calculation for the whole function.
negligibly faster (about 0.1%)
Originally committed as revision 22775 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/motion_est.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 17954b52f6..c1062faccc 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -1475,12 +1475,12 @@ static inline int bidir_refine(MpegEncContext * s, int mb_x, int mb_y) const int ymin= c->ymin<<shift; const int xmax= c->xmax<<shift; const int ymax= c->ymax<<shift; +#define HASH(fx,fy,bx,by) ((fx)+17*(fy)+63*(bx)+117*(by)) + int hashidx= HASH(motion_fx,motion_fy, motion_bx, motion_by); uint8_t map[256]; memset(map,0,sizeof(map)); -#define BIDIR_MAP(fx,fy,bx,by) \ - map[((motion_fx+fx)+17*(motion_fy+fy)+63*(motion_bx+bx)+117*(motion_by+by))&255] - BIDIR_MAP(0,0,0,0) = 1; + map[hashidx&255] = 1; fbmin= check_bidir_mv(s, motion_fx, motion_fy, motion_bx, motion_by, @@ -1491,12 +1491,13 @@ static inline int bidir_refine(MpegEncContext * s, int mb_x, int mb_y) if(s->avctx->bidir_refine){ int score, end; #define CHECK_BIDIR(fx,fy,bx,by)\ - if( !BIDIR_MAP(fx,fy,bx,by)\ + if( !map[(hashidx+HASH(fx,fy,bx,by))&255]\ &&(fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\ &&(fx>=0 || motion_fx+fx>=xmin) && (fy>=0 || motion_fy+fy>=ymin) && (bx>=0 || motion_bx+bx>=xmin) && (by>=0 || motion_by+by>=ymin)){\ - BIDIR_MAP(fx,fy,bx,by) = 1;\ + map[(hashidx+HASH(fx,fy,bx,by))&255] = 1;\ score= check_bidir_mv(s, motion_fx+fx, motion_fy+fy, motion_bx+bx, motion_by+by, pred_fx, pred_fy, pred_bx, pred_by, 0, 16);\ if(score < fbmin){\ + hashidx += HASH(fx,fy,bx,by);\ fbmin= score;\ motion_fx+=fx;\ motion_fy+=fy;\ |