ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/svn/trunk/xvidcore/src/xvid.c
Revision: 201
Committed: Thu Jun 13 21:35:01 2002 UTC (22 years, 3 months ago) by edgomez
Content type: text/plain
File size: 10156 byte(s)
Error occurred while calculating annotation data.
Log Message:
Cosmetic

File Contents

# Content
1 /*****************************************************************************
2 *
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 /*****************************************************************************
31 *
32 * History
33 *
34 * - 17.03.2002 Added interpolate8x8_halfpel_hv_xmm
35 * - 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: xvid.c,v 1.17 2002-06-13 21:35:01 edgomez Exp $
39 *
40 ****************************************************************************/
41
42 #include "xvid.h"
43 #include "decoder.h"
44 #include "encoder.h"
45 #include "bitstream/cbp.h"
46 #include "dct/idct.h"
47 #include "dct/fdct.h"
48 #include "image/colorspace.h"
49 #include "image/interpolate8x8.h"
50 #include "utils/mem_transfer.h"
51 #include "quant/quant_h263.h"
52 #include "quant/quant_mpeg4.h"
53 #include "motion/sad.h"
54 #include "utils/emms.h"
55 #include "utils/timer.h"
56 #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
73 xvid_init(void *handle,
74 int opt,
75 void *param1,
76 void *param2)
77 {
78 int cpu_flags;
79 XVID_INIT_PARAM *init_param;
80
81 init_param = (XVID_INIT_PARAM *) param1;
82
83 /* Do we have to force CPU features ? */
84 if ((init_param->cpu_flags & XVID_CPU_FORCE) > 0) {
85 cpu_flags = init_param->cpu_flags;
86 } else {
87
88 #ifdef ARCH_X86
89 cpu_flags = check_cpu_features();
90 #else
91 cpu_flags = 0;
92 #endif
93 init_param->cpu_flags = cpu_flags;
94 }
95
96 /* Initialize the function pointers */
97 idct_int32_init();
98 init_vlc_tables();
99
100 /* Fixed Point Forward/Inverse DCT transformations */
101 fdct = fdct_int32;
102 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;
109
110 /* Quantization functions */
111 quant_intra = quant_intra_c;
112 dequant_intra = dequant_intra_c;
113 quant_inter = quant_inter_c;
114 dequant_inter = dequant_inter_c;
115
116 quant4_intra = quant4_intra_c;
117 dequant4_intra = dequant4_intra_c;
118 quant4_inter = quant4_inter_c;
119 dequant4_inter = dequant4_inter_c;
120
121 /* Block transfer related functions */
122 transfer_8to16copy = transfer_8to16copy_c;
123 transfer_16to8copy = transfer_16to8copy_c;
124 transfer_8to16sub = transfer_8to16sub_c;
125 transfer_8to16sub2 = transfer_8to16sub2_c;
126 transfer_16to8add = transfer_16to8add_c;
127 transfer8x8_copy = transfer8x8_copy_c;
128
129 /* Image interpolation related functions */
130 interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_c;
131 interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_c;
132 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_c;
133
134 /* Initialize internal colorspace transformation tables */
135 colorspace_init();
136
137 /* All colorspace transformation functions User Format->YV12 */
138 rgb555_to_yv12 = rgb555_to_yv12_c;
139 rgb565_to_yv12 = rgb565_to_yv12_c;
140 rgb24_to_yv12 = rgb24_to_yv12_c;
141 rgb32_to_yv12 = rgb32_to_yv12_c;
142 yuv_to_yv12 = yuv_to_yv12_c;
143 yuyv_to_yv12 = yuyv_to_yv12_c;
144 uyvy_to_yv12 = uyvy_to_yv12_c;
145
146 /* All colorspace transformation functions YV12->User format */
147 yv12_to_rgb555 = yv12_to_rgb555_c;
148 yv12_to_rgb565 = yv12_to_rgb565_c;
149 yv12_to_rgb24 = yv12_to_rgb24_c;
150 yv12_to_rgb32 = yv12_to_rgb32_c;
151 yv12_to_yuv = yv12_to_yuv_c;
152 yv12_to_yuyv = yv12_to_yuyv_c;
153 yv12_to_uyvy = yv12_to_uyvy_c;
154
155 /* Functions used in motion estimation algorithms */
156 calc_cbp = calc_cbp_c;
157 sad16 = sad16_c;
158 sad16bi = sad16bi_c;
159 sad8 = sad8_c;
160 dev16 = dev16_c;
161
162 #ifdef ARCH_X86
163 if ((cpu_flags & XVID_CPU_MMX) > 0) {
164
165 /* Forward and Inverse Discrete Cosine Transformation functions */
166 fdct = fdct_mmx;
167 idct = idct_mmx;
168
169 /* To restore FPU context after mmx use */
170 emms = emms_mmx;
171
172 /* Quantization related functions */
173 quant_intra = quant_intra_mmx;
174 dequant_intra = dequant_intra_mmx;
175 quant_inter = quant_inter_mmx;
176 dequant_inter = dequant_inter_mmx;
177
178 quant4_intra = quant4_intra_mmx;
179 dequant4_intra = dequant4_intra_mmx;
180 quant4_inter = quant4_inter_mmx;
181 dequant4_inter = dequant4_inter_mmx;
182
183 /* Block related functions */
184 transfer_8to16copy = transfer_8to16copy_mmx;
185 transfer_16to8copy = transfer_16to8copy_mmx;
186 transfer_8to16sub = transfer_8to16sub_mmx;
187 transfer_16to8add = transfer_16to8add_mmx;
188 transfer8x8_copy = transfer8x8_copy_mmx;
189
190 /* Image Interpolation related functions */
191 interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_mmx;
192 interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_mmx;
193 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_mmx;
194
195 /* Image RGB->YV12 related functions */
196 rgb24_to_yv12 = rgb24_to_yv12_mmx;
197 rgb32_to_yv12 = rgb32_to_yv12_mmx;
198 yuv_to_yv12 = yuv_to_yv12_mmx;
199 yuyv_to_yv12 = yuyv_to_yv12_mmx;
200 uyvy_to_yv12 = uyvy_to_yv12_mmx;
201
202 /* Image YV12->RGB related functions */
203 yv12_to_rgb24 = yv12_to_rgb24_mmx;
204 yv12_to_rgb32 = yv12_to_rgb32_mmx;
205 yv12_to_yuyv = yv12_to_yuyv_mmx;
206 yv12_to_uyvy = yv12_to_uyvy_mmx;
207
208 /* Motion estimation related functions */
209 calc_cbp = calc_cbp_mmx;
210 sad16 = sad16_mmx;
211 sad8 = sad8_mmx;
212 dev16 = dev16_mmx;
213
214 }
215
216 if ((cpu_flags & XVID_CPU_MMXEXT) > 0) {
217
218 /* Inverse DCT */
219 idct = idct_xmm;
220
221 /* Interpolation */
222 interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_xmm;
223 interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_xmm;
224 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_xmm;
225
226 /* Colorspace transformation */
227 yuv_to_yv12 = yuv_to_yv12_xmm;
228
229 /* ME functions */
230 sad16 = sad16_xmm;
231 sad8 = sad8_xmm;
232 dev16 = dev16_xmm;
233
234 }
235
236 if ((cpu_flags & XVID_CPU_3DNOW) > 0) {
237
238 /* Interpolation */
239 interpolate8x8_halfpel_h = interpolate8x8_halfpel_h_3dn;
240 interpolate8x8_halfpel_v = interpolate8x8_halfpel_v_3dn;
241 interpolate8x8_halfpel_hv = interpolate8x8_halfpel_hv_3dn;
242 }
243
244 if ((cpu_flags & XVID_CPU_SSE2) > 0) {
245 #ifdef EXPERIMENTAL_SSE2_CODE
246
247 /* Quantization */
248 quant_intra = quant_intra_sse2;
249 dequant_intra = dequant_intra_sse2;
250 quant_inter = quant_inter_sse2;
251 dequant_inter = dequant_inter_sse2;
252
253 /* ME */
254 calc_cbp = calc_cbp_sse2;
255 sad16 = sad16_sse2;
256 dev16 = dev16_sse2;
257
258 /* Forward and Inverse DCT */
259 idct = idct_sse2;
260 fdct = fdct_sse2;
261 #endif
262 }
263
264 #endif
265
266 #ifdef ARCH_PPC
267 #ifdef ARCH_PPC_ALTIVEC
268 calc_cbp = calc_cbp_altivec;
269 fdct = fdct_altivec;
270 idct = idct_altivec;
271 sadInit = sadInit_altivec;
272 sad16 = sad16_altivec;
273 sad8 = sad8_altivec;
274 dev16 = dev16_altivec;
275 #else
276 calc_cbp = calc_cbp_ppc;
277 #endif
278 #endif
279
280 /* Inform the client the API version */
281 init_param->api_version = API_VERSION;
282
283 /* Inform the client the core build - unused because we're still alpha */
284 init_param->core_build = 1000;
285
286 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
300 xvid_decore(void *handle,
301 int opt,
302 void *param1,
303 void *param2)
304 {
305 switch (opt) {
306 case XVID_DEC_DECODE:
307 return decoder_decode((DECODER *) handle, (XVID_DEC_FRAME *) param1);
308
309 case XVID_DEC_CREATE:
310 return decoder_create((XVID_DEC_PARAM *) param1);
311
312 case XVID_DEC_DESTROY:
313 return decoder_destroy((DECODER *) handle);
314
315 default:
316 return XVID_ERR_FAIL;
317 }
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
332 xvid_encore(void *handle,
333 int opt,
334 void *param1,
335 void *param2)
336 {
337 switch (opt) {
338 case XVID_ENC_ENCODE:
339 return encoder_encode((Encoder *) handle, (XVID_ENC_FRAME *) param1,
340 (XVID_ENC_STATS *) param2);
341
342 case XVID_ENC_CREATE:
343 return encoder_create((XVID_ENC_PARAM *) param1);
344
345 case XVID_ENC_DESTROY:
346 return encoder_destroy((Encoder *) handle);
347
348 default:
349 return XVID_ERR_FAIL;
350 }
351 }