summaryrefslogtreecommitdiff
path: root/vp8/decoder/x86
diff options
context:
space:
mode:
Diffstat (limited to 'vp8/decoder/x86')
-rw-r--r--vp8/decoder/x86/dequantize_mmx.asm410
-rw-r--r--vp8/decoder/x86/dequantize_x86.h40
-rw-r--r--vp8/decoder/x86/onyxdxv.c1079
-rw-r--r--vp8/decoder/x86/x86_dsystemdependent.c51
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
+}