comparison motion_est.c @ 284:0778d4e1d584 libavcodec

better inter/intra decission algo (same as xvid)
author michaelni
date Sat, 23 Mar 2002 12:39:45 +0000
parents 1fc96b02142e
children f82cce6cb182
comparison
equal deleted inserted replaced
283:d94f9f58a2c5 284:0778d4e1d584
23 #include <stdio.h> 23 #include <stdio.h>
24 #include "avcodec.h" 24 #include "avcodec.h"
25 #include "dsputil.h" 25 #include "dsputil.h"
26 #include "mpegvideo.h" 26 #include "mpegvideo.h"
27 27
28 #define ABS(a) ((a)>0 ? (a) : -(a))
29 #define INTER_BIAS 257
30
28 static void halfpel_motion_search(MpegEncContext * s, 31 static void halfpel_motion_search(MpegEncContext * s,
29 int *mx_ptr, int *my_ptr, int dmin, 32 int *mx_ptr, int *my_ptr, int dmin,
30 int xmin, int ymin, int xmax, int ymax, 33 int xmin, int ymin, int xmax, int ymax,
31 int pred_x, int pred_y); 34 int pred_x, int pred_y);
32 35
46 s += pix[3]; 49 s += pix[3];
47 s += pix[4]; 50 s += pix[4];
48 s += pix[5]; 51 s += pix[5];
49 s += pix[6]; 52 s += pix[6];
50 s += pix[7]; 53 s += pix[7];
54 pix += 8;
55 }
56 pix += line_size - 16;
57 }
58 return s;
59 }
60
61 static int pix_dev(UINT8 * pix, int line_size, int mean)
62 {
63 int s, i, j;
64
65 s = 0;
66 for (i = 0; i < 16; i++) {
67 for (j = 0; j < 16; j += 8) {
68 s += ABS(pix[0]-mean);
69 s += ABS(pix[1]-mean);
70 s += ABS(pix[2]-mean);
71 s += ABS(pix[3]-mean);
72 s += ABS(pix[4]-mean);
73 s += ABS(pix[5]-mean);
74 s += ABS(pix[6]-mean);
75 s += ABS(pix[7]-mean);
51 pix += 8; 76 pix += 8;
52 } 77 }
53 pix += line_size - 16; 78 pix += line_size - 16;
54 } 79 }
55 return s; 80 return s;
730 pix = s->new_picture[0] + (yy * s->linesize) + xx; 755 pix = s->new_picture[0] + (yy * s->linesize) + xx;
731 /* At this point (mx,my) are full-pell and the absolute displacement */ 756 /* At this point (mx,my) are full-pell and the absolute displacement */
732 ppix = s->last_picture[0] + (my * s->linesize) + mx; 757 ppix = s->last_picture[0] + (my * s->linesize) + mx;
733 758
734 sum = pix_sum(pix, s->linesize); 759 sum = pix_sum(pix, s->linesize);
735 varc = pix_norm1(pix, s->linesize); 760 varc = pix_dev(pix, s->linesize, (sum+128)>>8);
736 vard = pix_norm(pix, ppix, s->linesize); 761 vard = pix_abs16x16(pix, ppix, s->linesize, 16);
737 762
738 vard = vard >> 8;
739 sum = sum >> 8;
740 varc = (varc >> 8) - (sum * sum);
741 s->mb_var[s->mb_width * mb_y + mb_x] = varc; 763 s->mb_var[s->mb_width * mb_y + mb_x] = varc;
742 s->avg_mb_var += varc; 764 s->avg_mb_var += varc;
743 s->mc_mb_var += vard; 765 s->mc_mb_var += vard;
744 766
745 #if 0 767 #if 0
746 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n", 768 printf("varc=%4d avg_var=%4d (sum=%4d) vard=%4d mx=%2d my=%2d\n",
747 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy); 769 varc, s->avg_mb_var, sum, vard, mx - xx, my - yy);
748 #endif 770 #endif
749 if (vard <= 64 || vard < varc) { 771 if (vard <= 64 || vard < varc + INTER_BIAS) {
750 if (s->full_search != ME_ZERO) { 772 if (s->full_search != ME_ZERO) {
751 halfpel_motion_search(s, &mx, &my, dmin, xmin, ymin, xmax, ymax, pred_x, pred_y); 773 halfpel_motion_search(s, &mx, &my, dmin, xmin, ymin, xmax, ymax, pred_x, pred_y);
752 } else { 774 } else {
753 mx -= 16 * s->mb_x; 775 mx -= 16 * s->mb_x;
754 my -= 16 * s->mb_y; 776 my -= 16 * s->mb_y;
755 } 777 }
756 // check(mx + 32*s->mb_x, my + 32*s->mb_y, 1, end) 778 // check(mx + 32*s->mb_x, my + 32*s->mb_y, 1, end)
757 779
758 *mx_ptr = mx; 780 *mx_ptr = mx;
759 *my_ptr = my; 781 *my_ptr = my;
760 return 0; 782 return 0;
761 } else { 783 } else {
762 *mx_ptr = 0; 784 *mx_ptr = 0;