/*
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */


#include "vpx_ports/config.h"
#include "vp8/encoder/variance.h"
#include "vp8/encoder/onyx_int.h"


void vp8_arch_x86_encoder_init(VP8_COMP *cpi);
void vp8_arch_arm_encoder_init(VP8_COMP *cpi);

void (*vp8_yv12_copy_partial_frame_ptr)(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc, int Fraction);
extern void vp8_yv12_copy_partial_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc, int Fraction);

void vp8_cmachine_specific_config(VP8_COMP *cpi) {
#if CONFIG_RUNTIME_CPU_DETECT
  cpi->rtcd.common                    = &cpi->common.rtcd;
  cpi->rtcd.variance.sad16x16              = vp8_sad16x16_c;
  cpi->rtcd.variance.sad16x8               = vp8_sad16x8_c;
  cpi->rtcd.variance.sad8x16               = vp8_sad8x16_c;
  cpi->rtcd.variance.sad8x8                = vp8_sad8x8_c;
  cpi->rtcd.variance.sad4x4                = vp8_sad4x4_c;

  cpi->rtcd.variance.sad16x16x3            = vp8_sad16x16x3_c;
  cpi->rtcd.variance.sad16x8x3             = vp8_sad16x8x3_c;
  cpi->rtcd.variance.sad8x16x3             = vp8_sad8x16x3_c;
  cpi->rtcd.variance.sad8x8x3              = vp8_sad8x8x3_c;
  cpi->rtcd.variance.sad4x4x3              = vp8_sad4x4x3_c;

  cpi->rtcd.variance.sad16x16x8            = vp8_sad16x16x8_c;
  cpi->rtcd.variance.sad16x8x8             = vp8_sad16x8x8_c;
  cpi->rtcd.variance.sad8x16x8             = vp8_sad8x16x8_c;
  cpi->rtcd.variance.sad8x8x8              = vp8_sad8x8x8_c;
  cpi->rtcd.variance.sad4x4x8              = vp8_sad4x4x8_c;

  cpi->rtcd.variance.sad16x16x4d           = vp8_sad16x16x4d_c;
  cpi->rtcd.variance.sad16x8x4d            = vp8_sad16x8x4d_c;
  cpi->rtcd.variance.sad8x16x4d            = vp8_sad8x16x4d_c;
  cpi->rtcd.variance.sad8x8x4d             = vp8_sad8x8x4d_c;
  cpi->rtcd.variance.sad4x4x4d             = vp8_sad4x4x4d_c;
#if ARCH_X86 || ARCH_X86_64
  cpi->rtcd.variance.copy32xn              = vp8_copy32xn_c;
#endif
  cpi->rtcd.variance.var4x4                = vp8_variance4x4_c;
  cpi->rtcd.variance.var8x8                = vp8_variance8x8_c;
  cpi->rtcd.variance.var8x16               = vp8_variance8x16_c;
  cpi->rtcd.variance.var16x8               = vp8_variance16x8_c;
  cpi->rtcd.variance.var16x16              = vp8_variance16x16_c;

  cpi->rtcd.variance.subpixvar4x4          = vp8_sub_pixel_variance4x4_c;
  cpi->rtcd.variance.subpixvar8x8          = vp8_sub_pixel_variance8x8_c;
  cpi->rtcd.variance.subpixvar8x16         = vp8_sub_pixel_variance8x16_c;
  cpi->rtcd.variance.subpixvar16x8         = vp8_sub_pixel_variance16x8_c;
  cpi->rtcd.variance.subpixvar16x16        = vp8_sub_pixel_variance16x16_c;
  cpi->rtcd.variance.halfpixvar16x16_h     = vp8_variance_halfpixvar16x16_h_c;
  cpi->rtcd.variance.halfpixvar16x16_v     = vp8_variance_halfpixvar16x16_v_c;
  cpi->rtcd.variance.halfpixvar16x16_hv    = vp8_variance_halfpixvar16x16_hv_c;
  cpi->rtcd.variance.subpixmse16x16        = vp8_sub_pixel_mse16x16_c;

  cpi->rtcd.variance.mse16x16              = vp8_mse16x16_c;
  cpi->rtcd.variance.getmbss               = vp8_get_mb_ss_c;

  cpi->rtcd.fdct.short8x8                  = vp8_short_fdct8x8_c;
  cpi->rtcd.fdct.haar_short2x2             = vp8_short_fhaar2x2_c;
  cpi->rtcd.fdct.short4x4                  = vp8_short_fdct4x4_c;
  cpi->rtcd.fdct.short8x4                  = vp8_short_fdct8x4_c;
  cpi->rtcd.fdct.fast4x4                   = vp8_short_fdct4x4_c;
  cpi->rtcd.fdct.fast8x4                   = vp8_short_fdct8x4_c;
  cpi->rtcd.fdct.walsh_short4x4            = vp8_short_walsh4x4_c;

  cpi->rtcd.encodemb.berr                  = vp8_block_error_c;
  cpi->rtcd.encodemb.mberr                 = vp8_mbblock_error_c;
  cpi->rtcd.encodemb.mbuverr               = vp8_mbuverror_c;
  cpi->rtcd.encodemb.subb                  = vp8_subtract_b_c;
  cpi->rtcd.encodemb.submby                = vp8_subtract_mby_c;
  cpi->rtcd.encodemb.submbuv               = vp8_subtract_mbuv_c;

  cpi->rtcd.search.full_search             = vp8_full_search_sad;
  cpi->rtcd.search.refining_search         = vp8_refining_search_sad;
  cpi->rtcd.search.diamond_search          = vp8_diamond_search_sad;
  cpi->rtcd.temporal.apply                 = vp8_temporal_filter_apply_c;
#if CONFIG_INTERNAL_STATS
  cpi->rtcd.variance.ssimpf_8x8            = vp8_ssim_parms_8x8_c;
  cpi->rtcd.variance.ssimpf_16x16          = vp8_ssim_parms_16x16_c;
#endif
#endif

  cpi->rtcd.variance.satd16x16             = vp8_satd16x16_c;
  vp8_yv12_copy_partial_frame_ptr = vp8_yv12_copy_partial_frame;

#if ARCH_X86 || ARCH_X86_64
  vp8_arch_x86_encoder_init(cpi);
#endif

#if ARCH_ARM
  vp8_arch_arm_encoder_init(cpi);
#endif

  cpi->rtcd.fdct.short4x4                  = vp8_short_fdct4x4_c;
  cpi->rtcd.fdct.short8x4                  = vp8_short_fdct8x4_c;
  cpi->rtcd.fdct.fast4x4                   = vp8_short_fdct4x4_c;
  cpi->rtcd.fdct.fast8x4                   = vp8_short_fdct8x4_c;
  cpi->rtcd.fdct.walsh_short4x4            = vp8_short_walsh4x4_c;

}
