comparison dsputil.c @ 256:4c1cec7c3c7c libavcodec

q-pel mc fixed
author michaelni
date Sat, 09 Mar 2002 14:22:21 +0000
parents db20b987c32d
children 944632089814
comparison
equal deleted inserted replaced
255:db20b987c32d 256:4c1cec7c3c7c
13 * GNU General Public License for more details. 13 * GNU General Public License for more details.
14 * 14 *
15 * You should have received a copy of the GNU General Public License 15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software 16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 * gmc & q-pel support by Michael Niedermayer <michaelni@gmx.at>
18 */ 20 */
19 #include <stdlib.h> 21 #include <stdlib.h>
20 #include <stdio.h> 22 #include <stdio.h>
21 #include <math.h> 23 #include <math.h>
22 #include "avcodec.h" 24 #include "avcodec.h"
467 dst[6]= (src1[6] + src2[6] + src3[6] + src4[6] + r)>>2; 469 dst[6]= (src1[6] + src2[6] + src3[6] + src4[6] + r)>>2;
468 dst[7]= (src1[7] + src2[7] + src3[7] + src4[7] + r)>>2; 470 dst[7]= (src1[7] + src2[7] + src3[7] + src4[7] + r)>>2;
469 dst+=dstStride; 471 dst+=dstStride;
470 src1+=srcStride; 472 src1+=srcStride;
471 src2+=8; 473 src2+=8;
472 src3+=9; 474 src3+=8;
473 src4+=8; 475 src4+=8;
474 } 476 }
475 } 477 }
476 478
477 #define QPEL_MC(r, name) \ 479 #define QPEL_MC(r, name) \
518 avg2_block(dst, src+srcStride, half, dstStride, srcStride, 1-r);\ 520 avg2_block(dst, src+srcStride, half, dstStride, srcStride, 1-r);\
519 }\ 521 }\
520 static void qpel_mc11_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 522 static void qpel_mc11_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
521 {\ 523 {\
522 UINT8 halfH[72];\ 524 UINT8 halfH[72];\
523 UINT8 halfV[72];\ 525 UINT8 halfV[64];\
524 UINT8 halfHV[64];\ 526 UINT8 halfHV[64];\
525 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 527 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
526 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 528 qpel_v_lowpass(halfV, src, 8, srcStride, 8, 128-r);\
527 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 529 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
528 avg4_block(dst, src, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\ 530 avg4_block(dst, src, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\
529 }\ 531 }\
530 static void qpel_mc31_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 532 static void qpel_mc31_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
531 {\ 533 {\
532 UINT8 halfH[72];\ 534 UINT8 halfH[72];\
533 UINT8 halfV[72];\ 535 UINT8 halfV[64];\
534 UINT8 halfHV[64];\ 536 UINT8 halfHV[64];\
535 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 537 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
536 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 538 qpel_v_lowpass(halfV, src+1, 8, srcStride, 8, 128-r);\
537 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 539 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
538 avg4_block(dst, src+1, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\ 540 avg4_block(dst, src+1, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\
539 }\ 541 }\
540 static void qpel_mc13_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 542 static void qpel_mc13_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
541 {\ 543 {\
542 UINT8 halfH[72];\ 544 UINT8 halfH[72];\
543 UINT8 halfV[72];\ 545 UINT8 halfV[64];\
544 UINT8 halfHV[64];\ 546 UINT8 halfHV[64];\
545 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 547 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
546 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 548 qpel_v_lowpass(halfV, src, 8, srcStride, 8, 128-r);\
547 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 549 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
548 avg4_block(dst, src+srcStride, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\ 550 avg4_block(dst, src+srcStride, halfH+8, halfV, halfHV, dstStride, srcStride, 2-r);\
549 }\ 551 }\
550 static void qpel_mc33_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 552 static void qpel_mc33_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
551 {\ 553 {\
552 UINT8 halfH[72];\ 554 UINT8 halfH[72];\
553 UINT8 halfV[72];\ 555 UINT8 halfV[64];\
554 UINT8 halfHV[64];\ 556 UINT8 halfHV[64];\
555 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 557 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
556 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 558 qpel_v_lowpass(halfV, src+1, 8, srcStride, 8, 128-r);\
557 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 559 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
558 avg4_block(dst, src+srcStride+1, halfH, halfV, halfHV, dstStride, srcStride, 2-r);\ 560 avg4_block(dst, src+srcStride+1, halfH+8, halfV, halfHV, dstStride, srcStride, 2-r);\
559 }\ 561 }\
560 static void qpel_mc21_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 562 static void qpel_mc21_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
561 {\ 563 {\
562 UINT8 halfH[72];\ 564 UINT8 halfH[72];\
563 UINT8 halfHV[64];\ 565 UINT8 halfHV[64];\
574 avg2_block(dst, halfH+8, halfHV, dstStride, 8, 1-r);\ 576 avg2_block(dst, halfH+8, halfHV, dstStride, 8, 1-r);\
575 }\ 577 }\
576 static void qpel_mc12_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 578 static void qpel_mc12_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
577 {\ 579 {\
578 UINT8 halfH[72];\ 580 UINT8 halfH[72];\
579 UINT8 halfV[72];\ 581 UINT8 halfV[64];\
580 UINT8 halfHV[64];\ 582 UINT8 halfHV[64];\
581 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 583 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
582 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 584 qpel_v_lowpass(halfV, src, 8, srcStride, 8, 128-r);\
583 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 585 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
584 avg2_block(dst, halfV, halfHV, dstStride, 9, 1-r);\ 586 avg2_block(dst, halfV, halfHV, dstStride, 8, 1-r);\
585 }\ 587 }\
586 static void qpel_mc32_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 588 static void qpel_mc32_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
587 {\ 589 {\
588 UINT8 halfH[72];\ 590 UINT8 halfH[72];\
589 UINT8 halfV[72];\ 591 UINT8 halfV[64];\
590 UINT8 halfHV[64];\ 592 UINT8 halfHV[64];\
591 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 593 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\
592 qpel_v_lowpass(halfV, src, 9, srcStride, 9, 128-r);\ 594 qpel_v_lowpass(halfV, src+1, 8, srcStride, 8, 128-r);\
593 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\ 595 qpel_v_lowpass(halfHV, halfH, 8, 8, 8, 128-r);\
594 avg2_block(dst, halfV+1, halfHV, dstStride, 9, 1-r);\ 596 avg2_block(dst, halfV, halfHV, dstStride, 8, 1-r);\
595 }\ 597 }\
596 static void qpel_mc22_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\ 598 static void qpel_mc22_c ## name (UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my)\
597 {\ 599 {\
598 UINT8 halfH[72];\ 600 UINT8 halfH[72];\
599 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\ 601 qpel_h_lowpass(halfH, src, 8, srcStride, 9, 128-r);\