~ubuntu-branches/ubuntu/jaunty/xvidcap/jaunty-proposed

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/dsputil.h

  • Committer: Bazaar Package Importer
  • Author(s): Christian Marillat
  • Date: 2004-08-29 10:53:42 UTC
  • Revision ID: james.westby@ubuntu.com-20040829105342-qgmnry37eadfkoxx
Tags: upstream-1.1.3
ImportĀ upstreamĀ versionĀ 1.1.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * DSP utils
 
3
 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard.
 
4
 *
 
5
 * This library is free software; you can redistribute it and/or
 
6
 * modify it under the terms of the GNU Lesser General Public
 
7
 * License as published by the Free Software Foundation; either
 
8
 * version 2 of the License, or (at your option) any later version.
 
9
 *
 
10
 * This library is distributed in the hope that it will be useful,
 
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
13
 * Lesser General Public License for more details.
 
14
 *
 
15
 * You should have received a copy of the GNU Lesser General Public
 
16
 * License along with this library; if not, write to the Free Software
 
17
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
18
 */
 
19
 
 
20
/**
 
21
 * @file dsputil.h
 
22
 * DSP utils.
 
23
 * note, many functions in here may use MMX which trashes the FPU state, it is
 
24
 * absolutely necessary to call emms_c() between dsp & float/double code
 
25
 */
 
26
 
 
27
#ifndef DSPUTIL_H
 
28
#define DSPUTIL_H
 
29
 
 
30
#include "common.h"
 
31
#include "avcodec.h"
 
32
 
 
33
 
 
34
//#define DEBUG
 
35
/* dct code */
 
36
typedef short DCTELEM;
 
37
 
 
38
void fdct_ifast (DCTELEM *data);
 
39
void ff_jpeg_fdct_islow (DCTELEM *data);
 
40
 
 
41
void j_rev_dct (DCTELEM *data);
 
42
 
 
43
void ff_fdct_mmx(DCTELEM *block);
 
44
 
 
45
/* encoding scans */
 
46
extern const uint8_t ff_alternate_horizontal_scan[64];
 
47
extern const uint8_t ff_alternate_vertical_scan[64];
 
48
extern const uint8_t ff_zigzag_direct[64];
 
49
 
 
50
/* pixel operations */
 
51
#define MAX_NEG_CROP 384
 
52
 
 
53
/* temporary */
 
54
extern uint32_t squareTbl[512];
 
55
extern uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
 
56
 
 
57
 
 
58
/* minimum alignment rules ;)
 
59
if u notice errors in the align stuff, need more alignment for some asm code for some cpu
 
60
or need to use a function with less aligned data then send a mail to the ffmpeg-dev list, ...
 
61
 
 
62
!warning these alignments might not match reallity, (missing attribute((align)) stuff somewhere possible)
 
63
i (michael) didnt check them, these are just the alignents which i think could be reached easily ...
 
64
 
 
65
!future video codecs might need functions with less strict alignment
 
66
*/
 
67
 
 
68
/*
 
69
void get_pixels_c(DCTELEM *block, const uint8_t *pixels, int line_size);
 
70
void diff_pixels_c(DCTELEM *block, const uint8_t *s1, const uint8_t *s2, int stride);
 
71
void put_pixels_clamped_c(const DCTELEM *block, uint8_t *pixels, int line_size);
 
72
void add_pixels_clamped_c(const DCTELEM *block, uint8_t *pixels, int line_size);
 
73
void clear_blocks_c(DCTELEM *blocks);
 
74
*/
 
75
 
 
76
/* add and put pixel (decoding) */
 
77
// blocksizes for op_pixels_func are 8x4,8x8 16x8 16x16
 
78
typedef void (*op_pixels_func)(uint8_t *block/*align width (8 or 16)*/, const uint8_t *pixels/*align 1*/, int line_size, int h);
 
79
typedef void (*tpel_mc_func)(uint8_t *block/*align width (8 or 16)*/, const uint8_t *pixels/*align 1*/, int line_size, int w, int h);
 
80
typedef void (*qpel_mc_func)(uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);
 
81
typedef void (*h264_chroma_mc_func)(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x, int y);
 
