1538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber/* 2538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * 4538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * Use of this source code is governed by a BSD-style license 5538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * that can be found in the LICENSE file in the root of the source 6538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * tree. An additional intellectual property rights grant can be found 7538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * in the file PATENTS. All contributing project authors may 8538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * be found in the AUTHORS file in the root of the source tree. 9538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 10538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 11538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 12538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "vpx_ports/config.h" 13538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#include "vpx_ports/arm.h" 1479f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/encoder/variance.h" 1579f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/encoder/onyx_int.h" 16538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 17538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void (*vp8_yv12_copy_partial_frame_ptr)(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc, int Fraction); 18538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void vp8_yv12_copy_partial_frame(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc, int Fraction); 19538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huberextern void vpxyv12_copy_partial_frame_neon(YV12_BUFFER_CONFIG *src_ybc, YV12_BUFFER_CONFIG *dst_ybc, int Fraction); 20538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 21538f6170b788de7408b06efc6613dc98579aa6a6Andreas Hubervoid vp8_arch_arm_encoder_init(VP8_COMP *cpi) 22538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber{ 23538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if CONFIG_RUNTIME_CPU_DETECT 24538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int flags = cpi->common.rtcd.flags; 25538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int has_edsp = flags & HAS_EDSP; 26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int has_media = flags & HAS_MEDIA; 27538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber int has_neon = flags & HAS_NEON; 28538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 29538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if HAVE_ARMV6 30538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (has_media) 31538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 3279f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.sad16x16 = vp8_sad16x16_armv6; 3379f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.sad16x8 = vp8_sad16x8_c; 34538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad8x16 = vp8_sad8x16_c; 35538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad8x8 = vp8_sad8x8_c; 36538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad4x4 = vp8_sad4x4_c;*/ 37538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 3879f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.var4x4 = vp8_variance4x4_c;*/ 3979f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.var8x8 = vp8_variance8x8_armv6; 4079f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.var8x16 = vp8_variance8x16_c; 4179f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.var16x8 = vp8_variance16x8_c;*/ 4279f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.var16x16 = vp8_variance16x16_armv6; 43538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 4479f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.subpixvar4x4 = vp8_sub_pixel_variance4x4_c;*/ 4579f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.subpixvar8x8 = vp8_sub_pixel_variance8x8_armv6; 4679f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.subpixvar8x16 = vp8_sub_pixel_variance8x16_c; 4779f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.subpixvar16x8 = vp8_sub_pixel_variance16x8_c;*/ 4879f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.subpixvar16x16 = vp8_sub_pixel_variance16x16_armv6; 4979f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.halfpixvar16x16_h = vp8_variance_halfpixvar16x16_h_armv6; 5079f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.halfpixvar16x16_v = vp8_variance_halfpixvar16x16_v_armv6; 5179f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.halfpixvar16x16_hv = vp8_variance_halfpixvar16x16_hv_armv6; 52538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 5379f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.variance.mse16x16 = vp8_mse16x16_armv6; 5479f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.variance.getmbss = vp8_get_mb_ss_c;*/ 55538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 56538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.get16x16prederror = vp8_get16x16pred_error_c; 57538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get8x8var = vp8_get8x8var_c; 58538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get16x16var = vp8_get16x16var_c;; 59538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get4x4sse_cs = vp8_get4x4sse_cs_c;*/ 60538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 61538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.fdct.short4x4 = vp8_short_fdct4x4_c; 6279f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.fdct.short8x4 = vp8_short_fdct8x4_c;*/ 6379f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.fdct.fast4x4 = vp8_fast_fdct4x4_armv6; 6479f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.fdct.fast8x4 = vp8_fast_fdct8x4_armv6; 65538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_armv6; 66538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 67538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.encodemb.berr = vp8_block_error_c; 68538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.mberr = vp8_mbblock_error_c; 6979f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.encodemb.mbuverr = vp8_mbuverror_c;*/ 7079f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.encodemb.subb = vp8_subtract_b_armv6; 7179f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.encodemb.submby = vp8_subtract_mby_armv6; 7279f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.encodemb.submbuv = vp8_subtract_mbuv_armv6; 73538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 7479f15823c34ae1e423108295e416213200bb280fAndreas Huber /*cpi->rtcd.quantize.quantb = vp8_regular_quantize_b;*/ 7579f15823c34ae1e423108295e416213200bb280fAndreas Huber cpi->rtcd.quantize.fastquantb = vp8_fast_quantize_b_armv6; 76538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 77538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 78538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 79538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if HAVE_ARMV7 80538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (has_neon) 81538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 82538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad16x16 = vp8_sad16x16_neon; 83538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad16x8 = vp8_sad16x8_neon; 84538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad8x16 = vp8_sad8x16_neon; 85538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad8x8 = vp8_sad8x8_neon; 86538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.sad4x4 = vp8_sad4x4_neon; 87538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 88538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.var4x4 = vp8_variance4x4_c;*/ 89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.var8x8 = vp8_variance8x8_neon; 90538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.var8x16 = vp8_variance8x16_neon; 91538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.var16x8 = vp8_variance16x8_neon; 92538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.var16x16 = vp8_variance16x16_neon; 93538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 94538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.subpixvar4x4 = vp8_sub_pixel_variance4x4_c;*/ 95538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.subpixvar8x8 = vp8_sub_pixel_variance8x8_neon; 96538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.subpixvar8x16 = vp8_sub_pixel_variance8x16_c; 97538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.subpixvar16x8 = vp8_sub_pixel_variance16x8_c;*/ 98538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.subpixvar16x16 = vp8_sub_pixel_variance16x16_neon; 99538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.halfpixvar16x16_h = vp8_variance_halfpixvar16x16_h_neon; 100538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.halfpixvar16x16_v = vp8_variance_halfpixvar16x16_v_neon; 101538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.halfpixvar16x16_hv = vp8_variance_halfpixvar16x16_hv_neon; 102538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 103538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.mse16x16 = vp8_mse16x16_neon; 104538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.getmbss = vp8_get_mb_ss_c;*/ 105538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 106538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get16x16prederror = vp8_get16x16pred_error_neon; 107538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.variance.get8x8var = vp8_get8x8var_c; 108538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get16x16var = vp8_get16x16var_c;*/ 109538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.variance.get4x4sse_cs = vp8_get4x4sse_cs_neon; 110538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 111538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.short4x4 = vp8_short_fdct4x4_neon; 112538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.short8x4 = vp8_short_fdct8x4_neon; 113538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.fast4x4 = vp8_fast_fdct4x4_neon; 114538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.fast8x4 = vp8_fast_fdct8x4_neon; 115538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.fdct.walsh_short4x4 = vp8_short_walsh4x4_neon; 116538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 117538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.encodemb.berr = vp8_block_error_c; 118538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.mberr = vp8_mbblock_error_c; 119538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.mbuverr = vp8_mbuverror_c;*/ 120538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.subb = vp8_subtract_b_neon; 121538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.submby = vp8_subtract_mby_neon; 122538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.encodemb.submbuv = vp8_subtract_mbuv_neon; 123538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 124538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.quantize.quantb = vp8_regular_quantize_b; 125538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber cpi->rtcd.quantize.fastquantb = vp8_fast_quantize_b_c;*/ 126538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /* The neon quantizer has not been updated to match the new exact 127538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber * quantizer introduced in commit e04e2935 128538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber */ 129538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber /*cpi->rtcd.quantize.fastquantb = vp8_fast_quantize_b_neon;*/ 130538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 131538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 132538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber 133538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if HAVE_ARMV7 134538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#if CONFIG_RUNTIME_CPU_DETECT 135538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber if (has_neon) 136538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 137538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber { 138538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber vp8_yv12_copy_partial_frame_ptr = vpxyv12_copy_partial_frame_neon; 139538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber } 140538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 141538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber#endif 142538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber} 143