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

« back to all changes in this revision

Viewing changes to ffmpeg/libavcodec/jfdctint.c

  • Committer: Bazaar Package Importer
  • Author(s): John Dong
  • Date: 2008-02-25 15:47:12 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080225154712-qvr11ekcea4c9ry8
Tags: 1.1.6-0.1ubuntu1
* Merge from debian-multimedia (LP: #120003), Ubuntu Changes:
 - For ffmpeg-related build-deps, remove cvs from package names.
 - Standards-Version 3.7.3
 - Maintainer Spec

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 * jfdctint.c
3
3
 *
4
 
 * Copyright (C) 1991-1996, Thomas G. Lane.
5
4
 * This file is part of the Independent JPEG Group's software.
6
 
 * For conditions of distribution and use, see the accompanying README file.
 
5
 *
 
6
 * The authors make NO WARRANTY or representation, either express or implied,
 
7
 * with respect to this software, its quality, accuracy, merchantability, or
 
8
 * fitness for a particular purpose.  This software is provided "AS IS", and
 
9
 * you, its user, assume the entire risk as to its quality and accuracy.
 
10
 *
 
11
 * This software is copyright (C) 1991-1996, Thomas G. Lane.
 
12
 * All Rights Reserved except as specified below.
 
13
 *
 
14
 * Permission is hereby granted to use, copy, modify, and distribute this
 
15
 * software (or portions thereof) for any purpose, without fee, subject to
 
16
 * these conditions:
 
17
 * (1) If any part of the source code for this software is distributed, then
 
18
 * this README file must be included, with this copyright and no-warranty
 
19
 * notice unaltered; and any additions, deletions, or changes to the original
 
20
 * files must be clearly indicated in accompanying documentation.
 
21
 * (2) If only executable code is distributed, then the accompanying
 
22
 * documentation must state that "this software is based in part on the work
 
23
 * of the Independent JPEG Group".
 
24
 * (3) Permission for use of this software is granted only if the user accepts
 
25
 * full responsibility for any undesirable consequences; the authors accept
 
26
 * NO LIABILITY for damages of any kind.
 
27
 *
 
28
 * These conditions apply to any software derived from or based on the IJG
 
29
 * code, not just to the unmodified library.  If you use our work, you ought
 
30
 * to acknowledge us.
 
31
 *
 
32
 * Permission is NOT granted for the use of any IJG author's name or company
 
33
 * name in advertising or publicity relating to this software or products
 
34
 * derived from it.  This software may be referred to only as "the Independent
 
35
 * JPEG Group's software".
 
36
 *
 
37
 * We specifically permit and encourage the use of this software as the basis
 
38
 * of commercial products, provided that all warranty or liability claims are
 
39
 * assumed by the product vendor.
7
40
 *
8
41
 * This file contains a slow-but-accurate integer implementation of the
9
42
 * forward DCT (Discrete Cosine Transform).
27
60
 * @file jfdctint.c
28
61
 * Independent JPEG Group's slow & accurate dct.
29
62
 */
30
 
 
 
63
 
31
64
#include <stdlib.h>
32
65
#include <stdio.h>
33
66
#include "common.h"
92
125
 
93
126
#if BITS_IN_JSAMPLE == 8
94
127
#define CONST_BITS  13
95
 
#define PASS1_BITS  4           /* set this to 2 if 16x16 multiplies are faster */
 
128
#define PASS1_BITS  4   /* set this to 2 if 16x16 multiplies are faster */
96
129
#else
97
130
#define CONST_BITS  13
98
 
#define PASS1_BITS  1           /* lose a little precision to avoid overflow */
 
131
#define PASS1_BITS  1   /* lose a little precision to avoid overflow */
99
132
#endif
100
133
 
101
134
/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus
106
139
 */
107
140
 
108
141
#if CONST_BITS == 13
109
 
#define FIX_0_298631336  ((int32_t)  2446)      /* FIX(0.298631336) */
110
 
#define FIX_0_390180644  ((int32_t)  3196)      /* FIX(0.390180644) */
111
 
#define FIX_0_541196100  ((int32_t)  4433)      /* FIX(0.541196100) */
112
 
#define FIX_0_765366865  ((int32_t)  6270)      /* FIX(0.765366865) */
113
 
#define FIX_0_899976223  ((int32_t)  7373)      /* FIX(0.899976223) */
114
 
#define FIX_1_175875602  ((int32_t)  9633)      /* FIX(1.175875602) */
115
 
#define FIX_1_501321110  ((int32_t)  12299)     /* FIX(1.501321110) */
116
 
#define FIX_1_847759065  ((int32_t)  15137)     /* FIX(1.847759065) */
117
 
#define FIX_1_961570560  ((int32_t)  16069)     /* FIX(1.961570560) */
118
 
#define FIX_2_053119869  ((int32_t)  16819)     /* FIX(2.053119869) */
119
 
#define FIX_2_562915447  ((int32_t)  20995)     /* FIX(2.562915447) */
120
 
#define FIX_3_072711026  ((int32_t)  25172)     /* FIX(3.072711026) */
 
142
#define FIX_0_298631336  ((int32_t)  2446)      /* FIX(0.298631336) */
 
143
#define FIX_0_390180644  ((int32_t)  3196)      /* FIX(0.390180644) */
 
144
#define FIX_0_541196100  ((int32_t)  4433)      /* FIX(0.541196100) */
 
145
#define FIX_0_765366865  ((int32_t)  6270)      /* FIX(0.765366865) */
 
146
#define FIX_0_899976223  ((int32_t)  7373)      /* FIX(0.899976223) */
 
147
#define FIX_1_175875602  ((int32_t)  9633)      /* FIX(1.175875602) */
 
148
#define FIX_1_501321110  ((int32_t)  12299)     /* FIX(1.501321110) */
 
149
#define FIX_1_847759065  ((int32_t)  15137)     /* FIX(1.847759065) */
 
150
#define FIX_1_961570560  ((int32_t)  16069)     /* FIX(1.961570560) */
 
151
#define FIX_2_053119869  ((int32_t)  16819)     /* FIX(2.053119869) */
 
152
#define FIX_2_562915447  ((int32_t)  20995)     /* FIX(2.562915447) */
 
153
#define FIX_3_072711026  ((int32_t)  25172)     /* FIX(3.072711026) */
121
154
#else
122
155
#define FIX_0_298631336  FIX(0.298631336)
123
156
#define FIX_0_390180644  FIX(0.390180644)
148
181
#endif
149
182
 
150
183
 
151
 
/*
152
 
 * Perform the forward DCT on one block of samples.
153
 
 */
154
 
 
155
 
GLOBAL(void)
156
 
ff_jpeg_fdct_islow (DCTELEM * data)
157
 
{
158
 
  int32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
159
 
  int32_t tmp10, tmp11, tmp12, tmp13;
160
 
  int32_t z1, z2, z3, z4, z5;
 
184
static av_always_inline void row_fdct(DCTELEM * data){
 
185
  int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
 
186
  int_fast32_t tmp10, tmp11, tmp12, tmp13;
 
187
  int_fast32_t z1, z2, z3, z4, z5;
161
188
  DCTELEM *dataptr;
162
189
  int ctr;
163
190
  SHIFT_TEMPS
176
203
    tmp5 = dataptr[2] - dataptr[5];
177
204
    tmp3 = dataptr[3] + dataptr[4];
178
205
    tmp4 = dataptr[3] - dataptr[4];
179
 
    
 
206
 
180
207
    /* Even part per LL&M figure 1 --- note that published figure is faulty;
181
208
     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
182
209
     */
183
 
    
 
210
 
184
211
    tmp10 = tmp0 + tmp3;
185
212
    tmp13 = tmp0 - tmp3;
186
213
    tmp11 = tmp1 + tmp2;
187
214
    tmp12 = tmp1 - tmp2;
188
 
    
 
215
 
189
216
    dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS);
190
217
    dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS);
191
 
    
 
218
 
192
219
    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
193
220
    dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
194
 
                                   CONST_BITS-PASS1_BITS);
 
