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 }