Cygwin's mangling by Felix Buenemann <atmosfear@users.sourceforge.net>
[libav.git] / libavcodec / dsputil.h
CommitLineData
de6d9b64
FB
1#ifndef DSPUTIL_H
2#define DSPUTIL_H
3
4#include "common.h"
de6d9b64
FB
5
6/* dct code */
7typedef short DCTELEM;
8
9void jpeg_fdct_ifast (DCTELEM *data);
10
11void j_rev_dct (DCTELEM *data);
12
13void fdct_mmx(DCTELEM *block);
14
15void (*av_fdct)(DCTELEM *block);
16
e0eac44e
FB
17/* encoding scans */
18extern UINT8 ff_alternate_horizontal_scan[64];
19extern UINT8 ff_alternate_vertical_scan[64];
20extern UINT8 zigzag_direct[64];
21
5a240838
MN
22/* permutation table */
23extern UINT8 permutation[64];
24
de6d9b64
FB
25/* pixel operations */
26#define MAX_NEG_CROP 384
27
28/* temporary */
29extern UINT32 squareTbl[512];
0cfa9713 30extern UINT8 cropTbl[256 + 2 * MAX_NEG_CROP];
de6d9b64
FB
31
32void dsputil_init(void);
33
34/* pixel ops : interface with DCT */
35
4af7bcc1 36extern void (*ff_idct)(DCTELEM *block);
de6d9b64
FB
37extern void (*get_pixels)(DCTELEM *block, const UINT8 *pixels, int line_size);
38extern void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
39extern void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size);
40
41void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size);
42void put_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size);
43void add_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size);
44
45/* add and put pixel (decoding) */
46typedef void (*op_pixels_func)(UINT8 *block, const UINT8 *pixels, int line_size, int h);
47
48extern op_pixels_func put_pixels_tab[4];
49extern op_pixels_func avg_pixels_tab[4];
50extern op_pixels_func put_no_rnd_pixels_tab[4];
51extern op_pixels_func avg_no_rnd_pixels_tab[4];
52
53/* sub pixel (encoding) */
54extern void (*sub_pixels_tab[4])(DCTELEM *block, const UINT8 *pixels, int line_size, int h);
55
56#define sub_pixels_2(block, pixels, line_size, dxy) \
57 sub_pixels_tab[dxy](block, pixels, line_size, 8)
58
59/* motion estimation */
60
61typedef int (*op_pixels_abs_func)(UINT8 *blk1, UINT8 *blk2, int line_size, int h);
62
63extern op_pixels_abs_func pix_abs16x16;
64extern op_pixels_abs_func pix_abs16x16_x2;
65extern op_pixels_abs_func pix_abs16x16_y2;
66extern op_pixels_abs_func pix_abs16x16_xy2;
67
68int pix_abs16x16_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
69int pix_abs16x16_x2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
70int pix_abs16x16_y2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
71int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx, int h);
72
e0eac44e
FB
73static inline int block_permute_op(int j)
74{
5a240838 75 return permutation[j];
e0eac44e
FB
76}
77
78void block_permute(INT16 *block);
79
3d03c0a2 80#if defined(HAVE_MMX)
de6d9b64
FB
81
82#define MM_MMX 0x0001 /* standard MMX */
83#define MM_3DNOW 0x0004 /* AMD 3DNOW */
84#define MM_MMXEXT 0x0002 /* SSE integer functions or AMD MMX ext */
85#define MM_SSE 0x0008 /* SSE functions */
86#define MM_SSE2 0x0010 /* PIV SSE2 functions */
87
88extern int mm_flags;
89
90int mm_support(void);
91
92static inline void emms(void)
93{
fb16b7e7
FB
94 __asm __volatile ("emms;":::"memory");
95}
96
97#define emms_c() \
98{\
99 if (mm_flags & MM_MMX)\
100 emms();\
de6d9b64
FB
101}
102
103#define __align8 __attribute__ ((aligned (8)))
104
105void dsputil_init_mmx(void);
106
3d03c0a2
FB
107#elif defined(ARCH_ARMV4L)
108
109#define emms_c()
110
111/* This is to use 4 bytes read to the IDCT pointers for some 'zero'
112 line ptimizations */
113#define __align8 __attribute__ ((aligned (4)))
114
115void dsputil_init_armv4l(void);
116
c34270f5
FB
117#elif defined(HAVE_MLIB)
118
119#define emms_c()
120
121/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */
122#define __align8 __attribute__ ((aligned (8)))
123
124void dsputil_init_mlib(void);
125
de6d9b64
FB
126#else
127
fb16b7e7
FB
128#define emms_c()
129
de6d9b64
FB
130#define __align8
131
132#endif
133
134#endif