190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1279f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/encoder/variance.h"
1379f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/encoder/onyx_int.h"
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberSADFunction *vp8_sad16x16;
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberSADFunction *vp8_sad16x8;
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberSADFunction *vp8_sad8x16;
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberSADFunction *vp8_sad8x8;
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas HuberSADFunction *vp8_sad4x4;
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_variance4x4;
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_variance8x8;
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_variance8x16;
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_variance16x8;
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_variance16x16;
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervariance_function *vp8_mse16x16;
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub_pixel_variance_function *vp8_sub_pixel_variance4x4;
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub_pixel_variance_function *vp8_sub_pixel_variance8x8;
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub_pixel_variance_function *vp8_sub_pixel_variance8x16;
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub_pixel_variance_function *vp8_sub_pixel_variance16x8;
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubersub_pixel_variance_function *vp8_sub_pixel_variance16x16;
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint (*vp8_block_error)(short *coeff, short *dqcoeff);
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint (*vp8_mbblock_error)(MACROBLOCK *mb, int dc);
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberint (*vp8_mbuverror)(MACROBLOCK *mb);
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int (*vp8_get_mb_ss)(short *);
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_short_fdct4x4)(short *input, short *output, int pitch);
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_short_fdct8x4)(short *input, short *output, int pitch);
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_fast_fdct4x4)(short *input, short *output, int pitch);
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_fast_fdct8x4)(short *input, short *output, int pitch);
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*short_walsh4x4)(short *input, short *output, int pitch);
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_subtract_b)(BLOCK *be, BLOCKD *bd, int pitch);
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_subtract_mby)(short *diff, unsigned char *src, unsigned char *pred, int stride);
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_subtract_mbuv)(short *diff, unsigned char *usrc, unsigned char *vsrc, unsigned char *pred, int stride);
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid (*vp8_fast_quantize_b)(BLOCK *b, BLOCKD *d);
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberunsigned int (*vp8_get4x4sse_cs)(unsigned char *src_ptr, int  source_stride, unsigned char *ref_ptr, int  recon_stride);
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// c imports
5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int block_error_c(short *coeff, short *dqcoeff);
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vp8_mbblock_error_c(MACROBLOCK *mb, int dc);
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vp8_mbuverror_c(MACROBLOCK *mb);
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get8x8var_c(unsigned char *src_ptr, int  source_stride, unsigned char *ref_ptr, int  recon_stride, unsigned int *SSE, int *Sum);
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void short_fdct4x4_c(short *input, short *output, int pitch);
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void short_fdct8x4_c(short *input, short *output, int pitch);
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_short_walsh4x4_c(short *input, short *output, int pitch);
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_subtract_b_c(BLOCK *be, BLOCKD *bd, int pitch);
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void subtract_mby_c(short *diff, unsigned char *src, unsigned char *pred, int stride);
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void subtract_mbuv_c(short *diff, unsigned char *usrc, unsigned char *vsrc, unsigned char *pred, int stride);
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_fast_quantize_b_c(BLOCK *b, BLOCKD *d);
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction sad16x16_c;
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction sad16x8_c;
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction sad8x16_c;
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction sad8x8_c;
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction sad4x4_c;
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function variance16x16_c;
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function variance8x16_c;
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function variance16x8_c;
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function variance8x8_c;
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function variance4x4_c;
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function mse16x16_c;
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function sub_pixel_variance4x4_c;
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function sub_pixel_variance8x8_c;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function sub_pixel_variance8x16_c;
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function sub_pixel_variance16x8_c;
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function sub_pixel_variance16x16_c;
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get_mb_ss_c(short *);
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get4x4sse_cs_c(unsigned char *src_ptr, int  source_stride, unsigned char *ref_ptr, int  recon_stride);
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber// ppc
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern int vp8_block_error_ppc(short *coeff, short *dqcoeff);
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_short_fdct4x4_ppc(short *input, short *output, int pitch);
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_short_fdct8x4_ppc(short *input, short *output, int pitch);
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_subtract_mby_ppc(short *diff, unsigned char *src, unsigned char *pred, int stride);
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_subtract_mbuv_ppc(short *diff, unsigned char *usrc, unsigned char *vsrc, unsigned char *pred, int stride);
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction vp8_sad16x16_ppc;
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction vp8_sad16x8_ppc;
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction vp8_sad8x16_ppc;
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction vp8_sad8x8_ppc;
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern SADFunction vp8_sad4x4_ppc;
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_variance16x16_ppc;
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_variance8x16_ppc;
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_variance16x8_ppc;
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_variance8x8_ppc;
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_variance4x4_ppc;
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern variance_function vp8_mse16x16_ppc;
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function vp8_sub_pixel_variance4x4_ppc;
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function vp8_sub_pixel_variance8x8_ppc;
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function vp8_sub_pixel_variance8x16_ppc;
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function vp8_sub_pixel_variance16x8_ppc;
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern sub_pixel_variance_function vp8_sub_pixel_variance16x16_ppc;
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get8x8var_ppc(unsigned char *src_ptr, int  source_stride, unsigned char *ref_ptr, int  recon_stride, unsigned int *SSE, int *Sum);
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern unsigned int vp8_get16x16var_ppc(unsigned char *src_ptr, int  source_stride, unsigned char *ref_ptr, int  recon_stride, unsigned int *SSE, int *Sum);
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_cmachine_specific_config(void)
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    // Pure C:
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_mbuverror               = vp8_mbuverror_c;
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_fast_quantize_b           = vp8_fast_quantize_b_c;
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_short_fdct4x4            = vp8_short_fdct4x4_ppc;
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_short_fdct8x4            = vp8_short_fdct8x4_ppc;
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_fast_fdct4x4             = vp8_short_fdct4x4_ppc;
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_fast_fdct8x4             = vp8_short_fdct8x4_ppc;
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    short_walsh4x4               = vp8_short_walsh4x4_c;
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_variance4x4             = vp8_variance4x4_ppc;
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_variance8x8             = vp8_variance8x8_ppc;
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_variance8x16            = vp8_variance8x16_ppc;
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_variance16x8            = vp8_variance16x8_ppc;
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_variance16x16           = vp8_variance16x16_ppc;
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_mse16x16                = vp8_mse16x16_ppc;
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sub_pixel_variance4x4     = vp8_sub_pixel_variance4x4_ppc;
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sub_pixel_variance8x8     = vp8_sub_pixel_variance8x8_ppc;
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sub_pixel_variance8x16    = vp8_sub_pixel_variance8x16_ppc;
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sub_pixel_variance16x8    = vp8_sub_pixel_variance16x8_ppc;
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sub_pixel_variance16x16   = vp8_sub_pixel_variance16x16_ppc;
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_get_mb_ss                 = vp8_get_mb_ss_c;
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_get4x4sse_cs            = vp8_get4x4sse_cs_c;
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sad16x16                = vp8_sad16x16_ppc;
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sad16x8                 = vp8_sad16x8_ppc;
15090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sad8x16                 = vp8_sad8x16_ppc;
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sad8x8                  = vp8_sad8x8_ppc;
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_sad4x4                  = vp8_sad4x4_ppc;
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_block_error              = vp8_block_error_ppc;
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_mbblock_error            = vp8_mbblock_error_c;
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_subtract_b               = vp8_subtract_b_c;
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_subtract_mby             = vp8_subtract_mby_ppc;
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vp8_subtract_mbuv            = vp8_subtract_mbuv_ppc;
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
161