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

Diff of /xvidcore/src/xvid.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.20, Fri Jun 21 16:12:47 2002 UTC revision 1.40, Sun Feb 9 19:32:52 2003 UTC
# Line 3  Line 3 
3   *  XVID MPEG-4 VIDEO CODEC   *  XVID MPEG-4 VIDEO CODEC
4   *  - Native API implementation  -   *  - Native API implementation  -
5   *   *
6   *  This program is an implementation of a part of one or more MPEG-4   *  Copyright(C) 2001-2002 Peter Ross <pross@xvid.org>
  *  Video tools as specified in ISO/IEC 14496-2 standard.  Those intending  
  *  to use this software module in hardware or software products are  
  *  advised that its use may infringe existing patents or copyrights, and  
  *  any such use would be at such party's own risk.  The original  
  *  developer of this software module and his/her company, and subsequent  
  *  editors and their companies, will have no liability for use of this  
  *  software or modifications or derivatives thereof.  
7   *   *
8   *  This program is free software ; you can redistribute it and/or modify   *  This file is part of XviD, a free MPEG-4 video encoder/decoder
9   *  it under the terms of the GNU General Public License as published by   *
10     *  XviD is free software; you can redistribute it and/or modify it
11     *  under the terms of the GNU General Public License as published by
12   *  the Free Software Foundation ; either version 2 of the License, or   *  the Free Software Foundation ; either version 2 of the License, or
13   *  (at your option) any later version.   *  (at your option) any later version.
14   *   *
# Line 26  Line 21 
21   *  along with this program ; if not, write to the Free Software   *  along with this program ; if not, write to the Free Software
22   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
23   *   *
24   ****************************************************************************/   *  Under section 8 of the GNU General Public License, the copyright
25  /*****************************************************************************   *  holders of XVID explicitly forbid distribution in the following
26   *   *  countries:
27   *  History   *
28   *   *    - Japan
29   *  - 17.03.2002        Added interpolate8x8_halfpel_hv_xmm   *    - United States of America
30   *  - 22.12.2001  API change: added xvid_init() - Isibaar   *
31   *  - 16.12.2001        inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>   *  Linking XviD statically or dynamically with other modules is making a
32     *  combined work based on XviD.  Thus, the terms and conditions of the
33     *  GNU General Public License cover the whole combination.
34     *
35     *  As a special exception, the copyright holders of XviD give you
36     *  permission to link XviD with independent modules that communicate with
37     *  XviD solely through the VFW1.1 and DShow interfaces, regardless of the
38     *  license terms of these independent modules, and to copy and distribute
39     *  the resulting combined work under terms of your choice, provided that
40     *  every copy of the combined work is accompanied by a complete copy of
41     *  the source code of XviD (the version of XviD used to produce the
42     *  combined work), being distributed under the terms of the GNU General
43     *  Public License plus this exception.  An independent module is a module
44     *  which is not derived from or based on XviD.
45     *
46     *  Note that people who make modified versions of XviD are not obligated
47     *  to grant this special exception for their modified versions; it is
48     *  their choice whether to do so.  The GNU General Public License gives
49     *  permission to release a modified version without this exception; this
50     *  exception also makes it possible to release a modified version which
51     *  carries forward this exception.
52   *   *
53   *  $Id$   *  $Id$
54   *   *
# Line 50  Line 65 
65  #include "utils/mem_transfer.h"  #include "utils/mem_transfer.h"
66  #include "quant/quant_h263.h"  #include "quant/quant_h263.h"
67  #include "quant/quant_mpeg4.h"  #include "quant/quant_mpeg4.h"
68    #include "motion/motion.h"
69  #include "motion/sad.h"  #include "motion/sad.h"
70  #include "utils/emms.h"  #include "utils/emms.h"
71  #include "utils/timer.h"  #include "utils/timer.h"
72  #include "bitstream/mbcoding.h"  #include "bitstream/mbcoding.h"
73    
74    #if defined(ARCH_IS_IA32) && defined(EXPERIMENTAL_SSE2_CODE)
75    
76    #ifdef _MSC_VER
77    #include <windows.h>
78    #else
79    #include <signal.h>
80    #include <setjmp.h>
81    #endif
82    
83    
84    #ifndef _MSC_VER
85    
86    static jmp_buf mark;
87    
88    static void
89    sigill_handler(int signal)
90    {
91       longjmp(mark, 1);
92    }
93    #endif
94    
95    
96    /*
97     * Calls the funcptr, and returns whether SIGILL (illegal instruction) was signalled
98     * Return values:
99     * -1 : could not determine
100     * 0  : SIGILL was *not* signalled
101     * 1  : SIGILL was signalled
102     */
103    
104    int
105    sigill_check(void (*func)())
106    {
107    #ifdef _MSC_VER
108            _try {
109                    func();
110            }
111            _except(EXCEPTION_EXECUTE_HANDLER) {
112    
113                    if (_exception_code() == STATUS_ILLEGAL_INSTRUCTION)
114                            return 1;
115            }
116            return 0;
117    #else
118        void * old_handler;
119        int jmpret;
120    
121    
122        old_handler = signal(SIGILL, sigill_handler);
123        if (old_handler == SIG_ERR)
124        {
125            return -1;
126        }
127    
128        jmpret = setjmp(mark);
129        if (jmpret == 0)
130        {
131            func();
132        }
133    
134        signal(SIGILL, old_handler);
135    
136        return jmpret;
137    #endif
138    }
139    #endif
140    
141  /*****************************************************************************  /*****************************************************************************
142   * XviD Init Entry point   * XviD Init Entry point
143   *   *
# Line 80  Line 163 
163    
164          init_param = (XVID_INIT_PARAM *) param1;          init_param = (XVID_INIT_PARAM *) param1;
165    
166            /* Inform the client the API version */
167            init_param->api_version = API_VERSION;
168    
169            /* Inform the client the core build - unused because we're still alpha */
170            init_param->core_build = 1000;
171    
172          /* Do we have to force CPU features  ? */          /* Do we have to force CPU features  ? */
173          if ((init_param->cpu_flags & XVID_CPU_FORCE) > 0) {          if ((init_param->cpu_flags & XVID_CPU_FORCE)) {
174    
175                  cpu_flags = init_param->cpu_flags;                  cpu_flags = init_param->cpu_flags;
176    
177          } else {          } else {
178    
 #ifdef ARCH_X86  
179                  cpu_flags = check_cpu_features();                  cpu_flags = check_cpu_features();
180  #else  
181                  cpu_flags = 0;  #if defined(ARCH_IS_IA32) && defined(EXPERIMENTAL_SSE2_CODE)
182                    if ((cpu_flags & XVID_CPU_SSE) && sigill_check(sse_os_trigger))
183                            cpu_flags &= ~XVID_CPU_SSE;
184    
185                    if ((cpu_flags & XVID_CPU_SSE2) && sigill_check(sse2_os_trigger))
186                            cpu_flags &= ~XVID_CPU_SSE2;
187  #endif  #endif
188            }
189    
190            if ((init_param->cpu_flags & XVID_CPU_CHKONLY))
191            {
192                  init_param->cpu_flags = cpu_flags;                  init_param->cpu_flags = cpu_flags;
193                    return XVID_ERR_OK;
194          }          }
195    
196            init_param->cpu_flags = cpu_flags;
197    
198    
199          /* Initialize the function pointers */          /* Initialize the function pointers */
200          idct_int32_init();          idct_int32_init();
201          init_vlc_tables();          init_vlc_tables();
# Line 155  Line 258 
258          /* Functions used in motion estimation algorithms */          /* Functions used in motion estimation algorithms */
259          calc_cbp = calc_cbp_c;          calc_cbp = calc_cbp_c;
260          sad16    = sad16_c;          sad16    = sad16_c;
         sad16bi  = sad16bi_c;  
