Mercurial > libavcodec.hg
comparison motion_est.c @ 2983:9d7d2bb70fd6 libavcodec
bidir refine support
| author | michael |
|---|---|
| date | Fri, 23 Dec 2005 16:25:00 +0000 |
| parents | 16f0f957e6ac |
| children | fedb0854bd07 |
comparison
equal
deleted
inserted
replaced
| 2982:16f0f957e6ac | 2983:9d7d2bb70fd6 |
|---|---|
| 1615 } | 1615 } |
| 1616 | 1616 |
| 1617 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/ | 1617 /* refine the bidir vectors in hq mode and return the score in both lq & hq mode*/ |
| 1618 static inline int bidir_refine(MpegEncContext * s, int mb_x, int mb_y) | 1618 static inline int bidir_refine(MpegEncContext * s, int mb_x, int mb_y) |
| 1619 { | 1619 { |
| 1620 MotionEstContext * const c= &s->me; | |
| 1620 const int mot_stride = s->mb_stride; | 1621 const int mot_stride = s->mb_stride; |
| 1621 const int xy = mb_y *mot_stride + mb_x; | 1622 const int xy = mb_y *mot_stride + mb_x; |
| 1622 int fbmin; | 1623 int fbmin; |
| 1623 int pred_fx= s->b_bidir_forw_mv_table[xy-1][0]; | 1624 int pred_fx= s->b_bidir_forw_mv_table[xy-1][0]; |
| 1624 int pred_fy= s->b_bidir_forw_mv_table[xy-1][1]; | 1625 int pred_fy= s->b_bidir_forw_mv_table[xy-1][1]; |
| 1626 int pred_by= s->b_bidir_back_mv_table[xy-1][1]; | 1627 int pred_by= s->b_bidir_back_mv_table[xy-1][1]; |
| 1627 int motion_fx= s->b_bidir_forw_mv_table[xy][0]= s->b_forw_mv_table[xy][0]; | 1628 int motion_fx= s->b_bidir_forw_mv_table[xy][0]= s->b_forw_mv_table[xy][0]; |
| 1628 int motion_fy= s->b_bidir_forw_mv_table[xy][1]= s->b_forw_mv_table[xy][1]; | 1629 int motion_fy= s->b_bidir_forw_mv_table[xy][1]= s->b_forw_mv_table[xy][1]; |
| 1629 int motion_bx= s->b_bidir_back_mv_table[xy][0]= s->b_back_mv_table[xy][0]; | 1630 int motion_bx= s->b_bidir_back_mv_table[xy][0]= s->b_back_mv_table[xy][0]; |
| 1630 int motion_by= s->b_bidir_back_mv_table[xy][1]= s->b_back_mv_table[xy][1]; | 1631 int motion_by= s->b_bidir_back_mv_table[xy][1]= s->b_back_mv_table[xy][1]; |
| 1631 | 1632 const int flags= c->sub_flags; |
| 1632 //FIXME do refinement and add flag | 1633 const int qpel= flags&FLAG_QPEL; |
| 1634 const int shift= 1+qpel; | |
| 1635 const int xmin= c->xmin<<shift; | |
| 1636 const int ymin= c->ymin<<shift; | |
| 1637 const int xmax= c->xmax<<shift; | |
| 1638 const int ymax= c->ymax<<shift; | |
| 1633 | 1639 |
| 1634 fbmin= check_bidir_mv(s, motion_fx, motion_fy, | 1640 fbmin= check_bidir_mv(s, motion_fx, motion_fy, |
| 1635 motion_bx, motion_by, | 1641 motion_bx, motion_by, |
| 1636 pred_fx, pred_fy, | 1642 pred_fx, pred_fy, |
| 1637 pred_bx, pred_by, | 1643 pred_bx, pred_by, |
| 1638 0, 16); | 1644 0, 16); |
| 1639 | 1645 |
| 1640 return fbmin; | 1646 if(s->avctx->bidir_refine){ |
| 1647 int score, end; | |
| 1648 #define CHECK_BIDIR(fx,fy,bx,by)\ | |
| 1649 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);\ | |
| 1650 if(score < fbmin){\ | |
| 1651 fbmin= score;\ | |
| 1652 motion_fx+=fx;\ | |
| 1653 motion_fy+=fy;\ | |
| 1654 motion_bx+=bx;\ | |
| 1655 motion_by+=by;\ | |
| 1656 end=0;\ | |
| 1657 } | |
| 1658 #define CHECK_BIDIR2(a,b,c,d)\ | |
| 1659 CHECK_BIDIR(a,b,c,d)\ | |
| 1660 CHECK_BIDIR(-a,-b,-c,-d) | |
| 1661 | |
| 1662 #define CHECK_BIDIRR(a,b,c,d)\ | |
| 1663 CHECK_BIDIR2(a,b,c,d)\ | |
| 1664 CHECK_BIDIR2(b,c,d,a)\ | |
| 1665 CHECK_BIDIR2(c,d,a,b)\ | |
| 1666 CHECK_BIDIR2(d,a,b,c) | |
| 1667 | |
| 1668 do{ | |
| 1669 end=1; | |
| 1670 | |
| 1671 if( motion_fx >= xmax || motion_bx >= xmax || motion_fx <= xmin || motion_bx <= xmin | |
| 1672 || motion_fy >= ymax || motion_by >= ymax || motion_fy <= ymin || motion_by <= ymin) | |
| 1673 break; | |
| 1674 | |
| 1675 CHECK_BIDIRR( 0, 0, 0, 1) | |
| 1676 if(s->avctx->bidir_refine > 1){ | |
| 1677 CHECK_BIDIRR( 0, 0, 1, 1) | |
| 1678 CHECK_BIDIR2( 0, 1, 0, 1) | |
| 1679 CHECK_BIDIR2( 1, 0, 1, 0) | |
| 1680 CHECK_BIDIRR( 0, 0,-1, 1) | |
| 1681 CHECK_BIDIR2( 0,-1, 0, 1) | |
| 1682 CHECK_BIDIR2(-1, 0, 1, 0) | |
| 1683 if(s->avctx->bidir_refine > 2){ | |
| 1684 CHECK_BIDIRR( 0, 1, 1, 1) | |
| 1685 CHECK_BIDIRR( 0,-1, 1, 1) | |
| 1686 CHECK_BIDIRR( 0, 1,-1, 1) | |
| 1687 CHECK_BIDIRR( 0, 1, 1,-1) | |
| 1688 if(s->avctx->bidir_refine > 3){ | |
| 1689 CHECK_BIDIR2( 1, 1, 1, 1) | |
| 1690 CHECK_BIDIRR( 1, 1, 1,-1) | |
| 1691 CHECK_BIDIR2( 1, 1,-1,-1) | |
| 1692 CHECK_BIDIR2( 1,-1,-1, 1) | |
| 1693 CHECK_BIDIR2( 1,-1, 1,-1) | |
| 1694 } | |
| 1695 } | |
| 1696 } | |
| 1697 }while(!end); | |
| 1698 } | |
| 1699 | |
| 1700 return fbmin; | |
| 1641 } | 1701 } |
| 1642 | 1702 |
| 1643 static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y) | 1703 static inline int direct_search(MpegEncContext * s, int mb_x, int mb_y) |
| 1644 { | 1704 { |
| 1645 MotionEstContext * const c= &s->me; | 1705 MotionEstContext * const c= &s->me; |
