Mercurial > libavcodec.hg
annotate dsputil.h @ 625:bb6a69f9d409 libavcodec
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
per context DCT selection
author | michaelni |
---|---|
date | Thu, 29 Aug 2002 23:55:32 +0000 |
parents | 92e99e506920 |
children | 23a093d6e450 |
rev | line source |
---|---|
429 | 1 /* |
2 * DSP utils | |
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard. | |
4 * | |
5 * This library is free software; you can redistribute it and/or | |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
9 * | |
10 * This library is distributed in the hope that it will be useful, | |
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 * Lesser General Public License for more details. | |
14 * | |
15 * You should have received a copy of the GNU Lesser General Public | |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 */ | |
0 | 19 #ifndef DSPUTIL_H |
20 #define DSPUTIL_H | |
21 | |
22 #include "common.h" | |
252
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
23 #include "avcodec.h" |
0 | 24 |
255 | 25 //#define DEBUG |
0 | 26 /* dct code */ |
27 typedef short DCTELEM; | |
28 | |
474
11dbd00682fc
avoid name clash with libjpeg - added missing externs
bellard
parents:
429
diff
changeset
|
29 void fdct_ifast (DCTELEM *data); |
625
bb6a69f9d409
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
michaelni
parents:
623
diff
changeset
|
30 void ff_jpeg_fdct_islow (DCTELEM *data); |
0 | 31 |
32 void j_rev_dct (DCTELEM *data); | |
33 | |
34 void fdct_mmx(DCTELEM *block); | |
35 | |
34 | 36 /* encoding scans */ |
37 extern UINT8 ff_alternate_horizontal_scan[64]; | |
38 extern UINT8 ff_alternate_vertical_scan[64]; | |
39 extern UINT8 zigzag_direct[64]; | |
40 | |
190
9e0e56869d05
fix for non-mmx runtimedetect encoding bugs - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
174
diff
changeset
|
41 /* permutation table */ |
9e0e56869d05
fix for non-mmx runtimedetect encoding bugs - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
174
diff
changeset
|
42 extern UINT8 permutation[64]; |
9e0e56869d05
fix for non-mmx runtimedetect encoding bugs - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
174
diff
changeset
|
43 |
0 | 44 /* pixel operations */ |
45 #define MAX_NEG_CROP 384 | |
46 | |
47 /* temporary */ | |
48 extern UINT32 squareTbl[512]; | |
50 | 49 extern UINT8 cropTbl[256 + 2 * MAX_NEG_CROP]; |
0 | 50 |
51 void dsputil_init(void); | |
52 | |
53 /* pixel ops : interface with DCT */ | |
54 | |
19
82d4c9be9873
MMX/MMXEXT iDCT support, using external functions currently defined in libmpeg2
arpi_esp
parents:
6
diff
changeset
|
55 extern void (*ff_idct)(DCTELEM *block); |
480 | 56 extern void (*ff_idct_put)(UINT8 *dest, int line_size, DCTELEM *block); |
57 extern void (*ff_idct_add)(UINT8 *dest, int line_size, DCTELEM *block); | |
0 | 58 extern void (*get_pixels)(DCTELEM *block, const UINT8 *pixels, int line_size); |
324 | 59 extern void (*diff_pixels)(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride); |
0 | 60 extern void (*put_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); |
61 extern void (*add_pixels_clamped)(const DCTELEM *block, UINT8 *pixels, int line_size); | |
255 | 62 extern void (*gmc1)(UINT8 *dst, UINT8 *src, int srcStride, int h, int x16, int y16, int rounder); |
296 | 63 extern void (*clear_blocks)(DCTELEM *blocks); |
612 | 64 extern int (*pix_sum)(UINT8 * pix, int line_size); |
65 extern int (*pix_norm1)(UINT8 * pix, int line_size); | |
66 | |
255 | 67 |
0 | 68 |
69 void get_pixels_c(DCTELEM *block, const UINT8 *pixels, int line_size); | |
324 | 70 void diff_pixels_c(DCTELEM *block, const UINT8 *s1, const UINT8 *s2, int stride); |
0 | 71 void put_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size); |
72 void add_pixels_clamped_c(const DCTELEM *block, UINT8 *pixels, int line_size); | |
296 | 73 void clear_blocks_c(DCTELEM *blocks); |
0 | 74 |
75 /* add and put pixel (decoding) */ | |
76 typedef void (*op_pixels_func)(UINT8 *block, const UINT8 *pixels, int line_size, int h); | |
255 | 77 typedef void (*qpel_mc_func)(UINT8 *dst, UINT8 *src, int dstStride, int srcStride, int mx, int my); |
0 | 78 |
79 extern op_pixels_func put_pixels_tab[4]; | |
80 extern op_pixels_func avg_pixels_tab[4]; | |
81 extern op_pixels_func put_no_rnd_pixels_tab[4]; | |
82 extern op_pixels_func avg_no_rnd_pixels_tab[4]; | |
255 | 83 extern qpel_mc_func qpel_mc_rnd_tab[16]; |
84 extern qpel_mc_func qpel_mc_no_rnd_tab[16]; | |
85 | |
0 | 86 /* motion estimation */ |
87 | |
294 | 88 typedef int (*op_pixels_abs_func)(UINT8 *blk1, UINT8 *blk2, int line_size); |
0 | 89 |
90 extern op_pixels_abs_func pix_abs16x16; | |
91 extern op_pixels_abs_func pix_abs16x16_x2; | |
92 extern op_pixels_abs_func pix_abs16x16_y2; | |
93 extern op_pixels_abs_func pix_abs16x16_xy2; | |
294 | 94 extern op_pixels_abs_func pix_abs8x8; |
95 extern op_pixels_abs_func pix_abs8x8_x2; | |
96 extern op_pixels_abs_func pix_abs8x8_y2; | |
97 extern op_pixels_abs_func pix_abs8x8_xy2; | |
0 | 98 |
294 | 99 int pix_abs16x16_c(UINT8 *blk1, UINT8 *blk2, int lx); |
100 int pix_abs16x16_x2_c(UINT8 *blk1, UINT8 *blk2, int lx); | |
101 int pix_abs16x16_y2_c(UINT8 *blk1, UINT8 *blk2, int lx); | |
102 int pix_abs16x16_xy2_c(UINT8 *blk1, UINT8 *blk2, int lx); | |
0 | 103 |
174
ac5075a55488
new IDCT code by Michael Niedermayer (michaelni@gmx.at) - #define SIMPLE_IDCT to enable
arpi_esp
parents:
88
diff
changeset
|
104 static inline int block_permute_op(int j) |
ac5075a55488
new IDCT code by Michael Niedermayer (michaelni@gmx.at) - #define SIMPLE_IDCT to enable
arpi_esp
parents:
88
diff
changeset
|
105 { |
190
9e0e56869d05
fix for non-mmx runtimedetect encoding bugs - patch by Michael Niedermayer <michaelni@gmx.at>
uid46427
parents:
174
diff
changeset
|
106 return permutation[j]; |
174
ac5075a55488
new IDCT code by Michael Niedermayer (michaelni@gmx.at) - #define SIMPLE_IDCT to enable
arpi_esp
parents:
88
diff
changeset
|
107 } |
34 | 108 |
109 void block_permute(INT16 *block); | |
110 | |
62 | 111 #if defined(HAVE_MMX) |
0 | 112 |
113 #define MM_MMX 0x0001 /* standard MMX */ | |
114 #define MM_3DNOW 0x0004 /* AMD 3DNOW */ | |
115 #define MM_MMXEXT 0x0002 /* SSE integer functions or AMD MMX ext */ | |
116 #define MM_SSE 0x0008 /* SSE functions */ | |
117 #define MM_SSE2 0x0010 /* PIV SSE2 functions */ | |
118 | |
119 extern int mm_flags; | |
120 | |
121 int mm_support(void); | |
122 | |
123 static inline void emms(void) | |
124 { | |
6
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
125 __asm __volatile ("emms;":::"memory"); |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
126 } |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
127 |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
128 #define emms_c() \ |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
129 {\ |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
130 if (mm_flags & MM_MMX)\ |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
131 emms();\ |
0 | 132 } |
133 | |
134 #define __align8 __attribute__ ((aligned (8))) | |
135 | |
136 void dsputil_init_mmx(void); | |
403
2c3e25f4c496
removed unused stuff - added dsputil_set_bit_exact() support for easier testing
glantau
parents:
324
diff
changeset
|
137 void dsputil_set_bit_exact_mmx(void); |
0 | 138 |
62 | 139 #elif defined(ARCH_ARMV4L) |
140 | |
141 #define emms_c() | |
142 | |
143 /* This is to use 4 bytes read to the IDCT pointers for some 'zero' | |
144 line ptimizations */ | |
145 #define __align8 __attribute__ ((aligned (4))) | |
146 | |
147 void dsputil_init_armv4l(void); | |
148 | |
88 | 149 #elif defined(HAVE_MLIB) |
150 | |
151 #define emms_c() | |
152 | |
153 /* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */ | |
154 #define __align8 __attribute__ ((aligned (8))) | |
155 | |
156 void dsputil_init_mlib(void); | |
157 | |
214
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
158 #elif defined(ARCH_ALPHA) |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
159 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
160 #define emms_c() |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
161 #define __align8 __attribute__ ((aligned (8))) |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
162 |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
163 void dsputil_init_alpha(void); |
73df666cacc7
Alpha optimizations by Falk Hueffner <falk.hueffner@student.uni-tuebingen.de>
nickols_k
parents:
190
diff
changeset
|
164 |
623
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
165 #elif defined(ARCH_POWERPC) |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
166 |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
167 #define emms_c() |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
168 #define __align8 __attribute__ ((aligned (16))) |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
169 |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
170 void dsputil_init_altivec(void); |
92e99e506920
first cut at altivec support on darwin patch by (Brian Foley <bfoley at compsoc dot nuigalway dot ie>)
michaelni
parents:
612
diff
changeset
|
171 |
0 | 172 #else |
173 | |
6
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
174 #define emms_c() |
ec4642daa6fe
added emms_c() macro which should can used in c code in both mmx/non mmx cases
glantau
parents:
2
diff
changeset
|
175 |
0 | 176 #define __align8 |
177 | |
178 #endif | |
179 | |
493
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
180 #ifdef __GNUC__ |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
181 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
182 struct unaligned_64 { uint64_t l; } __attribute__((packed)); |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
183 struct unaligned_32 { uint32_t l; } __attribute__((packed)); |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
184 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
185 #define LD32(a) (((const struct unaligned_32 *) (a))->l) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
186 #define LD64(a) (((const struct unaligned_64 *) (a))->l) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
187 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
188 #define ST32(a, b) (((struct unaligned_32 *) (a))->l) = (b) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
189 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
190 #else /* __GNUC__ */ |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
191 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
192 #define LD32(a) (*((uint32_t*)(a))) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
193 #define LD64(a) (*((uint64_t*)(a))) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
194 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
195 #define ST32(a, b) *((uint32_t*)(a)) = (b) |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
196 |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
197 #endif /* !__GNUC__ */ |
873b9075d853
move unaligned access macros to dsputil.h - added unaligned 32 bit store
bellard
parents:
480
diff
changeset
|
198 |
252
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
199 /* PSNR */ |
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
200 void get_psnr(UINT8 *orig_image[3], UINT8 *coded_image[3], |
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
201 int orig_linesize[3], int coded_linesize, |
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
202 AVCodecContext *avctx); |
ddb1a0e94cf4
- Added PSNR feature to libavcodec and ffmpeg. By now just Y PSNR until I'm
pulento
parents:
214
diff
changeset
|
203 |
0 | 204 #endif |