diff options
Diffstat (limited to 'vp8/decoder')
-rw-r--r-- | vp8/decoder/arm/arm_dsystemdependent.c | 66 | ||||
-rw-r--r-- | vp8/decoder/arm/dequantize_arm.h | 4 | ||||
-rw-r--r-- | vp8/decoder/arm/dsystemdependent.c | 39 | ||||
-rw-r--r-- | vp8/decoder/generic/dsystemdependent.c | 5 | ||||
-rw-r--r-- | vp8/decoder/onyxd_if.c | 58 |
5 files changed, 126 insertions, 46 deletions
diff --git a/vp8/decoder/arm/arm_dsystemdependent.c b/vp8/decoder/arm/arm_dsystemdependent.c new file mode 100644 index 000000000..77cff47db --- /dev/null +++ b/vp8/decoder/arm/arm_dsystemdependent.c @@ -0,0 +1,66 @@ +/* + * 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 "vpx_ports/arm.h" +#include "blockd.h" +#include "pragmas.h" +#include "postproc.h" +#include "dboolhuff.h" +#include "dequantize.h" +#include "onyxd_int.h" + +void vp8_arch_arm_decode_init(VP8D_COMP *pbi) +{ +#if CONFIG_RUNTIME_CPU_DETECT + int flags = pbi->common.rtcd.flags; + int has_edsp = flags & HAS_EDSP; + int has_media = flags & HAS_MEDIA; + int has_neon = flags & HAS_NEON; + +#if HAVE_ARMV6 + if (has_media) + { + pbi->dequant.block = vp8_dequantize_b_v6; + pbi->dequant.idct_add = vp8_dequant_idct_add_v6; + pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_v6; + pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_v6; + pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_v6; + pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_v6; +#if 0 //For use with RTCD, when implemented + pbi->dboolhuff.start = vp8dx_start_decode_c; + pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c; + pbi->dboolhuff.debool = vp8dx_decode_bool_c; + pbi->dboolhuff.devalue = vp8dx_decode_value_c; +#endif + } +#endif + +#if HAVE_ARMV7 + if (has_neon) + { + pbi->dequant.block = vp8_dequantize_b_neon; + pbi->dequant.idct_add = vp8_dequant_idct_add_neon; + /*This is not used: NEON always dequants two blocks at once. + pbi->dequant.dc_idct_add = vp8_dequant_dc_idct_add_neon;*/ + pbi->dequant.dc_idct_add_y_block = vp8_dequant_dc_idct_add_y_block_neon; + pbi->dequant.idct_add_y_block = vp8_dequant_idct_add_y_block_neon; + pbi->dequant.idct_add_uv_block = vp8_dequant_idct_add_uv_block_neon; +#if 0 //For use with RTCD, when implemented + pbi->dboolhuff.start = vp8dx_start_decode_c; + pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c; + pbi->dboolhuff.debool = vp8dx_decode_bool_c; + pbi->dboolhuff.devalue = vp8dx_decode_value_c; +#endif + } +#endif +#endif +} diff --git a/vp8/decoder/arm/dequantize_arm.h b/vp8/decoder/arm/dequantize_arm.h index 40151e01a..b7d800d26 100644 --- a/vp8/decoder/arm/dequantize_arm.h +++ b/vp8/decoder/arm/dequantize_arm.h @@ -20,6 +20,7 @@ extern prototype_dequant_dc_idct_add_y_block(vp8_dequant_dc_idct_add_y_block_v6) extern prototype_dequant_idct_add_y_block(vp8_dequant_idct_add_y_block_v6); extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block_v6); +#if !CONFIG_RUNTIME_CPU_DETECT #undef vp8_dequant_block #define vp8_dequant_block vp8_dequantize_b_v6 @@ -38,6 +39,7 @@ extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block_v6); #undef vp8_dequant_idct_add_uv_block #define vp8_dequant_idct_add_uv_block vp8_dequant_idct_add_uv_block_v6 #endif +#endif #if HAVE_ARMV7 extern prototype_dequant_block(vp8_dequantize_b_neon); @@ -47,6 +49,7 @@ extern prototype_dequant_dc_idct_add_y_block(vp8_dequant_dc_idct_add_y_block_neo extern prototype_dequant_idct_add_y_block(vp8_dequant_idct_add_y_block_neon); extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block_neon); +#if !CONFIG_RUNTIME_CPU_DETECT #undef vp8_dequant_block #define vp8_dequant_block vp8_dequantize_b_neon @@ -65,5 +68,6 @@ extern prototype_dequant_idct_add_uv_block(vp8_dequant_idct_add_uv_block_neon); #undef vp8_dequant_idct_add_uv_block #define vp8_dequant_idct_add_uv_block vp8_dequant_idct_add_uv_block_neon #endif +#endif #endif diff --git a/vp8/decoder/arm/dsystemdependent.c b/vp8/decoder/arm/dsystemdependent.c deleted file mode 100644 index 9dcf7b657..000000000 --- a/vp8/decoder/arm/dsystemdependent.c +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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 "blockd.h" -#include "pragmas.h" -#include "postproc.h" -#include "dboolhuff.h" -#include "dequantize.h" -#include "onyxd_int.h" - -void vp8_dmachine_specific_config(VP8D_COMP *pbi) -{ -#if CONFIG_RUNTIME_CPU_DETECT - pbi->mb.rtcd = &pbi->common.rtcd; -#if HAVE_ARMV7 - pbi->dequant.block = vp8_dequantize_b_neon; - pbi->dboolhuff.start = vp8dx_start_decode_c; - pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c; - pbi->dboolhuff.debool = vp8dx_decode_bool_c; - pbi->dboolhuff.devalue = vp8dx_decode_value_c; - -#elif HAVE_ARMV6 - pbi->dequant.block = vp8_dequantize_b_v6; - pbi->dboolhuff.start = vp8dx_start_decode_c; - pbi->dboolhuff.fill = vp8dx_bool_decoder_fill_c; - pbi->dboolhuff.debool = vp8dx_decode_bool_c; - pbi->dboolhuff.devalue = vp8dx_decode_value_c; -#endif -#endif -} diff --git a/vp8/decoder/generic/dsystemdependent.c b/vp8/decoder/generic/dsystemdependent.c index 60f2af5b8..84de7af43 100644 --- a/vp8/decoder/generic/dsystemdependent.c +++ b/vp8/decoder/generic/dsystemdependent.c @@ -14,6 +14,7 @@ #include "onyxd_int.h" extern void vp8_arch_x86_decode_init(VP8D_COMP *pbi); +extern void vp8_arch_arm_decode_init(VP8D_COMP *pbi); void vp8_dmachine_specific_config(VP8D_COMP *pbi) { @@ -37,4 +38,8 @@ void vp8_dmachine_specific_config(VP8D_COMP *pbi) #if ARCH_X86 || ARCH_X86_64 vp8_arch_x86_decode_init(pbi); #endif + +#if ARCH_ARM + vp8_arch_arm_decode_init(pbi); +#endif } diff --git a/vp8/decoder/onyxd_if.c b/vp8/decoder/onyxd_if.c index 884c38da0..b5a6e3e85 100644 --- a/vp8/decoder/onyxd_if.c +++ b/vp8/decoder/onyxd_if.c @@ -30,6 +30,9 @@ #include "systemdependent.h" #include "vpx_ports/vpx_timer.h" #include "detokenize.h" +#if ARCH_ARM +#include "vpx_ports/arm.h" +#endif extern void vp8_init_loop_filter(VP8_COMMON *cm); extern void vp8cx_init_de_quantizer(VP8D_COMP *pbi); @@ -224,7 +227,6 @@ int vp8dx_set_reference(VP8D_PTR ptr, VP8_REFFRAME ref_frame_flag, YV12_BUFFER_C #if HAVE_ARMV7 extern void vp8_push_neon(INT64 *store); extern void vp8_pop_neon(INT64 *store); -static INT64 dx_store_reg[8]; #endif static int get_free_fb (VP8_COMMON *cm) @@ -312,6 +314,9 @@ static int swap_frame_buffers (VP8_COMMON *cm) int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsigned char *source, INT64 time_stamp) { +#if HAVE_ARMV7 + INT64 dx_store_reg[8]; +#endif VP8D_COMP *pbi = (VP8D_COMP *) ptr; VP8_COMMON *cm = &pbi->common; int retcode = 0; @@ -327,10 +332,27 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign pbi->common.error.error_code = VPX_CODEC_OK; +#if HAVE_ARMV7 +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_push_neon(dx_store_reg); + } +#endif + cm->new_fb_idx = get_free_fb (cm); if (setjmp(pbi->common.error.jmp)) { +#if HAVE_ARMV7 +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_pop_neon(dx_store_reg); + } +#endif pbi->common.error.setjmp = 0; if (cm->fb_idx_ref_cnt[cm->new_fb_idx] > 0) cm->fb_idx_ref_cnt[cm->new_fb_idx]--; @@ -339,10 +361,6 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign pbi->common.error.setjmp = 1; -#if HAVE_ARMV7 - vp8_push_neon(dx_store_reg); -#endif - vpx_usec_timer_start(&timer); //cm->current_video_frame++; @@ -354,7 +372,12 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign if (retcode < 0) { #if HAVE_ARMV7 - vp8_pop_neon(dx_store_reg); +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_pop_neon(dx_store_reg); + } #endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; @@ -367,6 +390,14 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign { if (swap_frame_buffers (cm)) { +#if HAVE_ARMV7 +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_pop_neon(dx_store_reg); + } +#endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; return -1; @@ -375,6 +406,14 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign { if (swap_frame_buffers (cm)) { +#if HAVE_ARMV7 +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_pop_neon(dx_store_reg); + } +#endif pbi->common.error.error_code = VPX_CODEC_ERROR; pbi->common.error.setjmp = 0; return -1; @@ -455,7 +494,12 @@ int vp8dx_receive_compressed_data(VP8D_PTR ptr, unsigned long size, const unsign #endif #if HAVE_ARMV7 - vp8_pop_neon(dx_store_reg); +#if CONFIG_RUNTIME_CPU_DETECT + if (cm->rtcd.flags & HAS_NEON) +#endif + { + vp8_pop_neon(dx_store_reg); + } #endif pbi->common.error.setjmp = 0; return retcode; |