e7ad37a0c64d1b3774e4a8df2fd986092d9eec65
[theora.git] / lib / x86 / x86enc.h
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009                *
9  * by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
10  *                                                                  *
11  ********************************************************************
12
13   function:
14     last mod: $Id: x86int.h 15675 2009-02-06 09:43:27Z tterribe $
15
16  ********************************************************************/
17
18 #if !defined(_x86_x86enc_H)
19 # define _x86_x86enc_H (1)
20 # include "x86int.h"
21
22 # if defined(OC_X86_ASM)
23 #  define oc_enc_accel_init oc_enc_accel_init_x86
24 #  if defined(OC_X86_64_ASM)
25 /*x86-64 guarantees SIMD support up through at least SSE2.
26   If the best routine we have available only needs SSE2 (which at the moment
27    covers all of them), then we can avoid runtime detection and the indirect
28    call.*/
29 #   define oc_enc_frag_sub(_enc,_diff,_x,_y,_stride) \
30   oc_enc_frag_sub_mmx(_diff,_x,_y,_stride)
31 #   define oc_enc_frag_sub_128(_enc,_diff,_x,_stride) \
32   oc_enc_frag_sub_128_mmx(_diff,_x,_stride)
33 #   define oc_enc_frag_sad(_enc,_src,_ref,_ystride) \
34   oc_enc_frag_sad_mmxext(_src,_ref,_ystride)
35 #   define oc_enc_frag_sad_thresh(_enc,_src,_ref,_ystride,_thresh) \
36   oc_enc_frag_sad_thresh_mmxext(_src,_ref,_ystride,_thresh)
37 #   define oc_enc_frag_sad2_thresh(_enc,_src,_ref1,_ref2,_ystride,_thresh) \
38   oc_enc_frag_sad2_thresh_mmxext(_src,_ref1,_ref2,_ystride,_thresh)
39 #   define oc_enc_frag_satd(_enc,_dc,_src,_ref,_ystride) \
40   oc_enc_frag_satd_sse2(_dc,_src,_ref,_ystride)
41 #   define oc_enc_frag_satd2(_enc,_dc,_src,_ref1,_ref2,_ystride) \
42   oc_enc_frag_satd2_sse2(_dc,_src,_ref1,_ref2,_ystride)
43 #   define oc_enc_frag_intra_satd(_enc,_dc,_src,_ystride) \
44   oc_enc_frag_intra_satd_sse2(_dc,_src,_ystride)
45 #   define oc_enc_frag_ssd(_enc,_src,_ref,_ystride) \
46   oc_enc_frag_ssd_sse2(_src,_ref,_ystride)
47 #   define oc_enc_frag_border_ssd(_enc,_src,_ref,_ystride,_mask) \
48   oc_enc_frag_border_ssd_sse2(_src,_ref,_ystride,_mask)
49 #   define oc_enc_frag_copy2(_enc,_dst,_src1,_src2,_ystride) \
50   oc_int_frag_copy2_mmxext(_dst,_ystride,_src1,_src2,_ystride)
51 #   define oc_enc_enquant_table_init(_enc,_enquant,_dequant) \
52   oc_enc_enquant_table_init_x86(_enquant,_dequant)
53 #   define oc_enc_enquant_table_fixup(_enc,_enquant,_nqis) \
54   oc_enc_enquant_table_fixup_x86(_enquant,_nqis)
55 #  define oc_enc_quantize(_enc,_qdct,_dct,_dequant,_enquant) \
56   oc_enc_quantize_sse2(_qdct,_dct,_dequant,_enquant)
57 #   define oc_enc_frag_recon_intra(_enc,_dst,_ystride,_residue) \
58   oc_frag_recon_intra_mmx(_dst,_ystride,_residue)
59 #   define oc_enc_frag_recon_inter(_enc,_dst,_src,_ystride,_residue) \
60   oc_frag_recon_inter_mmx(_dst,_src,_ystride,_residue)
61 #   define oc_enc_fdct8x8(_enc,_y,_x) \
62   oc_enc_fdct8x8_x86_64sse2(_y,_x)
63 #  else
64 #   define OC_ENC_USE_VTABLE (1)
65 #  endif
66 # endif
67
68 # include "../encint.h"
69
70 void oc_enc_accel_init_x86(oc_enc_ctx *_enc);
71
72 void oc_enc_frag_sub_mmx(ogg_int16_t _diff[64],
73  const unsigned char *_x,const unsigned char *_y,int _stride);
74 void oc_enc_frag_sub_128_mmx(ogg_int16_t _diff[64],
75  const unsigned char *_x,int _stride);
76 unsigned oc_enc_frag_sad_mmxext(const unsigned char *_src,
77  const unsigned char *_ref,int _ystride);
78 unsigned oc_enc_frag_sad_thresh_mmxext(const unsigned char *_src,
79  const unsigned char *_ref,int _ystride,unsigned _thresh);
80 unsigned oc_enc_frag_sad2_thresh_mmxext(const unsigned char *_src,
81  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
82  unsigned _thresh);
83 unsigned oc_enc_frag_satd_mmxext(unsigned *_dc,const unsigned char *_src,
84  const unsigned char *_ref,int _ystride);
85 unsigned oc_enc_frag_satd_sse2(unsigned *_dc,const unsigned char *_src,
86  const unsigned char *_ref,int _ystride);
87 unsigned oc_enc_frag_satd2_mmxext(unsigned *_dc,const unsigned char *_src,
88  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
89 unsigned oc_enc_frag_satd2_sse2(unsigned *_dc,const unsigned char *_src,
90  const unsigned char *_ref1,const unsigned char *_ref2,int _ystride);
91 unsigned oc_enc_frag_intra_satd_mmxext(unsigned *_dc,
92  const unsigned char *_src,int _ystride);
93 unsigned oc_enc_frag_intra_satd_sse2(unsigned *_dc,
94  const unsigned char *_src,int _ystride);
95 unsigned oc_enc_frag_ssd_sse2(const unsigned char *_src,
96  const unsigned char *_ref,int _ystride);
97 unsigned oc_enc_frag_border_ssd_sse2(const unsigned char *_src,
98  const unsigned char *_ref,int _ystride,ogg_int64_t _mask);
99 void oc_int_frag_copy2_mmxext(unsigned char *_dst,int _dst_ystride,
100  const unsigned char *_src1,const unsigned char *_src2,int _src_ystride);
101 void oc_enc_frag_copy2_mmxext(unsigned char *_dst,
102  const unsigned char *_src1,const unsigned char *_src2,int _ystride);
103 void oc_enc_enquant_table_init_x86(void *_enquant,
104  const ogg_uint16_t _dequant[64]);
105 void oc_enc_enquant_table_fixup_x86(void *_enquant[3][3][2],int _nqis);
106 int oc_enc_quantize_sse2(ogg_int16_t _qdct[64],const ogg_int16_t _dct[64],
107  const ogg_uint16_t _dequant[64],const void *_enquant);
108 void oc_enc_fdct8x8_mmxext(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
109
110 # if defined(OC_X86_64_ASM)
111 void oc_enc_fdct8x8_x86_64sse2(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
112 # endif
113
114 #endif