221
                                   CONST_BITS-PASS1_BITS);
195
222
    dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
196
 
                                   CONST_BITS-PASS1_BITS);
197
 
    
 
223
                                   CONST_BITS-PASS1_BITS);
 
224
 
198
225
    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
199
226
     * cK represents cos(K*pi/16).
200
227
     * i0..i3 in the paper are tmp4..tmp7 here.
201
228
     */
202
 
    
 
229
 
203
230
    z1 = tmp4 + tmp7;
204
231
    z2 = tmp5 + tmp6;
205
232
    z3 = tmp4 + tmp6;
206
233
    z4 = tmp5 + tmp7;
207
234
    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
208
 
    
 
235
 
209
236
    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
210
237
    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
211
238
    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
214
241
    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
215
242
    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
216
243
    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
217
 
    
 
244
 
218
245
    z3 += z5;
219
246
    z4 += z5;
220
 
    
 
247
 
221
248
    dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS);
222
249
    dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS);
223
250
    dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS);
224
251
    dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS);
225
 
    
226
 
    dataptr += DCTSIZE;         /* advance pointer to next row */
 
252
 
 
253
    dataptr += DCTSIZE;         /* advance pointer to next row */
227
254
  }
 
255
}
 
256
 
 
257
/*
 
258
 * Perform the forward DCT on one block of samples.
 
259
 */
 
260
 
 
261
GLOBAL(void)
 
262
ff_jpeg_fdct_islow (DCTELEM * data)
 
263
{
 
264
  int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
 
265
  int_fast32_t tmp10, tmp11, tmp12, tmp13;
 
266
  int_fast32_t z1, z2, z3, z4, z5;
 
267
  DCTELEM *dataptr;
 
268
  int ctr;
 
269
  SHIFT_TEMPS
 
270
 
 
271
  row_fdct(data);
228
272
 
229
273
  /* Pass 2: process columns.
230
274
   * We remove the PASS1_BITS scaling, but leave the results scaled up
241
285
    tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5];
242
286
    tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4];
243
287
    tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4];
244
 
    
 
288
 
245
289
    /* Even part per LL&M figure 1 --- note that published figure is faulty;
246
290
     * rotator "sqrt(2)*c1" should be "sqrt(2)*c6".
247
291
     */
248
 
    
 
292
 
249
293
    tmp10 = tmp0 + tmp3;
250
294
    tmp13 = tmp0 - tmp3;
251
295
    tmp11 = tmp1 + tmp2;
252
296
    tmp12 = tmp1 - tmp2;
253
 
    
 
297
 
254
298
    dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
255
299
    dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
256
 
    
 
300
 
257
301
    z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
258
302
    dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
259
 
                                           CONST_BITS+PASS1_BITS);
 
