Mercurial > libavcodec.hg
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; |