82
 
 
83
#define DEF_OLD_QPEL(name)\
 
84
void ff_put_        ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);\
 
85
void ff_put_no_rnd_ ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);\
 
86
void ff_avg_        ## name (uint8_t *dst/*align width (8 or 16)*/, uint8_t *src/*align 1*/, int stride);
 
87
 
 
88
DEF_OLD_QPEL(qpel16_mc11_old_c)
 
89
DEF_OLD_QPEL(qpel16_mc31_old_c)
 
90
DEF_OLD_QPEL(qpel16_mc12_old_c)
 
91
DEF_OLD_QPEL(qpel16_mc32_old_c)
 
92
DEF_OLD_QPEL(qpel16_mc13_old_c)
 
93
DEF_OLD_QPEL(qpel16_mc33_old_c)
 
94
DEF_OLD_QPEL(qpel8_mc11_old_c)
 
95
DEF_OLD_QPEL(qpel8_mc31_old_c)
 
96
DEF_OLD_QPEL(qpel8_mc12_old_c)
 
97
DEF_OLD_QPEL(qpel8_mc32_old_c)
 
98
DEF_OLD_QPEL(qpel8_mc13_old_c)
 
99
DEF_OLD_QPEL(qpel8_mc33_old_c)
 
100
 
 
101
#define CALL_2X_PIXELS(a, b, n)\
 
102
static void a(uint8_t *block, const uint8_t *pixels, int line_size, int h){\
 
103
    b(block  , pixels  , line_size, h);\
 
104
    b(block+n, pixels+n, line_size, h);\
 
105
}
 
106
 
 
107
/* motion estimation */
 