303
                                           CONST_BITS+PASS1_BITS);
260
304
    dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
261
 
                                           CONST_BITS+PASS1_BITS);
262
 
    
 
305
                                           CONST_BITS+PASS1_BITS);
 
306
 
263
307
    /* Odd part per figure 8 --- note paper omits factor of sqrt(2).
264
308
     * cK represents cos(K*pi/16).
265
309
     * i0..i3 in the paper are tmp4..tmp7 here.
266
310
     */
267
 
    
 
311
 
268
312
    z1 = tmp4 + tmp7;
269
313
    z2 = tmp5 + tmp6;
270
314
    z3 = tmp4 + tmp6;
271
315
    z4 = tmp5 + tmp7;
272
316
    z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */
273
 
    
 
317
 
274
318
    tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */
275
319
    tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */
276
320
    tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */
279
323
    z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */
280
324
    z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */
281
325
    z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */
282
 
    
 
326
 
283
327
    z3 += z5;
284
328
    z4 += z5;
285
 
    
 
329
 
286
330
    dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3,
287
 
                                           CONST_BITS+PASS1_BITS);
 
331
                                           CONST_BITS+PASS1_BITS);
288
332
    dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4,
289
 
                                           CONST_BITS+PASS1_BITS);
 
333
                                           CONST_BITS+PASS1_BITS);
290
334
    dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3,
291
 
                                           CONST_BITS+PASS1_BITS);
 
335
                                           CONST_BITS+PASS1_BITS);
292
336
    dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4,
293
 
                                           CONST_BITS+PASS1_BITS);
294
 
    
295
 
    dataptr++;                  /* advance pointer to next column */
 
337
                                           CONST_BITS+PASS1_BITS);
 
338
 
 
339
    dataptr++;                  /* advance pointer to next column */
 
340
  }
 
341
}
 
342
 
 
343
/*
 
344
 * The secret of DCT2-4-8 is really simple -- you do the usual 1-DCT
 
345
 * on the rows and then, instead of doing even and odd, part on the colums
 
346
 * you do even part two times.
 
347
 */
 
348
GLOBAL(void)
 
349
ff_fdct248_islow (DCTELEM * data)
 
350
{
 
351
  int_fast32_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
 
352
  int_fast32_t tmp10, tmp11, tmp12, tmp13;
 
353
  int_fast32_t z1;
 
354
  DCTELEM *dataptr;
 
355
  int ctr;
 
356
  SHIFT_TEMPS
 
357
 
 
358
  row_fdct(data);
 
359
 
 
360
  /* Pass 2: process columns.
 
361
   * We remove the PASS1_BITS scaling, but leave the results scaled up
 
362
   * by an overall factor of 8.
 
363
   */
 
364
 
 
365
  dataptr = data;
 
366
  for (ctr = DCTSIZE-1; ctr >= 0; ctr--) {
 
367
     tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*1];
 
368
     tmp1 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*3];
 
369
     tmp2 = dataptr[DCTSIZE*4] + dataptr[DCTSIZE*5];
 
370
     tmp3 = dataptr[DCTSIZE*6] + dataptr[DCTSIZE*7];
 
371
     tmp4 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*1];
 
372
     tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*3];
 
373
     tmp6 = dataptr[DCTSIZE*4] - dataptr[DCTSIZE*5];
 
374
     tmp7 = dataptr[DCTSIZE*6] - dataptr[DCTSIZE*7];
 
375
 
 
376
     tmp10 = tmp0 + tmp3;
 
377
     tmp11 = tmp1 + tmp2;
 
378
     tmp12 = tmp1 - tmp2;
 
379
     tmp13 = tmp0 - tmp3;
 
380
 
 
381
     dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
 
382
     dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
 
383
 
 
384
     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
 
385
     dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
 
386
                                            CONST_BITS+PASS1_BITS);
 
387
     dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
 
388
                                            CONST_BITS+PASS1_BITS);
 
389
 
 
390
     tmp10 = tmp4 + tmp7;
 
391
     tmp11 = tmp5 + tmp6;
 
392
     tmp12 = tmp5 - tmp6;
 
393
     tmp13 = tmp4 - tmp7;
 
394
 
 
395
     dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS);
 
396
     dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS);
 
397
 
 
398
     z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100);
 
399
     dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865),
 
400
                                            CONST_BITS+PASS1_BITS);
 
401
     dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065),
 
402
                                            CONST_BITS+PASS1_BITS);
 
403
 
 
404
     dataptr++;                 /* advance pointer to next column */
296
405
  }
297
406
}