[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.2, Sat Mar 16 15:52:50 2002 UTC revision 1.20, Fri Jun 21 16:12:47 2002 UTC
# Line 1  Line 1 
1  /**************************************************************************  /*****************************************************************************
2   *   *
3   *      XVID MPEG-4 VIDEO CODEC   *      XVID MPEG-4 VIDEO CODEC
4   *      native api   *  - Native API implementation  -
5   *   *
6   *      This program is an implementation of a part of one or more MPEG-4   *      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   *      Video tools as specified in ISO/IEC 14496-2 standard.  Those intending
# Line 24  Line 24 
24   *   *
25   *      You should have received a copy of the GNU General Public License   *      You should have received a copy of the GNU General Public License
26   *      along with this program; if not, write to the Free Software   *      along with this program; if not, write to the Free Software
27   *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
28   *   *
29   *************************************************************************/   ****************************************************************************/
30    /*****************************************************************************
 /**************************************************************************  
31   *   *
32   *      History:   *  History
33   *   *
34   *  22.12.2001  API change: added xvid_init() - Isibaar   *  - 17.03.2002        Added interpolate8x8_halfpel_hv_xmm
35   *      16.12.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>   *  - 22.12.2001  API change: added xvid_init() - Isibaar
36     *  - 16.12.2001        inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>
37   *   *
38   *************************************************************************/   *  $Id$
39     *
40     ****************************************************************************/
41    
42  #include "xvid.h"  #include "xvid.h"
43  #include "decoder.h"  #include "decoder.h"
# Line 52  Line 53 
53  #include "motion/sad.h"  #include "motion/sad.h"
54  #include "utils/emms.h"  #include "utils/emms.h"
55  #include "utils/timer.h"  #include "utils/timer.h"
56    #include "bitstream/mbcoding.h"
57    
58  int xvid_init(void *handle, int opt, void *param1, void *param2)  /*****************************************************************************
59     * XviD Init Entry point
60     *
61     * Well this function initialize all internal function pointers according
62     * to the CPU features forced by the library client or autodetected (depending
63     * on the XVID_CPU_FORCE flag). It also initializes vlc coding tables and all
64     * image colorspace transformation tables.
65     *
66     * Returned value : XVID_ERR_OK
67     *                  + API_VERSION in the input XVID_INIT_PARAM structure
68     *                  + core build  "   "    "       "               "
69     *
70     ****************************************************************************/
71    
72    int
73    xvid_init(void *handle,
74                      int opt,
75                      void *param1,
76                      void *param2)
77  {  {
78          int cpu_flags;          int cpu_flags;
79          XVID_INIT_PARAM *init_param;          XVID_INIT_PARAM *init_param;
80    
81          init_param = (XVID_INIT_PARAM *) param1;          init_param = (XVID_INIT_PARAM *) param1;
82    
83          // force specific cpu settings?          /* Do we have to force CPU features  ? */
84          if((init_param->cpu_flags & XVID_CPU_FORCE) > 0)          if ((init_param->cpu_flags & XVID_CPU_FORCE) > 0) {
85                  cpu_flags = init_param->cpu_flags;                  cpu_flags = init_param->cpu_flags;
86          else {          } else {
87    
88  #ifdef ARCH_X86  #ifdef ARCH_X86
89                  cpu_flags = check_cpu_features();                  cpu_flags = check_cpu_features();
# Line 73  Line 93 
93                  init_param->cpu_flags = cpu_flags;                  init_param->cpu_flags = cpu_flags;
94          }          }
95    
96          // initialize the function pointers          /* Initialize the function pointers */
97          idct_int32_init();          idct_int32_init();
98            init_vlc_tables();
99    
100            /* Fixed Point Forward/Inverse DCT transformations */
101          fdct = fdct_int32;          fdct = fdct_int32;
102          idct = idct_int32;          idct = idct_int32;
103    
104            /* Only needed on PPC Altivec archs */
105            sadInit = 0;
106    
107            /* Restore FPU context : emms_c is a nop functions */
108          emms = emms_c;          emms = emms_c;
109    
110            /* Quantization functions */
111          quant_intra = quant_intra_c;          quant_intra = quant_intra_c;
112          dequant_intra = dequant_intra_c;          dequant_intra = dequant_intra_c;
113          quant_inter = quant_inter_c;          quant_inter = quant_inter_c;
# Line 91  Line 118 
118          quant4_inter = quant4_inter_c;          quant4_inter = quant4_inter_c;
119          dequant4_inter = dequant4_inter_c;          dequant4_inter = dequant4_inter_c;
120    
121            /* Block transfer related functions */
122          transfer_8to16copy = transfer_8to16copy_c;          transfer_8to16copy = transfer_8to16copy_c;
123          transfer_16to8copy = transfer_16to8copy_c;          transfer_16to8copy = transfer_16to8copy_c;
124          transfer_8to16sub = transfer_8to16sub_c;          transfer_8to16sub = transfer_8to16sub_c;
125            transfer_8to16sub2 = transfer_8to16sub2_c;
126          transfer_16to8add = transfer_16to8add_c;          transfer_16to8add = transfer_16to8add_c;
127          transfer8x8_copy = transfer8x8_copy_c;          transfer8x8_copy = transfer8x8_copy_c;
128    
129            /* Image interpolation related functions */
130          interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_c;          interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_c;
131          interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_c;          interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_c;
132          interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_c;          interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_c;
133    
134            /* Initialize internal colorspace transformation tables */
135          colorspace_init();          colorspace_init();
136    
137            /* All colorspace transformation functions User Format->YV12 */
138          rgb555_to_yv12 = rgb555_to_yv12_c;          rgb555_to_yv12 = rgb555_to_yv12_c;
139          rgb565_to_yv12 = rgb565_to_yv12_c;          rgb565_to_yv12 = rgb565_to_yv12_c;
140          rgb24_to_yv12 = rgb24_to_yv12_c;          rgb24_to_yv12 = rgb24_to_yv12_c;
# Line 111  Line 143 
143          yuyv_to_yv12 = yuyv_to_yv12_c;          yuyv_to_yv12 = yuyv_to_yv12_c;
144          uyvy_to_yv12 = uyvy_to_yv12_c;          uyvy_to_yv12 = uyvy_to_yv12_c;
145    
146            /* All colorspace transformation functions YV12->User format */
147          yv12_to_rgb555 = yv12_to_rgb555_c;          yv12_to_rgb555 = yv12_to_rgb555_c;
148          yv12_to_rgb565 = yv12_to_rgb565_c;          yv12_to_rgb565 = yv12_to_rgb565_c;
149          yv12_to_rgb24 = yv12_to_rgb24_c;          yv12_to_rgb24 = yv12_to_rgb24_c;
# Line 119  Line 152 
152          yv12_to_yuyv = yv12_to_yuyv_c;          yv12_to_yuyv = yv12_to_yuyv_c;
153          yv12_to_uyvy = yv12_to_uyvy_c;          yv12_to_uyvy = yv12_to_uyvy_c;
154    
155            /* Functions used in motion estimation algorithms */
156          calc_cbp = calc_cbp_c;          calc_cbp = calc_cbp_c;
157          sad16 = sad16_c;          sad16 = sad16_c;
158            sad16bi  = sad16bi_c;
159          sad8 = sad8_c;          sad8 = sad8_c;
160          dev16 = dev16_c;          dev16 = dev16_c;
161    
162  #ifdef ARCH_X86  #ifdef ARCH_X86
163          if((cpu_flags & XVID_CPU_MMX) > 0) {          if((cpu_flags & XVID_CPU_MMX) > 0) {
164    
165                    /* Forward and Inverse Discrete Cosine Transformation functions */
166                  fdct = fdct_mmx;                  fdct = fdct_mmx;
167                  idct = idct_mmx;                  idct = idct_mmx;
168    
169                    /* To restore FPU context after mmx use */
170                  emms = emms_mmx;                  emms = emms_mmx;
171    
172                    /* Quantization related functions */
173                  quant_intra = quant_intra_mmx;                  quant_intra = quant_intra_mmx;
174                  dequant_intra = dequant_intra_mmx;                  dequant_intra = dequant_intra_mmx;
175                  quant_inter = quant_inter_mmx;                  quant_inter = quant_inter_mmx;
# Line 141  Line 180 
180                  quant4_inter = quant4_inter_mmx;                  quant4_inter = quant4_inter_mmx;
181                  dequant4_inter = dequant4_inter_mmx;                  dequant4_inter = dequant4_inter_mmx;
182    
183                    /* Block related functions */
184                  transfer_8to16copy = transfer_8to16copy_mmx;                  transfer_8to16copy = transfer_8to16copy_mmx;
185                  transfer_16to8copy = transfer_16to8copy_mmx;                  transfer_16to8copy = transfer_16to8copy_mmx;
186                  transfer_8to16sub = transfer_8to16sub_mmx;                  transfer_8to16sub = transfer_8to16sub_mmx;
187                  transfer_16to8add = transfer_16to8add_mmx;                  transfer_16to8add = transfer_16to8add_mmx;
188                  transfer8x8_copy = transfer8x8_copy_mmx;                  transfer8x8_copy = transfer8x8_copy_mmx;
189    
190                    /* Image Interpolation related functions */
191                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_mmx;                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_mmx;
192                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_mmx;                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_mmx;
193                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_mmx;                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_mmx;
194    
195                    /* Image RGB->YV12 related functions */
196                  rgb24_to_yv12 = rgb24_to_yv12_mmx;                  rgb24_to_yv12 = rgb24_to_yv12_mmx;
197                  rgb32_to_yv12 = rgb32_to_yv12_mmx;                  rgb32_to_yv12 = rgb32_to_yv12_mmx;
198                  yuv_to_yv12 = yuv_to_yv12_mmx;                  yuv_to_yv12 = yuv_to_yv12_mmx;
199                  yuyv_to_yv12 = yuyv_to_yv12_mmx;                  yuyv_to_yv12 = yuyv_to_yv12_mmx;
200                  uyvy_to_yv12 = uyvy_to_yv12_mmx;                  uyvy_to_yv12 = uyvy_to_yv12_mmx;
201    
202                    /* Image YV12->RGB related functions */
203                  yv12_to_rgb24 = yv12_to_rgb24_mmx;                  yv12_to_rgb24 = yv12_to_rgb24_mmx;
204                  yv12_to_rgb32 = yv12_to_rgb32_mmx;                  yv12_to_rgb32 = yv12_to_rgb32_mmx;
205                  yv12_to_yuyv = yv12_to_yuyv_mmx;                  yv12_to_yuyv = yv12_to_yuyv_mmx;
206                  yv12_to_uyvy = yv12_to_uyvy_mmx;                  yv12_to_uyvy = yv12_to_uyvy_mmx;
207    
208                    /* Motion estimation related functions */
209                  calc_cbp = calc_cbp_mmx;                  calc_cbp = calc_cbp_mmx;
210                  sad16 = sad16_mmx;                  sad16 = sad16_mmx;
211                  sad8 = sad8_mmx;                  sad8 = sad8_mmx;
# Line 170  Line 214 
214          }          }
215    
216          if((cpu_flags & XVID_CPU_MMXEXT) > 0) {          if((cpu_flags & XVID_CPU_MMXEXT) > 0) {
217    
218                    /* Inverse DCT */
219                  idct = idct_xmm;                  idct = idct_xmm;
220    
221                    /* Interpolation */
222                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_xmm;                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_xmm;
223                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_xmm;                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_xmm;
224                    interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;
225    
226                    /* Buffer transfer */
227                    transfer_8to16sub2 = transfer_8to16sub2_xmm;
228    
229                    /* Colorspace transformation */
230                  yuv_to_yv12 = yuv_to_yv12_xmm;                  yuv_to_yv12 = yuv_to_yv12_xmm;
231    
232                    /* ME functions */
233                  sad16 = sad16_xmm;                  sad16 = sad16_xmm;
234                  sad8 = sad8_xmm;                  sad8 = sad8_xmm;
235                  dev16 = dev16_xmm;                  dev16 = dev16_xmm;
# Line 182  Line 237 
237          }          }
238    
239          if((cpu_flags & XVID_CPU_3DNOW) > 0) {          if((cpu_flags & XVID_CPU_3DNOW) > 0) {
240    
241                    /* Interpolation */
242                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;
243                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;
244                    interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dn;
245            }
246    
247            if ((cpu_flags & XVID_CPU_SSE2) > 0) {
248    #ifdef EXPERIMENTAL_SSE2_CODE
249    
250                    /* Quantization */
251                    quant_intra   = quant_intra_sse2;
252                    dequant_intra = dequant_intra_sse2;
253                    quant_inter   = quant_inter_sse2;
254                    dequant_inter = dequant_inter_sse2;
255    
256                    /* ME */
257                    calc_cbp = calc_cbp_sse2;
258                    sad16    = sad16_sse2;
259                    dev16    = dev16_sse2;
260    
261                    /* Forward and Inverse DCT */
262                    idct  = idct_sse2;
263                    fdct = fdct_sse2;
264    #endif
265          }          }
266    
267  #endif  #endif
268    
269          // API version  #ifdef ARCH_IA64
270            if ((cpu_flags & XVID_CPU_IA64) > 0) { //use assembler routines?
271              idct_ia64_init();
272              fdct = fdct_ia64;
273              idct = idct_ia64;   //not yet working, crashes
274              interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_ia64;
275              interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_ia64;
276              interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_ia64;
277              sad16 = sad16_ia64;
278              sad16bi = sad16bi_ia64;
279              sad8 = sad8_ia64;
280              dev16 = dev16_ia64;
281              quant_intra = quant_intra_ia64;
282              dequant_intra = dequant_intra_ia64;
283              quant_inter = quant_inter_ia64;
284              dequant_inter = dequant_inter_ia64;
285              transfer_8to16copy = transfer_8to16copy_ia64;
286              transfer_16to8copy = transfer_16to8copy_ia64;
287              transfer_8to16sub = transfer_8to16sub_ia64;
288              transfer_8to16sub2 = transfer_8to16sub2_ia64;
289              transfer_16to8add = transfer_16to8add_ia64;
290              transfer8x8_copy = transfer8x8_copy_ia64;
291              DEBUG("Using IA-64 assembler routines.\n");
292            }
293    #endif
294    
295    #ifdef ARCH_PPC
296    #ifdef ARCH_PPC_ALTIVEC
297            calc_cbp = calc_cbp_altivec;
298            fdct = fdct_altivec;
299            idct = idct_altivec;
300            sadInit = sadInit_altivec;
301            sad16 = sad16_altivec;
302            sad8 = sad8_altivec;
303            dev16 = dev16_altivec;
304    #else
305            calc_cbp = calc_cbp_ppc;
306    #endif
307    #endif
308    
309            /* Inform the client the API version */
310          init_param->api_version = API_VERSION;          init_param->api_version = API_VERSION;
311    
312          // something clever has to be done for this          /* Inform the client the core build - unused because we're still alpha */
313          init_param->core_build = 1000;          init_param->core_build = 1000;
314    
315          return XVID_ERR_OK;          return XVID_ERR_OK;
316  }  }
317    
318  int xvid_decore(void * handle, int opt, void * param1, void * param2)  /*****************************************************************************
319  {   * XviD Native decoder entry point
320          switch (opt)   *
321     * This function is just a wrapper to all the option cases.
322     *
323     * Returned values : XVID_ERR_FAIL when opt is invalid
324     *                   else returns the wrapped function result
325     *
326     ****************************************************************************/
327    
328    int
329    xvid_decore(void *handle,
330                            int opt,
331                            void *param1,
332                            void *param2)
333          {          {
334            switch (opt) {
335          case XVID_DEC_DECODE :          case XVID_DEC_DECODE :
336          return decoder_decode((DECODER *) handle, (XVID_DEC_FRAME *) param1);          return decoder_decode((DECODER *) handle, (XVID_DEC_FRAME *) param1);
337    
# Line 216  Line 347 
347  }  }
348    
349    
350  int xvid_encore(void * handle, int opt, void * param1, void * param2)  /*****************************************************************************
351  {   * XviD Native encoder entry point
352          switch (opt)   *
353     * This function is just a wrapper to all the option cases.
354     *
355     * Returned values : XVID_ERR_FAIL when opt is invalid
356     *                   else returns the wrapped function result
357     *
358     ****************************************************************************/
359    
360    int
361    xvid_encore(void *handle,
362                            int opt,
363                            void *param1,
364                            void *param2)
365          {          {
366            switch (opt) {
367          case XVID_ENC_ENCODE :          case XVID_ENC_ENCODE :
368          return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1, (XVID_ENC_STATS *) param2);  #ifdef BFRAMES
369                    if (((Encoder *) handle)->mbParam.max_bframes >= 0)
370                    return encoder_encode_bframes((Encoder *) handle, (XVID_ENC_FRAME *) param1,
371                                                              (XVID_ENC_STATS *) param2);
372                    else
373    #endif
374                    return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1,
375                                                              (XVID_ENC_STATS *) param2);
376    
377          case XVID_ENC_CREATE :          case XVID_ENC_CREATE :
378          return encoder_create((XVID_ENC_PARAM *) param1);          return encoder_create((XVID_ENC_PARAM *) param1);

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

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