[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.15, Wed Jun 12 20:38:40 2002 UTC revision 1.16, Thu Jun 13 13:18:57 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   *      17.03.2002      Added interpolate8x8_halfpel_hv_xmm  *  - 17.03.2002 Added interpolate8x8_halfpel_hv_xmm
35   *  22.12.2001  API change: added xvid_init() - Isibaar  *  - 22.12.2001  API change: added xvid_init() - Isibaar
36   *      16.12.2001      inital version; (c)2001 peter ross <pross@cs.rmit.edu.au>  *  - 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 55  Line 55 
55  #include "utils/timer.h"  #include "utils/timer.h"
56  #include "bitstream/mbcoding.h"  #include "bitstream/mbcoding.h"
57    
58    /*****************************************************************************
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  int
73  xvid_init(void *handle,  xvid_init(void *handle,
74                    int opt,                    int opt,
# Line 66  Line 80 
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 79  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();          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;          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 100  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;
# Line 107  Line 126 
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 121  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 129  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;          sad16bi = sad16bi_c;
# Line 137  Line 161 
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 152  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 181  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;                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;
225    
226                    /* Colorspace transformation */
227                  yuv_to_yv12 = yuv_to_yv12_xmm;                  yuv_to_yv12 = yuv_to_yv12_xmm;
228    
229                    /* ME functions */
230                  sad16 = sad16_xmm;                  sad16 = sad16_xmm;
231                  sad8 = sad8_xmm;                  sad8 = sad8_xmm;
232                  dev16 = dev16_xmm;                  dev16 = dev16_xmm;
# Line 194  Line 234 
234          }          }
235    
236          if ((cpu_flags & XVID_CPU_3DNOW) > 0) {          if ((cpu_flags & XVID_CPU_3DNOW) > 0) {
237    
238                    /* Interpolation */
239                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;                  interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;
240                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;                  interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;
241                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dn;                  interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dn;
# Line 201  Line 243 
243    
244          if ((cpu_flags & XVID_CPU_SSE2) > 0) {          if ((cpu_flags & XVID_CPU_SSE2) > 0) {
245  #ifdef EXPERIMENTAL_SSE2_CODE  #ifdef EXPERIMENTAL_SSE2_CODE
246    
247                    /* Quantization */
248                  quant_intra = quant_intra_sse2;                  quant_intra = quant_intra_sse2;
249                  dequant_intra = dequant_intra_sse2;                  dequant_intra = dequant_intra_sse2;
250                  quant_inter = quant_inter_sse2;                  quant_inter = quant_inter_sse2;
251                  dequant_inter = dequant_inter_sse2;                  dequant_inter = dequant_inter_sse2;
252    
253                    /* ME */
254                  calc_cbp = calc_cbp_sse2;                  calc_cbp = calc_cbp_sse2;
255                  sad16 = sad16_sse2;                  sad16 = sad16_sse2;
256                  dev16 = dev16_sse2;                  dev16 = dev16_sse2;
257    
258                    /* Forward and Inverse DCT */
259                  idct = idct_sse2;                  idct = idct_sse2;
260                  fdct = fdct_sse2;                  fdct = fdct_sse2;
261  #endif  #endif
262          }          }
263    
264  #endif  #endif
265    
266  #ifdef ARCH_PPC  #ifdef ARCH_PPC
267  #ifdef ARCH_PPC_ALTIVEC  #ifdef ARCH_PPC_ALTIVEC
268          calc_cbp = calc_cbp_altivec;          calc_cbp = calc_cbp_altivec;
# Line 228  Line 277 
277  #endif  #endif
278  #endif  #endif
279    
280          // API version          /* Inform the client the API version */
281          init_param->api_version = API_VERSION;          init_param->api_version = API_VERSION;
282    
283          // something clever has to be done for this          /* Inform the client the core build - unused because we're still alpha */
284          init_param->core_build = 1000;          init_param->core_build = 1000;
285    
286          return XVID_ERR_OK;          return XVID_ERR_OK;
287  }  }
288    
289    /*****************************************************************************
290     * XviD Native decoder entry point
291     *
292     * This function is just a wrapper to all the option cases.
293     *
294     * Returned values : XVID_ERR_FAIL when opt is invalid
295     *                   else returns the wrapped function result
296     *
297     ****************************************************************************/
298    
299  int  int
300  xvid_decore(void *handle,  xvid_decore(void *handle,
301                          int opt,                          int opt,
# Line 259  Line 318 
318  }  }
319    
320    
321    /*****************************************************************************
322     * XviD Native encoder entry point
323     *
324     * This function is just a wrapper to all the option cases.
325     *
326     * Returned values : XVID_ERR_FAIL when opt is invalid
327     *                   else returns the wrapped function result
328     *
329     ****************************************************************************/
330    
331  int  int
332  xvid_encore(void *handle,  xvid_encore(void *handle,
333                          int opt,                          int opt,

Legend:
Removed from v.1.15  
changed lines
  Added in v.1.16

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