diff options
Diffstat (limited to 'vp8/decoder/x86')
-rw-r--r-- | vp8/decoder/x86/dequantize_mmx.asm | 410 | ||||
-rw-r--r-- | vp8/decoder/x86/dequantize_x86.h | 40 | ||||
-rw-r--r-- | vp8/decoder/x86/onyxdxv.c | 1079 | ||||
-rw-r--r-- | vp8/decoder/x86/x86_dsystemdependent.c | 51 |
4 files changed, 1580 insertions, 0 deletions
diff --git a/vp8/decoder/x86/dequantize_mmx.asm b/vp8/decoder/x86/dequantize_mmx.asm new file mode 100644 index 000000000..02be4872e --- /dev/null +++ b/vp8/decoder/x86/dequantize_mmx.asm @@ -0,0 +1,410 @@ +; +; Copyright (c) 2010 The VP8 project authors. All Rights Reserved. +; +; Use of this source code is governed by a BSD-style license and patent +; grant that can be found in the LICENSE file in the root of the source +; tree. All contributing project authors may be found in the AUTHORS +; file in the root of the source tree. +; + + +%include "vpx_ports/x86_abi_support.asm" + + +;void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q) +global sym(vp8_dequantize_b_impl_mmx) +sym(vp8_dequantize_b_impl_mmx): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 3 + push rsi + push rdi + ; end prolog + + mov rsi, arg(0) ;sq + mov rdi, arg(1) ;dq + mov rax, arg(2) ;q + + movq mm1, [rsi] + pmullw mm1, [rax+0] ; mm4 *= kernel 0 modifiers. + movq [rdi], mm1 + + movq mm1, [rsi+8] + pmullw mm1, [rax+8] ; mm4 *= kernel 0 modifiers. + movq [rdi+8], mm1 + + movq mm1, [rsi+16] + pmullw mm1, [rax+16] ; mm4 *= kernel 0 modifiers. + movq [rdi+16], mm1 + + movq mm1, [rsi+24] + pmullw mm1, [rax+24] ; mm4 *= kernel 0 modifiers. + movq [rdi+24], mm1 + + ; begin epilog + pop rdi + pop rsi + UNSHADOW_ARGS + pop rbp + ret + + +;void dequant_idct_mmx(short *input, short *dq, short *output, int pitch) +global sym(vp8_dequant_idct_mmx) +sym(vp8_dequant_idct_mmx): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 4 + GET_GOT rbx + push rsi + push rdi + ; end prolog + + mov rax, arg(0) ;input + mov rdx, arg(1) ;dq + + + movq mm0, [rax ] + pmullw mm0, [rdx] + + movq mm1, [rax +8] + pmullw mm1, [rdx +8] + + movq mm2, [rax+16] + pmullw mm2, [rdx+16] + + movq mm3, [rax+24] + pmullw mm3, [rdx+24] + + mov rdx, arg(2) ;output + pxor mm7, mm7 + + + movq [rax], mm7 + movq [rax+8], mm7 + + movq [rax+16],mm7 + movq [rax+24],mm7 + + + movsxd rax, dword ptr arg(3) ;pitch + + psubw mm0, mm2 ; b1= 0-2 + paddw mm2, mm2 ; + + movq mm5, mm1 + paddw mm2, mm0 ; a1 =0+2 + + pmulhw mm5, [x_s1sqr2 GLOBAL]; + paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) + + movq mm7, mm3 ; + pmulhw mm7, [x_c1sqr2less1 GLOBAL]; + + paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) + psubw mm7, mm5 ; c1 + + movq mm5, mm1 + movq mm4, mm3 + + pmulhw mm5, [x_c1sqr2less1 GLOBAL] + paddw mm5, mm1 + + pmulhw mm3, [x_s1sqr2 GLOBAL] + paddw mm3, mm4 + + paddw mm3, mm5 ; d1 + movq mm6, mm2 ; a1 + + movq mm4, mm0 ; b1 + paddw mm2, mm3 ;0 + + paddw mm4, mm7 ;1 + psubw mm0, mm7 ;2 + + psubw mm6, mm3 ;3 + + movq mm1, mm2 ; 03 02 01 00 + movq mm3, mm4 ; 23 22 21 20 + + punpcklwd mm1, mm0 ; 11 01 10 00 + punpckhwd mm2, mm0 ; 13 03 12 02 + + punpcklwd mm3, mm6 ; 31 21 30 20 + punpckhwd mm4, mm6 ; 33 23 32 22 + + movq mm0, mm1 ; 11 01 10 00 + movq mm5, mm2 ; 13 03 12 02 + + punpckldq mm0, mm3 ; 30 20 10 00 + punpckhdq mm1, mm3 ; 31 21 11 01 + + punpckldq mm2, mm4 ; 32 22 12 02 + punpckhdq mm5, mm4 ; 33 23 13 03 + + movq mm3, mm5 ; 33 23 13 03 + + psubw mm0, mm2 ; b1= 0-2 + paddw mm2, mm2 ; + + movq mm5, mm1 + paddw mm2, mm0 ; a1 =0+2 + + pmulhw mm5, [x_s1sqr2 GLOBAL]; + paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) + + movq mm7, mm3 ; + pmulhw mm7, [x_c1sqr2less1 GLOBAL]; + + paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) + psubw mm7, mm5 ; c1 + + movq mm5, mm1 + movq mm4, mm3 + + pmulhw mm5, [x_c1sqr2less1 GLOBAL] + paddw mm5, mm1 + + pmulhw mm3, [x_s1sqr2 GLOBAL] + paddw mm3, mm4 + + paddw mm3, mm5 ; d1 + paddw mm0, [fours GLOBAL] + + paddw mm2, [fours GLOBAL] + movq mm6, mm2 ; a1 + + movq mm4, mm0 ; b1 + paddw mm2, mm3 ;0 + + paddw mm4, mm7 ;1 + psubw mm0, mm7 ;2 + + psubw mm6, mm3 ;3 + psraw mm2, 3 + + psraw mm0, 3 + psraw mm4, 3 + + psraw mm6, 3 + + movq mm1, mm2 ; 03 02 01 00 + movq mm3, mm4 ; 23 22 21 20 + + punpcklwd mm1, mm0 ; 11 01 10 00 + punpckhwd mm2, mm0 ; 13 03 12 02 + + punpcklwd mm3, mm6 ; 31 21 30 20 + punpckhwd mm4, mm6 ; 33 23 32 22 + + movq mm0, mm1 ; 11 01 10 00 + movq mm5, mm2 ; 13 03 12 02 + + punpckldq mm0, mm3 ; 30 20 10 00 + punpckhdq mm1, mm3 ; 31 21 11 01 + + punpckldq mm2, mm4 ; 32 22 12 02 + punpckhdq mm5, mm4 ; 33 23 13 03 + + movq [rdx], mm0 + + movq [rdx+rax], mm1 + movq [rdx+rax*2], mm2 + + add rdx, rax + movq [rdx+rax*2], mm5 + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT + UNSHADOW_ARGS + pop rbp + ret + + +;void dequant_dc_idct_mmx(short *input, short *dq, short *output, int pitch, int Dc) +global sym(vp8_dequant_dc_idct_mmx) +sym(vp8_dequant_dc_idct_mmx): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 5 + GET_GOT rbx + push rsi + push rdi + ; end prolog + + mov rax, arg(0) ;input + mov rdx, arg(1) ;dq + + movsxd rcx, dword ptr arg(4) ;Dc + + movq mm0, [rax ] + pmullw mm0, [rdx] + + movq mm1, [rax +8] + pmullw mm1, [rdx +8] + + movq mm2, [rax+16] + pmullw mm2, [rdx+16] + + movq mm3, [rax+24] + pmullw mm3, [rdx+24] + + mov rdx, arg(2) ;output + pxor mm7, mm7 + + + movq [rax], mm7 + movq [rax+8], mm7 + + movq [rax+16],mm7 + movq [rax+24],mm7 + + pinsrw mm0, rcx, 0 + movsxd rax, dword ptr arg(3) ;pitch + + psubw mm0, mm2 ; b1= 0-2 + paddw mm2, mm2 ; + + movq mm5, mm1 + paddw mm2, mm0 ; a1 =0+2 + + pmulhw mm5, [x_s1sqr2 GLOBAL]; + paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) + + movq mm7, mm3 ; + pmulhw mm7, [x_c1sqr2less1 GLOBAL]; + + paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) + psubw mm7, mm5 ; c1 + + movq mm5, mm1 + movq mm4, mm3 + + pmulhw mm5, [x_c1sqr2less1 GLOBAL] + paddw mm5, mm1 + + pmulhw mm3, [x_s1sqr2 GLOBAL] + paddw mm3, mm4 + + paddw mm3, mm5 ; d1 + movq mm6, mm2 ; a1 + + movq mm4, mm0 ; b1 + paddw mm2, mm3 ;0 + + paddw mm4, mm7 ;1 + psubw mm0, mm7 ;2 + + psubw mm6, mm3 ;3 + + movq mm1, mm2 ; 03 02 01 00 + movq mm3, mm4 ; 23 22 21 20 + + punpcklwd mm1, mm0 ; 11 01 10 00 + punpckhwd mm2, mm0 ; 13 03 12 02 + + punpcklwd mm3, mm6 ; 31 21 30 20 + punpckhwd mm4, mm6 ; 33 23 32 22 + + movq mm0, mm1 ; 11 01 10 00 + movq mm5, mm2 ; 13 03 12 02 + + punpckldq mm0, mm3 ; 30 20 10 00 + punpckhdq mm1, mm3 ; 31 21 11 01 + + punpckldq mm2, mm4 ; 32 22 12 02 + punpckhdq mm5, mm4 ; 33 23 13 03 + + movq mm3, mm5 ; 33 23 13 03 + + psubw mm0, mm2 ; b1= 0-2 + paddw mm2, mm2 ; + + movq mm5, mm1 + paddw mm2, mm0 ; a1 =0+2 + + pmulhw mm5, [x_s1sqr2 GLOBAL]; + paddw mm5, mm1 ; ip1 * sin(pi/8) * sqrt(2) + + movq mm7, mm3 ; + pmulhw mm7, [x_c1sqr2less1 GLOBAL]; + + paddw mm7, mm3 ; ip3 * cos(pi/8) * sqrt(2) + psubw mm7, mm5 ; c1 + + movq mm5, mm1 + movq mm4, mm3 + + pmulhw mm5, [x_c1sqr2less1 GLOBAL] + paddw mm5, mm1 + + pmulhw mm3, [x_s1sqr2 GLOBAL] + paddw mm3, mm4 + + paddw mm3, mm5 ; d1 + paddw mm0, [fours GLOBAL] + + paddw mm2, [fours GLOBAL] + movq mm6, mm2 ; a1 + + movq mm4, mm0 ; b1 + paddw mm2, mm3 ;0 + + paddw mm4, mm7 ;1 + psubw mm0, mm7 ;2 + + psubw mm6, mm3 ;3 + psraw mm2, 3 + + psraw mm0, 3 + psraw mm4, 3 + + psraw mm6, 3 + + movq mm1, mm2 ; 03 02 01 00 + movq mm3, mm4 ; 23 22 21 20 + + punpcklwd mm1, mm0 ; 11 01 10 00 + punpckhwd mm2, mm0 ; 13 03 12 02 + + punpcklwd mm3, mm6 ; 31 21 30 20 + punpckhwd mm4, mm6 ; 33 23 32 22 + + movq mm0, mm1 ; 11 01 10 00 + movq mm5, mm2 ; 13 03 12 02 + + punpckldq mm0, mm3 ; 30 20 10 00 + punpckhdq mm1, mm3 ; 31 21 11 01 + + punpckldq mm2, mm4 ; 32 22 12 02 + punpckhdq mm5, mm4 ; 33 23 13 03 + + movq [rdx], mm0 + + movq [rdx+rax], mm1 + movq [rdx+rax*2], mm2 + + add rdx, rax + movq [rdx+rax*2], mm5 + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT + UNSHADOW_ARGS + pop rbp + ret + + +SECTION_RODATA +align 16 +x_s1sqr2: + times 4 dw 0x8A8C +align 16 +x_c1sqr2less1: + times 4 dw 0x4E7B +align 16 +fours: + times 4 dw 0x0004 diff --git a/vp8/decoder/x86/dequantize_x86.h b/vp8/decoder/x86/dequantize_x86.h new file mode 100644 index 000000000..5def406d3 --- /dev/null +++ b/vp8/decoder/x86/dequantize_x86.h @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license and patent + * grant that can be found in the LICENSE file in the root of the source + * tree. All contributing project authors may be found in the AUTHORS + * file in the root of the source tree. + */ + + +#ifndef DEQUANTIZE_X86_H +#define DEQUANTIZE_X86_H + + +/* Note: + * + * This platform is commonly built for runtime CPU detection. If you modify + * any of the function mappings present in this file, be sure to also update + * them in the function pointer initialization code + */ +#if HAVE_MMX +extern prototype_dequant_block(vp8_dequantize_b_mmx); +extern prototype_dequant_idct(vp8_dequant_idct_mmx); +extern prototype_dequant_idct_dc(vp8_dequant_dc_idct_mmx); + + +#if !CONFIG_RUNTIME_CPU_DETECT +#undef vp8_dequant_block +#define vp8_dequant_block vp8_dequantize_b_mmx + +#undef vp8_dequant_idct +#define vp8_dequant_idct vp8_dequant_idct_mmx + +#undef vp8_dequant_idct_dc +#define vp8_dequant_idct_dc vp8_dequant_dc_idct_mmx + +#endif +#endif + +#endif diff --git a/vp8/decoder/x86/onyxdxv.c b/vp8/decoder/x86/onyxdxv.c new file mode 100644 index 000000000..75a676a07 --- /dev/null +++ b/vp8/decoder/x86/onyxdxv.c @@ -0,0 +1,1079 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license and patent + * grant that can be found in the LICENSE file in the root of the source + * tree. All contributing project authors may be found in the AUTHORS + * file in the root of the source tree. + */ + + +/**************************************************************************** +* +* Module Title : onyxdxv.c +* +* Description : VP80 interface to DXV. +* +***************************************************************************** +*/ +/**************************************************************************** +* Header Files +****************************************************************************/ +#include <math.h> // For Abs() +#include "pragmas.h" + +#include "vpxdxv.h" +#include "vpxdxv_plugin.h" + +#include "onyxd_int.h" +#include "onyx.h" +#include "codec_common_interface.h" +#include "vpx_scale/vpxscale.h" +#include "vpx_mem/vpx_mem.h" +#include "postproc.h" +#include "vpxblit.h" +#include "g_common.h" +#include "vpx_scale/yv12extend.h" + +#include <limits.h> +#include <stdio.h> +#include "scale_mode.h" +#include "onyx_pb_interface.h" + +/**************************************************************************** +* Macros +****************************************************************************/ + +#define VP8_FOURCC DXL_MKFOURCC( 'V', 'P', '8', '0') + +extern void vp8_blit_text(const char *msg, unsigned char *address, const int pitch); + + +/**************************************************************************** +* Typedefs +****************************************************************************/ + +typedef struct // YUV buffer configuration structure +{ + int y_width; + int y_height; + int y_stride; + + int uv_width; + int uv_height; + int uv_stride; + + char *y_buffer; + char *u_buffer; + char *v_buffer; + + char *uv_start; + int uv_dst_area; + int uv_used_area; + + unsigned char *y_ptr_scrn; + unsigned char *u_ptr_scrn; + unsigned char *v_ptr_scrn; + + +} DXV_YUV_BUFFER_CONFIG; + + +typedef void ((*vp8blit_func)(unsigned char *, int, YUV_BUFFER_CONFIG *)); + +/* define an x_image structure based on the core x_image struct */ +typedef struct t_ximage_codec +{ + DXV_YUV_BUFFER_CONFIG frame_buffer; + VP8D_COMP *my_pbi; + VP8_COMMON *common; + int owned; + int decompressed_once; + + int sizeof_pixel; + vp8blit_func blitter; + + unsigned int ppl_tag; + unsigned int bd_tag; + unsigned int *supported_output_format_list; + + int cpu_free; + int postproc; + int add_noise; + int deinterlace; + + int post_proc2time; + int post_proc4time; + + int hs; + int hr; + int vs; + int vr; + YV12_BUFFER_CONFIG this_buffer; + YV12_BUFFER_CONFIG scaled_buffer; + YV12_BUFFER_CONFIG *passed_in_buffer; + + int avgq; + int ppcount; + + +} VP8_XIMAGE, *VP8_XIMAGE_HANDLE; + + +/**************************************************************************** +* Modul Statics +****************************************************************************/ +static unsigned int g_vp8_preferred_output_format_list[] = +{ + VPXDXV_YUY2, + VPXDXV_UYVY, + VPXDXV_RGB8888, + VPXDXV_RGB888, + VPXDXV_RGB555, + VPXDXV_RGB565, + VPXDXV_YV12, + VPXDXV_I420, + +// VPXDXV_YV12, +// VPXDXV_YUY2, +// VPXDXV_RGB565, +// VPXDXV_UYVY, + 0 +}; + +/**************************************************************************** +* Forward declarationss +****************************************************************************/ +void onyx_set_parameter(XIMAGE_HANDLE src, int Command, unsigned int Parameter); + +static int onyx_get_output_format(XIMAGE_HANDLE src, unsigned int *bd_tag); +static int onyx_set_output_format(XIMAGE_HANDLE src, unsigned int bd_tag); + +static int vpx_get_size_of_pixel(unsigned int bd); + +/**************************************************************************** +* Imports +****************************************************************************/ + +#define __Clamp255(x) (unsigned char) ( (x) < 0 ? 0 : ( (x) <= 255 ? (x) : 255 ) ) + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +void +convert_yv12_buffer_types(YV12_BUFFER_CONFIG *source, DXV_YUV_BUFFER_CONFIG *dest) +{ + dest->y_buffer = (char *)source->y_buffer; + dest->u_buffer = (char *)source->u_buffer; + dest->v_buffer = (char *)source->v_buffer; + dest->y_width = source->y_width; + dest->y_height = source->y_height; + dest->y_stride = source->y_stride; + dest->uv_width = source->uv_width; + dest->uv_height = source->uv_height; + dest->uv_stride = source->uv_stride; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + + +int onyx_blit +( + XIMAGE_HANDLE src, + VSCREEN_HANDLE v_screen, + DXV_YUV_BUFFER_CONFIG *frame_buffer, + int x, + int y +) +{ + VP8_XIMAGE_HANDLE tab = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + VP8D_COMP *pbi; + VP8_COMMON *common = tab->common; + pbi = tab->my_pbi; + + if (v_screen) /* if there is a v_screen, blit to it */ + { + unsigned char *ptr_scrn; + int this_pitch, vs_height, vs_width; + unsigned int start_tick, stop_tick; + + vpxdxv_get_vscreen_attributes(v_screen, (void **)&ptr_scrn, &vs_width, &vs_height, &this_pitch); + + if (ptr_scrn) + { + int w, h; + + int p_size; + int view_x, view_y, view_w; + int hs, hr, vs, vr; + int neww, newh; + int cw, ch; + int microseconds_available = (int)(1000000 / 30); + + microseconds_available = microseconds_available * tab->cpu_free / 100; + + if (pbi) + { + microseconds_available -= pbi->decode_microseconds; + + if (tab->cpu_free == 0) + microseconds_available = INT_MAX; + + if (tab->post_proc2time == 0) + tab->post_proc2time = pbi->decode_microseconds * 1 / 2; + + if (tab->post_proc4time == 0) + tab->post_proc4time = pbi->decode_microseconds; + } + + + if (tab->ppcount == 0) + { + tab->post_proc2time = 0; + tab->post_proc4time = 0; + tab->ppcount = 64; + } + else + { + tab->ppcount --; + } + + vpxdxv_get_vscreen_view(v_screen, &view_x, &view_y, &view_w, NULL); + + Scale2Ratio(common->horiz_scale, &hr, &hs); + Scale2Ratio(common->vert_scale, &vr, &vs); + + if (tab->postproc && tab->passed_in_buffer == 0) + { + int show_text = 0; + + unsigned char message[512]; + + int pp = tab->postproc; + int q = (tab->avgq + 4) / 8; + int noise = 0; + + vp8_clear_system_state(); + + if (pp >= 1000) + { + pp -= 1000; + noise = pp / 100; + pp = pp - noise * 100; + } + + if (pp >= 300) + { + pp -= 300; + show_text = 3; + } + else if (pp >= 200) + { + pp -= 200; + show_text = 2; + } + else if (pp >= 100) + { + pp -= 100; + show_text = 1; + } + + if (pbi && (pbi->mb.segmentation_enabled & SEGMENT_PF) && tab->deinterlace) + { + de_interlace(common->frame_to_show->y_buffer, common->post_proc_buffer.y_buffer, + common->post_proc_buffer.y_width, common->post_proc_buffer.y_height, + common->post_proc_buffer.y_stride); + + de_interlace(common->frame_to_show->u_buffer, common->post_proc_buffer.u_buffer, + common->post_proc_buffer.uv_width, common->post_proc_buffer.uv_height, + common->post_proc_buffer.uv_stride); + de_interlace(common->frame_to_show->v_buffer, common->post_proc_buffer.v_buffer, + common->post_proc_buffer.uv_width, common->post_proc_buffer.uv_height, + common->post_proc_buffer.uv_stride); + } + else + { + if (pp >= 10 && pp <= 20) + { + q = q + (pp - 15) * 10; + + if (q < 0) + q = 0; + } + + start_tick = vp8_get_high_res_timer_tick(); + + if (pp > 3 && tab->post_proc4time < microseconds_available) + { + vp8_deblock_and_de_macro_block(common->frame_to_show, &common->post_proc_buffer, q, 1, 0); + + stop_tick = vp8_get_high_res_timer_tick(); + + if (pbi) + tab->post_proc4time = vp8_get_time_in_micro_sec(start_tick, stop_tick); + } + + else if (pp > 0 && tab->post_proc2time < microseconds_available) + { + vp8_deblock(common->frame_to_show, &common->post_proc_buffer, q , 1, 0); + stop_tick = vp8_get_high_res_timer_tick(); + + if (pbi) + tab->post_proc2time = vp8_get_time_in_micro_sec(start_tick, stop_tick); + } + else + { + vp8_yv12_copy_frame(common->frame_to_show, &common->post_proc_buffer); + } + + } + + vp8_clear_system_state(); + + if (tab->add_noise == 1) + { + + vp8_plane_add_noise(common->post_proc_buffer.y_buffer, + common->post_proc_buffer.y_width, common->post_proc_buffer.y_height, + common->post_proc_buffer.y_stride, 63 - q, noise); + } + + + if (show_text == 1) + { +#ifdef PACKET_TESTING + { + VP8_HEADER *oh2 = (VP8_HEADER *) pbi->Source; + sprintf(message, "%8d %d%d%d%d%d size:%d\n", + oh2->frame_number , + oh2->update_gold , + oh2->update_last , + oh2->uses_gold , + oh2->uses_last , + oh2->type, + vpxdxv_get_ximage_csize(src)); + } +#else + sprintf(message, "F:%1ldG:%1ldQ:%3ldF:%3ld,%3ldP:%d_s:%6ld,N:%d,", + (common->frame_type == KEY_FRAME), + common->refresh_golden_frame, + common->base_qindex, + common->filter_level, + q, + tab->postproc, + vpxdxv_get_ximage_csize(src), noise); +#endif + + vp8_blit_text(message, common->post_proc_buffer.y_buffer, common->post_proc_buffer.y_stride); + + } + else if (show_text == 2) + { + int i, j; + unsigned char *y_ptr; + YV12_BUFFER_CONFIG *post = &common->post_proc_buffer; + int mb_rows = post->y_height >> 4; + int mb_cols = post->y_width >> 4; + int mb_index = 0; + MODE_INFO *mi = common->mi; + + y_ptr = post->y_buffer + 4 * post->y_stride + 4; + + // vp8_filter each macro block + for (i = 0; i < mb_rows; i++) + { + for (j = 0; j < mb_cols; j++) + { + char zz[4]; + + if (pp == 4) + sprintf(zz, "%c", mi[mb_index].mbmi.mode + 'a'); + else + sprintf(zz, "%c", mi[mb_index].mbmi.ref_frame + 'a'); + + vp8_blit_text(zz, y_ptr, post->y_stride); + mb_index ++; + y_ptr += 16; + } + + mb_index ++; //border + y_ptr += post->y_stride * 16 - post->y_width; + + } + } + else if (show_text == 3) + { + int i, j; + unsigned char *y_ptr; + YV12_BUFFER_CONFIG *post = &common->post_proc_buffer; + int mb_rows = post->y_height >> 4; + int mb_cols = post->y_width >> 4; + int mb_index = 0; + MODE_INFO *mi = common->mi; + + y_ptr = post->y_buffer + 4 * post->y_stride + 4; + + // vp8_filter each macro block + for (i = 0; i < mb_rows; i++) + { + for (j = 0; j < mb_cols; j++) + { + char zz[4]; + + if (j == 0) + sprintf(zz, "%c", '0' + i % 10); + else + sprintf(zz, "%c", '0' + j % 10); + + vp8_blit_text(zz, y_ptr, post->y_stride); + mb_index ++; + y_ptr += 16; + } + + y_ptr += post->y_stride * 16 - post->y_width; + + } + } + + vpx_memcpy(&tab->this_buffer, &common->post_proc_buffer, sizeof(YV12_BUFFER_CONFIG)); + } + else + { + vpx_memcpy(&tab->this_buffer, common->frame_to_show, sizeof(YV12_BUFFER_CONFIG)); + } + + + /* get a frame pointer to the scaled and postprocessed reconstructed buffer */ + if (tab->passed_in_buffer == 0) + { + if (common->horiz_scale != NORMAL || common->vert_scale != NORMAL) + { + neww = hs * tab->this_buffer.y_width / hr; + newh = vs * tab->this_buffer.y_height / vr; + + neww += neww & 1; + + if (tab->hs != hs || tab->hr != hr || tab->vs != vs || tab->vr != vr) + { + vp8_yv12_alloc_frame_buffer(&tab->scaled_buffer, neww, newh , 8); + } + + vp8_yv12_scale_or_center(&tab->this_buffer, + &tab->scaled_buffer, + neww, newh, SCALE_TO_FIT, hs, hr, vs, vr); + + convert_yv12_buffer_types(&tab->scaled_buffer, frame_buffer); + + cw = hs * common->Width / hr; + ch = vs * common->Height / vr; + + } + else + { + convert_yv12_buffer_types(&tab->this_buffer, frame_buffer); + + cw = common->Width; + ch = common->Height; + } + } + else + { + convert_yv12_buffer_types(tab->passed_in_buffer, frame_buffer); + cw = common->Width; + ch = common->Height; + tab->passed_in_buffer = 0; + } + + frame_buffer->y_width = cw; + frame_buffer->y_height = ch; + frame_buffer->uv_width = cw / 2; + frame_buffer->uv_height = ch / 2; + + p_size = vpx_get_size_of_pixel(tab->bd_tag); + + /* remember to offset if requested */ + y += view_y; + x += view_x ; + + /* for planar destinations */ + w = view_w; + h = vs_height; + + if (w < frame_buffer->y_width) + { + frame_buffer->y_width = w; + frame_buffer->uv_width = (w + 1) / 2; + } + + if (h < frame_buffer->y_height) + { + frame_buffer->y_height = h; + frame_buffer->uv_height = (h + 1) / 2; + } + + if (frame_buffer->y_width < view_w) + x += (view_w - frame_buffer->y_width) / 2; + + if (x & 1) + x -= 1; + + if (frame_buffer->y_height < vs_height) + y += (vs_height - frame_buffer->y_height) / 2; + + + ptr_scrn += (x * p_size) + (y * this_pitch); + + frame_buffer->y_stride *= -1; + frame_buffer->uv_stride *= -1; + + if (tab->bd_tag == VPXDXV_YV12 || tab->bd_tag == VPXDXV_I420) + { + if (this_pitch < 0) + { + frame_buffer->uv_start = (char *)(ptr_scrn + abs(this_pitch) + abs(this_pitch) * h / 4 + this_pitch / 2); + frame_buffer->uv_dst_area = abs((this_pitch * h) / 4); + frame_buffer->uv_used_area = 0; + } + else + { + frame_buffer->uv_start = (char *)(ptr_scrn + (this_pitch * h)); + frame_buffer->uv_dst_area = (((this_pitch + 1) / 2) * ((h + 1) / 2)); + frame_buffer->uv_used_area = (((this_pitch + 1) / 2) * frame_buffer->uv_height); + } + } + + if ((pbi->mb.segmentation_enabled & SEGMENT_PF) && (tab->bd_tag != VPXDXV_YV12 && tab->bd_tag != VPXDXV_I420)) + { + int ypitch = frame_buffer->y_stride; + int uvpitch = frame_buffer->uv_stride; + + frame_buffer->y_stride <<= 1; + frame_buffer->y_height >>= 1; + frame_buffer->uv_stride <<= 1; + frame_buffer->uv_height >>= 1; + + ptr_scrn += this_pitch; + frame_buffer->y_buffer -= ypitch; + frame_buffer->u_buffer -= uvpitch; + frame_buffer->v_buffer -= uvpitch; + tab->blitter(ptr_scrn, 2 * this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); + + ptr_scrn -= this_pitch; + frame_buffer->y_buffer += ypitch; + frame_buffer->u_buffer += uvpitch; + frame_buffer->v_buffer += uvpitch; + tab->blitter(ptr_scrn, 2 * this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); + + } + else + { + /* blit the screen */ + tab->blitter(ptr_scrn, this_pitch, (YUV_BUFFER_CONFIG *)(&tab->frame_buffer)); + vpx_log("Decoder: Frame shown \n"); + } + + } + else + vpx_log("Decoder: Frame not shown scrn pointer 0\n"); + } + else + vpx_log("Decoder: Frame not shown vscreen 0\n"); + + return DXV_OK; +} +/**************************************************************************** + * + * ROUTINE : onyx_decompress + * + * INPUTS : None + * + * OUTPUTS : None + * + * RETURNS : None. + * + * FUNCTION : + * + * SPECIAL NOTES : + * + ****************************************************************************/ +static +int onyx_decompress(XIMAGE_HANDLE src, VSCREEN_HANDLE v_screen) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + unsigned char *c_addr; + unsigned int c_size; + int w, h, x, y; + int vp8_rv; + + c_addr = vpxdxv_get_ximage_cdata_addr(src); + c_size = vpxdxv_get_ximage_csize(src); + vpxdxv_get_ximage_xywh(src, &x, &y, &w, &h); + + // if we have a compressed frame decompress it ( otherwise we'll just redo + // the scaling and postprocessing from the last frame ) + if (c_addr) + { + if (c_size != 0) + { + int flags; + int ret_val; + + int f; + + // decode the frame + ret_val = vp8d_decompress_frame((VP8D_PTR) this_algorithm_base->my_pbi, + c_size, + (char *) c_addr, + &this_algorithm_base->this_buffer, + &flags); + + + f = this_algorithm_base->my_pbi->common.filter_level * 10 / 6; + + if (this_algorithm_base->my_pbi->common.frame_type == KEY_FRAME) + this_algorithm_base->avgq = 8 * f; + else + this_algorithm_base->avgq = this_algorithm_base->avgq * 7 / 8 + f; + + + + if (ret_val != 0) + { + if (ret_val == -1) + return DXV_VERSION_CONFLICT; + else + return DXV_BAD_DATA; + } + + } + } + + + vp8_rv = onyx_blit(src, v_screen, &this_algorithm_base->frame_buffer, x, y); + + + return vp8_rv; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static +int vp8_ximagedestroy(XIMAGE_HANDLE src) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + if (this_algorithm_base) + { + + vp8_yv12_de_alloc_frame_buffer(&this_algorithm_base->scaled_buffer); + + /* safety check in case stopdecode was not called */ + if (this_algorithm_base->owned) + vp8dx_remove_decompressor((VP8D_PTR)(this_algorithm_base->my_pbi)); + + duck_free(this_algorithm_base); + } + + return DXV_OK; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static int +onyx_get_post_proc(XIMAGE_HANDLE src, unsigned int *ppl) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + if (this_algorithm_base) + { + *ppl = this_algorithm_base->ppl_tag; + + return DXV_OK; + } + + return DXV_NULL_BASE; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static int +onyx_set_post_proc(XIMAGE_HANDLE src, unsigned int ppl) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + if (this_algorithm_base) + { + this_algorithm_base->ppl_tag = ppl; + + return DXV_OK; + } + + return DXV_NULL_BASE; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static +int vp8_ximagestop_decode(XIMAGE_HANDLE src) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + if (this_algorithm_base) + { + + vp8_yv12_de_alloc_frame_buffer(&this_algorithm_base->scaled_buffer); + + if (this_algorithm_base->owned) + vp8dx_remove_decompressor((VP8D_PTR)(this_algorithm_base->my_pbi)); + + this_algorithm_base->owned = 0; + } + + return DXV_OK; +} + + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static +int vp8_ximagestart_decode +( + XIMAGE_HANDLE src +) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + XIMAGE_INFO_PTR xinfo = vpxdxv_get_ximage_info(src); + VP8D_CONFIG ocf; + + if (xinfo) + { + ocf.Width = xinfo->width; + ocf.Height = xinfo->height; + } + + if (this_algorithm_base->common == 0) + { + this_algorithm_base->my_pbi = (VP8D_COMP *) vp8dx_create_decompressor(&ocf); + this_algorithm_base->owned = 1; + this_algorithm_base->common = &this_algorithm_base->my_pbi->common; + this_algorithm_base->avgq = 0; + + } + + this_algorithm_base->passed_in_buffer = 0; + this_algorithm_base->post_proc2time = 0; + this_algorithm_base->post_proc4time = 0; + this_algorithm_base->ppcount = 64; + + return DXV_OK; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static +DXV_HANDLE vp8_ximagecreate(XIMAGE_HANDLE src) +{ + VP8_XIMAGE_HANDLE this_algorithm_base; + + /* create a new algorithm base container */ + this_algorithm_base = (VP8_XIMAGE_HANDLE)duck_calloc(1, sizeof(VP8_XIMAGE), DMEM_GENERAL); + + if (this_algorithm_base == NULL) + return NULL; + + vp8_scale_machine_specific_config(); + + vpxdxv_register_ximage_start_decode(src, vp8_ximagestart_decode); + + vpxdxv_register_ximage_stop_decode(src, vp8_ximagestop_decode); + + vpxdxv_register_ximage_destroy(src, vp8_ximagedestroy); + + vpxdxv_register_ximage_dx(src, onyx_decompress); + + vpxdxv_register_ximage_set_parameter(src, onyx_set_parameter); + + vpxdxv_register_ximage_output_format_func(src, + onyx_get_output_format, + onyx_set_output_format); + + vpxdxv_register_ximage_post_proc_level_func(src, + onyx_get_post_proc, + onyx_set_post_proc); + + return (DXV_HANDLE)this_algorithm_base; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +static int store_output_list(unsigned int supported, int count, + unsigned int *outlist) +{ + int i = 0, j = 0, + ret = DXV_OK; + + while (i < count) + { + while (supported && !(supported & 0x01)) + { + supported >>= 1; + ++j; + } + + *(outlist + i) = g_vp8_preferred_output_format_list[j]; + ++i; + ++j; + supported >>= 1; + } + + + return ret; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static int onyx_get_output_list(XIMAGE_INFO_PTR xinfo, unsigned int *outlist, + unsigned int *size) +{ + int i, + ret = DXV_INVALID_REQUEST; + unsigned int supported = 0, + count = 0; + (void)xinfo; + + if (size) + { + for (i = 0; i < sizeof(g_vp8_preferred_output_format_list) / sizeof(unsigned int) && i < 32; ++i) + { + if (vpx_get_blitter(g_vp8_preferred_output_format_list[i]) != (void *)0xffffffff) + { + supported |= (1 << i); + ++count; + } + } + + if (outlist) + { + if (count && ((count + 1) == (*size / sizeof(int)))) + ret = store_output_list(supported, count, outlist); + else + *outlist = 0; + } + else + { + *size = (count + 1) * sizeof(int); + ret = DXV_OK; + } + } + + return ret; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +int onyx_init(void) +{ + int vp8_rv; + + /* register VPX blitters based on cpu */ + vpx_set_blit(); + + vp8_rv = vpxdxv_register_ximage(vp8_ximagecreate, onyx_get_output_list, VP8_FOURCC); + return vp8_rv; + + return DXV_OK; +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +int onyx_exit(void) +{ + + vpxdxv_un_register_ximage(VP8_FOURCC); + + return DXV_OK; +} +/**************************************************************************** + * + * ROUTINE : onyx_set_parameter + * + * INPUTS : XIMAGE_HANDLE src : + * int Command : + * unsigned long Parameter : + * + * OUTPUTS : None. + * + * RETURNS : void + * + * FUNCTION : + * + * + * SPECIAL NOTES : None. + * + ****************************************************************************/ +void onyx_set_parameter(XIMAGE_HANDLE src, int Command, unsigned int Parameter) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + switch (Command) + { + case PBC_SET_CPUFREE: + this_algorithm_base->cpu_free = Parameter; + break; + case PBC_SET_POSTPROC: + this_algorithm_base->postproc = Parameter; + break; + + case PBC_SET_BLITBUFF: + this_algorithm_base->passed_in_buffer = (YV12_BUFFER_CONFIG *) Parameter; + break; + + case PBC_SET_REFERENCEFRAME: + { + VP8_XIMAGE_HANDLE tab = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + VP8D_COMP *pbi; + pbi = tab->my_pbi; + vp8_yv12_copy_frame((YV12_BUFFER_CONFIG *) Parameter, &pbi->common.last_frame); + } + break; + + case PBC_SET_COMMON: + + if (Parameter) + { + this_algorithm_base->common = (VP8_COMMON *)Parameter; + } + + break; + case PBC_SET_ADDNOISE: + this_algorithm_base->add_noise = Parameter; + break; + case PBC_SET_DEINTERLACEMODE: + this_algorithm_base->deinterlace = Parameter; + break; + + } +} +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static int +onyx_get_output_format(XIMAGE_HANDLE src, unsigned int *format_tag) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + + if (this_algorithm_base) + { + *format_tag = this_algorithm_base->bd_tag; + return DXV_OK; + } + + return DXV_NULL_BASE; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +static int +onyx_set_output_format(XIMAGE_HANDLE src, unsigned int bd_tag) +{ + VP8_XIMAGE_HANDLE this_algorithm_base = (VP8_XIMAGE_HANDLE)vpxdxv_get_algorithm_base_ptr(src); + int i; + unsigned int bd_tag_found; + + if (this_algorithm_base) + { + i = 0; + bd_tag_found = 0; + + while (g_vp8_preferred_output_format_list[i] != 0) + { + if (g_vp8_preferred_output_format_list[i] == bd_tag) + { + bd_tag_found = 1; + break; + } + + i++; + } + + if (bd_tag_found) + { + this_algorithm_base->blitter = (vp8blit_func)vpx_get_blitter(bd_tag); + this_algorithm_base->bd_tag = bd_tag; + return DXV_OK; + } + + return DXV_INVALID_BLIT; + } + + return DXV_NULL_BASE; +} + +/* +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ +int +vpx_get_size_of_pixel(unsigned int bd) +{ + int vp8_rv; + + switch (bd) + { + case VPXDXV_YV12: + case VPXDXV_I420: + vp8_rv = 1; + break; + +#ifdef _ENABLE_SPLIT_PIXEL_ + case VPXDXV_SPLIT565: +#endif + case VPXDXV_RGB555: + case VPXDXV_RGB565: + case VPXDXV_YUY2: + case VPXDXV_UYVY: + case VPXDXV_YVYU: + vp8_rv = 2; + break; + + case VPXDXV_RGB888: + vp8_rv = 3; + break; + + case VPXDXV_RGB8888: + vp8_rv = 4; + break; + + default: + vp8_rv = -1; + break; + } + + return vp8_rv; +} diff --git a/vp8/decoder/x86/x86_dsystemdependent.c b/vp8/decoder/x86/x86_dsystemdependent.c new file mode 100644 index 000000000..6d7cc3666 --- /dev/null +++ b/vp8/decoder/x86/x86_dsystemdependent.c @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010 The VP8 project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license and patent + * grant that can be found in the LICENSE file in the root of the source + * tree. 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/x86.h" +#include "onyxd_int.h" + + +#if HAVE_MMX +void vp8_dequantize_b_impl_mmx(short *sq, short *dq, short *q); + +void vp8_dequantize_b_mmx(BLOCKD *d) +{ + short *sq = (short *) d->qcoeff; + short *dq = (short *) d->dqcoeff; + short *q = (short *) d->dequant; + vp8_dequantize_b_impl_mmx(sq, dq, q); +} +#endif + +void vp8_arch_x86_decode_init(VP8D_COMP *pbi) +{ + int flags = x86_simd_caps(); + + /* Note: + * + * This platform can be built without runtime CPU detection as well. If + * you modify any of the function mappings present in this file, be sure + * to also update them in static mapings (<arch>/filename_<arch>.h) + */ +#if CONFIG_RUNTIME_CPU_DETECT + /* Override default functions with fastest ones for this CPU. */ +#if HAVE_MMX + + if (flags & HAS_MMX) + { + pbi->dequant.block = vp8_dequantize_b_mmx; + pbi->dequant.idct = vp8_dequant_idct_mmx; + pbi->dequant.idct_dc = vp8_dequant_dc_idct_mmx; + } + +#endif +#endif +} |