jdk

Форк
0
391 строка · 13.4 Кб
1
/*
2
 * reserved comment block
3
 * DO NOT REMOVE OR ALTER!
4
 */
5
/*
6
 * jcdctmgr.c
7
 *
8
 * Copyright (C) 1994-1996, Thomas G. Lane.
9
 * This file is part of the Independent JPEG Group's software.
10
 * For conditions of distribution and use, see the accompanying README file.
11
 *
12
 * This file contains the forward-DCT management logic.
13
 * This code selects a particular DCT implementation to be used,
14
 * and it performs related housekeeping chores including coefficient
15
 * quantization.
16
 */
17

18
#define JPEG_INTERNALS
19
#include "jinclude.h"
20
#include "jpeglib.h"
21
#include "jdct.h"               /* Private declarations for DCT subsystem */
22

23

24
/* Private subobject for this module */
25

26
typedef struct {
27
  struct jpeg_forward_dct pub;  /* public fields */
28

29
  /* Pointer to the DCT routine actually in use */
30
  forward_DCT_method_ptr do_dct;
31

32
  /* The actual post-DCT divisors --- not identical to the quant table
33
   * entries, because of scaling (especially for an unnormalized DCT).
34
   * Each table is given in normal array order.
35
   */
36
  DCTELEM * divisors[NUM_QUANT_TBLS];
37

38
#ifdef DCT_FLOAT_SUPPORTED
39
  /* Same as above for the floating-point case. */
40
  float_DCT_method_ptr do_float_dct;
41
  FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
42
#endif
43
} my_fdct_controller;
44

45
typedef my_fdct_controller * my_fdct_ptr;
46

47

48
/*
49
 * Initialize for a processing pass.
50
 * Verify that all referenced Q-tables are present, and set up
51
 * the divisor table for each one.
52
 * In the current implementation, DCT of all components is done during
53
 * the first pass, even if only some components will be output in the
54
 * first scan.  Hence all components should be examined here.
55
 */
56

57
METHODDEF(void)
58
start_pass_fdctmgr (j_compress_ptr cinfo)
59
{
60
  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
61
  int ci, qtblno, i;
62
  jpeg_component_info *compptr;
63
  JQUANT_TBL * qtbl;
64
  DCTELEM * dtbl;
65

66
  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
67
       ci++, compptr++) {
68
    qtblno = compptr->quant_tbl_no;
69
    /* Make sure specified quantization table is present */
70
    if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
71
        cinfo->quant_tbl_ptrs[qtblno] == NULL)
72
      ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
73
    qtbl = cinfo->quant_tbl_ptrs[qtblno];
74
    /* Compute divisors for this quant table */
75
    /* We may do this more than once for same table, but it's not a big deal */
76
    switch (cinfo->dct_method) {
77
#ifdef DCT_ISLOW_SUPPORTED
78
    case JDCT_ISLOW:
79
      /* For LL&M IDCT method, divisors are equal to raw quantization
80
       * coefficients multiplied by 8 (to counteract scaling).
81
       */
82
      if (fdct->divisors[qtblno] == NULL) {
83
        fdct->divisors[qtblno] = (DCTELEM *)
84
          (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
85
                                      DCTSIZE2 * SIZEOF(DCTELEM));
86
      }
87
      dtbl = fdct->divisors[qtblno];
88
      for (i = 0; i < DCTSIZE2; i++) {
89
        dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
90
      }
91
      break;
92
#endif
93
#ifdef DCT_IFAST_SUPPORTED
94
    case JDCT_IFAST:
95
      {
96
        /* For AA&N IDCT method, divisors are equal to quantization
97
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
98
         *   scalefactor[0] = 1
99
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
100
         * We apply a further scale factor of 8.
101
         */
102
#define CONST_BITS 14
103
        static const INT16 aanscales[DCTSIZE2] = {
104
          /* precomputed values scaled up by 14 bits */
105
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
106
          22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
107
          21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
108
          19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
109
          16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
110
          12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
111
           8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
112
           4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
113
        };
114
        SHIFT_TEMPS
115

116
        if (fdct->divisors[qtblno] == NULL) {
117
          fdct->divisors[qtblno] = (DCTELEM *)
118
            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
119
                                        DCTSIZE2 * SIZEOF(DCTELEM));
120
        }
121
        dtbl = fdct->divisors[qtblno];
122
        for (i = 0; i < DCTSIZE2; i++) {
123
          dtbl[i] = (DCTELEM)
124
            DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
125
                                  (INT32) aanscales[i]),
126
                    CONST_BITS-3);
127
        }
128
      }
129
      break;