108
 
 
109
typedef int (*op_pixels_abs_func)(uint8_t *blk1/*align width (8 or 16)*/, uint8_t *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/;
 
110
 
 
111
typedef int (*me_cmp_func)(void /*MpegEncContext*/ *s, uint8_t *blk1/*align width (8 or 16)*/, uint8_t *blk2/*align 1*/, int line_size)/* __attribute__ ((const))*/;
 
112
 
 
113
 
 
114
/**
 
115
 * DSPContext.
 
116
 */
 
117
typedef struct DSPContext {
 
118
    /* pixel ops : interface with DCT */
 
119
    void (*get_pixels)(DCTELEM *block/*align 16*/, const uint8_t *pixels/*align 8*/, int line_size);
 
120
    void (*diff_pixels)(DCTELEM *block/*align 16*/, const uint8_t *s1/*align 8*/, const uint8_t *s2/*align 8*/, int stride);
 
121
    void (*put_pixels_clamped)(const DCTELEM *block/*align 16*/, uint8_t *pixels/*align 8*/, int line_size);
 
122
    void (*add_pixels_clamped)(const DCTELEM *block/*align 16*/, uint8_t *pixels/*align 8*/, int line_size);
 
123
    /**
 
124
     * translational global motion compensation.
 
125
     */
 
126
    void (*gmc1)(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int srcStride, int h, int x16, int y16, int rounder);
 
127
    /**
 
128
     * global motion compensation.
 
129
     */
 
130
    void (*gmc )(uint8_t *dst/*align 8*/, uint8_t *src/*align 1*/, int stride, int h, int ox, int oy,
 
131
                    int dxx, int dxy, int dyx, int dyy, int shift, int r, int width, int height);
 
132
    void (*clear_blocks)(DCTELEM *blocks/*align 16*/);
 
133
    int (*pix_sum)(uint8_t * pix, int line_size);
 
134
    int (*pix_norm1)(uint8_t * pix, int line_size);
 
135
    me_cmp_func sad[2]; /* identical to pix_absAxA except additional void * */
 
136
    me_cmp_func sse[2];
 
137
    me_cmp_func hadamard8_diff[2];
 
138
    me_cmp_func dct_sad[2];
 
139
    me_cmp_func quant_psnr[2];
 
140
    me_cmp_func bit[2];
 
141
    me_cmp_func rd[2];
 
142
    int (*hadamard8_abs )(uint8_t *src, int stride, int mean);
 
143
 
 
144
    me_cmp_func me_pre_cmp[11];
 
145
    me_cmp_func me_cmp[11];
 
146
    me_cmp_func me_sub_cmp[11];
 
147
    me_cmp_func mb_cmp[11];
 
148
 
 
149
    /* maybe create an array for 16/8/4/2 functions */
 
150
    /**
 
151
     * Halfpel motion compensation with rounding (a+b+1)>>1.
 
152
     * this is an array[4][4] of motion compensation funcions for 4 
 
153
     * horizontal blocksizes (2,4,8,16) and the 4 halfpel positions<br>
 
154
     * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
 
155
     * @param block destination where the result is stored
 
156
     * @param pixels source
 
157
     * @param line_size number of bytes in a horizontal line of block
 
158
     * @param h height
 
159
     */
 
160
    op_pixels_func put_pixels_tab[4][4];
 
161
 
 
162
    /**
 
163
     * Halfpel motion compensation with rounding (a+b+1)>>1.
 
164
     * This is an array[4][4] of motion compensation functions for 4 
 
165
     * horizontal blocksizes (2,4,8,16) and the 4 halfpel positions<br>
 
166
     * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
 
167
     * @param block destination into which the result is averaged (a+b+1)>>1
 
168
     * @param pixels source
 
169
     * @param line_size number of bytes in a horizontal line of block
 
170
     * @param h height
 
171
     */
 
172
    op_pixels_func avg_pixels_tab[4][4];
 
173
 
 
174
    /**
 
175
     * Halfpel motion compensation with no rounding (a+b)>>1.
 
176
     * this is an array[2][4] of motion compensation funcions for 2 
 
177
     * horizontal blocksizes (8,16) and the 4 halfpel positions<br>
 
178
     * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
 
179
     * @param block destination where the result is stored
 
180
     * @param pixels source
 
181
     * @param line_size number of bytes in a horizontal line of block
 
182
     * @param h height
 
183
     */
 
184
    op_pixels_func put_no_rnd_pixels_tab[2][4];
 
185
 
 
186
    /**
 
187
     * Halfpel motion compensation with no rounding (a+b)>>1.
 
188
     * this is an array[2][4] of motion compensation funcions for 2 
 
189
     * horizontal blocksizes (8,16) and the 4 halfpel positions<br>
 
190
     * *pixels_tab[ 0->16xH 1->8xH ][ xhalfpel + 2*yhalfpel ]
 
191
     * @param block destination into which the result is averaged (a+b)>>1
 
192
     * @param pixels source
 
193
     * @param line_size number of bytes in a horizontal line of block
 
194
     * @param h height
 
195
     */
 
196
    op_pixels_func avg_no_rnd_pixels_tab[2][4];
 
197
    
 
198
    /**
 
199
     * Thirdpel motion compensation with rounding (a+b+1)>>1.
 
200
     * this is an array[12] of motion compensation funcions for the 9 thirdpel positions<br>
 
201
     * *pixels_tab[ xthirdpel + 4*ythirdpel ]
 
202
     * @param block destination where the result is stored
 
203
     * @param pixels source
 
204
     * @param line_size number of bytes in a horizontal line of block
 
205
     * @param h height
 
206
     */
 
207
    tpel_mc_func put_tpel_pixels_tab[11]; //FIXME individual func ptr per width?
 
208
    tpel_mc_func avg_tpel_pixels_tab[11]; //FIXME individual func ptr per width?
 
209
 
 
210
    qpel_mc_func put_qpel_pixels_tab[2][16];
 
211
    qpel_mc_func avg_qpel_pixels_tab[2][16];
 
212
    qpel_mc_func put_no_rnd_qpel_pixels_tab[2][16];
 
213
    qpel_mc_func avg_no_rnd_qpel_pixels_tab[2][16];
 
214
    qpel_mc_func put_mspel_pixels_tab[8];
 
215
    
 
216
    /**
 
217
     * h264 Chram MC
 
218
     */
 
219
    h264_chroma_mc_func put_h264_chroma_pixels_tab[3];
 
220
    h264_chroma_mc_func avg_h264_chroma_pixels_tab[3];
 
221
 
 
222
    qpel_mc_func put_h264_qpel_pixels_tab[3][16];
 
223
    qpel_mc_func avg_h264_qpel_pixels_tab[3][16];
 
224
    
 
225
    op_pixels_abs_func pix_abs16x16;
 
226
    op_pixels_abs_func pix_abs16x16_x2;
 
227
    op_pixels_abs_func pix_abs16x16_y2;
 
228
    op_pixels_abs_func pix_abs16x16_xy2;
 
229
    op_pixels_abs_func pix_abs8x8;
 
230
    op_pixels_abs_func pix_abs8x8_x2;
 
231
    op_pixels_abs_func pix_abs8x8_y2;
 
232
    op_pixels_abs_func pix_abs8x8_xy2;
 
233
    
 
234
    /* huffyuv specific */
 
235
    void (*add_bytes)(uint8_t *dst/*align 16*/, uint8_t *src/*align 16*/, int w);
 
236
    void (*diff_bytes)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 1*/,int w);
 
237
    void (*bswap_buf)(uint32_t *dst, uint32_t *src, int w);
 
238
    
 
239
    /* (I)DCT */
 
240
    void (*fdct)(DCTELEM *block/* align 16*/);
 
241
    
 
242
    /* IDCT really*/
 
243
    void (*idct)(DCTELEM *block/* align 16*/);
 
244
    
 
245
    /**
 
246
     * block -> idct -> clip to unsigned 8 bit -> dest.
 
247
     * (-1392, 0, 0, ...) -> idct -> (-174, -174, ...) -> put -> (0, 0, ...)
 
248
     * @param line_size size in bytes of a horizotal line of dest
 
249
     */
 
250
    void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
 
251
    
 
252
    /**
 
253
     * block -> idct -> add dest -> clip to unsigned 8 bit -> dest.
 
254
     * @param line_size size in bytes of a horizotal line of dest
 
255
     */
 
256
    void (*idct_add)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
 
257
    
 
258
    /**
 
259
     * idct input permutation.
 
260
     * several optimized IDCTs need a permutated input (relative to the normal order of the reference
 
261
     * IDCT)
 
262
     * this permutation must be performed before the idct_put/add, note, normally this can be merged
 
263
     * with the zigzag/alternate scan<br>
 
264
     * an example to avoid confusion:
 
265
     * - (->decode coeffs -> zigzag reorder -> dequant -> reference idct ->...)
 
266
     * - (x -> referece dct -> reference idct -> x)
 
267
     * - (x -> referece dct -> simple_mmx_perm = idct_permutation -> simple_idct_mmx -> x)
 
268
     * - (->decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant -> simple_idct_mmx ->...)
 
269
     */
 
270
    uint8_t idct_permutation[64];
 
271
    int idct_permutation_type;
 
272
#define FF_NO_IDCT_PERM 1
 
273
#define FF_LIBMPEG2_IDCT_PERM 2
 
274
#define FF_SIMPLE_IDCT_PERM 3
 
275
#define FF_TRANSPOSE_IDCT_PERM 4
 
276
 
 
277
} DSPContext;
 
