193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner/*
293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *
493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  Use of this source code is governed by a BSD-style license
593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  that can be found in the LICENSE file in the root of the source
693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  tree. An additional intellectual property rights grant can be found
793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  in the file PATENTS.  All contributing project authors may
893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner *  be found in the AUTHORS file in the root of the source tree.
993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner */
1093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
1193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
1293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#ifndef __INC_MCOMP_H
1393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define __INC_MCOMP_H
1493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
1593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#include "block.h"
1693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#include "variance.h"
1793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
1893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#ifdef ENTROPY_STATS
1993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern void init_mv_ref_counts();
2093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern void accum_mv_refs(MB_PREDICTION_MODE, const int near_mv_ref_cts[4]);
2193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#endif
2293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
2393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
2493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define MAX_MVSEARCH_STEPS 8                                    // The maximum number of steps in a step search given the largest allowed initial step
2593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define MAX_FULL_PEL_VAL ((1 << (MAX_MVSEARCH_STEPS+3)) - 8)    // Max full pel mv specified in 1/8 pel units
2693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define MAX_FIRST_STEP (1 << (MAX_MVSEARCH_STEPS-1))            // Maximum size of the first step in full pel units
2793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
2893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern void print_mode_context(void);
2993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern int vp8_mv_bit_cost(MV *mv, MV *ref, int *mvcost[2], int Weight);
3093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern void vp8_init_dsmotion_compensation(MACROBLOCK *x, int stride);
3193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern void vp8_init3smotion_compensation(MACROBLOCK *x,  int stride);
3293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
3393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
3493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern int vp8_hex_search
3593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner(
36f5a1fb6b247611b92d9dec9476202b477661dbe8Chris Lattner    MACROBLOCK *x,
37f5a1fb6b247611b92d9dec9476202b477661dbe8Chris Lattner    BLOCK *b,
3893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    BLOCKD *d,
3993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    MV *ref_mv,
4093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    MV *best_mv,
4193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    int search_param,
4293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    int error_per_bit,
4393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    int *num00,
4493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    const vp8_variance_fn_ptr_t *vf,
4593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    int *mvsadcost[2],
4693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    int *mvcost[2],
4793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    MV *center_mv
4893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner);
4993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
5093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnertypedef int (fractional_mv_step_fp)
5193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    (MACROBLOCK *x, BLOCK *b, BLOCKD *d, MV *bestmv, MV *ref_mv,
5293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int error_per_bit, const vp8_variance_fn_ptr_t *vfp, int *mvcost[2]);
5393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern fractional_mv_step_fp vp8_find_best_sub_pixel_step_iteratively;
5493f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern fractional_mv_step_fp vp8_find_best_sub_pixel_step;
5593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern fractional_mv_step_fp vp8_find_best_half_pixel_step;
5693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattnerextern fractional_mv_step_fp vp8_skip_fractional_mv_step;
5793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
5893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define prototype_full_search_sad(sym)\
590bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner    int (sym)\
600bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner    (\
610bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner     MACROBLOCK *x, \
620bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner     BLOCK *b, \
630bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner     BLOCKD *d, \
640bef562ea253878ee92a1eaf6db05b0c2edfa74cChris Lattner     MV *ref_mv, \
6593f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int error_per_bit, \
6693f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int distance, \
6793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     vp8_variance_fn_ptr_t *fn_ptr, \
6893f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int *mvcost[2], \
6993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int *mvsadcost[2], \
7093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     MV *center_mv \
7193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner    )
7293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner
7393f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner#define prototype_diamond_search_sad(sym)\
741a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner    int (sym)\
751a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner    (\
765fb107287fd8d35b8fc39aa3e6b084fb2871a8ffChris Lattner     MACROBLOCK *x, \
7793f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     BLOCK *b, \
785fb107287fd8d35b8fc39aa3e6b084fb2871a8ffChris Lattner     BLOCKD *d, \
7993f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     MV *ref_mv, \
8093f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     MV *best_mv, \
8193f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int search_param, \
8293f3bcf7f323069e40d9abb950da73d437b6f7daChris Lattner     int error_per_bit, \
831a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner     int *num00, \
841a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner     vp8_variance_fn_ptr_t *fn_ptr, \
851a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner     int *mvsadcost[2], \
861a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner     int *mvcost[2], \
871a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner     MV *center_mv \
881a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner    )
891a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
901a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#if ARCH_X86 || ARCH_X86_64
911a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#include "x86/mcomp_x86.h"
921a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#endif
931a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
941a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnertypedef prototype_full_search_sad(*vp8_full_search_fn_t);
951a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_full_search_sad(vp8_full_search_sad);
961a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_full_search_sad(vp8_full_search_sadx3);
971a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_full_search_sad(vp8_full_search_sadx8);
981a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
991a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnertypedef prototype_diamond_search_sad(*vp8_diamond_search_fn_t);
1001a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_diamond_search_sad(vp8_diamond_search_sad);
1011a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_diamond_search_sad(vp8_diamond_search_sadx4);
1021a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
1031a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#ifndef vp8_search_full_search
1041a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#define vp8_search_full_search vp8_full_search_sad
1051a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#endif
1061a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_full_search_sad(vp8_search_full_search);
1071a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
1081a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#ifndef vp8_search_diamond_search
1091a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#define vp8_search_diamond_search vp8_diamond_search_sad
1101a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#endif
1111a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnerextern prototype_diamond_search_sad(vp8_search_diamond_search);
1121a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
1131a8d4de397c360a76f1389d15e862eba265d71fdChris Lattnertypedef struct
1141a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner{
1151a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner    prototype_full_search_sad(*full_search);
1161a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner    prototype_diamond_search_sad(*diamond_search);
1171a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner} vp8_search_rtcd_vtable_t;
1181a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
1191a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#if CONFIG_RUNTIME_CPU_DETECT
1201a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#define SEARCH_INVOKE(ctx,fn) (ctx)->fn
1211a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#else
1221a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#define SEARCH_INVOKE(ctx,fn) vp8_search_##fn
1231a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#endif
1241a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner
1251a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner#endif
1261a8d4de397c360a76f1389d15e862eba265d71fdChris Lattner