[cvs] / xvidcore / src / xvid.c Repository:
ViewVC logotype

Annotation of /xvidcore/src/xvid.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33.2.22 - (view) (download)

1 : edgomez 1.16 /*****************************************************************************
2 : edgomez 1.17 *
3 :     * XVID MPEG-4 VIDEO CODEC
4 :     * - Native API implementation -
5 :     *
6 :     * This program is an implementation of a part of one or more MPEG-4
7 :     * Video tools as specified in ISO/IEC 14496-2 standard. Those intending
8 :     * to use this software module in hardware or software products are
9 :     * advised that its use may infringe existing patents or copyrights, and
10 :     * any such use would be at such party's own risk. The original
11 :     * developer of this software module and his/her company, and subsequent
12 :     * editors and their companies, will have no liability for use of this
13 :     * software or modifications or derivatives thereof.
14 :     *
15 :     * This program is free software ; you can redistribute it and/or modify
16 :     * it under the terms of the GNU General Public License as published by
17 :     * the Free Software Foundation ; either version 2 of the License, or
18 :     * (at your option) any later version.
19 :     *
20 :     * This program is distributed in the hope that it will be useful,
21 :     * but WITHOUT ANY WARRANTY ; without even the implied warranty of
22 :     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 :     * GNU General Public License for more details.
24 :     *
25 :     * You should have received a copy of the GNU General Public License
26 :     * along with this program ; if not, write to the Free Software
27 :     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 :     *
29 :     ****************************************************************************/
30 : chenm001 1.29
31 : edgomez 1.16 /*****************************************************************************
32 : edgomez 1.17 *
33 :     * History
34 :     *
35 : suxen_drol 1.21 * - 23.06.2002 added XVID_CPU_CHKONLY
36 : edgomez 1.17 * - 17.03.2002 Added interpolate8x8_halfpel_hv_xmm
37 :     * - 22.12.2001 API change: added xvid_init() - Isibaar
38 :     * - 16.12.2001 inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
39 :     *
40 : suxen_drol 1.33.2.22 * $Id: xvid.c,v 1.33.2.21 2003/01/03 16:25:14 suxen_drol Exp $
41 : edgomez 1.17 *
42 :     ****************************************************************************/
43 : Isibaar 1.1
44 : suxen_drol 1.33.2.21 #include <stdio.h>
45 : suxen_drol 1.33.2.20 #include <stdlib.h>
46 : suxen_drol 1.33.2.21 #include <string.h>
47 : suxen_drol 1.33.2.20 #include <time.h>
48 :    
49 : Isibaar 1.1 #include "xvid.h"
50 :     #include "decoder.h"
51 :     #include "encoder.h"
52 :     #include "bitstream/cbp.h"
53 :     #include "dct/idct.h"
54 :     #include "dct/fdct.h"
55 :     #include "image/colorspace.h"
56 :     #include "image/interpolate8x8.h"
57 : suxen_drol 1.33.2.15 #include "image/reduced.h"
58 : Isibaar 1.1 #include "utils/mem_transfer.h"
59 : h 1.33.2.5 #include "utils/mbfunctions.h"
60 : Isibaar 1.1 #include "quant/quant_h263.h"
61 :     #include "quant/quant_mpeg4.h"
62 : ia64p 1.30 #include "motion/motion.h"
63 : Isibaar 1.1 #include "motion/sad.h"
64 :     #include "utils/emms.h"
65 :     #include "utils/timer.h"
66 : Isibaar 1.9 #include "bitstream/mbcoding.h"
67 : Isibaar 1.1
68 : suxen_drol 1.33.2.22 #if defined(ARCH_X86)
69 : suxen_drol 1.31
70 : suxen_drol 1.33.2.22 #if defined(_MSC_VER)
71 :     # include <windows.h>
72 : suxen_drol 1.31 #else
73 : suxen_drol 1.33.2.22 # include <signal.h>
74 :     # include <setjmp.h>
75 : suxen_drol 1.31
76 : suxen_drol 1.33.2.22 static jmp_buf mark;
77 : suxen_drol 1.31
78 : suxen_drol 1.33.2.22 static void
79 :     sigill_handler(int signal)
80 :     {
81 :     longjmp(mark, 1);
82 :     }
83 : suxen_drol 1.31 #endif
84 :    
85 :    
86 :     /*
87 :     calls the funcptr, and returns whether SIGILL (illegal instruction) was signalled
88 :     return values:
89 :     -1 : could not determine
90 :     0 : SIGILL was *not* signalled
91 :     1 : SIGILL was signalled
92 :     */
93 :    
94 :     int
95 :     sigill_check(void (*func)())
96 :     {
97 : suxen_drol 1.33.2.22 #if defined(_MSC_VER)
98 : suxen_drol 1.31 _try {
99 :     func();
100 :     }
101 :     _except(EXCEPTION_EXECUTE_HANDLER) {
102 :    
103 :     if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION)
104 :     return 1;
105 :     }
106 :     return 0;
107 :     #else
108 :     void * old_handler;
109 :     int jmpret;
110 :    
111 :    
112 :     old_handler = signal(SIGILL, sigill_handler);
113 :     if (old_handler == SIG_ERR)
114 :     {
115 :     return -1;
116 :     }
117 :    
118 :     jmpret = setjmp(mark);
119 :     if (jmpret == 0)
120 :     {
121 :     func();
122 :     }
123 :    
124 :     signal(SIGILL, old_handler);
125 :    
126 :     return jmpret;
127 :     #endif
128 :     }
129 :     #endif
130 :    
131 : suxen_drol 1.33.2.22
132 :     /* detect cpu flags */
133 :     static unsigned int
134 :     detect_cpu_flags()
135 :     {
136 :     /* enable native assembly optimizations by default */
137 :     unsigned int cpu_flags = XVID_CPU_ASM;
138 :    
139 :     #if defined(ARCH_X86)
140 :     cpu_flags |= check_cpu_features();
141 :     if ((cpu_flags & XVID_CPU_SSE) && sigill_check(sse_os_trigger))
142 :     cpu_flags &= ~XVID_CPU_SSE;
143 :    
144 :     if ((cpu_flags & XVID_CPU_SSE2) && sigill_check(sse2_os_trigger))
145 :     cpu_flags &= ~XVID_CPU_SSE2;
146 :     #endif
147 :    
148 :     #if defined(ARCH_PPC)
149 :     #if defined(ARCH_PPC_ALTIVEC)
150 :     cpu_flags |= XVID_CPU_ALTIVEC;
151 :     #endif
152 :     #endif
153 :    
154 :     return cpu_flags;
155 :     }
156 :    
157 :    
158 : edgomez 1.16 /*****************************************************************************
159 :     * XviD Init Entry point
160 :     *
161 :     * Well this function initialize all internal function pointers according
162 :     * to the CPU features forced by the library client or autodetected (depending
163 :     * on the XVID_CPU_FORCE flag). It also initializes vlc coding tables and all
164 :     * image colorspace transformation tables.
165 :     *
166 :     * Returned value : XVID_ERR_OK
167 :     * + API_VERSION in the input XVID_INIT_PARAM structure
168 :     * + core build " " " " "
169 :     *
170 :     ****************************************************************************/
171 :    
172 : suxen_drol 1.33.2.13
173 :     static
174 :     int xvid_init_init(XVID_INIT_PARAM * init_param)
175 : Isibaar 1.1 {
176 :     int cpu_flags;
177 :    
178 : suxen_drol 1.21 /* Inform the client the API version */
179 :     init_param->api_version = API_VERSION;
180 :    
181 :     /* Inform the client the core build - unused because we're still alpha */
182 :     init_param->core_build = 1000;
183 :    
184 : suxen_drol 1.31 /* Do we have to force CPU features ? */
185 :     if ((init_param->cpu_flags & XVID_CPU_FORCE)) {
186 : suxen_drol 1.21
187 : Isibaar 1.1 cpu_flags = init_param->cpu_flags;
188 : suxen_drol 1.31
189 : edgomez 1.16 } else {
190 : Isibaar 1.1
191 : suxen_drol 1.33.2.22 cpu_flags = detect_cpu_flags();
192 : suxen_drol 1.31 }
193 :    
194 :     if ((init_param->cpu_flags & XVID_CPU_CHKONLY))
195 :     {
196 : Isibaar 1.1 init_param->cpu_flags = cpu_flags;
197 : suxen_drol 1.31 return XVID_ERR_OK;
198 : Isibaar 1.1 }
199 : suxen_drol 1.31
200 :     init_param->cpu_flags = cpu_flags;
201 :    
202 : Isibaar 1.1
203 : edgomez 1.16 /* Initialize the function pointers */
204 : Isibaar 1.1 idct_int32_init();
205 : Isibaar 1.9 init_vlc_tables();
206 :    
207 : edgomez 1.16 /* Fixed Point Forward/Inverse DCT transformations */
208 : Isibaar 1.1 fdct = fdct_int32;
209 :     idct = idct_int32;
210 :    
211 : edgomez 1.16 /* Only needed on PPC Altivec archs */
212 : canard 1.10 sadInit = 0;
213 : edgomez 1.15
214 : edgomez 1.16 /* Restore FPU context : emms_c is a nop functions */
215 : Isibaar 1.1 emms = emms_c;
216 :    
217 : edgomez 1.16 /* Quantization functions */
218 :     quant_intra = quant_intra_c;
219 : Isibaar 1.1 dequant_intra = dequant_intra_c;
220 : edgomez 1.16 quant_inter = quant_inter_c;
221 : Isibaar 1.1 dequant_inter = dequant_inter_c;
222 :    
223 : edgomez 1.16 quant4_intra = quant4_intra_c;
224 : Isibaar 1.1 dequant4_intra = dequant4_intra_c;
225 : edgomez 1.16 quant4_inter = quant4_inter_c;
226 : Isibaar 1.1 dequant4_inter = dequant4_inter_c;
227 :    
228 : edgomez 1.16 /* Block transfer related functions */
229 : Isibaar 1.1 transfer_8to16copy = transfer_8to16copy_c;
230 :     transfer_16to8copy = transfer_16to8copy_c;
231 : edgomez 1.16 transfer_8to16sub = transfer_8to16sub_c;
232 : suxen_drol 1.11 transfer_8to16sub2 = transfer_8to16sub2_c;
233 : edgomez 1.16 transfer_16to8add = transfer_16to8add_c;
234 :     transfer8x8_copy = transfer8x8_copy_c;
235 : Isibaar 1.1
236 : h 1.33.2.5 /* Interlacing functions */
237 :     MBFieldTest = MBFieldTest_c;
238 :    
239 : edgomez 1.16 /* Image interpolation related functions */
240 :     interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_c;
241 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_c;
242 : Isibaar 1.1 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_c;
243 : Isibaar 1.33.2.8
244 :     interpolate16x16_lowpass_h = interpolate16x16_lowpass_h_c;
245 :     interpolate16x16_lowpass_v = interpolate16x16_lowpass_v_c;
246 :     interpolate16x16_lowpass_hv = interpolate16x16_lowpass_hv_c;
247 : Isibaar 1.1
248 : Isibaar 1.33.2.6 interpolate8x8_lowpass_h = interpolate8x8_lowpass_h_c;
249 :     interpolate8x8_lowpass_v = interpolate8x8_lowpass_v_c;
250 :     interpolate8x8_lowpass_hv = interpolate8x8_lowpass_hv_c;
251 :    
252 :     interpolate8x8_6tap_lowpass_h = interpolate8x8_6tap_lowpass_h_c;
253 :     interpolate8x8_6tap_lowpass_v = interpolate8x8_6tap_lowpass_v_c;
254 :    
255 :     interpolate8x8_avg2 = interpolate8x8_avg2_c;
256 :     interpolate8x8_avg4 = interpolate8x8_avg4_c;
257 :    
258 : suxen_drol 1.33.2.15 /* reduced resoltuion */
259 : suxen_drol 1.33.2.17 copy_upsampled_8x8_16to8 = xvid_Copy_Upsampled_8x8_16To8_C;
260 :     add_upsampled_8x8_16to8 = xvid_Add_Upsampled_8x8_16To8_C;
261 : suxen_drol 1.33.2.15 vfilter_31 = xvid_VFilter_31_C;
262 :     hfilter_31 = xvid_HFilter_31_C;
263 : suxen_drol 1.33.2.17 filter_18x18_to_8x8 = xvid_Filter_18x18_To_8x8_C;
264 :     filter_diff_18x18_to_8x8 = xvid_Filter_Diff_18x18_To_8x8_C;
265 : suxen_drol 1.33.2.15
266 : edgomez 1.16 /* Initialize internal colorspace transformation tables */
267 : Isibaar 1.1 colorspace_init();
268 :    
269 : edgomez 1.16 /* All colorspace transformation functions User Format->YV12 */
270 : suxen_drol 1.33.2.11 yv12_to_yv12 = yv12_to_yv12_c;
271 :     rgb555_to_yv12 = rgb555_to_yv12_c;
272 :     rgb565_to_yv12 = rgb565_to_yv12_c;
273 :     bgr_to_yv12 = bgr_to_yv12_c;
274 :     bgra_to_yv12 = bgra_to_yv12_c;
275 :     abgr_to_yv12 = abgr_to_yv12_c;
276 :     rgba_to_yv12 = rgba_to_yv12_c;
277 :     yuyv_to_yv12 = yuyv_to_yv12_c;
278 :     uyvy_to_yv12 = uyvy_to_yv12_c;
279 :    
280 :     rgb555i_to_yv12 = rgb555i_to_yv12_c;
281 :     rgb565i_to_yv12 = rgb565i_to_yv12_c;
282 :     bgri_to_yv12 = bgri_to_yv12_c;
283 :     bgrai_to_yv12 = bgrai_to_yv12_c;
284 :     abgri_to_yv12 = abgri_to_yv12_c;
285 :     rgbai_to_yv12 = rgbai_to_yv12_c;
286 :     yuyvi_to_yv12 = yuyvi_to_yv12_c;
287 :     uyvyi_to_yv12 = uyvyi_to_yv12_c;
288 :    
289 : Isibaar 1.1
290 : edgomez 1.16 /* All colorspace transformation functions YV12->User format */
291 : suxen_drol 1.33.2.11 yv12_to_rgb555 = yv12_to_rgb555_c;
292 :     yv12_to_rgb565 = yv12_to_rgb565_c;
293 :     yv12_to_bgr = yv12_to_bgr_c;
294 :     yv12_to_bgra = yv12_to_bgra_c;
295 :     yv12_to_abgr = yv12_to_abgr_c;
296 :     yv12_to_rgba = yv12_to_rgba_c;
297 :     yv12_to_yuyv = yv12_to_yuyv_c;
298 :     yv12_to_uyvy = yv12_to_uyvy_c;
299 :    
300 :     yv12_to_rgb555i = yv12_to_rgb555i_c;
301 :     yv12_to_rgb565i = yv12_to_rgb565i_c;
302 :     yv12_to_bgri = yv12_to_bgri_c;
303 :     yv12_to_bgrai = yv12_to_bgrai_c;
304 :     yv12_to_abgri = yv12_to_abgri_c;
305 :     yv12_to_rgbai = yv12_to_rgbai_c;
306 :     yv12_to_yuyvi = yv12_to_yuyvi_c;
307 :     yv12_to_uyvyi = yv12_to_uyvyi_c;
308 : Isibaar 1.1
309 : edgomez 1.16 /* Functions used in motion estimation algorithms */
310 : Isibaar 1.1 calc_cbp = calc_cbp_c;
311 : edgomez 1.16 sad16 = sad16_c;
312 : suxen_drol 1.33 sad8 = sad8_c;
313 : edgomez 1.16 sad16bi = sad16bi_c;
314 : suxen_drol 1.33 sad8bi = sad8bi_c;
315 : edgomez 1.16 dev16 = dev16_c;
316 : chl 1.33.2.1 sad16v = sad16v_c;
317 : suxen_drol 1.33
318 : chl 1.33.2.1 // Halfpel8_Refine = Halfpel8_Refine_c;
319 : Isibaar 1.1
320 : suxen_drol 1.33.2.22 #if defined(ARCH_X86)
321 :    
322 :     if ((cpu_flags & XVID_CPU_ASM))
323 :     {
324 :     vfilter_31 = xvid_VFilter_31_x86;
325 :     hfilter_31 = xvid_HFilter_31_x86;
326 :     }
327 : suxen_drol 1.33.2.11
328 :     if ((cpu_flags & XVID_CPU_MMX) || (cpu_flags & XVID_CPU_MMXEXT) ||
329 :     (cpu_flags & XVID_CPU_3DNOW) || (cpu_flags & XVID_CPU_3DNOWEXT) ||
330 :     (cpu_flags & XVID_CPU_SSE) || (cpu_flags & XVID_CPU_SSE2))
331 :     {
332 :     /* Restore FPU context : emms_c is a nop functions */
333 :     emms = emms_mmx;
334 :     }
335 :    
336 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_MMX)) {
337 : edgomez 1.16
338 :     /* Forward and Inverse Discrete Cosine Transformation functions */
339 : Isibaar 1.1 fdct = fdct_mmx;
340 :     idct = idct_mmx;
341 :    
342 : edgomez 1.16 /* Quantization related functions */
343 :     quant_intra = quant_intra_mmx;
344 : Isibaar 1.1 dequant_intra = dequant_intra_mmx;
345 : edgomez 1.16 quant_inter = quant_inter_mmx;
346 : Isibaar 1.1 dequant_inter = dequant_inter_mmx;
347 :    
348 : edgomez 1.16 quant4_intra = quant4_intra_mmx;
349 : Isibaar 1.1 dequant4_intra = dequant4_intra_mmx;
350 : edgomez 1.16 quant4_inter = quant4_inter_mmx;
351 : Isibaar 1.1 dequant4_inter = dequant4_inter_mmx;
352 :    
353 : edgomez 1.16 /* Block related functions */
354 : Isibaar 1.1 transfer_8to16copy = transfer_8to16copy_mmx;
355 :     transfer_16to8copy = transfer_16to8copy_mmx;
356 : edgomez 1.16 transfer_8to16sub = transfer_8to16sub_mmx;
357 : edgomez 1.22 transfer_8to16sub2 = transfer_8to16sub2_mmx;
358 : edgomez 1.16 transfer_16to8add = transfer_16to8add_mmx;
359 :     transfer8x8_copy = transfer8x8_copy_mmx;
360 : edgomez 1.22
361 : h 1.33.2.5 /* Interlacing Functions */
362 :     MBFieldTest = MBFieldTest_mmx;
363 : edgomez 1.16
364 :     /* Image Interpolation related functions */
365 :     interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_mmx;
366 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_mmx;
367 : Isibaar 1.1 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_mmx;
368 : Isibaar 1.33.2.6
369 :     interpolate8x8_6tap_lowpass_h = interpolate8x8_6tap_lowpass_h_mmx;
370 :     interpolate8x8_6tap_lowpass_v = interpolate8x8_6tap_lowpass_v_mmx;
371 :    
372 : Isibaar 1.33.2.14 interpolate8x8_avg2 = interpolate8x8_avg2_mmx;
373 : Isibaar 1.33.2.6 interpolate8x8_avg4 = interpolate8x8_avg4_mmx;
374 : Isibaar 1.1
375 : suxen_drol 1.33.2.15 /* reduced resolution */
376 :     copy_upsampled_8x8_16to8 = xvid_Copy_Upsampled_8x8_16To8_mmx;
377 :     add_upsampled_8x8_16to8 = xvid_Add_Upsampled_8x8_16To8_mmx;
378 :     hfilter_31 = xvid_HFilter_31_mmx;
379 : suxen_drol 1.33.2.17 filter_18x18_to_8x8 = xvid_Filter_18x18_To_8x8_mmx;
380 :     filter_diff_18x18_to_8x8 = xvid_Filter_Diff_18x18_To_8x8_mmx;
381 : suxen_drol 1.33.2.15
382 : suxen_drol 1.33.2.11 /* image input xxx_to_yv12 related functions */
383 :     yv12_to_yv12 = yv12_to_yv12_mmx;
384 :     bgr_to_yv12 = bgr_to_yv12_mmx;
385 :     bgra_to_yv12 = bgra_to_yv12_mmx;
386 : edgomez 1.16 yuyv_to_yv12 = yuyv_to_yv12_mmx;
387 :     uyvy_to_yv12 = uyvy_to_yv12_mmx;
388 : Isibaar 1.1
389 : suxen_drol 1.33.2.11 /* image output yv12_to_xxx related functions */
390 :     yv12_to_bgr = yv12_to_bgr_mmx;
391 :     yv12_to_bgra = yv12_to_bgra_mmx;
392 : edgomez 1.16 yv12_to_yuyv = yv12_to_yuyv_mmx;
393 :     yv12_to_uyvy = yv12_to_uyvy_mmx;
394 : suxen_drol 1.33.2.11
395 :     yv12_to_yuyvi = yv12_to_yuyvi_mmx;
396 :     yv12_to_uyvyi = yv12_to_uyvyi_mmx;
397 : Isibaar 1.1
398 : edgomez 1.16 /* Motion estimation related functions */
399 : Isibaar 1.1 calc_cbp = calc_cbp_mmx;
400 : edgomez 1.16 sad16 = sad16_mmx;
401 :     sad8 = sad8_mmx;
402 : suxen_drol 1.33 sad16bi = sad16bi_mmx;
403 :     sad8bi = sad8bi_mmx;
404 : edgomez 1.16 dev16 = dev16_mmx;
405 : Isibaar 1.33.2.2 sad16v = sad16v_mmx;
406 : Isibaar 1.1 }
407 :    
408 : suxen_drol 1.33 /* these 3dnow functions are faster than mmx, but slower than xmm. */
409 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_3DNOW)) {
410 :    
411 :     emms = emms_3dn;
412 : suxen_drol 1.33
413 :     /* ME functions */
414 :     sad16bi = sad16bi_3dn;
415 :     sad8bi = sad8bi_3dn;
416 : suxen_drol 1.33.2.11
417 :     yuyv_to_yv12 = yuyv_to_yv12_3dn;
418 :     uyvy_to_yv12 = uyvy_to_yv12_3dn;
419 : suxen_drol 1.33 }
420 :    
421 :    
422 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_MMXEXT)) {
423 : edgomez 1.16
424 :     /* Inverse DCT */
425 : Isibaar 1.1 idct = idct_xmm;
426 : edgomez 1.16
427 :     /* Interpolation */
428 :     interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_xmm;
429 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_xmm;
430 : h 1.3 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;
431 : suxen_drol 1.33.2.15
432 :     /* reduced resolution */
433 :     copy_upsampled_8x8_16to8 = xvid_Copy_Upsampled_8x8_16To8_xmm;
434 :     add_upsampled_8x8_16to8 = xvid_Add_Upsampled_8x8_16To8_xmm;
435 : Isibaar 1.25
436 : chenm001 1.29 /* Quantization */
437 : Isibaar 1.33.2.18 quant4_intra = quant4_intra_xmm;
438 :     quant4_inter = quant4_inter_xmm;
439 :    
440 : chenm001 1.29 dequant_intra = dequant_intra_xmm;
441 :     dequant_inter = dequant_inter_xmm;
442 :    
443 : edgomez 1.19 /* Buffer transfer */
444 :     transfer_8to16sub2 = transfer_8to16sub2_xmm;
445 : edgomez 1.16
446 :     /* Colorspace transformation */
447 : suxen_drol 1.33.2.11 yv12_to_yv12 = yv12_to_yv12_xmm;
448 :     yuyv_to_yv12 = yuyv_to_yv12_xmm;
449 : Isibaar 1.33.2.12 uyvy_to_yv12 = uyvy_to_yv12_xmm;
450 : Isibaar 1.1
451 : edgomez 1.16 /* ME functions */
452 : Isibaar 1.1 sad16 = sad16_xmm;
453 : suxen_drol 1.33 sad8 = sad8_xmm;
454 : chenm001 1.29 sad16bi = sad16bi_xmm;
455 : suxen_drol 1.33 sad8bi = sad8bi_xmm;
456 : Isibaar 1.1 dev16 = dev16_xmm;
457 : chl 1.33.2.1 sad16v = sad16v_xmm;
458 : Isibaar 1.1 }
459 :    
460 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_3DNOW)) {
461 : edgomez 1.16
462 :     /* Interpolation */
463 : Isibaar 1.1 interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;
464 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;
465 : h 1.4 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dn;
466 : Isibaar 1.1 }
467 : Isibaar 1.33.2.18
468 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_3DNOWEXT)) {
469 : Isibaar 1.33.2.18
470 :     /* Inverse DCT */
471 :     idct = idct_3dne;
472 :    
473 :     /* Buffer transfer */
474 :     transfer_8to16copy = transfer_8to16copy_3dne;
475 :     transfer_16to8copy = transfer_16to8copy_3dne;
476 :     transfer_8to16sub = transfer_8to16sub_3dne;
477 :     transfer_8to16sub2 = transfer_8to16sub2_3dne;
478 :     transfer_16to8add = transfer_16to8add_3dne;
479 :     transfer8x8_copy = transfer8x8_copy_3dne;
480 :    
481 :     /* Quantization */
482 :     dequant4_intra = dequant4_intra_3dne;
483 :     dequant4_inter = dequant4_inter_3dne;
484 :     quant_intra = quant_intra_3dne;
485 :     quant_inter = quant_inter_3dne;
486 :     dequant_intra = dequant_intra_3dne;
487 :     dequant_inter = dequant_inter_3dne;
488 :    
489 :     /* ME functions */
490 :     calc_cbp = calc_cbp_3dne;
491 :     sad16 = sad16_3dne;
492 :     sad8 = sad8_3dne;
493 :     sad16bi = sad16bi_3dne;
494 :     sad8bi = sad8bi_3dne;
495 :     dev16 = dev16_3dne;
496 :    
497 :     /* Interpolation */
498 :     interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dne;
499 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dne;
500 :     interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dne;
501 :     }
502 :    
503 : Isibaar 1.1
504 : suxen_drol 1.33.2.22 if ((cpu_flags & XVID_CPU_SSE2)) {
505 : edgomez 1.16
506 : chenm001 1.29 calc_cbp = calc_cbp_sse2;
507 :    
508 : edgomez 1.16 /* Quantization */
509 :     quant_intra = quant_intra_sse2;
510 : Isibaar 1.14 dequant_intra = dequant_intra_sse2;
511 : edgomez 1.16 quant_inter = quant_inter_sse2;
512 : Isibaar 1.14 dequant_inter = dequant_inter_sse2;
513 : h 1.13
514 : suxen_drol 1.33.2.22 #if defined(EXPERIMENTAL_SSE2_CODE)
515 :     /* ME; slower than xmm */
516 : edgomez 1.16 sad16 = sad16_sse2;
517 :     dev16 = dev16_sse2;
518 : suxen_drol 1.33.2.22 #endif
519 : edgomez 1.16 /* Forward and Inverse DCT */
520 :     idct = idct_sse2;
521 : Isibaar 1.14 fdct = fdct_sse2;
522 : h 1.12 }
523 : Isibaar 1.1 #endif
524 : Isibaar 1.18
525 : suxen_drol 1.33.2.22 #if defined(ARCH_IA64)
526 :     if ((cpu_flags & XVID_CPU_ASM)) { //use assembler routines?
527 : Isibaar 1.18 idct_ia64_init();
528 :     fdct = fdct_ia64;
529 :     idct = idct_ia64; //not yet working, crashes
530 :     interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_ia64;
531 :     interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_ia64;
532 :     interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_ia64;
533 :     sad16 = sad16_ia64;
534 :     sad16bi = sad16bi_ia64;
535 :     sad8 = sad8_ia64;
536 :     dev16 = dev16_ia64;
537 : chl 1.33.2.1 // Halfpel8_Refine = Halfpel8_Refine_ia64;
538 : Isibaar 1.18 quant_intra = quant_intra_ia64;
539 :     dequant_intra = dequant_intra_ia64;
540 :     quant_inter = quant_inter_ia64;
541 :     dequant_inter = dequant_inter_ia64;
542 :     transfer_8to16copy = transfer_8to16copy_ia64;
543 :     transfer_16to8copy = transfer_16to8copy_ia64;
544 :     transfer_8to16sub = transfer_8to16sub_ia64;
545 :     transfer_8to16sub2 = transfer_8to16sub2_ia64;
546 :     transfer_16to8add = transfer_16to8add_ia64;
547 :     transfer8x8_copy = transfer8x8_copy_ia64;
548 :     DEBUG("Using IA-64 assembler routines.\n");
549 :     }
550 :     #endif
551 : edgomez 1.16
552 : suxen_drol 1.33.2.22 #if defined(ARCH_PPC)
553 :     if ((cpu_flags & XVID_CPU_ASM))
554 :     {
555 :     calc_cbp = calc_cbp_ppc;
556 :     }
557 :    
558 :     if ((cpu_flags & XVID_CPU_ALTIVEC))
559 :     {
560 :     calc_cbp = calc_cbp_altivec;
561 :     fdct = fdct_altivec;
562 :     idct = idct_altivec;
563 :     sadInit = sadInit_altivec;
564 :     sad16 = sad16_altivec;
565 :     sad8 = sad8_altivec;
566 :     dev16 = dev16_altivec;
567 :     }
568 : canard 1.5 #endif
569 : Isibaar 1.1
570 :     return XVID_ERR_OK;
571 : suxen_drol 1.33.2.13 }
572 :    
573 :    
574 :    
575 :     static int
576 :     xvid_init_convert(XVID_INIT_CONVERTINFO* convert)
577 :     {
578 : suxen_drol 1.33.2.16 // const int flip1 = (convert->input.colorspace & XVID_CSP_VFLIP) ^ (convert->output.colorspace & XVID_CSP_VFLIP);
579 : suxen_drol 1.33.2.13 const int width = convert->width;
580 :     const int height = convert->height;
581 :     const int width2 = convert->width/2;
582 :     const int height2 = convert->height/2;
583 :     IMAGE img;
584 :    
585 :     switch (convert->input.colorspace & ~XVID_CSP_VFLIP)
586 :     {
587 :     case XVID_CSP_YV12 :
588 :     img.y = convert->input.y;
589 :     img.v = (uint8_t*)convert->input.y + width*height;
590 :     img.u = (uint8_t*)convert->input.y + width*height + width2*height2;
591 :     image_output(&img, width, height, width,
592 :     convert->output.y, convert->output.y_stride,
593 :     convert->output.colorspace, convert->interlacing);
594 :     break;
595 :    
596 :     default :
597 :     return XVID_ERR_FORMAT;
598 :     }
599 :    
600 :    
601 :     emms();
602 :     return XVID_ERR_OK;
603 :     }
604 :    
605 :    
606 : suxen_drol 1.33.2.19
607 :     void fill8(uint8_t * block, int size, int value)
608 :     {
609 :     int i;
610 :     for (i = 0; i < size; i++)
611 :     block[i] = value;
612 :     }
613 :    
614 :     void fill16(int16_t * block, int size, int value)
615 :     {
616 :     int i;
617 :     for (i = 0; i < size; i++)
618 :     block[i] = value;
619 :     }
620 :    
621 :     #define RANDOM(min,max) min + (rand() % (max-min))
622 :    
623 :     void random8(uint8_t * block, int size, int min, int max)
624 :     {
625 :     int i;
626 :     for (i = 0; i < size; i++)
627 :     block[i] = RANDOM(min,max);
628 :     }
629 :    
630 :     void random16(int16_t * block, int size, int min, int max)
631 :     {
632 :     int i;
633 :     for (i = 0; i < size; i++)
634 :     block[i] = RANDOM(min,max);
635 :     }
636 :    
637 :     int compare16(const int16_t * blockA, const int16_t * blockB, int size)
638 :     {
639 :     int i;
640 :     for (i = 0; i < size; i++)
641 :     if (blockA[i] != blockB[i])
642 :     return 1;
643 :    
644 :     return 0;
645 :     }
646 :    
647 : suxen_drol 1.33.2.20 int diff16(const int16_t * blockA, const int16_t * blockB, int size)
648 :     {
649 :     int i, diff = 0;
650 :     for (i = 0; i < size; i++)
651 :     diff += ABS(blockA[i]-blockB[i]);
652 :     return diff;
653 :     }
654 :    
655 :    
656 :     #define XVID_TEST_RANDOM 0x00000001 /* random input data */
657 :     #define XVID_TEST_VERBOSE 0x00000002 /* verbose error output */
658 : suxen_drol 1.33.2.19
659 :    
660 : suxen_drol 1.33.2.20 #define TEST_FORWARD 0x00000001 /* intra */
661 :     #define TEST_FDCT (TEST_FORWARD)
662 :     #define TEST_IDCT (0)
663 :    
664 :     int test_transform(void * funcA, void * funcB, const char * nameB,
665 :     int test, int flags)
666 : suxen_drol 1.33.2.19 {
667 : suxen_drol 1.33.2.20 int i;
668 : suxen_drol 1.33.2.19 int64_t timeSTART;
669 :     int64_t timeA = 0;
670 :     int64_t timeB = 0;
671 :     DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);
672 :     DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);
673 : suxen_drol 1.33.2.20 int min, max;
674 :     int count = 0;
675 : suxen_drol 1.33.2.19
676 : suxen_drol 1.33.2.20 int tmp;
677 :     int min_error = 0x10000*64;
678 :     int max_error = 0;
679 :    
680 :    
681 :     if ((test & TEST_FORWARD)) /* forward */
682 : suxen_drol 1.33.2.19 {
683 : suxen_drol 1.33.2.20 min = -256;
684 :     max = 255;
685 :     }else{ /* inverse */
686 :     min = -2048;
687 :     max = 2047;
688 :     }
689 :    
690 :     for (i = 0; i < 64*64; i++)
691 :     {
692 :     if ((flags & XVID_TEST_RANDOM))
693 : suxen_drol 1.33.2.19 {
694 : suxen_drol 1.33.2.20 random16(arrayA, 64, min, max);
695 :     }else{
696 :     fill16(arrayA, 64, i);
697 :     }
698 :     memcpy(arrayB, arrayA, 64*sizeof(int16_t));
699 : suxen_drol 1.33.2.19
700 : suxen_drol 1.33.2.20 if ((test & TEST_FORWARD))
701 :     {
702 : suxen_drol 1.33.2.19 timeSTART = read_counter();
703 : suxen_drol 1.33.2.20 ((fdctFunc*)funcA)(arrayA);
704 : suxen_drol 1.33.2.19 timeA += read_counter() - timeSTART;
705 :    
706 :     timeSTART = read_counter();
707 : suxen_drol 1.33.2.20 ((fdctFunc*)funcB)(arrayB);
708 : suxen_drol 1.33.2.19 timeB += read_counter() - timeSTART;
709 : suxen_drol 1.33.2.20 }
710 :     else
711 :     {
712 :     timeSTART = read_counter();
713 :     ((idctFunc*)funcA)(arrayA);
714 :     timeA += read_counter() - timeSTART;
715 : suxen_drol 1.33.2.19
716 : suxen_drol 1.33.2.20 timeSTART = read_counter();
717 :     ((idctFunc*)funcB)(arrayB);
718 :     timeB += read_counter() - timeSTART;
719 : suxen_drol 1.33.2.19 }
720 : suxen_drol 1.33.2.20
721 :     tmp = diff16(arrayA, arrayB, 64) / 64;
722 :     if (tmp > max_error)
723 :     max_error = tmp;
724 :     if (tmp < min_error)
725 :     min_error = tmp;
726 :    
727 :     count++;
728 : suxen_drol 1.33.2.19 }
729 :    
730 : suxen_drol 1.33.2.20 /* print the "average difference" of best/worst transforms */
731 : suxen_drol 1.33.2.21 printf("%s:\t%i\t(min_error:%i, max_error:%i)\n", nameB, (int)(timeB / count), min_error, max_error);
732 : suxen_drol 1.33.2.19
733 :     return 0;
734 :     }
735 :    
736 : suxen_drol 1.33.2.20
737 :     #define TEST_QUANT 0x00000001 /* forward quantization */
738 :     #define TEST_INTRA 0x00000002 /* intra */
739 :     #define TEST_QUANT_INTRA (TEST_QUANT|TEST_INTRA)
740 :     #define TEST_QUANT_INTER (TEST_QUANT)
741 :     #define TEST_DEQUANT_INTRA (TEST_INTRA)
742 :     #define TEST_DEQUANT_INTER (0)
743 :    
744 :     int test_quant(void * funcA, void * funcB, const char * nameB,
745 :     int test, int flags)
746 : suxen_drol 1.33.2.19 {
747 :     int q,i;
748 :     int64_t timeSTART;
749 :     int64_t timeA = 0;
750 :     int64_t timeB = 0;
751 : suxen_drol 1.33.2.20 int retA, retB;
752 : suxen_drol 1.33.2.19 DECLARE_ALIGNED_MATRIX(arrayX, 1, 64, int16_t, CACHE_LINE);
753 :     DECLARE_ALIGNED_MATRIX(arrayA, 1, 64, int16_t, CACHE_LINE);
754 :     DECLARE_ALIGNED_MATRIX(arrayB, 1, 64, int16_t, CACHE_LINE);
755 : suxen_drol 1.33.2.20 int min, max;
756 :     int count = 0;
757 :     int errors = 0;
758 :    
759 :     if ((test & TEST_QUANT)) /* quant */
760 :     {
761 :     min = -2048;
762 :     max = 2047;
763 :     }else{ /* dequant */
764 :     min = -256;
765 :     max = 255;
766 :     }
767 :    
768 : suxen_drol 1.33.2.19 for (q = 1; q <= 31; q++) /* quantizer */
769 :     {
770 :     for (i = min; i < max; i++) /* input coeff */
771 :     {
772 : suxen_drol 1.33.2.20 if ((flags & XVID_TEST_RANDOM))
773 :     {
774 :     random16(arrayX, 64, min, max);
775 :     }else{
776 :     fill16(arrayX, 64, i);
777 :     }
778 : suxen_drol 1.33.2.19
779 : suxen_drol 1.33.2.20 if ((test & TEST_INTRA)) /* intra */
780 :     {
781 :     timeSTART = read_counter();
782 :     ((quanth263_intraFunc*)funcA)(arrayA, arrayX, q, q);
783 :     timeA += read_counter() - timeSTART;
784 :    
785 :     timeSTART = read_counter();
786 :     ((quanth263_intraFunc*)funcB)(arrayB, arrayX, q, q);
787 :     timeB += read_counter() - timeSTART;
788 :     }
789 :     else /* inter */
790 :     {
791 :     timeSTART = read_counter();
792 :     retA = ((quanth263_interFunc*)funcA)(arrayA, arrayX, q);
793 :     timeA += read_counter() - timeSTART;
794 :    
795 :     timeSTART = read_counter();
796 :     retB = ((quanth263_interFunc*)funcB)(arrayB, arrayX, q);
797 :     timeB += read_counter() - timeSTART;
798 :     }
799 : suxen_drol 1.33.2.19
800 : suxen_drol 1.33.2.20 /* compare return value from quant_inter, and compare (de)quantiz'd arrays */
801 :     if ( ((test&TEST_QUANT) && !(test&TEST_INTRA) && retA != retB ) ||
802 :     compare16(arrayA, arrayB, 64))
803 : suxen_drol 1.33.2.19 {
804 : suxen_drol 1.33.2.20 errors++;
805 :     if ((flags & XVID_TEST_VERBOSE))
806 :     printf("%s error: q=%i, i=%i\n", nameB, q, i);
807 : suxen_drol 1.33.2.19 }
808 : suxen_drol 1.33.2.20
809 :     count++;
810 : suxen_drol 1.33.2.19 }
811 :     }
812 :    
813 : suxen_drol 1.33.2.21 printf("%s:\t%i", nameB, (int)(timeB / count));
814 : suxen_drol 1.33.2.20 if (errors>0)
815 :     printf("\t(%i errors out of %i)", errors, count);
816 :     printf("\n");
817 :    
818 : suxen_drol 1.33.2.19 return 0;
819 :     }
820 :    
821 :    
822 :    
823 : suxen_drol 1.33.2.20 int xvid_init_test(int flags)
824 : suxen_drol 1.33.2.19 {
825 :     int cpu_flags;
826 :    
827 : suxen_drol 1.33.2.20 srand(time(0));
828 :    
829 : suxen_drol 1.33.2.19 printf("xvid_init_test\n");
830 :    
831 :     #if defined(ARCH_X86)
832 : suxen_drol 1.33.2.22 cpu_flags = detect_cpu_flags();
833 : suxen_drol 1.33.2.20 idct_int32_init();
834 : suxen_drol 1.33.2.19 emms_mmx();
835 :    
836 : suxen_drol 1.33.2.20 printf("--- fdct ---\n");
837 :     test_transform(fdct_int32, fdct_int32, "c", TEST_FDCT, flags);
838 :     if (cpu_flags & XVID_CPU_MMX)
839 :     test_transform(fdct_int32, fdct_mmx, "mmx", TEST_FDCT, flags);
840 :     if (cpu_flags & XVID_CPU_SSE2)
841 :     test_transform(fdct_int32, fdct_sse2, "sse2", TEST_FDCT, flags);
842 :    
843 :     printf("\n--- idct ---\n");
844 :     test_transform(idct_int32, idct_int32, "c", TEST_IDCT, flags);
845 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
846 : suxen_drol 1.33.2.20 test_transform(idct_int32, idct_mmx, "mmx", TEST_IDCT, flags);
847 :     if (cpu_flags & XVID_CPU_MMXEXT)
848 :     test_transform(idct_int32, idct_xmm, "xmm", TEST_IDCT, flags);
849 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
850 : suxen_drol 1.33.2.20 test_transform(idct_int32, idct_3dne, "3dne", TEST_IDCT, flags);
851 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_SSE2)
852 : suxen_drol 1.33.2.20 test_transform(idct_int32, idct_sse2, "sse2", TEST_IDCT, flags);
853 :    
854 :     printf("\n--- quant intra ---\n");
855 :     test_quant(quant_intra_c, quant_intra_c, "c", TEST_QUANT_INTRA, flags);
856 :     if (cpu_flags & XVID_CPU_MMX)
857 :     test_quant(quant_intra_c, quant_intra_mmx, "mmx", TEST_QUANT_INTRA, flags);
858 :     if (cpu_flags & XVID_CPU_3DNOWEXT)
859 :     test_quant(quant_intra_c, quant_intra_3dne, "3dne", TEST_QUANT_INTRA, flags);
860 :     if (cpu_flags & XVID_CPU_SSE2)
861 :     test_quant(quant_intra_c, quant_intra_sse2, "sse2", TEST_QUANT_INTRA, flags);
862 : suxen_drol 1.33.2.19
863 :     printf("\n--- quant inter ---\n");
864 : suxen_drol 1.33.2.20 test_quant(quant_inter_c, quant_inter_c, "c", TEST_QUANT_INTER, flags);
865 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
866 : suxen_drol 1.33.2.20 test_quant(quant_inter_c, quant_inter_mmx, "mmx", TEST_QUANT_INTER, flags);
867 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
868 : suxen_drol 1.33.2.20 test_quant(quant_inter_c, quant_inter_3dne, "3dne", TEST_QUANT_INTER, flags);
869 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_SSE2)
870 : suxen_drol 1.33.2.20 test_quant(quant_inter_c, quant_inter_sse2, "sse2", TEST_QUANT_INTER, flags);
871 : suxen_drol 1.33.2.19
872 : suxen_drol 1.33.2.20 printf("\n--- dequant intra ---\n");
873 :     test_quant(dequant_intra_c, dequant_intra_c, "c", TEST_DEQUANT_INTRA, flags);
874 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
875 : suxen_drol 1.33.2.20 test_quant(dequant_intra_c, dequant_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags);
876 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMXEXT)
877 : suxen_drol 1.33.2.20 test_quant(dequant_intra_c, dequant_intra_xmm, "xmm", TEST_DEQUANT_INTRA, flags);
878 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
879 : suxen_drol 1.33.2.20 test_quant(dequant_intra_c, dequant_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags);
880 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_SSE2)
881 : suxen_drol 1.33.2.20 test_quant(dequant_intra_c, dequant_intra_sse2, "sse2", TEST_DEQUANT_INTRA, flags);
882 : suxen_drol 1.33.2.19
883 :     printf("\n--- dequant inter ---\n");
884 : suxen_drol 1.33.2.20 test_quant(dequant_inter_c, dequant_inter_c, "c", TEST_DEQUANT_INTER, flags);
885 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
886 : suxen_drol 1.33.2.20 test_quant(dequant_inter_c, dequant_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags);
887 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMXEXT)
888 : suxen_drol 1.33.2.20 test_quant(dequant_inter_c, dequant_inter_xmm, "xmm", TEST_DEQUANT_INTER, flags);
889 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
890 : suxen_drol 1.33.2.20 test_quant(dequant_inter_c, dequant_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags);
891 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_SSE2)
892 : suxen_drol 1.33.2.20 test_quant(dequant_inter_c, dequant_inter_sse2, "sse2", TEST_DEQUANT_INTER, flags);
893 : suxen_drol 1.33.2.19
894 :     printf("\n--- quant4_intra ---\n");
895 : suxen_drol 1.33.2.20 test_quant(quant4_intra_c, quant4_intra_c, "c", TEST_QUANT_INTRA, flags);
896 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
897 : suxen_drol 1.33.2.20 test_quant(quant4_intra_c, quant4_intra_mmx, "mmx", TEST_QUANT_INTRA, flags);
898 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMXEXT)
899 : suxen_drol 1.33.2.20 test_quant(quant4_intra_c, quant4_intra_xmm, "xmm", TEST_QUANT_INTRA, flags);
900 : suxen_drol 1.33.2.19
901 :     printf("\n--- quant4_inter ---\n");
902 : suxen_drol 1.33.2.20 test_quant(quant4_inter_c, quant4_inter_c, "c", TEST_QUANT_INTER, flags);
903 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
904 : suxen_drol 1.33.2.20 test_quant(quant4_inter_c, quant4_inter_mmx, "mmx", TEST_QUANT_INTER, flags);
905 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMXEXT)
906 : suxen_drol 1.33.2.20 test_quant(quant4_inter_c, quant4_inter_xmm, "xmm", TEST_QUANT_INTER, flags);
907 : suxen_drol 1.33.2.19
908 :     printf("\n--- dequant4_intra ---\n");
909 : suxen_drol 1.33.2.20 test_quant(dequant4_intra_c, dequant4_intra_c, "c", TEST_DEQUANT_INTRA, flags);
910 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
911 : suxen_drol 1.33.2.20 test_quant(dequant4_intra_c, dequant4_intra_mmx, "mmx", TEST_DEQUANT_INTRA, flags);
912 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
913 : suxen_drol 1.33.2.20 test_quant(dequant4_intra_c, dequant4_intra_3dne, "3dne", TEST_DEQUANT_INTRA, flags);
914 : suxen_drol 1.33.2.19
915 :     printf("\n--- dequant4_inter ---\n");
916 : suxen_drol 1.33.2.20 test_quant(dequant4_inter_c, dequant4_inter_c, "c", TEST_DEQUANT_INTER, flags);
917 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_MMX)
918 : suxen_drol 1.33.2.20 test_quant(dequant4_inter_c, dequant4_inter_mmx, "mmx", TEST_DEQUANT_INTER, flags);
919 : suxen_drol 1.33.2.19 if (cpu_flags & XVID_CPU_3DNOWEXT)
920 : suxen_drol 1.33.2.20 test_quant(dequant4_inter_c, dequant4_inter_3dne, "3dne", TEST_DEQUANT_INTER, flags);
921 : suxen_drol 1.33.2.19
922 :     emms_mmx();
923 :    
924 :     #endif
925 :    
926 :     return XVID_ERR_OK;
927 :     }
928 :    
929 :    
930 : suxen_drol 1.33.2.13 int
931 :     xvid_init(void *handle,
932 :     int opt,
933 :     void *param1,
934 :     void *param2)
935 :     {
936 :     switch(opt)
937 :     {
938 :     case XVID_INIT_INIT :
939 :     return xvid_init_init((XVID_INIT_PARAM*)param1);
940 :    
941 :     case XVID_INIT_CONVERT :
942 :     return xvid_init_convert((XVID_INIT_CONVERTINFO*)param1);
943 : suxen_drol 1.33.2.19
944 :     case XVID_INIT_TEST :
945 : suxen_drol 1.33.2.20 return xvid_init_test((int)param1);
946 : suxen_drol 1.33.2.13
947 :     default :
948 :     return XVID_ERR_FAIL;
949 :     }
950 : Isibaar 1.1 }
951 :    
952 : edgomez 1.16 /*****************************************************************************
953 :     * XviD Native decoder entry point
954 :     *
955 :     * This function is just a wrapper to all the option cases.
956 :     *
957 :     * Returned values : XVID_ERR_FAIL when opt is invalid
958 :     * else returns the wrapped function result
959 :     *
960 :     ****************************************************************************/
961 :    
962 : edgomez 1.15 int
963 :     xvid_decore(void *handle,
964 :     int opt,
965 :     void *param1,
966 :     void *param2)
967 : Isibaar 1.1 {
968 : edgomez 1.15 switch (opt) {
969 :     case XVID_DEC_DECODE:
970 : suxen_drol 1.33.2.11 return decoder_decode((DECODER *) handle, (XVID_DEC_FRAME *) param1, (XVID_DEC_STATS*) param2);
971 : edgomez 1.15
972 :     case XVID_DEC_CREATE:
973 : chenm001 1.29 return decoder_create((XVID_DEC_PARAM *) param1);
974 : edgomez 1.15
975 :     case XVID_DEC_DESTROY:
976 :     return decoder_destroy((DECODER *) handle);
977 : Isibaar 1.1
978 :     default:
979 : edgomez 1.15 return XVID_ERR_FAIL;
980 :     }
981 : Isibaar 1.1 }
982 :    
983 : edgomez 1.16
984 :     /*****************************************************************************
985 :     * XviD Native encoder entry point
986 :     *
987 :     * This function is just a wrapper to all the option cases.
988 :     *
989 :     * Returned values : XVID_ERR_FAIL when opt is invalid
990 :     * else returns the wrapped function result
991 :     *
992 :     ****************************************************************************/
993 : Isibaar 1.1
994 : edgomez 1.15 int
995 :     xvid_encore(void *handle,
996 :     int opt,
997 :     void *param1,
998 :     void *param2)
999 : Isibaar 1.1 {
1000 : edgomez 1.15 switch (opt) {
1001 :     case XVID_ENC_ENCODE:
1002 : chl 1.33.2.10
1003 : suxen_drol 1.20 if (((Encoder *) handle)->mbParam.max_bframes >= 0)
1004 :     return encoder_encode_bframes((Encoder *) handle, (XVID_ENC_FRAME *) param1,
1005 :     (XVID_ENC_STATS *) param2);
1006 :     else
1007 : edgomez 1.15 return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1,
1008 :     (XVID_ENC_STATS *) param2);
1009 :    
1010 :     case XVID_ENC_CREATE:
1011 :     return encoder_create((XVID_ENC_PARAM *) param1);
1012 :    
1013 :     case XVID_ENC_DESTROY:
1014 :     return encoder_destroy((Encoder *) handle);
1015 : Isibaar 1.1
1016 :     default:
1017 : edgomez 1.15 return XVID_ERR_FAIL;
1018 :     }
1019 : Isibaar 1.1 }

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4