278
 
 
279
void dsputil_static_init(void);
 
280
void dsputil_init(DSPContext* p, AVCodecContext *avctx);
 
281
 
 
282
/**
 
283
 * permute block according to permuatation.
 
284
 * @param last last non zero element in scantable order
 
285
 */
 
286
void ff_block_permute(DCTELEM *block, uint8_t *permutation, const uint8_t *scantable, int last);
 
287
 
 
288
#define BYTE_VEC32(c)   ((c)*0x01010101UL)
 
289
 
 
290
static inline uint32_t rnd_avg32(uint32_t a, uint32_t b)
 
291
{
 
292
    return (a | b) - (((a ^ b) & ~BYTE_VEC32(0x01)) >> 1);
 
293
}
 
294
 
 
295
static inline uint32_t no_rnd_avg32(uint32_t a, uint32_t b)
 
296
{
 
297
    return (a & b) + (((a ^ b) & ~BYTE_VEC32(0x01)) >> 1);
 
298
}
 
299
 
 
300
/**
 
301
 * Empty mmx state.
 
302
 * this must be called between any dsp function and float/double code.
 
303
 * for example sin(); dsp->idct_put(); emms_c(); cos()
 
304
 */
 
305
#define emms_c()
 
306
 
 
307
/* should be defined by architectures supporting
 
308
   one or more MultiMedia extension */
 