130
#endif
131
#ifdef DCT_FLOAT_SUPPORTED
132
    case JDCT_FLOAT:
133
      {
134
        /* For float AA&N IDCT method, divisors are equal to quantization
135
         * coefficients scaled by scalefactor[row]*scalefactor[col], where
136
         *   scalefactor[0] = 1
137
         *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
138
         * We apply a further scale factor of 8.
139
         * What's actually stored is 1/divisor so that the inner loop can
140
         * use a multiplication rather than a division.
141
         */
142
        FAST_FLOAT * fdtbl;
143
        int row, col;
144
        static const double aanscalefactor[DCTSIZE] = {
145
          1.0, 1.387039845, 1.306562965, 1.175875602,
146
          1.0, 0.785694958, 0.541196100, 0.275899379
147
        };
148

149
        if (fdct->float_divisors[qtblno] == NULL) {
150
          fdct->float_divisors[qtblno] = (FAST_FLOAT *)
151
            (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
152
                                        DCTSIZE2 * SIZEOF(FAST_FLOAT));
153
        }
154
        fdtbl = fdct->float_divisors[qtblno];
155
        i = 0;
156
        for (row = 0; row < DCTSIZE; row++) {
157
          for (col = 0; col < DCTSIZE; col++) {
158
            fdtbl[i] = (FAST_FLOAT)
159
              (1.0 / (((double) qtbl->quantval[i] *
160
                       aanscalefactor[row] * aanscalefactor[col] * 8.0)));
161
            i++;
162
          }
163
        }
164
      }
165
      break;
166
#endif
167
    default:
168
      ERREXIT(cinfo, JERR_NOT_COMPILED);
169
      break;
170
    }
171
  }
172
}
173

174

175
/*
176
 * Perform forward DCT on one or more blocks of a component.
177
 *
178
 * The input samples are taken from the sample_data[] array starting at
179
 * position start_row/start_col, and moving to the right for any additional
180
 * blocks. The quantized coefficients are returned in coef_blocks[].
181
 */
182

183
METHODDEF(void)
184
forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
185
             JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
186
             JDIMENSION start_row, JDIMENSION start_col,
187
             JDIMENSION num_blocks)
188
/* This version is used for integer DCT implementations. */
189
{
190
  /* This routine is heavily used, so it's worth coding it tightly. */
191
  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
192
  forward_DCT_method_ptr do_dct = fdct->do_dct;
193
  DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
194
  DCTELEM workspace[DCTSIZE2];  /* work area for FDCT subroutine */
195
  JDIMENSION bi;
196

197
  sample_data += start_row;     /* fold in the vertical offset once */
198

199
  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
200
    /* Load data into workspace, applying unsigned->signed conversion */
201
    { register DCTELEM *workspaceptr;
202
      register JSAMPROW elemptr;
203
      register int elemr;
204

205
      workspaceptr = workspace;
206
      for (elemr = 0; elemr < DCTSIZE; elemr++) {
207
        elemptr = sample_data[elemr] + start_col;
208
#if DCTSIZE == 8                /* unroll the inner loop */
209
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
210
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
211
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
212
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
213
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
214
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
215
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
216
        *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
217
#else
218
        { register int elemc;
219
          for (elemc = DCTSIZE; elemc > 0; elemc--) {
220
            *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
221
          }
222
        }
223
#endif
224
      }
225
    }
226

227
    /* Perform the DCT */
228
    (*do_dct) (workspace);
229

230
    /* Quantize/descale the coefficients, and store into coef_blocks[] */
231
    { register DCTELEM temp, qval;
232
      register int i;
233
      register JCOEFPTR output_ptr = coef_blocks[bi];
234

235
      for (i = 0; i < DCTSIZE2; i++) {
236
        qval = divisors[i];
237
        temp = workspace[i];
238
        /* Divide the coefficient value by qval, ensuring proper rounding.
239
         * Since C does not specify the direction of rounding for negative
240
         * quotients, we have to force the dividend positive for portability.
241
         *
242
         * In most files, at least half of the output values will be zero
243
         * (at default quantization settings, more like three-quarters...)
244
         * so we should ensure that this case is fast.  On many machines,
245
         * a comparison is enough cheaper than a divide to make a special test
246
         * a win.  Since both inputs will be nonnegative, we need only test
247
         * for a < b to discover whether a/b is 0.
248
         * If your machine's division is fast enough, define FAST_DIVIDE.
249
         */
250
#ifdef FAST_DIVIDE
251
#define DIVIDE_BY(a,b)  a /= b
252
#else
253
#define DIVIDE_BY(a,b)  if (a >= b) a /= b; else a = 0
254
#endif
255
        if (temp < 0) {
256
          temp = -temp;
257
          temp += qval>>1;      /* for rounding */
258
          DIVIDE_BY(temp, qval);
259
          temp = -temp;
260
        } else {
261
          temp += qval>>1;      /* for rounding */
262
          DIVIDE_BY(temp, qval);
263
        }
264
        output_ptr[i] = (JCOEF) temp;
265
      }
266
    }
267
  }