261          sad8     = sad8_c;          sad8     = sad8_c;
262            sad16bi  = sad16bi_c;
263            sad8bi   = sad8bi_c;
264          dev16    = dev16_c;          dev16    = dev16_c;
265    
266  #ifdef ARCH_X86          Halfpel8_Refine = Halfpel8_Refine_c;
267    
268    #ifdef ARCH_IS_IA32
269          if ((cpu_flags & XVID_CPU_MMX) > 0) {          if ((cpu_flags & XVID_CPU_MMX) > 0) {
270    
271                  /* Forward and Inverse Discrete Cosine Transformation functions */                  /* Forward and Inverse Discrete Cosine Transformation functions */
# Line 184  Line 290 
290                  transfer_8to16copy = transfer_8to16copy_mmx;                  transfer_8to16copy = transfer_8to16copy_mmx;
291                  transfer_16to8copy = transfer_16to8copy_mmx;                  transfer_16to8copy = transfer_16to8copy_mmx;
292                  transfer_8to16sub  = transfer_8to16sub_mmx;                  transfer_8to16sub  = transfer_8to16sub_mmx;
293                    transfer_8to16sub2 = transfer_8to16sub2_mmx;
294                  transfer_16to8add  = transfer_16to8add_mmx;                  transfer_16to8add  = transfer_16to8add_mmx;
295                  transfer8x8_copy   = transfer8x8_copy_mmx;                  transfer8x8_copy   = transfer8x8_copy_mmx;
296    
297    
298                  /* Image Interpolation related functions */                  /* Image Interpolation related functions */
299                  interpolate8x8_halfpel_h  = interpolate8x8_halfpel_h_mmx;                  interpolate8x8_halfpel_h  = interpolate8x8_halfpel_h_mmx;
300                  interpolate8x8_halfpel_v  = interpolate8x8_halfpel_v_mmx;                  interpolate8x8_halfpel_v  = interpolate8x8_halfpel_v_mmx;
# Line 209  Line 317 
317                  calc_cbp = calc_cbp_mmx;                  calc_cbp = calc_cbp_mmx;
318                  sad16    = sad16_mmx;                  sad16    = sad16_mmx;
319                  sad8     = sad8_mmx;                  sad8     = sad8_mmx;
320                    sad16bi = sad16bi_mmx;
321                    sad8bi  = sad8bi_mmx;
322                  dev16    = dev16_mmx;                  dev16    = dev16_mmx;
323    
324          }          }
325    
326            /* these 3dnow functions are faster than mmx, but slower than xmm. */
327            if ((cpu_flags & XVID_CPU_3DNOW) > 0) {
328    
329                    /* ME functions */
330                    sad16bi = sad16bi_3dn;
331                    sad8bi  = sad8bi_3dn;
332            }
333    
334    
335          if ((cpu_flags & XVID_CPU_MMXEXT) > 0) {          if ((cpu_flags & XVID_CPU_MMXEXT) > 0) {
336    
337                  /* Inverse DCT */                  /* Inverse DCT */
# Line 223  Line 342 
342                  interpolate8x8_halfpel_v  = interpolate8x8_halfpel_v_xmm;                  interpolate8x8_halfpel_v  = interpolate8x8_halfpel_v_xmm;
343                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;
344    
345                    /* Quantization */
346                    dequant_intra = dequant_intra_xmm;
347                    dequant_inter = dequant_inter_xmm;
348    
349                  /* Buffer transfer */                  /* Buffer transfer */
350                  transfer_8to16sub2 = transfer_8to16sub2_xmm;                  transfer_8to16sub2 = transfer_8to16sub2_xmm;
351    
# Line 232  Line 355 
355                  /* ME functions */                  /* ME functions */
356                  sad16 = sad16_xmm;                  sad16 = sad16_xmm;
357                  sad8  = sad8_xmm;                  sad8  = sad8_xmm;
358                    sad16bi = sad16bi_xmm;
359                    sad8bi  = sad8bi_xmm;
360                  dev16 = dev16_xmm;                  dev16 = dev16_xmm;
361    
362          }          }
# Line 247  Line 372 
372          if ((cpu_flags & XVID_CPU_SSE2) > 0) {          if ((cpu_flags & XVID_CPU_SSE2) > 0) {
373  #ifdef EXPERIMENTAL_SSE2_CODE  #ifdef EXPERIMENTAL_SSE2_CODE
374    
375                    calc_cbp = calc_cbp_sse2;
376    
377                  /* Quantization */                  /* Quantization */
378                  quant_intra   = quant_intra_sse2;                  quant_intra   = quant_intra_sse2;
379                  dequant_intra = dequant_intra_sse2;                  dequant_intra = dequant_intra_sse2;
# Line 254  Line 381 
381                  dequant_inter = dequant_inter_sse2;                  dequant_inter = dequant_inter_sse2;
382    
383                  /* ME */                  /* ME */
                 calc_cbp = calc_cbp_sse2;  
384                  sad16    = sad16_sse2;                  sad16    = sad16_sse2;
385                  dev16    = dev16_sse2;                  dev16    = dev16_sse2;
386    
# Line 266  Line 392 
392    
393  #endif  #endif
394    
395  #ifdef ARCH_IA64  #ifdef ARCH_IS_IA64
396          if ((cpu_flags & XVID_CPU_IA64) > 0) { //use assembler routines?          if ((cpu_flags & XVID_CPU_IA64) > 0) { //use assembler routines?
397            idct_ia64_init();            idct_ia64_init();
398            fdct = fdct_ia64;            fdct = fdct_ia64;
399            idct = idct_ia64;   //not yet working, crashes            idct = idct_ia64;
400            interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_ia64;            interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_ia64;
401            interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_ia64;            interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_ia64;
402            interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_ia64;            interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_ia64;
# Line 278  Line 404 
404            sad16bi = sad16bi_ia64;            sad16bi = sad16bi_ia64;
405            sad8 = sad8_ia64;            sad8 = sad8_ia64;
406            dev16 = dev16_ia64;            dev16 = dev16_ia64;
407              Halfpel8_Refine = Halfpel8_Refine_ia64;
408            quant_intra = quant_intra_ia64;            quant_intra = quant_intra_ia64;
409            dequant_intra = dequant_intra_ia64;            dequant_intra = dequant_intra_ia64;
410            quant_inter = quant_inter_ia64;            quant_inter = quant_inter_ia64;
# Line 288  Line 415 
415            transfer_8to16sub2 = transfer_8to16sub2_ia64;            transfer_8to16sub2 = transfer_8to16sub2_ia64;
416            transfer_16to8add = transfer_16to8add_ia64;            transfer_16to8add = transfer_16to8add_ia64;
417            transfer8x8_copy = transfer8x8_copy_ia64;            transfer8x8_copy = transfer8x8_copy_ia64;
418            DEBUG("Using IA-64 assembler routines.\n");  //        DEBUG("Using IA-64 assembler routines.\n");
419          }          }
420  #endif  #endif
421    
422  #ifdef ARCH_PPC  #ifdef ARCH_IS_PPC
423  #ifdef ARCH_PPC_ALTIVEC  #ifdef ARCH_IS_PPC_ALTIVEC
424          calc_cbp = calc_cbp_altivec;          calc_cbp = calc_cbp_altivec;
425          fdct = fdct_altivec;          fdct = fdct_altivec;
426          idct = idct_altivec;          idct = idct_altivec;
# Line 306  Line 433 
433  #endif  #endif
434  #endif  #endif
435    
         /* Inform the client the API version */  
         init_param->api_version = API_VERSION;  
   
         /* Inform the client the core build - unused because we're still alpha */  
         init_param->core_build = 1000;  
   
436          return XVID_ERR_OK;          return XVID_ERR_OK;
437  }  }
438    
# Line 365  Line 486 
486  {  {
487          switch (opt) {          switch (opt) {
488          case XVID_ENC_ENCODE:          case XVID_ENC_ENCODE:
 #ifdef BFRAMES  
                 if (((Encoder *) handle)->mbParam.max_bframes >= 0)  
                 return encoder_encode_bframes((Encoder *) handle, (XVID_ENC_FRAME *) param1,  
                                                           (XVID_ENC_STATS *) param2);  
                 else  
 #endif  
489                  return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1,                  return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1,
490                                                            (XVID_ENC_STATS *) param2);                                                            (XVID_ENC_STATS *) param2);
491    

Legend:
Removed from v.1.20  
changed lines
  Added in v.1.40

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