annotate motion_est_template.c @ 1352:e8ff4783f188 libavcodec

1) remove TBL support in PPC performance. It's much more useful to use the PMCs, and with Apple's CHUD it's fairly easy too. No reason to keep useless code around 2) make the PPC perf stuff a configure option 3) make put_pixels16_altivec a bit faster by unrolling the loop by 4 patch by (Romain Dolbeau <dolbeau at irisa dot fr>)
author michaelni
date Wed, 09 Jul 2003 20:18:13 +0000
parents ec946cb74397
children a7a9df478e46
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1 /*
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
2 * Motion estimation
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
3 * Copyright (c) 2002 Michael Niedermayer
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
4 *
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
5 * This library is free software; you can redistribute it and/or
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
7 * License as published by the Free Software Foundation; either
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
8 * version 2 of the License, or (at your option) any later version.
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
9 *
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
10 * This library is distributed in the hope that it will be useful,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
13 * Lesser General Public License for more details.
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
14 *
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
16 * License along with this library; if not, write to the Free Software
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
18 *
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
19 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1013
diff changeset
20
1e39f273ecd6 per file doxy
michaelni
parents: 1013
diff changeset
21 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1013
diff changeset
22 * @file motion_est_template.c
1e39f273ecd6 per file doxy
michaelni
parents: 1013
diff changeset
23 * Motion estimation template.
1e39f273ecd6 per file doxy
michaelni
parents: 1013
diff changeset
24 */
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
25
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
26 //lets hope gcc will remove the unused vars ...(gcc 3.2.2 seems to do it ...)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
27 //Note, the last line is there to kill these ugly unused var warnings
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
28 #define LOAD_COMMON(x, y)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
29 uint32_t * const score_map= s->me.score_map;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
30 const int stride= s->linesize;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
31 const int uvstride= s->uvlinesize;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
32 const int time_pp= s->pp_time;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
33 const int time_pb= s->pb_time;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
34 uint8_t * const src_y= s->new_picture.data[0] + ((y) * stride) + (x);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
35 uint8_t * const src_u= s->new_picture.data[1] + (((y)>>1) * uvstride) + ((x)>>1);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
36 uint8_t * const src_v= s->new_picture.data[2] + (((y)>>1) * uvstride) + ((x)>>1);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
37 uint8_t * const ref_y= ref_picture->data[0] + ((y) * stride) + (x);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
38 uint8_t * const ref_u= ref_picture->data[1] + (((y)>>1) * uvstride) + ((x)>>1);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
39 uint8_t * const ref_v= ref_picture->data[2] + (((y)>>1) * uvstride) + ((x)>>1);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
40 uint8_t * const ref2_y= s->next_picture.data[0] + ((y) * stride) + (x);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
41 op_pixels_func (*hpel_put)[4];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
42 op_pixels_func (*hpel_avg)[4]= &s->dsp.avg_pixels_tab[size];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
43 op_pixels_func (*chroma_hpel_put)[4];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
44 qpel_mc_func (*qpel_put)[16];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
45 qpel_mc_func (*qpel_avg)[16]= &s->dsp.avg_qpel_pixels_tab[size];\
1266
ec946cb74397 Warning fixes.
mellum
parents: 1177
diff changeset
46 const __attribute__((unused)) int unu= time_pp + time_pb + (size_t)src_u + (size_t)src_v + (size_t)ref_u + (size_t)ref_v\
ec946cb74397 Warning fixes.
mellum
parents: 1177
diff changeset
47 + (size_t)ref2_y + (size_t)hpel_avg + (size_t)qpel_avg + (size_t)score_map;\
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
48 if(s->no_rounding /*FIXME b_type*/){\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
49 hpel_put= &s->dsp.put_no_rnd_pixels_tab[size];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
50 chroma_hpel_put= &s->dsp.put_no_rnd_pixels_tab[size+1];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
51 qpel_put= &s->dsp.put_no_rnd_qpel_pixels_tab[size];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
52 }else{\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
53 hpel_put=& s->dsp.put_pixels_tab[size];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
54 chroma_hpel_put= &s->dsp.put_pixels_tab[size+1];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
55 qpel_put= &s->dsp.put_qpel_pixels_tab[size];\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
56 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
57
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
58
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
59 #ifdef CMP_HPEL
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
60
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
61 #define CHECK_HALF_MV(dx, dy, x, y)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
62 {\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
63 const int hx= 2*(x)+(dx);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
64 const int hy= 2*(y)+(dy);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
65 CMP_HPEL(d, dx, dy, x, y, size);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
66 d += (mv_penalty[hx - pred_x] + mv_penalty[hy - pred_y])*penalty_factor;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
67 COPY3_IF_LT(dmin, d, bx, hx, by, hy)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
68 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
69
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
70 #if 0
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
71 static int RENAME(hpel_motion_search)(MpegEncContext * s,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
72 int *mx_ptr, int *my_ptr, int dmin,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
73 int xmin, int ymin, int xmax, int ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
74 int pred_x, int pred_y, Picture *ref_picture,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
75 int n, int size, uint8_t * const mv_penalty)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
76 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
77 const int xx = 16 * s->mb_x + 8*(n&1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
78 const int yy = 16 * s->mb_y + 8*(n>>1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
79 const int mx = *mx_ptr;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
80 const int my = *my_ptr;
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
81 const int penalty_factor= s->me.sub_penalty_factor;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
82
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
83 LOAD_COMMON(xx, yy);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
84
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
85 // INIT;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
86 //FIXME factorize
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
87 me_cmp_func cmp, chroma_cmp, cmp_sub, chroma_cmp_sub;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
88
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
89 if(s->no_rounding /*FIXME b_type*/){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
90 hpel_put= &s->dsp.put_no_rnd_pixels_tab[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
91 chroma_hpel_put= &s->dsp.put_no_rnd_pixels_tab[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
92 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
93 hpel_put=& s->dsp.put_pixels_tab[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
94 chroma_hpel_put= &s->dsp.put_pixels_tab[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
95 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
96 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
97 chroma_cmp= s->dsp.me_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
98 cmp_sub= s->dsp.me_sub_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
99 chroma_cmp_sub= s->dsp.me_sub_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
100
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
101 if(s->me.skip){ //FIXME somehow move up (benchmark)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
102 *mx_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
103 *my_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
104 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
105 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
106
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
107 if(s->avctx->me_cmp != s->avctx->me_sub_cmp){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
108 CMP_HPEL(dmin, 0, 0, mx, my, size);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
109 if(mx || my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
110 dmin += (mv_penalty[2*mx - pred_x] + mv_penalty[2*my - pred_y])*penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
111 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
112
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
113 if (mx > xmin && mx < xmax &&
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
114 my > ymin && my < ymax) {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
115 int bx=2*mx, by=2*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
116 int d= dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
117
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
118 CHECK_HALF_MV(1, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
119 CHECK_HALF_MV(0, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
120 CHECK_HALF_MV(1, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
121 CHECK_HALF_MV(1, 0, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
122 CHECK_HALF_MV(1, 0, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
123 CHECK_HALF_MV(1, 1, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
124 CHECK_HALF_MV(0, 1, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
125 CHECK_HALF_MV(1, 1, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
126
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
127 assert(bx >= xmin*2 || bx <= xmax*2 || by >= ymin*2 || by <= ymax*2);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
128
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
129 *mx_ptr = bx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
130 *my_ptr = by;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
131 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
132 *mx_ptr =2*mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
133 *my_ptr =2*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
134 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
135
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
136 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
137 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
138
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
139 #else
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
140 static int RENAME(hpel_motion_search)(MpegEncContext * s,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
141 int *mx_ptr, int *my_ptr, int dmin,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
142 int xmin, int ymin, int xmax, int ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
143 int pred_x, int pred_y, Picture *ref_picture,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
144 int n, int size, uint8_t * const mv_penalty)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
145 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
146 const int xx = 16 * s->mb_x + 8*(n&1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
147 const int yy = 16 * s->mb_y + 8*(n>>1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
148 const int mx = *mx_ptr;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
149 const int my = *my_ptr;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
150 const int penalty_factor= s->me.sub_penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
151 me_cmp_func cmp_sub, chroma_cmp_sub;
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
152 int bx=2*mx, by=2*my;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
153
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
154 LOAD_COMMON(xx, yy);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
155
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
156 //FIXME factorize
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
157
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
158 cmp_sub= s->dsp.me_sub_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
159 chroma_cmp_sub= s->dsp.me_sub_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
160
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
161 if(s->me.skip){ //FIXME move out of hpel?
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
162 *mx_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
163 *my_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
164 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
165 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
166
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
167 if(s->avctx->me_cmp != s->avctx->me_sub_cmp){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
168 CMP_HPEL(dmin, 0, 0, mx, my, size);
1011
michaelni
parents: 954
diff changeset
169 if(mx || my || size>0)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
170 dmin += (mv_penalty[2*mx - pred_x] + mv_penalty[2*my - pred_y])*penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
171 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
172
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
173 if (mx > xmin && mx < xmax &&
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
174 my > ymin && my < ymax) {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
175 int d= dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
176 const int index= (my<<ME_MAP_SHIFT) + mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
177 const int t= score_map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)]
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
178 + (mv_penalty[bx - pred_x] + mv_penalty[by-2 - pred_y])*s->me.penalty_factor;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
179 const int l= score_map[(index- 1 )&(ME_MAP_SIZE-1)]
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
180 + (mv_penalty[bx-2 - pred_x] + mv_penalty[by - pred_y])*s->me.penalty_factor;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
181 const int r= score_map[(index+ 1 )&(ME_MAP_SIZE-1)]
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
182 + (mv_penalty[bx+2 - pred_x] + mv_penalty[by - pred_y])*s->me.penalty_factor;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
183 const int b= score_map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)]
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
184 + (mv_penalty[bx - pred_x] + mv_penalty[by+2 - pred_y])*s->me.penalty_factor;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
185
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
186 #if 1
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
187 int key;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
188 int map_generation= s->me.map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
189 uint32_t *map= s->me.map;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
190 key= ((my-1)<<ME_MAP_MV_BITS) + (mx) + map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
191 assert(map[(index-(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
192 key= ((my+1)<<ME_MAP_MV_BITS) + (mx) + map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
193 assert(map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] == key);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
194 key= ((my)<<ME_MAP_MV_BITS) + (mx+1) + map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
195 assert(map[(index+1)&(ME_MAP_SIZE-1)] == key);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
196 key= ((my)<<ME_MAP_MV_BITS) + (mx-1) + map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
197 assert(map[(index-1)&(ME_MAP_SIZE-1)] == key);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
198 #endif
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
199 if(t<=b){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
200 CHECK_HALF_MV(0, 1, mx ,my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
201 if(l<=r){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
202 CHECK_HALF_MV(1, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
203 if(t+r<=b+l){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
204 CHECK_HALF_MV(1, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
205 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
206 CHECK_HALF_MV(1, 1, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
207 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
208 CHECK_HALF_MV(1, 0, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
209 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
210 CHECK_HALF_MV(1, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
211 if(t+l<=b+r){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
212 CHECK_HALF_MV(1, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
213 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
214 CHECK_HALF_MV(1, 1, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
215 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
216 CHECK_HALF_MV(1, 0, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
217 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
218 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
219 if(l<=r){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
220 if(t+l<=b+r){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
221 CHECK_HALF_MV(1, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
222 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
223 CHECK_HALF_MV(1, 1, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
224 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
225 CHECK_HALF_MV(1, 0, mx-1, my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
226 CHECK_HALF_MV(1, 1, mx-1, my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
227 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
228 if(t+r<=b+l){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
229 CHECK_HALF_MV(1, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
230 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
231 CHECK_HALF_MV(1, 1, mx-1, my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
232 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
233 CHECK_HALF_MV(1, 0, mx , my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
234 CHECK_HALF_MV(1, 1, mx , my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
235 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
236 CHECK_HALF_MV(0, 1, mx , my)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
237 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
238 assert(bx >= xmin*2 && bx <= xmax*2 && by >= ymin*2 && by <= ymax*2);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
239 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
240
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
241 *mx_ptr = bx;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
242 *my_ptr = by;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
243
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
244 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
245 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
246 #endif
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
247
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
248 static int RENAME(hpel_get_mb_score)(MpegEncContext * s, int mx, int my, int pred_x, int pred_y, Picture *ref_picture,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
249 uint8_t * const mv_penalty)
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
250 {
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
251 // const int check_luma= s->dsp.me_sub_cmp != s->dsp.mb_cmp;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
252 const int size= 0;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
253 const int xx = 16 * s->mb_x;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
254 const int yy = 16 * s->mb_y;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
255 const int penalty_factor= s->me.mb_penalty_factor;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
256 const int xmin= -256*256, ymin= -256*256, xmax= 256*256, ymax= 256*256; //assume that the caller checked these
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
257 const __attribute__((unused)) int unu2= xmin + xmax +ymin + ymax; //no unused warning shit
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
258 me_cmp_func cmp_sub, chroma_cmp_sub;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
259 int d;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
260
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
261 LOAD_COMMON(xx, yy);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
262
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
263 //FIXME factorize
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
264
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
265 cmp_sub= s->dsp.mb_cmp[size];
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
266 chroma_cmp_sub= s->dsp.mb_cmp[size+1];
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
267
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
268 assert(!s->me.skip);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
269 assert(s->avctx->me_sub_cmp != s->avctx->mb_cmp);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
270
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
271 CMP_HPEL(d, mx&1, my&1, mx>>1, my>>1, size);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
272 //FIXME check cbp before adding penalty for (0,0) vector
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
273 if(mx || my || size>0)
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
274 d += (mv_penalty[mx - pred_x] + mv_penalty[my - pred_y])*penalty_factor;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
275
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
276 return d;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
277 }
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
278
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
279 #endif /* CMP_HPEL */
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
280
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
281
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
282
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
283 #ifdef CMP_QPEL
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
284
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
285 #define CHECK_QUARTER_MV(dx, dy, x, y)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
286 {\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
287 const int hx= 4*(x)+(dx);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
288 const int hy= 4*(y)+(dy);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
289 CMP_QPEL(d, dx, dy, x, y, size);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
290 d += (mv_penalty[hx - pred_x] + mv_penalty[hy - pred_y])*penalty_factor;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
291 COPY3_IF_LT(dmin, d, bx, hx, by, hy)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
292 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
293
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
294 static int RENAME(qpel_motion_search)(MpegEncContext * s,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
295 int *mx_ptr, int *my_ptr, int dmin,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
296 int xmin, int ymin, int xmax, int ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
297 int pred_x, int pred_y, Picture *ref_picture,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
298 int n, int size, uint8_t * const mv_penalty)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
299 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
300 const int xx = 16 * s->mb_x + 8*(n&1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
301 const int yy = 16 * s->mb_y + 8*(n>>1);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
302 const int mx = *mx_ptr;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
303 const int my = *my_ptr;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
304 const int penalty_factor= s->me.sub_penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
305 const int map_generation= s->me.map_generation;
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
306 const int subpel_quality= s->avctx->me_subpel_quality;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
307 uint32_t *map= s->me.map;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
308 me_cmp_func cmp, chroma_cmp;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
309 me_cmp_func cmp_sub, chroma_cmp_sub;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
310
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
311 LOAD_COMMON(xx, yy);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
312
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
313 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
314 chroma_cmp= s->dsp.me_cmp[size+1]; //factorize FIXME
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
315 //FIXME factorize
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
316
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
317 cmp_sub= s->dsp.me_sub_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
318 chroma_cmp_sub= s->dsp.me_sub_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
319
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
320 if(s->me.skip){ //FIXME somehow move up (benchmark)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
321 *mx_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
322 *my_ptr = 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
323 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
324 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
325
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
326 if(s->avctx->me_cmp != s->avctx->me_sub_cmp){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
327 CMP_QPEL(dmin, 0, 0, mx, my, size);
1011
michaelni
parents: 954
diff changeset
328 if(mx || my || size>0)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
329 dmin += (mv_penalty[4*mx - pred_x] + mv_penalty[4*my - pred_y])*penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
330 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
331
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
332 if (mx > xmin && mx < xmax &&
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
333 my > ymin && my < ymax) {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
334 int bx=4*mx, by=4*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
335 int d= dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
336 int i, nx, ny;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
337 const int index= (my<<ME_MAP_SHIFT) + mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
338 const int t= score_map[(index-(1<<ME_MAP_SHIFT) )&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
339 const int l= score_map[(index- 1 )&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
340 const int r= score_map[(index+ 1 )&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
341 const int b= score_map[(index+(1<<ME_MAP_SHIFT) )&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
342 const int c= score_map[(index )&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
343 int best[8];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
344 int best_pos[8][2];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
345
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
346 memset(best, 64, sizeof(int)*8);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
347 #if 1
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
348 if(s->me.dia_size>=2){
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
349 const int tl= score_map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
350 const int bl= score_map[(index+(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
351 const int tr= score_map[(index-(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
352 const int br= score_map[(index+(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
353
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
354 for(ny= -3; ny <= 3; ny++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
355 for(nx= -3; nx <= 3; nx++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
356 const int t2= nx*nx*(tr + tl - 2*t) + 4*nx*(tr-tl) + 32*t;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
357 const int c2= nx*nx*( r + l - 2*c) + 4*nx*( r- l) + 32*c;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
358 const int b2= nx*nx*(br + bl - 2*b) + 4*nx*(br-bl) + 32*b;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
359 int score= ny*ny*(b2 + t2 - 2*c2) + 4*ny*(b2 - t2) + 32*c2;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
360 int i;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
361
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
362 if((nx&3)==0 && (ny&3)==0) continue;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
363
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
364 score += 1024*(mv_penalty[4*mx + nx - pred_x] + mv_penalty[4*my + ny - pred_y])*penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
365
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
366 // if(nx&1) score-=1024*s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
367 // if(ny&1) score-=1024*s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
368
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
369 for(i=0; i<8; i++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
370 if(score < best[i]){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
371 memmove(&best[i+1], &best[i], sizeof(int)*(7-i));
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
372 memmove(&best_pos[i+1][0], &best_pos[i][0], sizeof(int)*2*(7-i));
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
373 best[i]= score;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
374 best_pos[i][0]= nx + 4*mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
375 best_pos[i][1]= ny + 4*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
376 break;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
377 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
378 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
379 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
380 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
381 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
382 int tl;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
383 const int cx = 4*(r - l);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
384 const int cx2= r + l - 2*c;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
385 const int cy = 4*(b - t);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
386 const int cy2= b + t - 2*c;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
387 int cxy;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
388
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
389 if(map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)] == (my<<ME_MAP_MV_BITS) + mx + map_generation && 0){ //FIXME
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
390 tl= score_map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
391 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
392 CMP(tl, mx-1, my-1, size); //FIXME wrong if chroma me is different
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
393 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
394
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
395 cxy= 2*tl + (cx + cy)/4 - (cx2 + cy2) - 2*c;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
396
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
397 assert(16*cx2 + 4*cx + 32*c == 32*r);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
398 assert(16*cx2 - 4*cx + 32*c == 32*l);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
399 assert(16*cy2 + 4*cy + 32*c == 32*b);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
400 assert(16*cy2 - 4*cy + 32*c == 32*t);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
401 assert(16*cxy + 16*cy2 + 16*cx2 - 4*cy - 4*cx + 32*c == 32*tl);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
402
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
403 for(ny= -3; ny <= 3; ny++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
404 for(nx= -3; nx <= 3; nx++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
405 int score= ny*nx*cxy + nx*nx*cx2 + ny*ny*cy2 + nx*cx + ny*cy + 32*c; //FIXME factor
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
406 int i;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
407
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
408 if((nx&3)==0 && (ny&3)==0) continue;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
409
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
410 score += 32*(mv_penalty[4*mx + nx - pred_x] + mv_penalty[4*my + ny - pred_y])*penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
411 // if(nx&1) score-=32*s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
412 // if(ny&1) score-=32*s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
413
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
414 for(i=0; i<8; i++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
415 if(score < best[i]){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
416 memmove(&best[i+1], &best[i], sizeof(int)*(7-i));
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
417 memmove(&best_pos[i+1][0], &best_pos[i][0], sizeof(int)*2*(7-i));
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
418 best[i]= score;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
419 best_pos[i][0]= nx + 4*mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
420 best_pos[i][1]= ny + 4*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
421 break;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
422 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
423 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
424 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
425 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
426 }
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
427 for(i=0; i<subpel_quality; i++){
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
428 nx= best_pos[i][0];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
429 ny= best_pos[i][1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
430 CHECK_QUARTER_MV(nx&3, ny&3, nx>>2, ny>>2)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
431 }
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
432
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
433 #if 0
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
434 const int tl= score_map[(index-(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
435 const int bl= score_map[(index+(1<<ME_MAP_SHIFT)-1)&(ME_MAP_SIZE-1)];
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
436 const int tr= score_map[(index-(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
437 const int br= score_map[(index+(1<<ME_MAP_SHIFT)+1)&(ME_MAP_SIZE-1)];
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
438 // if(l < r && l < t && l < b && l < tl && l < bl && l < tr && l < br && bl < tl){
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
439 if(tl<br){
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
440
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
441 // nx= FFMAX(4*mx - bx, bx - 4*mx);
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
442 // ny= FFMAX(4*my - by, by - 4*my);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
443
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
444 static int stats[7][7], count;
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
445 count++;
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
446 stats[4*mx - bx + 3][4*my - by + 3]++;
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
447 if(256*256*256*64 % count ==0){
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
448 for(i=0; i<49; i++){
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
449 if((i%7)==0) printf("\n");
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
450 printf("%6d ", stats[0][i]);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
451 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
452 printf("\n");
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
453 }
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
454 }
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
455 #endif
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
456 #else
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
457
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
458 CHECK_QUARTER_MV(2, 2, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
459 CHECK_QUARTER_MV(0, 2, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
460 CHECK_QUARTER_MV(2, 2, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
461 CHECK_QUARTER_MV(2, 0, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
462 CHECK_QUARTER_MV(2, 2, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
463 CHECK_QUARTER_MV(0, 2, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
464 CHECK_QUARTER_MV(2, 2, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
465 CHECK_QUARTER_MV(2, 0, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
466
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
467 nx= bx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
468 ny= by;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
469
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
470 for(i=0; i<8; i++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
471 int ox[8]= {0, 1, 1, 1, 0,-1,-1,-1};
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
472 int oy[8]= {1, 1, 0,-1,-1,-1, 0, 1};
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
473 CHECK_QUARTER_MV((nx + ox[i])&3, (ny + oy[i])&3, (nx + ox[i])>>2, (ny + oy[i])>>2)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
474 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
475 #endif
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
476 #if 0
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
477 //outer ring
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
478 CHECK_QUARTER_MV(1, 3, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
479 CHECK_QUARTER_MV(1, 2, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
480 CHECK_QUARTER_MV(1, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
481 CHECK_QUARTER_MV(2, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
482 CHECK_QUARTER_MV(3, 1, mx-1, my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
483 CHECK_QUARTER_MV(0, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
484 CHECK_QUARTER_MV(1, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
485 CHECK_QUARTER_MV(2, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
486 CHECK_QUARTER_MV(3, 1, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
487 CHECK_QUARTER_MV(3, 2, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
488 CHECK_QUARTER_MV(3, 3, mx , my-1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
489 CHECK_QUARTER_MV(3, 0, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
490 CHECK_QUARTER_MV(3, 1, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
491 CHECK_QUARTER_MV(3, 2, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
492 CHECK_QUARTER_MV(3, 3, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
493 CHECK_QUARTER_MV(2, 3, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
494 CHECK_QUARTER_MV(1, 3, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
495 CHECK_QUARTER_MV(0, 3, mx , my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
496 CHECK_QUARTER_MV(3, 3, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
497 CHECK_QUARTER_MV(2, 3, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
498 CHECK_QUARTER_MV(1, 3, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
499 CHECK_QUARTER_MV(1, 2, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
500 CHECK_QUARTER_MV(1, 1, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
501 CHECK_QUARTER_MV(1, 0, mx-1, my )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
502 #endif
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
503 assert(bx >= xmin*4 && bx <= xmax*4 && by >= ymin*4 && by <= ymax*4);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
504
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
505 *mx_ptr = bx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
506 *my_ptr = by;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
507 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
508 *mx_ptr =4*mx;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
509 *my_ptr =4*my;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
510 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
511
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
512 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
513 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
514
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
515 static int RENAME(qpel_get_mb_score)(MpegEncContext * s, int mx, int my, int pred_x, int pred_y, Picture *ref_picture,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
516 uint8_t * const mv_penalty)
1013
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
517 {
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
518 const int size= 0;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
519 const int xx = 16 * s->mb_x;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
520 const int yy = 16 * s->mb_y;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
521 const int penalty_factor= s->me.mb_penalty_factor;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
522 const int xmin= -256*256, ymin= -256*256, xmax= 256*256, ymax= 256*256; //assume that the caller checked these
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
523 const __attribute__((unused)) int unu2= xmin + xmax +ymin + ymax; //no unused warning shit
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
524 me_cmp_func cmp_sub, chroma_cmp_sub;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
525 int d;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
526
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
527 LOAD_COMMON(xx, yy);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
528
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
529 //FIXME factorize
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
530
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
531 cmp_sub= s->dsp.mb_cmp[size];
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
532 chroma_cmp_sub= s->dsp.mb_cmp[size+1];
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
533
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
534 assert(!s->me.skip);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
535 assert(s->avctx->me_sub_cmp != s->avctx->mb_cmp);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
536
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
537 CMP_QPEL(d, mx&3, my&3, mx>>2, my>>2, size);
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
538 //FIXME check cbp before adding penalty for (0,0) vector
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
539 if(mx || my || size>0)
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
540 d += (mv_penalty[mx - pred_x] + mv_penalty[my - pred_y])*penalty_factor;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
541
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
542 return d;
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
543 }
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
544
5d4c95f323d0 finetuneing thresholds/factors
michaelni
parents: 1011
diff changeset
545
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
546 #endif /* CMP_QPEL */
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
547
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
548 #define CHECK_MV(x,y)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
549 {\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
550 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
551 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
552 /*printf("check_mv %d %d\n", x, y);*/\
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
553 if(map[index]!=key){\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
554 CMP(d, x, y, size);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
555 map[index]= key;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
556 score_map[index]= d;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
557 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*penalty_factor;\
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
558 /*printf("score:%d\n", d);*/\
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
559 COPY3_IF_LT(dmin, d, best[0], x, best[1], y)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
560 }\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
561 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
562
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
563 #define CHECK_CLIPED_MV(ax,ay)\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
564 {\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
565 const int x= FFMAX(xmin, FFMIN(ax, xmax));\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
566 const int y= FFMAX(ymin, FFMIN(ay, ymax));\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
567 CHECK_MV(x, y)\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
568 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
569
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
570 #define CHECK_MV_DIR(x,y,new_dir)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
571 {\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
572 const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
573 const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
574 /*printf("check_mv_dir %d %d %d\n", x, y, new_dir);*/\
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
575 if(map[index]!=key){\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
576 CMP(d, x, y, size);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
577 map[index]= key;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
578 score_map[index]= d;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
579 d += (mv_penalty[((x)<<shift)-pred_x] + mv_penalty[((y)<<shift)-pred_y])*penalty_factor;\
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
580 /*printf("score:%d\n", d);*/\
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
581 if(d<dmin){\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
582 best[0]=x;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
583 best[1]=y;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
584 dmin=d;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
585 next_dir= new_dir;\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
586 }\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
587 }\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
588 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
589
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
590 #define check(x,y,S,v)\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
591 if( (x)<(xmin<<(S)) ) printf("%d %d %d %d %d xmin" #v, xmin, (x), (y), s->mb_x, s->mb_y);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
592 if( (x)>(xmax<<(S)) ) printf("%d %d %d %d %d xmax" #v, xmax, (x), (y), s->mb_x, s->mb_y);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
593 if( (y)<(ymin<<(S)) ) printf("%d %d %d %d %d ymin" #v, ymin, (x), (y), s->mb_x, s->mb_y);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
594 if( (y)>(ymax<<(S)) ) printf("%d %d %d %d %d ymax" #v, ymax, (x), (y), s->mb_x, s->mb_y);\
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
595
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
596
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
597 static inline int RENAME(small_diamond_search)(MpegEncContext * s, int *best, int dmin,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
598 Picture *ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
599 int const pred_x, int const pred_y, int const penalty_factor,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
600 int const xmin, int const ymin, int const xmax, int const ymax, int const shift,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
601 uint32_t *map, int map_generation, int size, uint8_t * const mv_penalty
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
602 )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
603 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
604 me_cmp_func cmp, chroma_cmp;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
605 int next_dir=-1;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
606 LOAD_COMMON(s->mb_x*16, s->mb_y*16);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
607
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
608 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
609 chroma_cmp= s->dsp.me_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
610
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
611 { /* ensure that the best point is in the MAP as h/qpel refinement needs it */
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
612 const int key= (best[1]<<ME_MAP_MV_BITS) + best[0] + map_generation;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
613 const int index= ((best[1]<<ME_MAP_SHIFT) + best[0])&(ME_MAP_SIZE-1);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
614 if(map[index]!=key){ //this will be executed only very rarey
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
615 CMP(score_map[index], best[0], best[1], size);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
616 map[index]= key;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
617 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
618 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
619
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
620 for(;;){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
621 int d;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
622 const int dir= next_dir;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
623 const int x= best[0];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
624 const int y= best[1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
625 next_dir=-1;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
626
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
627 //printf("%d", dir);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
628 if(dir!=2 && x>xmin) CHECK_MV_DIR(x-1, y , 0)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
629 if(dir!=3 && y>ymin) CHECK_MV_DIR(x , y-1, 1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
630 if(dir!=0 && x<xmax) CHECK_MV_DIR(x+1, y , 2)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
631 if(dir!=1 && y<ymax) CHECK_MV_DIR(x , y+1, 3)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
632
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
633 if(next_dir==-1){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
634 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
635 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
636 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
637 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
638
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
639 static inline int RENAME(funny_diamond_search)(MpegEncContext * s, int *best, int dmin,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
640 Picture *ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
641 int const pred_x, int const pred_y, int const penalty_factor,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
642 int const xmin, int const ymin, int const xmax, int const ymax, int const shift,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
643 uint32_t *map, int map_generation, int size, uint8_t * const mv_penalty
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
644 )
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
645 {
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
646 me_cmp_func cmp, chroma_cmp;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
647 int dia_size;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
648 LOAD_COMMON(s->mb_x*16, s->mb_y*16);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
649
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
650 cmp= s->dsp.me_cmp[size];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
651 chroma_cmp= s->dsp.me_cmp[size+1];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
652
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
653 for(dia_size=1; dia_size<=4; dia_size++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
654 int dir;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
655 const int x= best[0];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
656 const int y= best[1];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
657
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
658 if(dia_size&(dia_size-1)) continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
659
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
660 if( x + dia_size > xmax
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
661 || x - dia_size < xmin
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
662 || y + dia_size > ymax
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
663 || y - dia_size < ymin)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
664 continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
665
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
666 for(dir= 0; dir<dia_size; dir+=2){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
667 int d;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
668
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
669 CHECK_MV(x + dir , y + dia_size - dir);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
670 CHECK_MV(x + dia_size - dir, y - dir );
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
671 CHECK_MV(x - dir , y - dia_size + dir);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
672 CHECK_MV(x - dia_size + dir, y + dir );
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
673 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
674
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
675 if(x!=best[0] || y!=best[1])
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
676 dia_size=0;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
677 #if 0
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
678 {
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
679 int dx, dy, i;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
680 static int stats[8*8];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
681 dx= ABS(x-best[0]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
682 dy= ABS(y-best[1]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
683 if(dy>dx){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
684 dx^=dy; dy^=dx; dx^=dy;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
685 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
686 stats[dy*8 + dx] ++;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
687 if(256*256*256*64 % (stats[0]+1)==0){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
688 for(i=0; i<64; i++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
689 if((i&7)==0) printf("\n");
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
690 printf("%8d ", stats[i]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
691 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
692 printf("\n");
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
693 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
694 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
695 #endif
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
696 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
697 return dmin;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
698 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
699
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
700 #define SAB_CHECK_MV(ax,ay)\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
701 {\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
702 const int key= ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
703 const int index= (((ay)<<ME_MAP_SHIFT) + (ax))&(ME_MAP_SIZE-1);\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
704 /*printf("sab check %d %d\n", ax, ay);*/\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
705 if(map[index]!=key){\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
706 CMP(d, ax, ay, size);\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
707 map[index]= key;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
708 score_map[index]= d;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
709 d += (mv_penalty[((ax)<<shift)-pred_x] + mv_penalty[((ay)<<shift)-pred_y])*penalty_factor;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
710 /*printf("score: %d\n", d);*/\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
711 if(d < minima[minima_count-1].height){\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
712 int j=0;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
713 \
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
714 while(d >= minima[j].height) j++;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
715 \
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
716 memmove(&minima [j+1], &minima [j], (minima_count - j - 1)*sizeof(Minima));\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
717 \
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
718 minima[j].checked= 0;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
719 minima[j].height= d;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
720 minima[j].x= ax;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
721 minima[j].y= ay;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
722 \
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
723 i=-1;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
724 continue;\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
725 }\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
726 }\
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
727 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
728
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
729 #define MAX_SAB_SIZE 16
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
730 static inline int RENAME(sab_diamond_search)(MpegEncContext * s, int *best, int dmin,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
731 Picture *ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
732 int const pred_x, int const pred_y, int const penalty_factor,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
733 int const xmin, int const ymin, int const xmax, int const ymax, int const shift,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
734 uint32_t *map, int map_generation, int size, uint8_t * const mv_penalty
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
735 )
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
736 {
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
737 me_cmp_func cmp, chroma_cmp;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
738 Minima minima[MAX_SAB_SIZE];
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
739 const int minima_count= ABS(s->me.dia_size);
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
740 int i, j;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
741 LOAD_COMMON(s->mb_x*16, s->mb_y*16);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
742
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
743 cmp= s->dsp.me_cmp[size];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
744 chroma_cmp= s->dsp.me_cmp[size+1];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
745
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
746 for(j=i=0; i<ME_MAP_SIZE; i++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
747 uint32_t key= map[i];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
748
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
749 key += (1<<(ME_MAP_MV_BITS-1)) + (1<<(2*ME_MAP_MV_BITS-1));
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
750
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
751 if((key&((-1)<<(2*ME_MAP_MV_BITS))) != map_generation) continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
752
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
753 assert(j<MAX_SAB_SIZE); //max j = number of predictors
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
754
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
755 minima[j].height= score_map[i];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
756 minima[j].x= key & ((1<<ME_MAP_MV_BITS)-1); key>>=ME_MAP_MV_BITS;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
757 minima[j].y= key & ((1<<ME_MAP_MV_BITS)-1);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
758 minima[j].x-= (1<<(ME_MAP_MV_BITS-1));
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
759 minima[j].y-= (1<<(ME_MAP_MV_BITS-1));
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
760 minima[j].checked=0;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
761 if(minima[j].x || minima[j].y)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
762 minima[j].height+= (mv_penalty[((minima[j].x)<<shift)-pred_x] + mv_penalty[((minima[j].y)<<shift)-pred_y])*penalty_factor;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
763
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
764 j++;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
765 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
766
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
767 qsort(minima, j, sizeof(Minima), minima_cmp);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
768
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
769 for(; j<minima_count; j++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
770 minima[j].height=256*256*256*64;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
771 minima[j].checked=0;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
772 minima[j].x= minima[j].y=0;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
773 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
774
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
775 for(i=0; i<minima_count; i++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
776 const int x= minima[i].x;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
777 const int y= minima[i].y;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
778 int d;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
779
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
780 if(minima[i].checked) continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
781
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
782 if( x >= xmax || x <= xmin
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
783 || y >= ymax || y <= ymin)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
784 continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
785
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
786 SAB_CHECK_MV(x-1, y)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
787 SAB_CHECK_MV(x+1, y)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
788 SAB_CHECK_MV(x , y-1)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
789 SAB_CHECK_MV(x , y+1)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
790
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
791 minima[i].checked= 1;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
792 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
793
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
794 best[0]= minima[0].x;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
795 best[1]= minima[0].y;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
796 dmin= minima[0].height;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
797
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
798 if( best[0] < xmax && best[0] > xmin
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
799 && best[1] < ymax && best[1] > ymin){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
800 int d;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
801 //ensure that the refernece samples for hpel refinement are in the map
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
802 CHECK_MV(best[0]-1, best[1])
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
803 CHECK_MV(best[0]+1, best[1])
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
804 CHECK_MV(best[0], best[1]-1)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
805 CHECK_MV(best[0], best[1]+1)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
806 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
807 return dmin;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
808 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
809
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
810 static inline int RENAME(var_diamond_search)(MpegEncContext * s, int *best, int dmin,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
811 Picture *ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
812 int const pred_x, int const pred_y, int const penalty_factor,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
813 int const xmin, int const ymin, int const xmax, int const ymax, int const shift,
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
814 uint32_t *map, int map_generation, int size, uint8_t * const mv_penalty
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
815 )
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
816 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
817 me_cmp_func cmp, chroma_cmp;
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
818 int dia_size;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
819 LOAD_COMMON(s->mb_x*16, s->mb_y*16);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
820
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
821 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
822 chroma_cmp= s->dsp.me_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
823
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
824 for(dia_size=1; dia_size<=s->me.dia_size; dia_size++){
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
825 int dir, start, end;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
826 const int x= best[0];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
827 const int y= best[1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
828
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
829 start= FFMAX(0, y + dia_size - ymax);
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
830 end = FFMIN(dia_size, xmax - x + 1);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
831 for(dir= start; dir<end; dir++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
832 int d;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
833
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
834 //check(x + dir,y + dia_size - dir,0, a0)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
835 CHECK_MV(x + dir , y + dia_size - dir);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
836 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
837
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
838 start= FFMAX(0, x + dia_size - xmax);
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
839 end = FFMIN(dia_size, y - ymin + 1);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
840 for(dir= start; dir<end; dir++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
841 int d;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
842
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
843 //check(x + dia_size - dir, y - dir,0, a1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
844 CHECK_MV(x + dia_size - dir, y - dir );
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
845 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
846
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
847 start= FFMAX(0, -y + dia_size + ymin );
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
848 end = FFMIN(dia_size, x - xmin + 1);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
849 for(dir= start; dir<end; dir++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
850 int d;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
851
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
852 //check(x - dir,y - dia_size + dir,0, a2)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
853 CHECK_MV(x - dir , y - dia_size + dir);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
854 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
855
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
856 start= FFMAX(0, -x + dia_size + xmin );
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
857 end = FFMIN(dia_size, ymax - y + 1);
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
858 for(dir= start; dir<end; dir++){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
859 int d;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
860
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
861 //check(x - dia_size + dir, y + dir,0, a3)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
862 CHECK_MV(x - dia_size + dir, y + dir );
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
863 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
864
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
865 if(x!=best[0] || y!=best[1])
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
866 dia_size=0;
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
867 #if 0
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
868 {
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
869 int dx, dy, i;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
870 static int stats[8*8];
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
871 dx= ABS(x-best[0]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
872 dy= ABS(y-best[1]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
873 stats[dy*8 + dx] ++;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
874 if(256*256*256*64 % (stats[0]+1)==0){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
875 for(i=0; i<64; i++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
876 if((i&7)==0) printf("\n");
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
877 printf("%6d ", stats[i]);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
878 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
879 printf("\n");
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
880 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
881 }
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
882 #endif
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
883 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
884 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
885 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
886
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
887 static int RENAME(epzs_motion_search)(MpegEncContext * s, int block,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
888 int *mx_ptr, int *my_ptr,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
889 int P[10][2], int pred_x, int pred_y,
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
890 int xmin, int ymin, int xmax, int ymax, Picture *ref_picture, int16_t (*last_mv)[2],
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
891 int ref_mv_scale, uint8_t * const mv_penalty)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
892 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
893 int best[2]={0, 0};
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
894 int d, dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
895 const int shift= 1+s->quarter_sample;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
896 uint32_t *map= s->me.map;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
897 int map_generation;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
898 const int penalty_factor= s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
899 const int size=0;
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1162
diff changeset
900 const int ref_mv_stride= s->mb_stride;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1162
diff changeset
901 const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
902 me_cmp_func cmp, chroma_cmp;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
903 LOAD_COMMON(s->mb_x*16, s->mb_y*16);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
904
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
905 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
906 chroma_cmp= s->dsp.me_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
907
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
908 map_generation= update_map_generation(s);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
909
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
910 CMP(dmin, 0, 0, size);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
911 map[0]= map_generation;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
912 score_map[0]= dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
913
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
914 /* first line */
952
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
915 if (s->mb_y == 0) {
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
916 CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
917 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
918 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
919 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
920 if(dmin<256 && ( P_LEFT[0] |P_LEFT[1]
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
921 |P_TOP[0] |P_TOP[1]
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
922 |P_TOPRIGHT[0]|P_TOPRIGHT[1])==0){
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
923 *mx_ptr= 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
924 *my_ptr= 0;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
925 s->me.skip=1;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
926 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
927 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
928 CHECK_MV(P_MEDIAN[0]>>shift, P_MEDIAN[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
929 if(dmin>256*2){
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
930 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
931 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
932 CHECK_MV(P_LEFT[0] >>shift, P_LEFT[1] >>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
933 CHECK_MV(P_TOP[0] >>shift, P_TOP[1] >>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
934 CHECK_MV(P_TOPRIGHT[0]>>shift, P_TOPRIGHT[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
935 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
936 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
937 if(dmin>256*4){
952
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
938 if(s->me.pre_pass){
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
939 CHECK_CLIPED_MV((last_mv[ref_mv_xy-1][0]*ref_mv_scale + (1<<15))>>16,
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
940 (last_mv[ref_mv_xy-1][1]*ref_mv_scale + (1<<15))>>16)
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
941 CHECK_CLIPED_MV((last_mv[ref_mv_xy-ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16,
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
942 (last_mv[ref_mv_xy-ref_mv_stride][1]*ref_mv_scale + (1<<15))>>16)
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
943 }else{
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
944 CHECK_CLIPED_MV((last_mv[ref_mv_xy+1][0]*ref_mv_scale + (1<<15))>>16,
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
945 (last_mv[ref_mv_xy+1][1]*ref_mv_scale + (1<<15))>>16)
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
946 CHECK_CLIPED_MV((last_mv[ref_mv_xy+ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16,
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
947 (last_mv[ref_mv_xy+ref_mv_stride][1]*ref_mv_scale + (1<<15))>>16)
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
948 }
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
949 }
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
950
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
951 if(s->avctx->last_predictor_count){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
952 const int count= s->avctx->last_predictor_count;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
953 const int xstart= FFMAX(0, s->mb_x - count);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
954 const int ystart= FFMAX(0, s->mb_y - count);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
955 const int xend= FFMIN(s->mb_width , s->mb_x + count + 1);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
956 const int yend= FFMIN(s->mb_height, s->mb_y + count + 1);
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
957 int mb_y;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
958
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
959 for(mb_y=ystart; mb_y<yend; mb_y++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
960 int mb_x;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
961 for(mb_x=xstart; mb_x<xend; mb_x++){
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
962 const int xy= mb_x + 1 + (mb_y + 1)*ref_mv_stride;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
963 int mx= (last_mv[xy][0]*ref_mv_scale + (1<<15))>>16;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
964 int my= (last_mv[xy][1]*ref_mv_scale + (1<<15))>>16;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
965
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
966 if(mx>xmax || mx<xmin || my>ymax || my<ymin) continue;
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
967 CHECK_MV(mx,my)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
968 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
969 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
970 }
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
971
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
972 //check(best[0],best[1],0, b0)
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
973 if(s->me.dia_size==-1)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
974 dmin= RENAME(funny_diamond_search)(s, best, dmin, ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
975 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
976 shift, map, map_generation, size, mv_penalty);
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
977 else if(s->me.dia_size<-1)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
978 dmin= RENAME(sab_diamond_search)(s, best, dmin, ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
979 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
980 shift, map, map_generation, size, mv_penalty);
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
981 else if(s->me.dia_size<2)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
982 dmin= RENAME(small_diamond_search)(s, best, dmin, ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
983 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
984 shift, map, map_generation, size, mv_penalty);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
985 else
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
986 dmin= RENAME(var_diamond_search)(s, best, dmin, ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
987 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
988 shift, map, map_generation, size, mv_penalty);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
989
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
990 //check(best[0],best[1],0, b1)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
991 *mx_ptr= best[0];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
992 *my_ptr= best[1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
993
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
994 // printf("%d %d %d \n", best[0], best[1], dmin);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
995 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
996 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
997
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
998 #ifndef CMP_DIRECT /* no 4mv search needed in direct mode */
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
999 static int RENAME(epzs_motion_search4)(MpegEncContext * s, int block,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1000 int *mx_ptr, int *my_ptr,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1001 int P[10][2], int pred_x, int pred_y,
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1002 int xmin, int ymin, int xmax, int ymax, Picture *ref_picture, int16_t (*last_mv)[2],
1162
8c15d82c1893 some static -> dynamic alloc & 16->8 bit
michaelni
parents: 1106
diff changeset
1003 int ref_mv_scale, uint8_t * const mv_penalty)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1004 {
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1005 int best[2]={0, 0};
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1006 int d, dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1007 const int shift= 1+s->quarter_sample;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1008 uint32_t *map= s->me.map;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1009 int map_generation;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1010 const int penalty_factor= s->me.penalty_factor;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1011 const int size=1;
1177
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1162
diff changeset
1012 const int ref_mv_stride= s->mb_stride;
fea03d2c4946 simplified adressing of most mb based arrays (mb_x + mb_y*s->mb_stride) now instead of mb_x + mb_y*mb_width and 1+mb_x + (1+mb_y)*(mb_width+2) and ... mixture
michaelni
parents: 1162
diff changeset
1013 const int ref_mv_xy= s->mb_x + s->mb_y *ref_mv_stride;
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1014 me_cmp_func cmp, chroma_cmp;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1015 LOAD_COMMON((s->mb_x*2 + (block&1))*8, (s->mb_y*2 + (block>>1))*8);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1016
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1017 cmp= s->dsp.me_cmp[size];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1018 chroma_cmp= s->dsp.me_cmp[size+1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1019
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1020 map_generation= update_map_generation(s);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1021
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1022 dmin = 1000000;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1023 //printf("%d %d %d %d //",xmin, ymin, xmax, ymax);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1024 /* first line */
952
f348d302a51e pre motion estimation cleanup/bugfix
michaelni
parents: 948
diff changeset
1025 if (s->mb_y == 0 && block<2) {
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1026 CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1027 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1028 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1029 CHECK_MV(P_MV1[0]>>shift, P_MV1[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1030 }else{
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1031 CHECK_MV(P_MV1[0]>>shift, P_MV1[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1032 //FIXME try some early stop
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1033 if(dmin>64*2){
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1034 CHECK_MV(P_MEDIAN[0]>>shift, P_MEDIAN[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1035 CHECK_MV(P_LEFT[0]>>shift, P_LEFT[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1036 CHECK_MV(P_TOP[0]>>shift, P_TOP[1]>>shift)
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1037 CHECK_MV(P_TOPRIGHT[0]>>shift, P_TOPRIGHT[1]>>shift)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1038 CHECK_CLIPED_MV((last_mv[ref_mv_xy][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1039 (last_mv[ref_mv_xy][1]*ref_mv_scale + (1<<15))>>16)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1040 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1041 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1042 if(dmin>64*4){
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1043 CHECK_CLIPED_MV((last_mv[ref_mv_xy+1][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1044 (last_mv[ref_mv_xy+1][1]*ref_mv_scale + (1<<15))>>16)
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1045 CHECK_CLIPED_MV((last_mv[ref_mv_xy+ref_mv_stride][0]*ref_mv_scale + (1<<15))>>16,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1046 (last_mv[ref_mv_xy+ref_mv_stride][1]*ref_mv_scale + (1<<15))>>16)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1047 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1048
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
1049 if(s->me.dia_size==-1)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1050 dmin= RENAME(funny_diamond_search)(s, best, dmin, ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1051 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1052 shift, map, map_generation, size, mv_penalty);
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
1053 else if(s->me.dia_size<-1)
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1054 dmin= RENAME(sab_diamond_search)(s, best, dmin, ref_picture,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1055 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1056 shift, map, map_generation, size, mv_penalty);
954
13aec7e50c52 qpel in mmx2/3dnow
michaelni
parents: 952
diff changeset
1057 else if(s->me.dia_size<2)
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1058 dmin= RENAME(small_diamond_search)(s, best, dmin, ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1059 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1060 shift, map, map_generation, size, mv_penalty);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1061 else
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1062 dmin= RENAME(var_diamond_search)(s, best, dmin, ref_picture,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1063 pred_x, pred_y, penalty_factor, xmin, ymin, xmax, ymax,
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1064 shift, map, map_generation, size, mv_penalty);
948
371bc36a9c5c shape adaptive diamonds for EPZS
michaelni
parents: 936
diff changeset
1065
936
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1066 *mx_ptr= best[0];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1067 *my_ptr= best[1];
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1068
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1069 // printf("%d %d %d \n", best[0], best[1], dmin);
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1070 return dmin;
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1071 }
caa77cd960c0 qpel encoding
michaelni
parents:
diff changeset
1072 #endif /* !CMP_DIRECT */