diff options
author | Loren Merritt <lorenm@u.washington.edu> | 2006-01-09 02:08:12 +0000 |
---|---|---|
committer | Loren Merritt <lorenm@u.washington.edu> | 2006-01-09 02:08:12 +0000 |
commit | 8bf755d4ff26315f5af4faad3195b72ab8d386db (patch) | |
tree | 9b49ca195ccc32910820da91a55519f87924de3c /libavcodec/motion_est.c | |
parent | 62e60aed8da0cfe978b7ceb80f603425a8357645 (diff) | |
download | ffmpeg-streaming-8bf755d4ff26315f5af4faad3195b72ab8d386db.zip ffmpeg-streaming-8bf755d4ff26315f5af4faad3195b72ab8d386db.tar.gz |
10l: bidir_refine didn't save the new mvs. also improve speed.
Originally committed as revision 4832 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/motion_est.c')
-rw-r--r-- | libavcodec/motion_est.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/libavcodec/motion_est.c b/libavcodec/motion_est.c index 7c20272..365a431 100644 --- a/libavcodec/motion_est.c +++ b/libavcodec/motion_est.c @@ -1636,6 +1636,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; + uint8_t map[8][8][8][8]; + + memset(map,0,sizeof(map)); +#define BIDIR_MAP(fx,fy,bx,by) \ + map[(motion_fx+fx)&7][(motion_fy+fy)&7][(motion_bx+bx)&7][(motion_by+by)&7] + BIDIR_MAP(0,0,0,0) = 1; fbmin= check_bidir_mv(s, motion_fx, motion_fy, motion_bx, motion_by, @@ -1646,8 +1652,10 @@ 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( (fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\ + if( !BIDIR_MAP(fx,fy,bx,by)\ + &&(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;\ 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){\ fbmin= score;\ @@ -1696,6 +1704,11 @@ CHECK_BIDIR2(d,a,b,c) }while(!end); } + s->b_bidir_forw_mv_table[xy][0]= motion_fx; + s->b_bidir_forw_mv_table[xy][1]= motion_fy; + s->b_bidir_back_mv_table[xy][0]= motion_bx; + s->b_bidir_back_mv_table[xy][1]= motion_by; + return fbmin; } |