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; |