Mercurial > libavcodec.hg
comparison motion_est.c @ 11577:e4a69ce0256f libavcodec
Optimize bidir_refine a bit.
compiled code is less tham 1/4 the size.
a tiny bit faster
author | michael |
---|---|
date | Fri, 02 Apr 2010 14:04:15 +0000 |
parents | 56b71cbf22ac |
children | 7dd2a45249a9 |
comparison
equal
deleted
inserted
replaced
11576:56b71cbf22ac | 11577:e4a69ce0256f |
---|---|
1487 pred_fx, pred_fy, | 1487 pred_fx, pred_fy, |
1488 pred_bx, pred_by, | 1488 pred_bx, pred_by, |
1489 0, 16); | 1489 0, 16); |
1490 | 1490 |
1491 if(s->avctx->bidir_refine){ | 1491 if(s->avctx->bidir_refine){ |
1492 int score, end; | 1492 int end; |
1493 static const uint8_t limittab[5]={0,8,32,64,80}; | |
1494 const int limit= limittab[s->avctx->bidir_refine]; | |
1495 static const int8_t vect[][4]={ | |
1496 { 0, 0, 0, 1}, { 0, 0, 0,-1}, { 0, 0, 1, 0}, { 0, 0,-1, 0}, { 0, 1, 0, 0}, { 0,-1, 0, 0}, { 1, 0, 0, 0}, {-1, 0, 0, 0}, | |
1497 | |
1498 { 0, 0, 1, 1}, { 0, 0,-1,-1}, { 0, 1, 1, 0}, { 0,-1,-1, 0}, { 1, 1, 0, 0}, {-1,-1, 0, 0}, { 1, 0, 0, 1}, {-1, 0, 0,-1}, | |
1499 { 0, 1, 0, 1}, { 0,-1, 0,-1}, { 1, 0, 1, 0}, {-1, 0,-1, 0}, | |
1500 { 0, 0,-1, 1}, { 0, 0, 1,-1}, { 0,-1, 1, 0}, { 0, 1,-1, 0}, {-1, 1, 0, 0}, { 1,-1, 0, 0}, { 1, 0, 0,-1}, {-1, 0, 0, 1}, | |
1501 { 0,-1, 0, 1}, { 0, 1, 0,-1}, {-1, 0, 1, 0}, { 1, 0,-1, 0}, | |
1502 | |
1503 { 0, 1, 1, 1}, { 0,-1,-1,-1}, { 1, 1, 1, 0}, {-1,-1,-1, 0}, { 1, 1, 0, 1}, {-1,-1, 0,-1}, { 1, 0, 1, 1}, {-1, 0,-1,-1}, | |
1504 { 0,-1, 1, 1}, { 0, 1,-1,-1}, {-1, 1, 1, 0}, { 1,-1,-1, 0}, { 1, 1, 0,-1}, {-1,-1, 0, 1}, { 1, 0,-1, 1}, {-1, 0, 1,-1}, | |
1505 { 0, 1,-1, 1}, { 0,-1, 1,-1}, { 1,-1, 1, 0}, {-1, 1,-1, 0}, {-1, 1, 0, 1}, { 1,-1, 0,-1}, { 1, 0, 1,-1}, {-1, 0,-1, 1}, | |
1506 { 0, 1, 1,-1}, { 0,-1,-1, 1}, { 1, 1,-1, 0}, {-1,-1, 1, 0}, { 1,-1, 0, 1}, {-1, 1, 0,-1}, {-1, 0, 1, 1}, { 1, 0,-1,-1}, | |
1507 | |
1508 { 1, 1, 1, 1}, {-1,-1,-1,-1}, | |
1509 { 1, 1, 1,-1}, {-1,-1,-1, 1}, { 1, 1,-1, 1}, {-1,-1, 1,-1}, { 1,-1, 1, 1}, {-1, 1,-1,-1}, {-1, 1, 1, 1}, { 1,-1,-1,-1}, | |
1510 { 1, 1,-1,-1}, {-1,-1, 1, 1}, { 1,-1,-1, 1}, {-1, 1, 1,-1}, { 1,-1, 1,-1}, {-1, 1,-1, 1}, | |
1511 }; | |
1512 static const uint8_t hash[]={ | |
1513 HASH( 0, 0, 0, 1), HASH( 0, 0, 0,-1), HASH( 0, 0, 1, 0), HASH( 0, 0,-1, 0), HASH( 0, 1, 0, 0), HASH( 0,-1, 0, 0), HASH( 1, 0, 0, 0), HASH(-1, 0, 0, 0), | |
1514 | |
1515 HASH( 0, 0, 1, 1), HASH( 0, 0,-1,-1), HASH( 0, 1, 1, 0), HASH( 0,-1,-1, 0), HASH( 1, 1, 0, 0), HASH(-1,-1, 0, 0), HASH( 1, 0, 0, 1), HASH(-1, 0, 0,-1), | |
1516 HASH( 0, 1, 0, 1), HASH( 0,-1, 0,-1), HASH( 1, 0, 1, 0), HASH(-1, 0,-1, 0), | |
1517 HASH( 0, 0,-1, 1), HASH( 0, 0, 1,-1), HASH( 0,-1, 1, 0), HASH( 0, 1,-1, 0), HASH(-1, 1, 0, 0), HASH( 1,-1, 0, 0), HASH( 1, 0, 0,-1), HASH(-1, 0, 0, 1), | |
1518 HASH( 0,-1, 0, 1), HASH( 0, 1, 0,-1), HASH(-1, 0, 1, 0), HASH( 1, 0,-1, 0), | |
1519 | |
1520 HASH( 0, 1, 1, 1), HASH( 0,-1,-1,-1), HASH( 1, 1, 1, 0), HASH(-1,-1,-1, 0), HASH( 1, 1, 0, 1), HASH(-1,-1, 0,-1), HASH( 1, 0, 1, 1), HASH(-1, 0,-1,-1), | |
1521 HASH( 0,-1, 1, 1), HASH( 0, 1,-1,-1), HASH(-1, 1, 1, 0), HASH( 1,-1,-1, 0), HASH( 1, 1, 0,-1), HASH(-1,-1, 0, 1), HASH( 1, 0,-1, 1), HASH(-1, 0, 1,-1), | |
1522 HASH( 0, 1,-1, 1), HASH( 0,-1, 1,-1), HASH( 1,-1, 1, 0), HASH(-1, 1,-1, 0), HASH(-1, 1, 0, 1), HASH( 1,-1, 0,-1), HASH( 1, 0, 1,-1), HASH(-1, 0,-1, 1), | |
1523 HASH( 0, 1, 1,-1), HASH( 0,-1,-1, 1), HASH( 1, 1,-1, 0), HASH(-1,-1, 1, 0), HASH( 1,-1, 0, 1), HASH(-1, 1, 0,-1), HASH(-1, 0, 1, 1), HASH( 1, 0,-1,-1), | |
1524 | |
1525 HASH( 1, 1, 1, 1), HASH(-1,-1,-1,-1), | |
1526 HASH( 1, 1, 1,-1), HASH(-1,-1,-1, 1), HASH( 1, 1,-1, 1), HASH(-1,-1, 1,-1), HASH( 1,-1, 1, 1), HASH(-1, 1,-1,-1), HASH(-1, 1, 1, 1), HASH( 1,-1,-1,-1), | |
1527 HASH( 1, 1,-1,-1), HASH(-1,-1, 1, 1), HASH( 1,-1,-1, 1), HASH(-1, 1, 1,-1), HASH( 1,-1, 1,-1), HASH(-1, 1,-1, 1), | |
1528 }; | |
1529 | |
1493 #define CHECK_BIDIR(fx,fy,bx,by)\ | 1530 #define CHECK_BIDIR(fx,fy,bx,by)\ |
1494 if( !map[(hashidx+HASH(fx,fy,bx,by))&255]\ | 1531 if( !map[(hashidx+HASH(fx,fy,bx,by))&255]\ |
1495 &&(fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\ | 1532 &&(fx<=0 || motion_fx+fx<=xmax) && (fy<=0 || motion_fy+fy<=ymax) && (bx<=0 || motion_bx+bx<=xmax) && (by<=0 || motion_by+by<=ymax)\ |
1496 &&(fx>=0 || motion_fx+fx>=xmin) && (fy>=0 || motion_fy+fy>=ymin) && (bx>=0 || motion_bx+bx>=xmin) && (by>=0 || motion_by+by>=ymin)){\ | 1533 &&(fx>=0 || motion_fx+fx>=xmin) && (fy>=0 || motion_fy+fy>=ymin) && (bx>=0 || motion_bx+bx>=xmin) && (by>=0 || motion_by+by>=ymin)){\ |
1534 int score;\ | |
1497 map[(hashidx+HASH(fx,fy,bx,by))&255] = 1;\ | 1535 map[(hashidx+HASH(fx,fy,bx,by))&255] = 1;\ |
1498 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);\ | 1536 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);\ |
1499 if(score < fbmin){\ | 1537 if(score < fbmin){\ |
1500 hashidx += HASH(fx,fy,bx,by);\ | 1538 hashidx += HASH(fx,fy,bx,by);\ |
1501 fbmin= score;\ | 1539 fbmin= score;\ |
1508 } | 1546 } |
1509 #define CHECK_BIDIR2(a,b,c,d)\ | 1547 #define CHECK_BIDIR2(a,b,c,d)\ |
1510 CHECK_BIDIR(a,b,c,d)\ | 1548 CHECK_BIDIR(a,b,c,d)\ |
1511 CHECK_BIDIR(-(a),-(b),-(c),-(d)) | 1549 CHECK_BIDIR(-(a),-(b),-(c),-(d)) |
1512 | 1550 |
1513 #define CHECK_BIDIRR(a,b,c,d)\ | |
1514 CHECK_BIDIR2(a,b,c,d)\ | |
1515 CHECK_BIDIR2(b,c,d,a)\ | |
1516 CHECK_BIDIR2(c,d,a,b)\ | |
1517 CHECK_BIDIR2(d,a,b,c) | |
1518 | |
1519 do{ | 1551 do{ |
1552 int i; | |
1553 int borderdist=0; | |
1520 end=1; | 1554 end=1; |
1521 | 1555 |
1522 CHECK_BIDIRR( 0, 0, 0, 1) | 1556 CHECK_BIDIR2(0,0,0,1) |
1523 if(s->avctx->bidir_refine > 1){ | 1557 CHECK_BIDIR2(0,0,1,0) |
1524 CHECK_BIDIRR( 0, 0, 1, 1) | 1558 CHECK_BIDIR2(0,1,0,0) |
1525 CHECK_BIDIR2( 0, 1, 0, 1) | 1559 CHECK_BIDIR2(1,0,0,0) |
1526 CHECK_BIDIR2( 1, 0, 1, 0) | 1560 |
1527 CHECK_BIDIRR( 0, 0,-1, 1) | 1561 for(i=8; i<limit; i++){ |
1528 CHECK_BIDIR2( 0,-1, 0, 1) | 1562 int fx= motion_fx+vect[i][0]; |
1529 CHECK_BIDIR2(-1, 0, 1, 0) | 1563 int fy= motion_fy+vect[i][1]; |
1530 if(s->avctx->bidir_refine > 2){ | 1564 int bx= motion_bx+vect[i][2]; |
1531 CHECK_BIDIRR( 0, 1, 1, 1) | 1565 int by= motion_by+vect[i][3]; |
1532 CHECK_BIDIRR( 0,-1, 1, 1) | 1566 if(borderdist<=0){ |
1533 CHECK_BIDIRR( 0, 1,-1, 1) | 1567 int a= (xmax - FFMAX(fx,bx))|(FFMIN(fx,bx) - xmin); |
1534 CHECK_BIDIRR( 0, 1, 1,-1) | 1568 int b= (ymax - FFMAX(fy,by))|(FFMIN(fy,by) - ymin); |
1535 if(s->avctx->bidir_refine > 3){ | 1569 if((a|b) < 0) |
1536 CHECK_BIDIR2( 1, 1, 1, 1) | 1570 map[(hashidx+hash[i])&255] = 1; |
1537 CHECK_BIDIRR( 1, 1, 1,-1) | 1571 } |
1538 CHECK_BIDIR2( 1, 1,-1,-1) | 1572 if(!map[(hashidx+hash[i])&255]){ |
1539 CHECK_BIDIR2( 1,-1,-1, 1) | 1573 int score; |
1540 CHECK_BIDIR2( 1,-1, 1,-1) | 1574 map[(hashidx+hash[i])&255] = 1; |
1575 score= check_bidir_mv(s, fx, fy, bx, by, pred_fx, pred_fy, pred_bx, pred_by, 0, 16); | |
1576 if(score < fbmin){ | |
1577 hashidx += hash[i]; | |
1578 fbmin= score; | |
1579 motion_fx=fx; | |
1580 motion_fy=fy; | |
1581 motion_bx=bx; | |
1582 motion_by=by; | |
1583 end=0; | |
1584 borderdist--; | |
1585 if(borderdist<=0){ | |
1586 int a= FFMIN(xmax - FFMAX(fx,bx), FFMIN(fx,bx) - xmin); | |
1587 int b= FFMIN(ymax - FFMAX(fy,by), FFMIN(fy,by) - ymin); | |
1588 borderdist= FFMIN(a,b); | |
1589 } | |
1541 } | 1590 } |
1542 } | 1591 } |
1543 } | 1592 } |
1544 }while(!end); | 1593 }while(!end); |
1545 } | 1594 } |