Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(194)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_mcomp.c

Issue 554673004: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_pickmode.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 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 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 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
249 CHECK_BETTER(second, tr + kr, tc + hstep); \ 249 CHECK_BETTER(second, tr + kr, tc + hstep); \
250 break; \ 250 break; \
251 case 1: \ 251 case 1: \
252 case 3: \ 252 case 3: \
253 CHECK_BETTER(second, tr + kr, tc - hstep); \ 253 CHECK_BETTER(second, tr + kr, tc - hstep); \
254 break; \ 254 break; \
255 } \ 255 } \
256 } \ 256 } \
257 } 257 }
258 258
259 #define SETUP_SUBPEL_SEARCH \
260 const uint8_t *const z = x->plane[0].src.buf; \
261 const int src_stride = x->plane[0].src.stride; \
262 const MACROBLOCKD *xd = &x->e_mbd; \
263 unsigned int besterr = INT_MAX; \
264 unsigned int sse; \
265 unsigned int whichdir; \
266 int thismse; \
267 const unsigned int halfiters = iters_per_step; \
268 const unsigned int quarteriters = iters_per_step; \
269 const unsigned int eighthiters = iters_per_step; \
270 const int y_stride = xd->plane[0].pre[0].stride; \
271 const int offset = bestmv->row * y_stride + bestmv->col; \
272 const uint8_t *const y = xd->plane[0].pre[0].buf; \
273 \
274 int rr = ref_mv->row; \
275 int rc = ref_mv->col; \
276 int br = bestmv->row * 8; \
277 int bc = bestmv->col * 8; \
278 int hstep = 4; \
279 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX); \
280 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX); \
281 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX); \
282 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX); \
283 int tr = br; \
284 int tc = bc; \
285 \
286 bestmv->row *= 8; \
287 bestmv->col *= 8; \
288 if (second_pred != NULL) { \
289 DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64); \
290 vp9_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride); \
291 besterr = vfp->vf(comp_pred, w, z, src_stride, sse1); \
292 } else { \
293 besterr = vfp->vf(y + offset, y_stride, z, src_stride, sse1); \
294 } \
295 *distortion = besterr; \
296 besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
297
298 int vp9_find_best_sub_pixel_tree_pruned(const MACROBLOCK *x,
299 MV *bestmv, const MV *ref_mv,
300 int allow_hp,
301 int error_per_bit,
302 const vp9_variance_fn_ptr_t *vfp,
303 int forced_stop,
304 int iters_per_step,
305 int *sad_list,
306 int *mvjcost, int *mvcost[2],
307 int *distortion,
308 unsigned int *sse1,
309 const uint8_t *second_pred,
310 int w, int h) {
311 SETUP_SUBPEL_SEARCH;
312
313 if (sad_list &&
314 sad_list[0] != INT_MAX && sad_list[1] != INT_MAX &&
315 sad_list[2] != INT_MAX && sad_list[3] != INT_MAX &&
316 sad_list[4] != INT_MAX) {
317 unsigned int left, right, up, down, diag;
318 whichdir = (sad_list[1] < sad_list[3] ? 0 : 1) +
319 (sad_list[2] < sad_list[4] ? 0 : 2);
320 switch (whichdir) {
321 case 0:
322 CHECK_BETTER(left, tr, tc - hstep);
323 CHECK_BETTER(up, tr - hstep, tc);
324 CHECK_BETTER(diag, tr - hstep, tc - hstep);
325 break;
326 case 1:
327 CHECK_BETTER(right, tr, tc + hstep);
328 CHECK_BETTER(up, tr - hstep, tc);
329 CHECK_BETTER(diag, tr - hstep, tc + hstep);
330 break;
331 case 2:
332 CHECK_BETTER(left, tr, tc - hstep);
333 CHECK_BETTER(down, tr + hstep, tc);
334 CHECK_BETTER(diag, tr + hstep, tc - hstep);
335 break;
336 case 3:
337 CHECK_BETTER(right, tr, tc + hstep);
338 CHECK_BETTER(down, tr + hstep, tc);
339 CHECK_BETTER(diag, tr + hstep, tc + hstep);
340 break;
341 }
342 } else {
343 FIRST_LEVEL_CHECKS;
344 if (halfiters > 1) {
345 SECOND_LEVEL_CHECKS;
346 }
347 }
348
349 tr = br;
350 tc = bc;
351
352 // Each subsequent iteration checks at least one point in common with
353 // the last iteration could be 2 ( if diag selected) 1/4 pel
354
355 // Note forced_stop: 0 - full, 1 - qtr only, 2 - half only
356 if (forced_stop != 2) {
357 hstep >>= 1;
358 FIRST_LEVEL_CHECKS;
359 if (quarteriters > 1) {
360 SECOND_LEVEL_CHECKS;
361 }
362 tr = br;
363 tc = bc;
364 }
365
366 if (allow_hp && vp9_use_mv_hp(ref_mv) && forced_stop == 0) {
367 hstep >>= 1;
368 FIRST_LEVEL_CHECKS;
369 if (eighthiters > 1) {
370 SECOND_LEVEL_CHECKS;
371 }
372 tr = br;
373 tc = bc;
374 }
375 // These lines insure static analysis doesn't warn that
376 // tr and tc aren't used after the above point.
377 (void) tr;
378 (void) tc;
379
380 bestmv->row = br;
381 bestmv->col = bc;
382
383 if ((abs(bestmv->col - ref_mv->col) > (MAX_FULL_PEL_VAL << 3)) ||
384 (abs(bestmv->row - ref_mv->row) > (MAX_FULL_PEL_VAL << 3)))
385 return INT_MAX;
386
387 return besterr;
388 }
389
259 int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x, 390 int vp9_find_best_sub_pixel_tree(const MACROBLOCK *x,
260 MV *bestmv, const MV *ref_mv, 391 MV *bestmv, const MV *ref_mv,
261 int allow_hp, 392 int allow_hp,
262 int error_per_bit, 393 int error_per_bit,
263 const vp9_variance_fn_ptr_t *vfp, 394 const vp9_variance_fn_ptr_t *vfp,
264 int forced_stop, 395 int forced_stop,
265 int iters_per_step, 396 int iters_per_step,
397 int *sad_list,
266 int *mvjcost, int *mvcost[2], 398 int *mvjcost, int *mvcost[2],
267 int *distortion, 399 int *distortion,
268 unsigned int *sse1, 400 unsigned int *sse1,
269 const uint8_t *second_pred, 401 const uint8_t *second_pred,
270 int w, int h) { 402 int w, int h) {
271 const uint8_t *const z = x->plane[0].src.buf; 403 SETUP_SUBPEL_SEARCH;
272 const int src_stride = x->plane[0].src.stride; 404 (void) sad_list; // to silence compiler warning
273 const MACROBLOCKD *xd = &x->e_mbd;
274 unsigned int besterr = INT_MAX;
275 unsigned int sse;
276 unsigned int whichdir;
277 int thismse;
278 const unsigned int halfiters = iters_per_step;
279 const unsigned int quarteriters = iters_per_step;
280 const unsigned int eighthiters = iters_per_step;
281
282 const int y_stride = xd->plane[0].pre[0].stride;
283 const int offset = bestmv->row * y_stride + bestmv->col;
284 const uint8_t *const y = xd->plane[0].pre[0].buf;
285
286 int rr = ref_mv->row;
287 int rc = ref_mv->col;
288 int br = bestmv->row * 8;
289 int bc = bestmv->col * 8;
290 int hstep = 4;
291 const int minc = MAX(x->mv_col_min * 8, ref_mv->col - MV_MAX);
292 const int maxc = MIN(x->mv_col_max * 8, ref_mv->col + MV_MAX);
293 const int minr = MAX(x->mv_row_min * 8, ref_mv->row - MV_MAX);
294 const int maxr = MIN(x->mv_row_max * 8, ref_mv->row + MV_MAX);
295
296 int tr = br;
297 int tc = bc;
298
299 // central mv
300 bestmv->row *= 8;
301 bestmv->col *= 8;
302
303 // calculate central point error
304 // TODO(yunqingwang): central pointer error was already calculated in full-
305 // pixel search, and can be passed in this function.
306 if (second_pred != NULL) {
307 DECLARE_ALIGNED_ARRAY(16, uint8_t, comp_pred, 64 * 64);
308 vp9_comp_avg_pred(comp_pred, second_pred, w, h, y + offset, y_stride);
309 besterr = vfp->vf(comp_pred, w, z, src_stride, sse1);
310 } else {
311 besterr = vfp->vf(y + offset, y_stride, z, src_stride, sse1);
312 }
313 *distortion = besterr;
314 besterr += mv_err_cost(bestmv, ref_mv, mvjcost, mvcost, error_per_bit);
315 405
316 // Each subsequent iteration checks at least one point in 406 // Each subsequent iteration checks at least one point in
317 // common with the last iteration could be 2 ( if diag selected) 407 // common with the last iteration could be 2 ( if diag selected)
318 // 1/2 pel 408 // 1/2 pel
319 FIRST_LEVEL_CHECKS; 409 FIRST_LEVEL_CHECKS;
320 if (halfiters > 1) { 410 if (halfiters > 1) {
321 SECOND_LEVEL_CHECKS; 411 SECOND_LEVEL_CHECKS;
322 } 412 }
323 tr = br; 413 tr = br;
324 tc = bc; 414 tc = bc;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 } 481 }
392 482
393 #define MAX_PATTERN_SCALES 11 483 #define MAX_PATTERN_SCALES 11
394 #define MAX_PATTERN_CANDIDATES 8 // max number of canddiates per scale 484 #define MAX_PATTERN_CANDIDATES 8 // max number of canddiates per scale
395 #define PATTERN_CANDIDATES_REF 3 // number of refinement candidates 485 #define PATTERN_CANDIDATES_REF 3 // number of refinement candidates
396 486
397 // Generic pattern search function that searches over multiple scales. 487 // Generic pattern search function that searches over multiple scales.
398 // Each scale can have a different number of candidates and shape of 488 // Each scale can have a different number of candidates and shape of
399 // candidates as indicated in the num_candidates and candidates arrays 489 // candidates as indicated in the num_candidates and candidates arrays
400 // passed into this function 490 // passed into this function
491 //
401 static int vp9_pattern_search(const MACROBLOCK *x, 492 static int vp9_pattern_search(const MACROBLOCK *x,
402 MV *ref_mv, 493 MV *ref_mv,
403 int search_param, 494 int search_param,
404 int sad_per_bit, 495 int sad_per_bit,
405 int do_init_search, int do_refine, 496 int do_init_search,
497 int *sad_list,
406 const vp9_variance_fn_ptr_t *vfp, 498 const vp9_variance_fn_ptr_t *vfp,
407 int use_mvcost, 499 int use_mvcost,
408 const MV *center_mv, MV *best_mv, 500 const MV *center_mv,
501 MV *best_mv,
409 const int num_candidates[MAX_PATTERN_SCALES], 502 const int num_candidates[MAX_PATTERN_SCALES],
410 const MV candidates[MAX_PATTERN_SCALES] 503 const MV candidates[MAX_PATTERN_SCALES]
411 [MAX_PATTERN_CANDIDATES]) { 504 [MAX_PATTERN_CANDIDATES]) {
412 const MACROBLOCKD *const xd = &x->e_mbd; 505 const MACROBLOCKD *const xd = &x->e_mbd;
413 static const int search_param_to_steps[MAX_MVSEARCH_STEPS] = { 506 static const int search_param_to_steps[MAX_MVSEARCH_STEPS] = {
414 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 507 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0,
415 }; 508 };
416 int i, j, s, t; 509 int i, s, t;
417 const struct buf_2d *const what = &x->plane[0].src; 510 const struct buf_2d *const what = &x->plane[0].src;
418 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 511 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
419 int br, bc; 512 int br, bc;
420 int bestsad = INT_MAX; 513 int bestsad = INT_MAX;
421 int thissad; 514 int thissad;
422 int k = -1; 515 int k = -1;
423 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3}; 516 const MV fcenter_mv = {center_mv->row >> 3, center_mv->col >> 3};
424 int best_init_s = search_param_to_steps[search_param]; 517 int best_init_s = search_param_to_steps[search_param];
425 // adjust ref_mv to make sure it is within MV range 518 // adjust ref_mv to make sure it is within MV range
426 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max); 519 clamp_mv(ref_mv, x->mv_col_min, x->mv_col_max, x->mv_row_min, x->mv_row_max);
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 638
546 if (best_site != -1) { 639 if (best_site != -1) {
547 k = next_chkpts_indices[best_site]; 640 k = next_chkpts_indices[best_site];
548 br += candidates[s][k].row; 641 br += candidates[s][k].row;
549 bc += candidates[s][k].col; 642 bc += candidates[s][k].col;
550 } 643 }
551 } while (best_site != -1); 644 } while (best_site != -1);
552 } while (s--); 645 } while (s--);
553 } 646 }
554 647
555 // Check 4 1-away neighbors if do_refine is true. 648 // Returns the one-away integer pel sad values around the best as follows:
556 // For most well-designed schemes do_refine will not be necessary. 649 // sad_list[0]: sad at the best integer pel
557 if (do_refine) { 650 // sad_list[1]: sad at delta {0, -1} (left) from the best integer pel
558 static const MV neighbors[4] = {{0, -1}, { -1, 0}, {1, 0}, {0, 1}}; 651 // sad_list[2]: sad at delta {-1, 0} (top) from the best integer pel
559 652 // sad_list[3]: sad at delta { 0, 1} (right) from the best integer pel
560 for (j = 0; j < 16; j++) { 653 // sad_list[4]: sad at delta { 1, 0} (bottom) from the best integer pel
561 int best_site = -1; 654 if (sad_list) {
562 if (check_bounds(x, br, bc, 1)) { 655 static const MV neighbors[4] = {{0, -1}, {-1, 0}, {0, 1}, {1, 0}};
563 for (i = 0; i < 4; i++) { 656 sad_list[0] = bestsad;
564 const MV this_mv = {br + neighbors[i].row, 657 if (check_bounds(x, br, bc, 1)) {
565 bc + neighbors[i].col}; 658 for (i = 0; i < 4; i++) {
566 thissad = vfp->sdf(what->buf, what->stride, 659 const MV this_mv = {br + neighbors[i].row,
567 get_buf_from_mv(in_what, &this_mv), 660 bc + neighbors[i].col};
568 in_what->stride); 661 sad_list[i + 1] = vfp->sdf(what->buf, what->stride,
569 CHECK_BETTER 662 get_buf_from_mv(in_what, &this_mv),
570 } 663 in_what->stride);
571 } else {
572 for (i = 0; i < 4; i++) {
573 const MV this_mv = {br + neighbors[i].row,
574 bc + neighbors[i].col};
575 if (!is_mv_in(x, &this_mv))
576 continue;
577 thissad = vfp->sdf(what->buf, what->stride,
578 get_buf_from_mv(in_what, &this_mv),
579 in_what->stride);
580 CHECK_BETTER
581 }
582 } 664 }
583 665 } else {
584 if (best_site == -1) { 666 for (i = 0; i < 4; i++) {
585 break; 667 const MV this_mv = {br + neighbors[i].row,
586 } else { 668 bc + neighbors[i].col};
587 br += neighbors[best_site].row; 669 if (!is_mv_in(x, &this_mv))
588 bc += neighbors[best_site].col; 670 sad_list[i + 1] = INT_MAX;
671 else
672 sad_list[i + 1] = vfp->sdf(what->buf, what->stride,
673 get_buf_from_mv(in_what, &this_mv),
674 in_what->stride);
589 } 675 }
590 } 676 }
591 } 677 }
592
593 best_mv->row = br; 678 best_mv->row = br;
594 best_mv->col = bc; 679 best_mv->col = bc;
595
596 return bestsad; 680 return bestsad;
597 } 681 }
598 682
599 int vp9_get_mvpred_var(const MACROBLOCK *x, 683 int vp9_get_mvpred_var(const MACROBLOCK *x,
600 const MV *best_mv, const MV *center_mv, 684 const MV *best_mv, const MV *center_mv,
601 const vp9_variance_fn_ptr_t *vfp, 685 const vp9_variance_fn_ptr_t *vfp,
602 int use_mvcost) { 686 int use_mvcost) {
603 const MACROBLOCKD *const xd = &x->e_mbd; 687 const MACROBLOCKD *const xd = &x->e_mbd;
604 const struct buf_2d *const what = &x->plane[0].src; 688 const struct buf_2d *const what = &x->plane[0].src;
605 const struct buf_2d *const in_what = &xd->plane[0].pre[0]; 689 const struct buf_2d *const in_what = &xd->plane[0].pre[0];
(...skipping 21 matching lines...) Expand all
627 what->buf, what->stride, &unused, second_pred) + 711 what->buf, what->stride, &unused, second_pred) +
628 (use_mvcost ? mv_err_cost(&mv, center_mv, x->nmvjointcost, 712 (use_mvcost ? mv_err_cost(&mv, center_mv, x->nmvjointcost,
629 x->mvcost, x->errorperbit) : 0); 713 x->mvcost, x->errorperbit) : 0);
630 } 714 }
631 715
632 int vp9_hex_search(const MACROBLOCK *x, 716 int vp9_hex_search(const MACROBLOCK *x,
633 MV *ref_mv, 717 MV *ref_mv,
634 int search_param, 718 int search_param,
635 int sad_per_bit, 719 int sad_per_bit,
636 int do_init_search, 720 int do_init_search,
721 int *sad_list,
637 const vp9_variance_fn_ptr_t *vfp, 722 const vp9_variance_fn_ptr_t *vfp,
638 int use_mvcost, 723 int use_mvcost,
639 const MV *center_mv, MV *best_mv) { 724 const MV *center_mv, MV *best_mv) {
640 // First scale has 8-closest points, the rest have 6 points in hex shape 725 // First scale has 8-closest points, the rest have 6 points in hex shape
641 // at increasing scales 726 // at increasing scales
642 static const int hex_num_candidates[MAX_PATTERN_SCALES] = { 727 static const int hex_num_candidates[MAX_PATTERN_SCALES] = {
643 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 728 8, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6
644 }; 729 };
645 // Note that the largest candidate step at each scale is 2^scale 730 // Note that the largest candidate step at each scale is 2^scale
646 static const MV hex_candidates[MAX_PATTERN_SCALES][MAX_PATTERN_CANDIDATES] = { 731 static const MV hex_candidates[MAX_PATTERN_SCALES][MAX_PATTERN_CANDIDATES] = {
647 {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, { 0, 1}, { -1, 1}, {-1, 0}}, 732 {{-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}, { 0, 1}, { -1, 1}, {-1, 0}},
648 {{-1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0}}, 733 {{-1, -2}, {1, -2}, {2, 0}, {1, 2}, { -1, 2}, { -2, 0}},
649 {{-2, -4}, {2, -4}, {4, 0}, {2, 4}, { -2, 4}, { -4, 0}}, 734 {{-2, -4}, {2, -4}, {4, 0}, {2, 4}, { -2, 4}, { -4, 0}},
650 {{-4, -8}, {4, -8}, {8, 0}, {4, 8}, { -4, 8}, { -8, 0}}, 735 {{-4, -8}, {4, -8}, {8, 0}, {4, 8}, { -4, 8}, { -8, 0}},
651 {{-8, -16}, {8, -16}, {16, 0}, {8, 16}, { -8, 16}, { -16, 0}}, 736 {{-8, -16}, {8, -16}, {16, 0}, {8, 16}, { -8, 16}, { -16, 0}},
652 {{-16, -32}, {16, -32}, {32, 0}, {16, 32}, { -16, 32}, { -32, 0}}, 737 {{-16, -32}, {16, -32}, {32, 0}, {16, 32}, { -16, 32}, { -32, 0}},
653 {{-32, -64}, {32, -64}, {64, 0}, {32, 64}, { -32, 64}, { -64, 0}}, 738 {{-32, -64}, {32, -64}, {64, 0}, {32, 64}, { -32, 64}, { -64, 0}},
654 {{-64, -128}, {64, -128}, {128, 0}, {64, 128}, { -64, 128}, { -128, 0}}, 739 {{-64, -128}, {64, -128}, {128, 0}, {64, 128}, { -64, 128}, { -128, 0}},
655 {{-128, -256}, {128, -256}, {256, 0}, {128, 256}, { -128, 256}, { -256, 0}}, 740 {{-128, -256}, {128, -256}, {256, 0}, {128, 256}, { -128, 256}, { -256, 0}},
656 {{-256, -512}, {256, -512}, {512, 0}, {256, 512}, { -256, 512}, { -512, 0}}, 741 {{-256, -512}, {256, -512}, {512, 0}, {256, 512}, { -256, 512}, { -512, 0}},
657 {{-512, -1024}, {512, -1024}, {1024, 0}, {512, 1024}, { -512, 1024}, 742 {{-512, -1024}, {512, -1024}, {1024, 0}, {512, 1024}, { -512, 1024},
658 { -1024, 0}}, 743 { -1024, 0}},
659 }; 744 };
660 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 745 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
661 do_init_search, 0, vfp, use_mvcost, 746 do_init_search, sad_list, vfp, use_mvcost,
662 center_mv, best_mv, 747 center_mv, best_mv,
663 hex_num_candidates, hex_candidates); 748 hex_num_candidates, hex_candidates);
664 } 749 }
665 750
666 int vp9_bigdia_search(const MACROBLOCK *x, 751 int vp9_bigdia_search(const MACROBLOCK *x,
667 MV *ref_mv, 752 MV *ref_mv,
668 int search_param, 753 int search_param,
669 int sad_per_bit, 754 int sad_per_bit,
670 int do_init_search, 755 int do_init_search,
756 int *sad_list,
671 const vp9_variance_fn_ptr_t *vfp, 757 const vp9_variance_fn_ptr_t *vfp,
672 int use_mvcost, 758 int use_mvcost,
673 const MV *center_mv, 759 const MV *center_mv,
674 MV *best_mv) { 760 MV *best_mv) {
675 // First scale has 4-closest points, the rest have 8 points in diamond 761 // First scale has 4-closest points, the rest have 8 points in diamond
676 // shape at increasing scales 762 // shape at increasing scales
677 static const int bigdia_num_candidates[MAX_PATTERN_SCALES] = { 763 static const int bigdia_num_candidates[MAX_PATTERN_SCALES] = {
678 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 764 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
679 }; 765 };
680 // Note that the largest candidate step at each scale is 2^scale 766 // Note that the largest candidate step at each scale is 2^scale
(...skipping 11 matching lines...) Expand all
692 {{-64, -64}, {0, -128}, {64, -64}, {128, 0}, {64, 64}, {0, 128}, 778 {{-64, -64}, {0, -128}, {64, -64}, {128, 0}, {64, 64}, {0, 128},
693 {-64, 64}, {-128, 0}}, 779 {-64, 64}, {-128, 0}},
694 {{-128, -128}, {0, -256}, {128, -128}, {256, 0}, {128, 128}, {0, 256}, 780 {{-128, -128}, {0, -256}, {128, -128}, {256, 0}, {128, 128}, {0, 256},
695 {-128, 128}, {-256, 0}}, 781 {-128, 128}, {-256, 0}},
696 {{-256, -256}, {0, -512}, {256, -256}, {512, 0}, {256, 256}, {0, 512}, 782 {{-256, -256}, {0, -512}, {256, -256}, {512, 0}, {256, 256}, {0, 512},
697 {-256, 256}, {-512, 0}}, 783 {-256, 256}, {-512, 0}},
698 {{-512, -512}, {0, -1024}, {512, -512}, {1024, 0}, {512, 512}, {0, 1024}, 784 {{-512, -512}, {0, -1024}, {512, -512}, {1024, 0}, {512, 512}, {0, 1024},
699 {-512, 512}, {-1024, 0}}, 785 {-512, 512}, {-1024, 0}},
700 }; 786 };
701 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 787 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
702 do_init_search, 0, vfp, use_mvcost, 788 do_init_search, sad_list, vfp, use_mvcost,
703 center_mv, best_mv, 789 center_mv, best_mv,
704 bigdia_num_candidates, bigdia_candidates); 790 bigdia_num_candidates, bigdia_candidates);
705 } 791 }
706 792
707 int vp9_square_search(const MACROBLOCK *x, 793 int vp9_square_search(const MACROBLOCK *x,
708 MV *ref_mv, 794 MV *ref_mv,
709 int search_param, 795 int search_param,
710 int sad_per_bit, 796 int sad_per_bit,
711 int do_init_search, 797 int do_init_search,
798 int *sad_list,
712 const vp9_variance_fn_ptr_t *vfp, 799 const vp9_variance_fn_ptr_t *vfp,
713 int use_mvcost, 800 int use_mvcost,
714 const MV *center_mv, 801 const MV *center_mv,
715 MV *best_mv) { 802 MV *best_mv) {
716 // All scales have 8 closest points in square shape 803 // All scales have 8 closest points in square shape
717 static const int square_num_candidates[MAX_PATTERN_SCALES] = { 804 static const int square_num_candidates[MAX_PATTERN_SCALES] = {
718 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 805 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
719 }; 806 };
720 // Note that the largest candidate step at each scale is 2^scale 807 // Note that the largest candidate step at each scale is 2^scale
721 static const MV square_candidates[MAX_PATTERN_SCALES] 808 static const MV square_candidates[MAX_PATTERN_SCALES]
(...skipping 11 matching lines...) Expand all
733 {{-128, -128}, {0, -128}, {128, -128}, {128, 0}, {128, 128}, {0, 128}, 820 {{-128, -128}, {0, -128}, {128, -128}, {128, 0}, {128, 128}, {0, 128},
734 {-128, 128}, {-128, 0}}, 821 {-128, 128}, {-128, 0}},
735 {{-256, -256}, {0, -256}, {256, -256}, {256, 0}, {256, 256}, {0, 256}, 822 {{-256, -256}, {0, -256}, {256, -256}, {256, 0}, {256, 256}, {0, 256},
736 {-256, 256}, {-256, 0}}, 823 {-256, 256}, {-256, 0}},
737 {{-512, -512}, {0, -512}, {512, -512}, {512, 0}, {512, 512}, {0, 512}, 824 {{-512, -512}, {0, -512}, {512, -512}, {512, 0}, {512, 512}, {0, 512},
738 {-512, 512}, {-512, 0}}, 825 {-512, 512}, {-512, 0}},
739 {{-1024, -1024}, {0, -1024}, {1024, -1024}, {1024, 0}, {1024, 1024}, 826 {{-1024, -1024}, {0, -1024}, {1024, -1024}, {1024, 0}, {1024, 1024},
740 {0, 1024}, {-1024, 1024}, {-1024, 0}}, 827 {0, 1024}, {-1024, 1024}, {-1024, 0}},
741 }; 828 };
742 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit, 829 return vp9_pattern_search(x, ref_mv, search_param, sad_per_bit,
743 do_init_search, 0, vfp, use_mvcost, 830 do_init_search, sad_list, vfp, use_mvcost,
744 center_mv, best_mv, 831 center_mv, best_mv,
745 square_num_candidates, square_candidates); 832 square_num_candidates, square_candidates);
746 } 833 }
747 834
748 int vp9_fast_hex_search(const MACROBLOCK *x, 835 int vp9_fast_hex_search(const MACROBLOCK *x,
749 MV *ref_mv, 836 MV *ref_mv,
750 int search_param, 837 int search_param,
751 int sad_per_bit, 838 int sad_per_bit,
752 int do_init_search, // must be zero for fast_hex 839 int do_init_search, // must be zero for fast_hex
840 int *sad_list,
753 const vp9_variance_fn_ptr_t *vfp, 841 const vp9_variance_fn_ptr_t *vfp,
754 int use_mvcost, 842 int use_mvcost,
755 const MV *center_mv, 843 const MV *center_mv,
756 MV *best_mv) { 844 MV *best_mv) {
757 return vp9_hex_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param), 845 return vp9_hex_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param),
758 sad_per_bit, do_init_search, vfp, use_mvcost, 846 sad_per_bit, do_init_search, sad_list, vfp, use_mvcost,
759 center_mv, best_mv); 847 center_mv, best_mv);
760 } 848 }
761 849
762 int vp9_fast_dia_search(const MACROBLOCK *x, 850 int vp9_fast_dia_search(const MACROBLOCK *x,
763 MV *ref_mv, 851 MV *ref_mv,
764 int search_param, 852 int search_param,
765 int sad_per_bit, 853 int sad_per_bit,
766 int do_init_search, 854 int do_init_search,
855 int *sad_list,
767 const vp9_variance_fn_ptr_t *vfp, 856 const vp9_variance_fn_ptr_t *vfp,
768 int use_mvcost, 857 int use_mvcost,
769 const MV *center_mv, 858 const MV *center_mv,
770 MV *best_mv) { 859 MV *best_mv) {
771 return vp9_bigdia_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param), 860 return vp9_bigdia_search(x, ref_mv, MAX(MAX_MVSEARCH_STEPS - 2, search_param),
772 sad_per_bit, do_init_search, vfp, use_mvcost, 861 sad_per_bit, do_init_search, sad_list, vfp,
773 center_mv, best_mv); 862 use_mvcost, center_mv, best_mv);
774 } 863 }
775 864
776 #undef CHECK_BETTER 865 #undef CHECK_BETTER
777 866
778 int vp9_full_range_search_c(const MACROBLOCK *x, 867 int vp9_full_range_search_c(const MACROBLOCK *x,
779 const search_site_config *cfg, 868 const search_site_config *cfg,
780 MV *ref_mv, MV *best_mv, 869 MV *ref_mv, MV *best_mv,
781 int search_param, int sad_per_bit, int *num00, 870 int search_param, int sad_per_bit, int *num00,
782 const vp9_variance_fn_ptr_t *fn_ptr, 871 const vp9_variance_fn_ptr_t *fn_ptr,
783 const MV *center_mv) { 872 const MV *center_mv) {
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
1361 ref_mv->row += neighbors[best_site].row; 1450 ref_mv->row += neighbors[best_site].row;
1362 ref_mv->col += neighbors[best_site].col; 1451 ref_mv->col += neighbors[best_site].col;
1363 } 1452 }
1364 } 1453 }
1365 return best_sad; 1454 return best_sad;
1366 } 1455 }
1367 1456
1368 int vp9_full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x, 1457 int vp9_full_pixel_search(VP9_COMP *cpi, MACROBLOCK *x,
1369 BLOCK_SIZE bsize, MV *mvp_full, 1458 BLOCK_SIZE bsize, MV *mvp_full,
1370 int step_param, int error_per_bit, 1459 int step_param, int error_per_bit,
1460 int *sad_list,
1371 const MV *ref_mv, MV *tmp_mv, 1461 const MV *ref_mv, MV *tmp_mv,
1372 int var_max, int rd) { 1462 int var_max, int rd) {
1373 const SPEED_FEATURES *const sf = &cpi->sf; 1463 const SPEED_FEATURES *const sf = &cpi->sf;
1374 const SEARCH_METHODS method = sf->mv.search_method; 1464 const SEARCH_METHODS method = sf->mv.search_method;
1375 vp9_variance_fn_ptr_t *fn_ptr = &cpi->fn_ptr[bsize]; 1465 vp9_variance_fn_ptr_t *fn_ptr = &cpi->fn_ptr[bsize];
1376 int var = 0; 1466 int var = 0;
1467 if (sad_list) {
1468 sad_list[0] = INT_MAX;
1469 sad_list[1] = INT_MAX;
1470 sad_list[2] = INT_MAX;
1471 sad_list[3] = INT_MAX;
1472 sad_list[4] = INT_MAX;
1473 }
1377 1474
1378 switch (method) { 1475 switch (method) {
1379 case FAST_DIAMOND: 1476 case FAST_DIAMOND:
1380 var = vp9_fast_dia_search(x, mvp_full, step_param, error_per_bit, 0, 1477 var = vp9_fast_dia_search(x, mvp_full, step_param, error_per_bit, 0,
1381 fn_ptr, 1, ref_mv, tmp_mv); 1478 sad_list, fn_ptr, 1, ref_mv, tmp_mv);
1382 break; 1479 break;
1383 case FAST_HEX: 1480 case FAST_HEX:
1384 var = vp9_fast_hex_search(x, mvp_full, step_param, error_per_bit, 0, 1481 var = vp9_fast_hex_search(x, mvp_full, step_param, error_per_bit, 0,
1385 fn_ptr, 1, ref_mv, tmp_mv); 1482 sad_list, fn_ptr, 1, ref_mv, tmp_mv);
1386 break; 1483 break;
1387 case HEX: 1484 case HEX:
1388 var = vp9_hex_search(x, mvp_full, step_param, error_per_bit, 1, 1485 var = vp9_hex_search(x, mvp_full, step_param, error_per_bit, 1,
1389 fn_ptr, 1, ref_mv, tmp_mv); 1486 sad_list, fn_ptr, 1, ref_mv, tmp_mv);
1390 break; 1487 break;
1391 case SQUARE: 1488 case SQUARE:
1392 var = vp9_square_search(x, mvp_full, step_param, error_per_bit, 1, 1489 var = vp9_square_search(x, mvp_full, step_param, error_per_bit, 1,
1393 fn_ptr, 1, ref_mv, tmp_mv); 1490 sad_list, fn_ptr, 1, ref_mv, tmp_mv);
1394 break; 1491 break;
1395 case BIGDIA: 1492 case BIGDIA:
1396 var = vp9_bigdia_search(x, mvp_full, step_param, error_per_bit, 1, 1493 var = vp9_bigdia_search(x, mvp_full, step_param, error_per_bit, 1,
1397 fn_ptr, 1, ref_mv, tmp_mv); 1494 sad_list, fn_ptr, 1, ref_mv, tmp_mv);
1398 break; 1495 break;
1399 case NSTEP: 1496 case NSTEP:
1400 var = vp9_full_pixel_diamond(cpi, x, mvp_full, step_param, error_per_bit, 1497 var = vp9_full_pixel_diamond(cpi, x, mvp_full, step_param, error_per_bit,
1401 MAX_MVSEARCH_STEPS - 1 - step_param, 1498 MAX_MVSEARCH_STEPS - 1 - step_param,
1402 1, fn_ptr, ref_mv, tmp_mv); 1499 1, fn_ptr, ref_mv, tmp_mv);
1403 break; 1500 break;
1404 default: 1501 default:
1405 assert(!"Invalid search method."); 1502 assert(!"Invalid search method.");
1406 } 1503 }
1407 1504
1408 if (method != NSTEP && rd && var < var_max) 1505 if (method != NSTEP && rd && var < var_max)
1409 var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, fn_ptr, 1); 1506 var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, fn_ptr, 1);
1410 1507
1411 return var; 1508 return var;
1412 } 1509 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_pickmode.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698