268
}
269

270

271
#ifdef DCT_FLOAT_SUPPORTED
272

273
METHODDEF(void)
274
forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
275
                   JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
276
                   JDIMENSION start_row, JDIMENSION start_col,
277
                   JDIMENSION num_blocks)
278
/* This version is used for floating-point DCT implementations. */
279
{
280
  /* This routine is heavily used, so it's worth coding it tightly. */
281
  my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
282
  float_DCT_method_ptr do_dct = fdct->do_float_dct;
283
  FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
284
  FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
285
  JDIMENSION bi;
286

287
  sample_data += start_row;     /* fold in the vertical offset once */
288

289
  for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
290
    /* Load data into workspace, applying unsigned->signed conversion */
291
    { register FAST_FLOAT *workspaceptr;
292
      register JSAMPROW elemptr;
293
      register int elemr;
294

295
      workspaceptr = workspace;
296
      for (elemr = 0; elemr < DCTSIZE; elemr++) {
297
        elemptr = sample_data[elemr] + start_col;
298
#if DCTSIZE == 8                /* unroll the inner loop */
299
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
300
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
301
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
302
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
303
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
304
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
305
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
306
        *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
307
#else
308
        { register int elemc;
309
          for (elemc = DCTSIZE; elemc > 0; elemc--) {
310
            *workspaceptr++ = (FAST_FLOAT)
311
              (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
312
          }
313
        }
314
#endif
315
      }
316
    }
317

318
    /* Perform the DCT */
319
    (*do_dct) (workspace);
320

321
    /* Quantize/descale the coefficients, and store into coef_blocks[] */
322
    { register FAST_FLOAT temp;
323
      register int i;
324
      register JCOEFPTR output_ptr = coef_blocks[bi];
325

326
      for (i = 0; i < DCTSIZE2; i++) {
327
        /* Apply the quantization and scaling factor */
328
        temp = workspace[i] * divisors[i];
329
        /* Round to nearest integer.
330
         * Since C does not specify the direction of rounding for negative
331
         * quotients, we have to force the dividend positive for portability.
332
         * The maximum coefficient size is +-16K (for 12-bit data), so this
333
         * code should work for either 16-bit or 32-bit ints.
334
         */
335
        output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
336
      }
337
    }
338
  }
339
}
340

341
#endif /* DCT_FLOAT_SUPPORTED */
342

343

344
/*
345
 * Initialize FDCT manager.
346
 */
347

348
GLOBAL(void)
349
jinit_forward_dct (j_compress_ptr cinfo)
350
{
351
  my_fdct_ptr fdct;
352
  int i;
353

354
  fdct = (my_fdct_ptr)
355
    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
356
                                SIZEOF(my_fdct_controller));
357
  cinfo->fdct = (struct jpeg_forward_dct *) fdct;
358
  fdct->pub.start_pass = start_pass_fdctmgr;
359

360
  switch (cinfo->dct_method) {
361
#ifdef DCT_ISLOW_SUPPORTED
362
  case JDCT_ISLOW:
363
    fdct->pub.forward_DCT = forward_DCT;
364
    fdct->do_dct = jpeg_fdct_islow;
365
    break;
366
#endif
367
#ifdef DCT_IFAST_SUPPORTED
368
  case JDCT_IFAST:
369
    fdct->pub.forward_DCT = forward_DCT;
370
    fdct->do_dct = jpeg_fdct_ifast;
371
    break;
372
#endif
373
#ifdef DCT_FLOAT_SUPPORTED
374
  case JDCT_FLOAT:
375
    fdct->pub.forward_DCT = forward_DCT_float;
376
    fdct->do_float_dct = jpeg_fdct_float;
377
    break;
378
#endif
379
  default:
380
    ERREXIT(cinfo, JERR_NOT_COMPILED);
381
    break;
382
  }
383

384
  /* Mark divisor tables unallocated */
385
  for (i = 0; i < NUM_QUANT_TBLS; i++) {
386
    fdct->divisors[i] = NULL;
387
#ifdef DCT_FLOAT_SUPPORTED
388
    fdct->float_divisors[i] = NULL;
389
#endif
390
  }
391
}
392

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.