309
int mm_support(void);
 
310
 
 
311
#if defined(HAVE_MMX)
 
312
 
 
313
#undef emms_c
 
314
 
 
315
#define MM_MMX    0x0001 /* standard MMX */
 
316
#define MM_3DNOW  0x0004 /* AMD 3DNOW */
 
317
#define MM_MMXEXT 0x0002 /* SSE integer functions or AMD MMX ext */
 
318
#define MM_SSE    0x0008 /* SSE functions */
 
319
#define MM_SSE2   0x0010 /* PIV SSE2 functions */
 
320
 
 
321
extern int mm_flags;
 
322
 
 
323
void add_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size);
 
324
void put_pixels_clamped_mmx(const DCTELEM *block, uint8_t *pixels, int line_size);
 
325
 
 
326
static inline void emms(void)
 
327
{
 
328
    __asm __volatile ("emms;":::"memory");
 
329
}
 
330
 
 
331
 
 
332
#define emms_c() \
 
333
{\
 
334
    if (mm_flags & MM_MMX)\
 
335
        emms();\
 
336
}
 
337
 
 
338
#define __align8 __attribute__ ((aligned (8)))
 
339
 
 
340
void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx);
 
341
void dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx);
 
342
 
 
343
#elif defined(ARCH_ARMV4L)
 
344
 
 
345
/* This is to use 4 bytes read to the IDCT pointers for some 'zero'
 
346
   line ptimizations */
 
347
#define __align8 __attribute__ ((aligned (4)))
 
348
 
 
349
void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx);
 
350
 
 
351
#elif defined(HAVE_MLIB)
 
352
 
 
353
/* SPARC/VIS IDCT needs 8-byte aligned DCT blocks */
 
354
#define __align8 __attribute__ ((aligned (8)))
 
355
 
 
356
void dsputil_init_mlib(DSPContext* c, AVCodecContext *avctx);
 
357
 
 
358
#elif defined(ARCH_ALPHA)
 
359
 
 
360
#define __align8 __attribute__ ((aligned (8)))
 
361
 
 
362
void dsputil_init_alpha(DSPContext* c, AVCodecContext *avctx);
 
363
 
 
364
#elif defined(ARCH_POWERPC)
 
365
 
 
366
#define MM_ALTIVEC    0x0001 /* standard AltiVec */
 
367
 
 
368
extern int mm_flags;
 
369
 
 
370
#if defined(HAVE_ALTIVEC) && !defined(CONFIG_DARWIN)
 
371
#include <altivec.h>
 
372
#endif
 
373
 
 
374
#define __align8 __attribute__ ((aligned (16)))
 
375
 
 
376
void dsputil_init_ppc(DSPContext* c, AVCodecContext *avctx);
 
377
 
 
378
#elif defined(HAVE_MMI)
 
379
 
 
380
#define __align8 __attribute__ ((aligned (16)))
 
381
 
 
382
void dsputil_init_mmi(DSPContext* c, AVCodecContext *avctx);
 
383
 
 
384
#elif defined(ARCH_SH4)
 
385
 
 
386
#define __align8 __attribute__ ((aligned (8)))
 
387
 
 
388
void dsputil_init_sh4(DSPContext* c, AVCodecContext *avctx);
 
389
 
 
390
#else
 
391
 
 
392
#define __align8
 
393
 
 
394
#endif
 
395
 
 
396
#ifdef __GNUC__
 
397
 
 
398
struct unaligned_64 { uint64_t l; } __attribute__((packed));
 
399
struct unaligned_32 { uint32_t l; } __attribute__((packed));
 
400
struct unaligned_16 { uint16_t l; } __attribute__((packed));
 
401
 
 
402
#define LD16(a) (((const struct unaligned_16 *) (a))->l)
 
403
#define LD32(a) (((const struct unaligned_32 *) (a))->l)
 
404
#define LD64(a) (((const struct unaligned_64 *) (a))->l)
 
405
 
 
406
#define ST32(a, b) (((struct unaligned_32 *) (a))->l) = (b)
 
407
 
 
408
#else /* __GNUC__ */
 
