2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
13 #include "vpx_mem/vpx_mem.h"
20 static int mv_ref_ct [31] [4] [2];
21 static int mv_mode_cts [4] [2];
24 static int mv_bits_sadcost[256];
26 void vp8cx_init_mv_bits_sadcost()
30 for (i = 0; i < 256; i++)
32 mv_bits_sadcost[i] = (int)sqrt(i * 16);
37 int vp8_mv_bit_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int Weight)
39 // MV costing is based on the distribution of vectors in the previous frame and as such will tend to
40 // over state the cost of vectors. In addition coding a new vector can have a knock on effect on the
41 // cost of subsequent vectors and the quality of prediction from NEAR and NEAREST for subsequent blocks.
42 // The "Weight" parameter allows, to a limited extent, for some account to be taken of these factors.
43 return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] + mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1]) * Weight) >> 7;
46 static int mv_err_cost(int_mv *mv, int_mv *ref, int *mvcost[2], int error_per_bit)
48 return ((mvcost[0][(mv->as_mv.row - ref->as_mv.row) >> 1] +
49 mvcost[1][(mv->as_mv.col - ref->as_mv.col) >> 1])
50 * error_per_bit + 128) >> 8;
53 static int mvsad_err_cost(int_mv *mv, int_mv *ref, int *mvsadcost[2], int error_per_bit)
55 /* Calculate sad error cost on full pixel basis. */
56 return ((mvsadcost[0][(mv->as_mv.row - ref->as_mv.row)] +
57 mvsadcost[1][(mv->as_mv.col - ref->as_mv.col)])
58 * error_per_bit + 128) >> 8;
61 void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride)
64 int search_site_count = 0;
67 // Generate offsets for 4 search sites per step.
69 x->ss[search_site_count].mv.col = 0;
70 x->ss[search_site_count].mv.row = 0;
71 x->ss[search_site_count].offset = 0;
77 // Compute offsets for search sites.
78 x->ss[search_site_count].mv.col = 0;
79 x->ss[search_site_count].mv.row = -Len;
80 x->ss[search_site_count].offset = -Len * stride;
83 // Compute offsets for search sites.
84 x->ss[search_site_count].mv.col = 0;
85 x->ss[search_site_count].mv.row = Len;
86 x->ss[search_site_count].offset = Len * stride;
89 // Compute offsets for search sites.
90 x->ss[search_site_count].mv.col = -Len;
91 x->ss[search_site_count].mv.row = 0;
92 x->ss[search_site_count].offset = -Len;
95 // Compute offsets for search sites.
96 x->ss[search_site_count].mv.col = Len;
97 x->ss[search_site_count].mv.row = 0;
98 x->ss[search_site_count].offset = Len;
105 x->ss_count = search_site_count;
106 x->searches_per_step = 4;
109 void vp8_init3smotion_compensation(MACROBLOCK *x, int stride)
112 int search_site_count = 0;
114 // Generate offsets for 8 search sites per step.
115 Len = MAX_FIRST_STEP;
116 x->ss[search_site_count].mv.col = 0;
117 x->ss[search_site_count].mv.row = 0;
118 x->ss[search_site_count].offset = 0;
124 // Compute offsets for search sites.
125 x->ss[search_site_count].mv.col = 0;
126 x->ss[search_site_count].mv.row = -Len;
127 x->ss[search_site_count].offset = -Len * stride;
130 // Compute offsets for search sites.
131 x->ss[search_site_count].mv.col = 0;
132 x->ss[search_site_count].mv.row = Len;
133 x->ss[search_site_count].offset = Len * stride;
136 // Compute offsets for search sites.
137 x->ss[search_site_count].mv.col = -Len;
138 x->ss[search_site_count].mv.row = 0;
139 x->ss[search_site_count].offset = -Len;
142 // Compute offsets for search sites.
143 x->ss[search_site_count].mv.col = Len;
144 x->ss[search_site_count].mv.row = 0;
145 x->ss[search_site_count].offset = Len;
148 // Compute offsets for search sites.
149 x->ss[search_site_count].mv.col = -Len;
150 x->ss[search_site_count].mv.row = -Len;
151 x->ss[search_site_count].offset = -Len * stride - Len;
154 // Compute offsets for search sites.
155 x->ss[search_site_count].mv.col = Len;
156 x->ss[search_site_count].mv.row = -Len;
157 x->ss[search_site_count].offset = -Len * stride + Len;
160 // Compute offsets for search sites.
161 x->ss[search_site_count].mv.col = -Len;
162 x->ss[search_site_count].mv.row = Len;
163 x->ss[search_site_count].offset = Len * stride - Len;
166 // Compute offsets for search sites.
167 x->ss[search_site_count].mv.col = Len;
168 x->ss[search_site_count].mv.row = Len;
169 x->ss[search_site_count].offset = Len * stride + Len;
177 x->ss_count = search_site_count;
178 x->searches_per_step = 8;
182 #define MVC(r,c) (((mvcost[0][(r)-rr] + mvcost[1][(c) - rc]) * error_per_bit + 128 )>>8 ) // estimated cost of a motion vector (r,c)
183 #define PRE(r,c) (*(d->base_pre) + d->pre + ((r)>>2) * d->pre_stride + ((c)>>2)) // pointer to predictor base of a motionvector
184 #define SP(x) (((x)&3)<<1) // convert motion vector component to offset for svf calc
185 #define DIST(r,c) vfp->svf( PRE(r,c), d->pre_stride, SP(c),SP(r), z,b->src_stride,&sse) // returns subpixel variance error function.
186 #define IFMVCV(r,c,s,e) if ( c >= minc && c <= maxc && r >= minr && r <= maxr) s else e;
187 #define ERR(r,c) (MVC(r,c)+DIST(r,c)) // returns distortion + motion vector cost
188 #define CHECK_BETTER(v,r,c) IFMVCV(r,c,{thismse = DIST(r,c); if((v = (MVC(r,c)+thismse)) < besterr) { besterr = v; br=r; bc=c; *distortion = thismse; *sse1 = sse; }}, v=INT_MAX;)// checks if (r,c) has better score than previous best
189 #define MIN(x,y) (((x)<(y))?(x):(y))
190 #define MAX(x,y) (((x)>(y))?(x):(y))
192 //#define CHECK_BETTER(v,r,c) if((v = ERR(r,c)) < besterr) { besterr = v; br=r; bc=c; }
194 int vp8_find_best_sub_pixel_step_iteratively(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
195 int_mv *bestmv, int_mv *ref_mv,
197 const vp8_variance_fn_ptr_t *vfp,
198 int *mvcost[2], int *distortion,
201 unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col;
202 unsigned char *z = (*(b->base_src) + b->src);
204 int rr = ref_mv->as_mv.row >> 1, rc = ref_mv->as_mv.col >> 1;
205 int br = bestmv->as_mv.row << 2, bc = bestmv->as_mv.col << 2;
206 int tr = br, tc = bc;
207 unsigned int besterr = INT_MAX;
208 unsigned int left, right, up, down, diag;
210 unsigned int whichdir;
211 unsigned int halfiters = 4;
212 unsigned int quarteriters = 4;
215 int minc = MAX(x->mv_col_min << 2, (ref_mv->as_mv.col >> 1) - ((1 << mvlong_width) - 1));
216 int maxc = MIN(x->mv_col_max << 2, (ref_mv->as_mv.col >> 1) + ((1 << mvlong_width) - 1));
217 int minr = MAX(x->mv_row_min << 2, (ref_mv->as_mv.row >> 1) - ((1 << mvlong_width) - 1));
218 int maxr = MIN(x->mv_row_max << 2, (ref_mv->as_mv.row >> 1) + ((1 << mvlong_width) - 1));
221 bestmv->as_mv.row <<= 3;
222 bestmv->as_mv.col <<= 3;
224 // calculate central point error
225 besterr = vfp->vf(y, d->pre_stride, z, b->src_stride, sse1);
226 *distortion = besterr;
227 besterr += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
229 // TODO: Each subsequent iteration checks at least one point in common with the last iteration could be 2 ( if diag selected)
233 CHECK_BETTER(left, tr, tc - 2);
234 CHECK_BETTER(right, tr, tc + 2);
235 CHECK_BETTER(up, tr - 2, tc);
236 CHECK_BETTER(down, tr + 2, tc);
238 whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
243 CHECK_BETTER(diag, tr - 2, tc - 2);
246 CHECK_BETTER(diag, tr - 2, tc + 2);
249 CHECK_BETTER(diag, tr + 2, tc - 2);
252 CHECK_BETTER(diag, tr + 2, tc + 2);
256 // no reason to check the same one again.
257 if (tr == br && tc == bc)
264 // TODO: Each subsequent iteration checks at least one point in common with the last iteration could be 2 ( if diag selected)
266 while (--quarteriters)
268 CHECK_BETTER(left, tr, tc - 1);
269 CHECK_BETTER(right, tr, tc + 1);
270 CHECK_BETTER(up, tr - 1, tc);
271 CHECK_BETTER(down, tr + 1, tc);
273 whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
278 CHECK_BETTER(diag, tr - 1, tc - 1);
281 CHECK_BETTER(diag, tr - 1, tc + 1);
284 CHECK_BETTER(diag, tr + 1, tc - 1);
287 CHECK_BETTER(diag, tr + 1, tc + 1);
291 // no reason to check the same one again.
292 if (tr == br && tc == bc)
299 bestmv->as_mv.row = br << 1;
300 bestmv->as_mv.col = bc << 1;
302 if ((abs(bestmv->as_mv.col - ref_mv->as_mv.col) > MAX_FULL_PEL_VAL) ||
303 (abs(bestmv->as_mv.row - ref_mv->as_mv.row) > MAX_FULL_PEL_VAL))
316 int vp8_find_best_sub_pixel_step(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
317 int_mv *bestmv, int_mv *ref_mv,
319 const vp8_variance_fn_ptr_t *vfp,
320 int *mvcost[2], int *distortion,
323 int bestmse = INT_MAX;
326 unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col;
327 unsigned char *z = (*(b->base_src) + b->src);
328 int left, right, up, down, diag;
334 // Trap uncodable vectors
335 if ((abs((bestmv->as_mv.col << 3) - ref_mv->as_mv.col) > MAX_FULL_PEL_VAL)
336 || (abs((bestmv->as_mv.row << 3) - ref_mv->as_mv.row) > MAX_FULL_PEL_VAL))
338 bestmv->as_mv.row <<= 3;
339 bestmv->as_mv.col <<= 3;
340 *distortion = INT_MAX;
345 bestmv->as_mv.row <<= 3;
346 bestmv->as_mv.col <<= 3;
349 // calculate central point error
350 bestmse = vfp->vf(y, d->pre_stride, z, b->src_stride, sse1);
351 *distortion = bestmse;
352 bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
354 // go left then right and check error
355 this_mv.as_mv.row = startmv.as_mv.row;
356 this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
357 thismse = vfp->svf_halfpix_h(y - 1, d->pre_stride, z, b->src_stride, &sse);
358 left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
364 *distortion = thismse;
368 this_mv.as_mv.col += 8;
369 thismse = vfp->svf_halfpix_h(y, d->pre_stride, z, b->src_stride, &sse);
370 right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
376 *distortion = thismse;
380 // go up then down and check error
381 this_mv.as_mv.col = startmv.as_mv.col;
382 this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
383 thismse = vfp->svf_halfpix_v(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
384 up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
390 *distortion = thismse;
394 this_mv.as_mv.row += 8;
395 thismse = vfp->svf_halfpix_v(y, d->pre_stride, z, b->src_stride, &sse);
396 down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
402 *distortion = thismse;
407 // now check 1 more diagonal
408 whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
409 //for(whichdir =0;whichdir<4;whichdir++)
416 this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
417 this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
418 thismse = vfp->svf_halfpix_hv(y - 1 - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
421 this_mv.as_mv.col += 4;
422 this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
423 thismse = vfp->svf_halfpix_hv(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
426 this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
427 this_mv.as_mv.row += 4;
428 thismse = vfp->svf_halfpix_hv(y - 1, d->pre_stride, z, b->src_stride, &sse);
432 this_mv.as_mv.col += 4;
433 this_mv.as_mv.row += 4;
434 thismse = vfp->svf_halfpix_hv(y, d->pre_stride, z, b->src_stride, &sse);
438 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
444 *distortion = thismse;
451 // time to check quarter pels.
452 if (bestmv->as_mv.row < startmv.as_mv.row)
455 if (bestmv->as_mv.col < startmv.as_mv.col)
462 // go left then right and check error
463 this_mv.as_mv.row = startmv.as_mv.row;
465 if (startmv.as_mv.col & 7)
467 this_mv.as_mv.col = startmv.as_mv.col - 2;
468 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
472 this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
473 thismse = vfp->svf(y - 1, d->pre_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
476 left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
482 *distortion = thismse;
486 this_mv.as_mv.col += 4;
487 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
488 right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
494 *distortion = thismse;
498 // go up then down and check error
499 this_mv.as_mv.col = startmv.as_mv.col;
501 if (startmv.as_mv.row & 7)
503 this_mv.as_mv.row = startmv.as_mv.row - 2;
504 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
508 this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
509 thismse = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
512 up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
518 *distortion = thismse;
522 this_mv.as_mv.row += 4;
523 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
524 down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
530 *distortion = thismse;
535 // now check 1 more diagonal
536 whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
538 // for(whichdir=0;whichdir<4;whichdir++)
546 if (startmv.as_mv.row & 7)
548 this_mv.as_mv.row -= 2;
550 if (startmv.as_mv.col & 7)
552 this_mv.as_mv.col -= 2;
553 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
557 this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
558 thismse = vfp->svf(y - 1, d->pre_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);;
563 this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
565 if (startmv.as_mv.col & 7)
567 this_mv.as_mv.col -= 2;
568 thismse = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
572 this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
573 thismse = vfp->svf(y - d->pre_stride - 1, d->pre_stride, 6, 6, z, b->src_stride, &sse);
579 this_mv.as_mv.col += 2;
581 if (startmv.as_mv.row & 7)
583 this_mv.as_mv.row -= 2;
584 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
588 this_mv.as_mv.row = (startmv.as_mv.row - 8) | 6;
589 thismse = vfp->svf(y - d->pre_stride, d->pre_stride, this_mv.as_mv.col & 7, 6, z, b->src_stride, &sse);
594 this_mv.as_mv.row += 2;
596 if (startmv.as_mv.col & 7)
598 this_mv.as_mv.col -= 2;
599 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
603 this_mv.as_mv.col = (startmv.as_mv.col - 8) | 6;
604 thismse = vfp->svf(y - 1, d->pre_stride, 6, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
609 this_mv.as_mv.col += 2;
610 this_mv.as_mv.row += 2;
611 thismse = vfp->svf(y, d->pre_stride, this_mv.as_mv.col & 7, this_mv.as_mv.row & 7, z, b->src_stride, &sse);
615 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
621 *distortion = thismse;
628 int vp8_find_best_half_pixel_step(MACROBLOCK *mb, BLOCK *b, BLOCKD *d,
629 int_mv *bestmv, int_mv *ref_mv,
631 const vp8_variance_fn_ptr_t *vfp,
632 int *mvcost[2], int *distortion,
635 int bestmse = INT_MAX;
638 unsigned char *y = *(d->base_pre) + d->pre + (bestmv->as_mv.row) * d->pre_stride + bestmv->as_mv.col;
639 unsigned char *z = (*(b->base_src) + b->src);
640 int left, right, up, down, diag;
644 // Trap uncodable vectors
645 if ((abs((bestmv->as_mv.col << 3) - ref_mv->as_mv.col) > MAX_FULL_PEL_VAL)
646 || (abs((bestmv->as_mv.row << 3) - ref_mv->as_mv.row) > MAX_FULL_PEL_VAL))
648 bestmv->as_mv.row <<= 3;
649 bestmv->as_mv.col <<= 3;
650 *distortion = INT_MAX;
655 bestmv->as_mv.row <<= 3;
656 bestmv->as_mv.col <<= 3;
659 // calculate central point error
660 bestmse = vfp->vf(y, d->pre_stride, z, b->src_stride, sse1);
661 *distortion = bestmse;
662 bestmse += mv_err_cost(bestmv, ref_mv, mvcost, error_per_bit);
664 // go left then right and check error
665 this_mv.as_mv.row = startmv.as_mv.row;
666 this_mv.as_mv.col = ((startmv.as_mv.col - 8) | 4);
667 thismse = vfp->svf_halfpix_h(y - 1, d->pre_stride, z, b->src_stride, &sse);
668 left = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
674 *distortion = thismse;
678 this_mv.as_mv.col += 8;
679 thismse = vfp->svf_halfpix_h(y, d->pre_stride, z, b->src_stride, &sse);
680 right = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
686 *distortion = thismse;
690 // go up then down and check error
691 this_mv.as_mv.col = startmv.as_mv.col;
692 this_mv.as_mv.row = ((startmv.as_mv.row - 8) | 4);
693 thismse = vfp->svf_halfpix_v(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
694 up = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
700 *distortion = thismse;
704 this_mv.as_mv.row += 8;
705 thismse = vfp->svf_halfpix_v(y, d->pre_stride, z, b->src_stride, &sse);
706 down = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
712 *distortion = thismse;
716 // somewhat strangely not doing all the diagonals for half pel is slower than doing them.
718 // now check 1 more diagonal -
719 whichdir = (left < right ? 0 : 1) + (up < down ? 0 : 2);
725 this_mv.col = (this_mv.col - 8) | 4;
726 this_mv.row = (this_mv.row - 8) | 4;
727 diag = vfp->svf(y - 1 - d->pre_stride, d->pre_stride, 4, 4, z, b->src_stride, &sse);
731 this_mv.row = (this_mv.row - 8) | 4;
732 diag = vfp->svf(y - d->pre_stride, d->pre_stride, 4, 4, z, b->src_stride, &sse);
735 this_mv.col = (this_mv.col - 8) | 4;
737 diag = vfp->svf(y - 1, d->pre_stride, 4, 4, z, b->src_stride, &sse);
742 diag = vfp->svf(y, d->pre_stride, 4, 4, z, b->src_stride, &sse);
746 diag += mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
755 this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
756 this_mv.as_mv.row = (this_mv.as_mv.row - 8) | 4;
757 thismse = vfp->svf_halfpix_hv(y - 1 - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
758 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
764 *distortion = thismse;
768 this_mv.as_mv.col += 8;
769 thismse = vfp->svf_halfpix_hv(y - d->pre_stride, d->pre_stride, z, b->src_stride, &sse);
770 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
776 *distortion = thismse;
780 this_mv.as_mv.col = (this_mv.as_mv.col - 8) | 4;
781 this_mv.as_mv.row = startmv.as_mv.row + 4;
782 thismse = vfp->svf_halfpix_hv(y - 1, d->pre_stride, z, b->src_stride, &sse);
783 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
789 *distortion = thismse;
793 this_mv.as_mv.col += 8;
794 thismse = vfp->svf_halfpix_hv(y, d->pre_stride, z, b->src_stride, &sse);
795 diag = thismse + mv_err_cost(&this_mv, ref_mv, mvcost, error_per_bit);
801 *distortion = thismse;
810 #define MVC(r,c) (((mvsadcost[0][r-rr] + mvsadcost[1][c-rc]) * error_per_bit + 128 )>>8 ) // estimated cost of a motion vector (r,c)
811 #define PRE(r,c) (*(d->base_pre) + d->pre + (r) * d->pre_stride + (c)) // pointer to predictor base of a motionvector
812 #define DIST(r,c,v) vfp->sdf( src,src_stride,PRE(r,c),d->pre_stride, v) // returns sad error score.
813 #define ERR(r,c,v) (MVC(r,c)+DIST(r,c,v)) // returns distortion + motion vector cost
814 #define CHECK_BETTER(v,r,c) if ((v = ERR(r,c,besterr)) < besterr) { besterr = v; br=r; bc=c; } // checks if (r,c) has better score than previous best
815 static const MV next_chkpts[6][3] =
817 {{ -2, 0}, { -1, -2}, {1, -2}},
818 {{ -1, -2}, {1, -2}, {2, 0}},
819 {{1, -2}, {2, 0}, {1, 2}},
820 {{2, 0}, {1, 2}, { -1, 2}},
821 {{1, 2}, { -1, 2}, { -2, 0}},
822 {{ -1, 2}, { -2, 0}, { -1, -2}}
834 const vp8_variance_fn_ptr_t *vfp,
840 MV hex[6] = { { -1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0} } ;
841 //MV neighbors[8] = { { -1, -1}, {0, -1}, {1, -1}, { -1, 0}, {1, 0}, { -1, 1}, {0, 1}, {1, 1} } ;
842 MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}} ;
845 unsigned char *src = (*(b->base_src) + b->src);
846 int src_stride = b->src_stride;
847 int rr = center_mv->as_mv.row, rc = center_mv->as_mv.col;
848 int br = ref_mv->as_mv.row >> 3, bc = ref_mv->as_mv.col >> 3, tr, tc;
849 unsigned int besterr, thiserr = 0x7fffffff;
852 if (bc < x->mv_col_min) bc = x->mv_col_min;
854 if (bc > x->mv_col_max) bc = x->mv_col_max;
856 if (br < x->mv_row_min) br = x->mv_row_min;
858 if (br > x->mv_row_max) br = x->mv_row_max;
863 besterr = ERR(br, bc, thiserr);
870 for (i = 0; i < 6; i++)
872 int nr = tr + hex[i].row, nc = tc + hex[i].col;
874 if (nc < x->mv_col_min) continue;
876 if (nc > x->mv_col_max) continue;
878 if (nr < x->mv_row_min) continue;
880 if (nr > x->mv_row_max) continue;
882 //CHECK_BETTER(thiserr,nr,nc);
883 if ((thiserr = ERR(nr, nc, besterr)) < besterr)
892 if (tr == br && tc == bc)
895 for (j = 1; j < 127; j++)
901 for (i = 0; i < 3; i++)
903 int nr = tr + next_chkpts[tk][i].row, nc = tc + next_chkpts[tk][i].col;
905 if (nc < x->mv_col_min) continue;
907 if (nc > x->mv_col_max) continue;
909 if (nr < x->mv_row_min) continue;
911 if (nr > x->mv_row_max) continue;
913 //CHECK_BETTER(thiserr,nr,nc);
914 if ((thiserr = ERR(nr, nc, besterr)) < besterr)
918 bc = nc; //k=(tk+5+i)%6;}
921 if (k >= 12) k -= 12;
922 else if (k >= 6) k -= 6;
926 if (tr == br && tc == bc)
930 // check 4 1-away neighbors
933 for (j = 0; j < 32; j++)
938 for (i = 0; i < 4; i++)
940 int nr = tr + neighbors[i].row, nc = tc + neighbors[i].col;
942 if (nc < x->mv_col_min) continue;
944 if (nc > x->mv_col_max) continue;
946 if (nr < x->mv_row_min) continue;
948 if (nr > x->mv_row_max) continue;
950 CHECK_BETTER(thiserr, nr, nc);
953 if (tr == br && tc == bc)
957 best_mv->as_mv.row = br;
958 best_mv->as_mv.col = bc;
960 return vfp->vf(src, src_stride, PRE(br, bc), d->pre_stride, &thiserr) + mv_err_cost(best_mv, center_mv, mvcost, error_per_bit) ;
970 int vp8_diamond_search_sad
980 vp8_variance_fn_ptr_t *fn_ptr,
987 unsigned char *what = (*(b->base_src) + b->src);
988 int what_stride = b->src_stride;
989 unsigned char *in_what;
990 int in_what_stride = d->pre_stride;
991 unsigned char *best_address;
996 int bestsad = INT_MAX;
1000 int ref_row = ref_mv->as_mv.row >> 3;
1001 int ref_col = ref_mv->as_mv.col >> 3;
1002 int this_row_offset;
1003 int this_col_offset;
1006 unsigned char *check_here;
1009 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1011 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1012 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1016 best_mv->as_mv.row = ref_row;
1017 best_mv->as_mv.col = ref_col;
1019 // Work out the start point for the search
1020 in_what = (unsigned char *)(*(d->base_pre) + d->pre + (ref_row * (d->pre_stride)) + ref_col);
1021 best_address = in_what;
1023 // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits
1024 if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) &&
1025 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max))
1027 // Check the starting position
1028 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, error_per_bit);
1031 // search_param determines the length of the initial step and hence the number of iterations
1032 // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
1033 ss = &x->ss[search_param * x->searches_per_step];
1034 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1038 for (step = 0; step < tot_steps ; step++)
1040 for (j = 0 ; j < x->searches_per_step ; j++)
1042 // Trap illegal vectors
1043 this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
1044 this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
1046 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
1047 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
1050 check_here = ss[i].offset + best_address;
1051 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1053 if (thissad < bestsad)
1055 this_mv.as_mv.row = this_row_offset;
1056 this_mv.as_mv.col = this_col_offset;
1057 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1059 if (thissad < bestsad)
1070 if (best_site != last_site)
1072 best_mv->as_mv.row += ss[best_site].mv.row;
1073 best_mv->as_mv.col += ss[best_site].mv.col;
1074 best_address += ss[best_site].offset;
1075 last_site = best_site;
1077 else if (best_address == in_what)
1081 this_mv.as_mv.row = best_mv->as_mv.row << 3;
1082 this_mv.as_mv.col = best_mv->as_mv.col << 3;
1084 if (bestsad == INT_MAX)
1087 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, (unsigned int *)(&thissad))
1088 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1091 int vp8_diamond_search_sadx4
1101 vp8_variance_fn_ptr_t *fn_ptr,
1108 unsigned char *what = (*(b->base_src) + b->src);
1109 int what_stride = b->src_stride;
1110 unsigned char *in_what;
1111 int in_what_stride = d->pre_stride;
1112 unsigned char *best_address;
1117 int bestsad = INT_MAX;
1121 int ref_row = ref_mv->as_mv.row >> 3;
1122 int ref_col = ref_mv->as_mv.col >> 3;
1123 int this_row_offset;
1124 int this_col_offset;
1127 unsigned char *check_here;
1128 unsigned int thissad;
1130 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1132 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1133 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1136 best_mv->as_mv.row = ref_row;
1137 best_mv->as_mv.col = ref_col;
1139 // Work out the start point for the search
1140 in_what = (unsigned char *)(*(d->base_pre) + d->pre + (ref_row * (d->pre_stride)) + ref_col);
1141 best_address = in_what;
1143 // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits
1144 if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) &&
1145 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max))
1147 // Check the starting position
1148 bestsad = fn_ptr->sdf(what, what_stride, in_what, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, error_per_bit);
1151 // search_param determines the length of the initial step and hence the number of iterations
1152 // 0 = initial step (MAX_FIRST_STEP) pel : 1 = (MAX_FIRST_STEP/2) pel, 2 = (MAX_FIRST_STEP/4) pel... etc.
1153 ss = &x->ss[search_param * x->searches_per_step];
1154 tot_steps = (x->ss_count / x->searches_per_step) - search_param;
1158 for (step = 0; step < tot_steps ; step++)
1162 // To know if all neighbor points are within the bounds, 4 bounds checking are enough instead of
1163 // checking 4 bounds for each points.
1164 all_in &= ((best_mv->as_mv.row + ss[i].mv.row)> x->mv_row_min);
1165 all_in &= ((best_mv->as_mv.row + ss[i+1].mv.row) < x->mv_row_max);
1166 all_in &= ((best_mv->as_mv.col + ss[i+2].mv.col) > x->mv_col_min);
1167 all_in &= ((best_mv->as_mv.col + ss[i+3].mv.col) < x->mv_col_max);
1171 unsigned int sad_array[4];
1173 for (j = 0 ; j < x->searches_per_step ; j += 4)
1175 unsigned char *block_offset[4];
1177 for (t = 0; t < 4; t++)
1178 block_offset[t] = ss[i+t].offset + best_address;
1180 fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
1182 for (t = 0; t < 4; t++, i++)
1184 if (sad_array[t] < bestsad)
1186 this_mv.as_mv.row = best_mv->as_mv.row + ss[i].mv.row;
1187 this_mv.as_mv.col = best_mv->as_mv.col + ss[i].mv.col;
1188 sad_array[t] += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1190 if (sad_array[t] < bestsad)
1192 bestsad = sad_array[t];
1201 for (j = 0 ; j < x->searches_per_step ; j++)
1203 // Trap illegal vectors
1204 this_row_offset = best_mv->as_mv.row + ss[i].mv.row;
1205 this_col_offset = best_mv->as_mv.col + ss[i].mv.col;
1207 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
1208 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
1210 check_here = ss[i].offset + best_address;
1211 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1213 if (thissad < bestsad)
1215 this_mv.as_mv.row = this_row_offset;
1216 this_mv.as_mv.col = this_col_offset;
1217 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1219 if (thissad < bestsad)
1230 if (best_site != last_site)
1232 best_mv->as_mv.row += ss[best_site].mv.row;
1233 best_mv->as_mv.col += ss[best_site].mv.col;
1234 best_address += ss[best_site].offset;
1235 last_site = best_site;
1237 else if (best_address == in_what)
1241 this_mv.as_mv.row = best_mv->as_mv.row << 3;
1242 this_mv.as_mv.col = best_mv->as_mv.col << 3;
1244 if (bestsad == INT_MAX)
1247 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, (unsigned int *)(&thissad))
1248 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1251 int vp8_full_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
1252 int error_per_bit, int distance,
1253 vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
1256 unsigned char *what = (*(b->base_src) + b->src);
1257 int what_stride = b->src_stride;
1258 unsigned char *in_what;
1259 int in_what_stride = d->pre_stride;
1260 int mv_stride = d->pre_stride;
1261 unsigned char *bestaddress;
1262 int_mv *best_mv = &d->bmi.mv;
1264 int bestsad = INT_MAX;
1267 unsigned char *check_here;
1270 int ref_row = ref_mv->as_mv.row;
1271 int ref_col = ref_mv->as_mv.col;
1273 int row_min = ref_row - distance;
1274 int row_max = ref_row + distance;
1275 int col_min = ref_col - distance;
1276 int col_max = ref_col + distance;
1278 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1280 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1281 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1283 // Work out the mid point for the search
1284 in_what = *(d->base_pre) + d->pre;
1285 bestaddress = in_what + (ref_row * d->pre_stride) + ref_col;
1287 best_mv->as_mv.row = ref_row;
1288 best_mv->as_mv.col = ref_col;
1290 // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits
1291 if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) &&
1292 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max))
1294 // Baseline value at the centre
1296 //bestsad = fn_ptr->sf( what,what_stride,bestaddress,in_what_stride) + (int)sqrt(mv_err_cost(ref_mv,ref_mv, mvcost,error_per_bit*14));
1297 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, error_per_bit);
1300 // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border
1301 if (col_min < x->mv_col_min)
1302 col_min = x->mv_col_min;
1304 if (col_max > x->mv_col_max)
1305 col_max = x->mv_col_max;
1307 if (row_min < x->mv_row_min)
1308 row_min = x->mv_row_min;
1310 if (row_max > x->mv_row_max)
1311 row_max = x->mv_row_max;
1313 for (r = row_min; r < row_max ; r++)
1315 this_mv.as_mv.row = r;
1316 check_here = r * mv_stride + in_what + col_min;
1318 for (c = col_min; c < col_max; c++)
1320 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1322 this_mv.as_mv.col = c;
1323 //thissad += (int)sqrt(mv_err_cost(&this_mv,ref_mv, mvcost,error_per_bit*14));
1324 //thissad += error_per_bit * mv_bits_sadcost[mv_bits(&this_mv, ref_mv, mvcost)];
1325 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit); //mv_bits(error_per_bit, &this_mv, ref_mv, mvsadcost);
1327 if (thissad < bestsad)
1330 best_mv->as_mv.row = r;
1331 best_mv->as_mv.col = c;
1332 bestaddress = check_here;
1339 this_mv.as_mv.row = best_mv->as_mv.row << 3;
1340 this_mv.as_mv.col = best_mv->as_mv.col << 3;
1342 if (bestsad < INT_MAX)
1343 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, (unsigned int *)(&thissad))
1344 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1349 int vp8_full_search_sadx3(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
1350 int error_per_bit, int distance,
1351 vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
1354 unsigned char *what = (*(b->base_src) + b->src);
1355 int what_stride = b->src_stride;
1356 unsigned char *in_what;
1357 int in_what_stride = d->pre_stride;
1358 int mv_stride = d->pre_stride;
1359 unsigned char *bestaddress;
1360 int_mv *best_mv = &d->bmi.mv;
1362 int bestsad = INT_MAX;
1365 unsigned char *check_here;
1366 unsigned int thissad;
1368 int ref_row = ref_mv->as_mv.row;
1369 int ref_col = ref_mv->as_mv.col;
1371 int row_min = ref_row - distance;
1372 int row_max = ref_row + distance;
1373 int col_min = ref_col - distance;
1374 int col_max = ref_col + distance;
1376 unsigned int sad_array[3];
1378 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1380 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1381 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1383 // Work out the mid point for the search
1384 in_what = *(d->base_pre) + d->pre;
1385 bestaddress = in_what + (ref_row * d->pre_stride) + ref_col;
1387 best_mv->as_mv.row = ref_row;
1388 best_mv->as_mv.col = ref_col;
1390 // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits
1391 if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) &&
1392 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max))
1394 // Baseline value at the centre
1395 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, error_per_bit);
1398 // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border
1399 if (col_min < x->mv_col_min)
1400 col_min = x->mv_col_min;
1402 if (col_max > x->mv_col_max)
1403 col_max = x->mv_col_max;
1405 if (row_min < x->mv_row_min)
1406 row_min = x->mv_row_min;
1408 if (row_max > x->mv_row_max)
1409 row_max = x->mv_row_max;
1411 for (r = row_min; r < row_max ; r++)
1413 this_mv.as_mv.row = r;
1414 check_here = r * mv_stride + in_what + col_min;
1417 while ((c + 2) < col_max)
1421 fn_ptr->sdx3f(what, what_stride, check_here , in_what_stride, sad_array);
1423 for (i = 0; i < 3; i++)
1425 thissad = sad_array[i];
1427 if (thissad < bestsad)
1429 this_mv.as_mv.col = c;
1430 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1432 if (thissad < bestsad)
1435 best_mv->as_mv.row = r;
1436 best_mv->as_mv.col = c;
1437 bestaddress = check_here;
1448 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1450 if (thissad < bestsad)
1452 this_mv.as_mv.col = c;
1453 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1455 if (thissad < bestsad)
1458 best_mv->as_mv.row = r;
1459 best_mv->as_mv.col = c;
1460 bestaddress = check_here;
1470 this_mv.as_mv.row = best_mv->as_mv.row << 3;
1471 this_mv.as_mv.col = best_mv->as_mv.col << 3;
1473 if (bestsad < INT_MAX)
1474 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, (unsigned int *)(&thissad))
1475 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1480 int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
1481 int error_per_bit, int distance,
1482 vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
1485 unsigned char *what = (*(b->base_src) + b->src);
1486 int what_stride = b->src_stride;
1487 unsigned char *in_what;
1488 int in_what_stride = d->pre_stride;
1489 int mv_stride = d->pre_stride;
1490 unsigned char *bestaddress;
1491 int_mv *best_mv = &d->bmi.mv;
1493 int bestsad = INT_MAX;
1496 unsigned char *check_here;
1497 unsigned int thissad;
1499 int ref_row = ref_mv->as_mv.row;
1500 int ref_col = ref_mv->as_mv.col;
1502 int row_min = ref_row - distance;
1503 int row_max = ref_row + distance;
1504 int col_min = ref_col - distance;
1505 int col_max = ref_col + distance;
1507 DECLARE_ALIGNED_ARRAY(16, unsigned short, sad_array8, 8);
1508 unsigned int sad_array[3];
1510 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1512 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1513 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1515 // Work out the mid point for the search
1516 in_what = *(d->base_pre) + d->pre;
1517 bestaddress = in_what + (ref_row * d->pre_stride) + ref_col;
1519 best_mv->as_mv.row = ref_row;
1520 best_mv->as_mv.col = ref_col;
1522 // We need to check that the starting point for the search (as indicated by ref_mv) is within the buffer limits
1523 if ((ref_col > x->mv_col_min) && (ref_col < x->mv_col_max) &&
1524 (ref_row > x->mv_row_min) && (ref_row < x->mv_row_max))
1526 // Baseline value at the centre
1527 bestsad = fn_ptr->sdf(what, what_stride, bestaddress, in_what_stride, 0x7fffffff) + mvsad_err_cost(best_mv, &fcenter_mv, mvsadcost, error_per_bit);
1530 // Apply further limits to prevent us looking using vectors that stretch beyiond the UMV border
1531 if (col_min < x->mv_col_min)
1532 col_min = x->mv_col_min;
1534 if (col_max > x->mv_col_max)
1535 col_max = x->mv_col_max;
1537 if (row_min < x->mv_row_min)
1538 row_min = x->mv_row_min;
1540 if (row_max > x->mv_row_max)
1541 row_max = x->mv_row_max;
1543 for (r = row_min; r < row_max ; r++)
1545 this_mv.as_mv.row = r;
1546 check_here = r * mv_stride + in_what + col_min;
1549 while ((c + 7) < col_max)
1553 fn_ptr->sdx8f(what, what_stride, check_here , in_what_stride, sad_array8);
1555 for (i = 0; i < 8; i++)
1557 thissad = (unsigned int)sad_array8[i];
1559 if (thissad < bestsad)
1561 this_mv.as_mv.col = c;
1562 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1564 if (thissad < bestsad)
1567 best_mv->as_mv.row = r;
1568 best_mv->as_mv.col = c;
1569 bestaddress = check_here;
1578 while ((c + 2) < col_max)
1582 fn_ptr->sdx3f(what, what_stride, check_here , in_what_stride, sad_array);
1584 for (i = 0; i < 3; i++)
1586 thissad = sad_array[i];
1588 if (thissad < bestsad)
1590 this_mv.as_mv.col = c;
1591 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1593 if (thissad < bestsad)
1596 best_mv->as_mv.row = r;
1597 best_mv->as_mv.col = c;
1598 bestaddress = check_here;
1609 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1611 if (thissad < bestsad)
1613 this_mv.as_mv.col = c;
1614 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1616 if (thissad < bestsad)
1619 best_mv->as_mv.row = r;
1620 best_mv->as_mv.col = c;
1621 bestaddress = check_here;
1630 this_mv.as_mv.row = best_mv->as_mv.row << 3;
1631 this_mv.as_mv.col = best_mv->as_mv.col << 3;
1633 if (bestsad < INT_MAX)
1634 return fn_ptr->vf(what, what_stride, bestaddress, in_what_stride, (unsigned int *)(&thissad))
1635 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1640 int vp8_refining_search_sad(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv,
1641 int error_per_bit, int search_range,
1642 vp8_variance_fn_ptr_t *fn_ptr, int *mvcost[2],
1645 MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
1647 short this_row_offset, this_col_offset;
1649 int what_stride = b->src_stride;
1650 int in_what_stride = d->pre_stride;
1651 unsigned char *what = (*(b->base_src) + b->src);
1652 unsigned char *best_address = (unsigned char *)(*(d->base_pre) + d->pre +
1653 (ref_mv->as_mv.row * (d->pre_stride)) + ref_mv->as_mv.col);
1654 unsigned char *check_here;
1655 unsigned int thissad;
1657 unsigned int bestsad = INT_MAX;
1659 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1662 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1663 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1665 bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride, 0x7fffffff) + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
1667 for (i=0; i<search_range; i++)
1671 for (j = 0 ; j < 4 ; j++)
1673 this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
1674 this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
1676 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
1677 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
1679 check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
1680 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1682 if (thissad < bestsad)
1684 this_mv.as_mv.row = this_row_offset;
1685 this_mv.as_mv.col = this_col_offset;
1686 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1688 if (thissad < bestsad)
1697 if (best_site == -1)
1701 ref_mv->as_mv.row += neighbors[best_site].row;
1702 ref_mv->as_mv.col += neighbors[best_site].col;
1703 best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
1707 this_mv.as_mv.row = ref_mv->as_mv.row << 3;
1708 this_mv.as_mv.col = ref_mv->as_mv.col << 3;
1710 if (bestsad < INT_MAX)
1711 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, (unsigned int *)(&thissad))
1712 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1717 int vp8_refining_search_sadx4(MACROBLOCK *x, BLOCK *b, BLOCKD *d,
1718 int_mv *ref_mv, int error_per_bit,
1719 int search_range, vp8_variance_fn_ptr_t *fn_ptr,
1720 int *mvcost[2], int_mv *center_mv)
1722 MV neighbors[4] = {{-1, 0}, {0, -1}, {0, 1}, {1, 0}};
1724 short this_row_offset, this_col_offset;
1726 int what_stride = b->src_stride;
1727 int in_what_stride = d->pre_stride;
1728 unsigned char *what = (*(b->base_src) + b->src);
1729 unsigned char *best_address = (unsigned char *)(*(d->base_pre) + d->pre +
1730 (ref_mv->as_mv.row * (d->pre_stride)) + ref_mv->as_mv.col);
1731 unsigned char *check_here;
1732 unsigned int thissad;
1734 unsigned int bestsad = INT_MAX;
1736 int *mvsadcost[2] = {x->mvsadcost[0], x->mvsadcost[1]};
1739 fcenter_mv.as_mv.row = center_mv->as_mv.row >> 3;
1740 fcenter_mv.as_mv.col = center_mv->as_mv.col >> 3;
1742 bestsad = fn_ptr->sdf(what, what_stride, best_address, in_what_stride, 0x7fffffff) + mvsad_err_cost(ref_mv, &fcenter_mv, mvsadcost, error_per_bit);
1744 for (i=0; i<search_range; i++)
1749 all_in &= ((ref_mv->as_mv.row - 1) > x->mv_row_min);
1750 all_in &= ((ref_mv->as_mv.row + 1) < x->mv_row_max);
1751 all_in &= ((ref_mv->as_mv.col - 1) > x->mv_col_min);
1752 all_in &= ((ref_mv->as_mv.col + 1) < x->mv_col_max);
1756 unsigned int sad_array[4];
1757 unsigned char *block_offset[4];
1758 block_offset[0] = best_address - in_what_stride;
1759 block_offset[1] = best_address - 1;
1760 block_offset[2] = best_address + 1;
1761 block_offset[3] = best_address + in_what_stride;
1763 fn_ptr->sdx4df(what, what_stride, block_offset, in_what_stride, sad_array);
1765 for (j = 0; j < 4; j++)
1767 if (sad_array[j] < bestsad)
1769 this_mv.as_mv.row = ref_mv->as_mv.row + neighbors[j].row;
1770 this_mv.as_mv.col = ref_mv->as_mv.col + neighbors[j].col;
1771 sad_array[j] += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1773 if (sad_array[j] < bestsad)
1775 bestsad = sad_array[j];
1783 for (j = 0 ; j < 4 ; j++)
1785 this_row_offset = ref_mv->as_mv.row + neighbors[j].row;
1786 this_col_offset = ref_mv->as_mv.col + neighbors[j].col;
1788 if ((this_col_offset > x->mv_col_min) && (this_col_offset < x->mv_col_max) &&
1789 (this_row_offset > x->mv_row_min) && (this_row_offset < x->mv_row_max))
1791 check_here = (neighbors[j].row)*in_what_stride + neighbors[j].col + best_address;
1792 thissad = fn_ptr->sdf(what, what_stride, check_here , in_what_stride, bestsad);
1794 if (thissad < bestsad)
1796 this_mv.as_mv.row = this_row_offset;
1797 this_mv.as_mv.col = this_col_offset;
1798 thissad += mvsad_err_cost(&this_mv, &fcenter_mv, mvsadcost, error_per_bit);
1800 if (thissad < bestsad)
1810 if (best_site == -1)
1814 ref_mv->as_mv.row += neighbors[best_site].row;
1815 ref_mv->as_mv.col += neighbors[best_site].col;
1816 best_address += (neighbors[best_site].row)*in_what_stride + neighbors[best_site].col;
1820 this_mv.as_mv.row = ref_mv->as_mv.row << 3;
1821 this_mv.as_mv.col = ref_mv->as_mv.col << 3;
1823 if (bestsad < INT_MAX)
1824 return fn_ptr->vf(what, what_stride, best_address, in_what_stride, (unsigned int *)(&thissad))
1825 + mv_err_cost(&this_mv, center_mv, mvcost, error_per_bit);
1830 #ifdef ENTROPY_STATS
1831 void print_mode_context(void)
1833 FILE *f = fopen("modecont.c", "w");
1836 fprintf(f, "#include \"entropy.h\"\n");
1837 fprintf(f, "const int vp8_mode_contexts[6][4] =\n");
1840 for (j = 0; j < 6; j++)
1842 fprintf(f, " { // %d \n", j);
1845 for (i = 0; i < 4; i++)
1849 int count; // = mv_ref_ct[j][i][0]+mv_ref_ct[j][i][1];
1852 count = mv_mode_cts[i][0] + mv_mode_cts[i][1];
1855 overal_prob = 256 * mv_mode_cts[i][0] / count;
1859 if (overal_prob == 0)
1863 count = mv_ref_ct[j][i][0] + mv_ref_ct[j][i][1];
1866 this_prob = 256 * mv_ref_ct[j][i][0] / count;
1873 fprintf(f, "%5d, ", this_prob);
1874 //fprintf(f,"%5d, %5d, %8d,", this_prob, overal_prob, (this_prob << 10)/overal_prob);
1875 //fprintf(f,"%8d, ", (this_prob << 10)/overal_prob);
1878 fprintf(f, " },\n");
1885 /* MV ref count ENTROPY_STATS stats code */
1886 #ifdef ENTROPY_STATS
1887 void init_mv_ref_counts()
1889 vpx_memset(mv_ref_ct, 0, sizeof(mv_ref_ct));
1890 vpx_memset(mv_mode_cts, 0, sizeof(mv_mode_cts));
1893 void accum_mv_refs(MB_PREDICTION_MODE m, const int ct[4])
1897 ++mv_ref_ct [ct[0]] [0] [0];
1898 ++mv_mode_cts[0][0];
1902 ++mv_ref_ct [ct[0]] [0] [1];
1903 ++mv_mode_cts[0][1];
1907 ++mv_ref_ct [ct[1]] [1] [0];
1908 ++mv_mode_cts[1][0];
1912 ++mv_ref_ct [ct[1]] [1] [1];
1913 ++mv_mode_cts[1][1];
1917 ++mv_ref_ct [ct[2]] [2] [0];
1918 ++mv_mode_cts[2][0];
1922 ++mv_ref_ct [ct[2]] [2] [1];
1923 ++mv_mode_cts[2][1];
1927 ++mv_ref_ct [ct[3]] [3] [0];
1928 ++mv_mode_cts[3][0];
1932 ++mv_ref_ct [ct[3]] [3] [1];
1933 ++mv_mode_cts[3][1];
1940 #endif/* END MV ref count ENTROPY_STATS stats code */