409
 
 
410
#define LD16(a) (*((uint16_t*)(a)))
 
411
#define LD32(a) (*((uint32_t*)(a)))
 
412
#define LD64(a) (*((uint64_t*)(a)))
 
413
 
 
414
#define ST32(a, b) *((uint32_t*)(a)) = (b)
 
415
 
 
416
#endif /* !__GNUC__ */
 
417
 
 
418
/* PSNR */
 
419
void get_psnr(uint8_t *orig_image[3], uint8_t *coded_image[3],
 
420
              int orig_linesize[3], int coded_linesize,
 
421
              AVCodecContext *avctx);
 
422
 
 
423
/* FFT computation */
 
424
 
 
425
/* NOTE: soon integer code will be added, so you must use the
 
426
   FFTSample type */
 
427
typedef float FFTSample;
 
428
 
 
429
typedef struct FFTComplex {
 
430
    FFTSample re, im;
 
431
} FFTComplex;
 
432
 
 
433
typedef struct FFTContext {
 
434
    int nbits;
 
435
    int inverse;
 
436
    uint16_t *revtab;
 
437
    FFTComplex *exptab;
 
438
    FFTComplex *exptab1; /* only used by SSE code */
 
439
    void (*fft_calc)(struct FFTContext *s, FFTComplex *z);
 
440
} FFTContext;
 
441
 
 
442
int fft_init(FFTContext *s, int nbits, int inverse);
 
443
void fft_permute(FFTContext *s, FFTComplex *z);
 
444
void fft_calc_c(FFTContext *s, FFTComplex *z);
 
445
void fft_calc_sse(FFTContext *s, FFTComplex *z);
 
446
void fft_calc_altivec(FFTContext *s, FFTComplex *z);
 
447
 
 
448
static inline void fft_calc(FFTContext *s, FFTComplex *z)
 
449
{
 
450
    s->fft_calc(s, z);
 
451
}
 
452
void fft_end(FFTContext *s);
 
453
 
 
454
/* MDCT computation */
 
455
 
 
456
typedef struct MDCTContext {
 
457
    int n;  /* size of MDCT (i.e. number of input data * 2) */
 
458
    int nbits; /* n = 2^nbits */
 
459
    /* pre/post rotation tables */
 
460
    FFTSample *tcos;
 
461
    FFTSample *tsin;
 
462
    FFTContext fft;
 
463
} MDCTContext;
 
464
 
 
465
int ff_mdct_init(MDCTContext *s, int nbits, int inverse);
 
466
void ff_imdct_calc(MDCTContext *s, FFTSample *output,
 
467
                const FFTSample *input, FFTSample *tmp);
 
468
void ff_mdct_calc(MDCTContext *s, FFTSample *out,
 
469
               const FFTSample *input, FFTSample *tmp);
 
470
void ff_mdct_end(MDCTContext *s);
 
471
 
 
472
#define WARPER88_1616(name8, name16)\
 
473
static int name16(void /*MpegEncContext*/ *s, uint8_t *dst, uint8_t *src, int stride){\
 
474
    return name8(s, dst           , src           , stride)\
 
475
          +name8(s, dst+8         , src+8         , stride)\
 
476
          +name8(s, dst  +8*stride, src  +8*stride, stride)\
 
477
          +name8(s, dst+8+8*stride, src+8+8*stride, stride);\
 
478
}
 
479
 
 
480
#ifndef HAVE_LRINTF
 
481
/* XXX: add ISOC specific test to avoid specific BSD testing. */
 
482
/* better than nothing implementation. */
 
483
/* btw, rintf() is existing on fbsd too -- alex */
 
484
static inline long int lrintf(float x)
 
485
{
 
486
#ifdef CONFIG_WIN32
 
487
    /* XXX: incorrect, but make it compile */
 
488
    return (int)(x);
 
489
#else
 
490
    return (int)(rint(x));
 
491
#endif
 
492
}
 
493
#endif
 
494
 
 
495
#if defined(CONFIG_OS2) || defined(CONFIG_SUNOS)
 
496
static inline float floorf(float f) { 
 
497
    return floor(f); 
 
498
}
 
499
#endif
 
500
 
 
501
#endif