1 /*
   2  * jddctmgr.c
   3  *
   4  * Copyright (C) 1994-1996, Thomas G. Lane.
   5  * This file is part of the Independent JPEG Group's software.
   6  * For conditions of distribution and use, see the accompanying README file.
   7  *
   8  * This file contains the inverse-DCT management logic.
   9  * This code selects a particular IDCT implementation to be used,
  10  * and it performs related housekeeping chores.  No code in this file
  11  * is executed per IDCT step, only during output pass setup.
  12  *
  13  * Note that the IDCT routines are responsible for performing coefficient
  14  * dequantization as well as the IDCT proper.  This module sets up the
  15  * dequantization multiplier table needed by the IDCT routine.
  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 /*
  25  * The decompressor input side (jdinput.c) saves away the appropriate
  26  * quantization table for each component at the start of the first scan
  27  * involving that component.  (This is necessary in order to correctly
  28  * decode files that reuse Q-table slots.)
  29  * When we are ready to make an output pass, the saved Q-table is converted
  30  * to a multiplier table that will actually be used by the IDCT routine.
  31  * The multiplier table contents are IDCT-method-dependent.  To support
  32  * application changes in IDCT method between scans, we can remake the
  33  * multiplier tables if necessary.
  34  * In buffered-image mode, the first output pass may occur before any data
  35  * has been seen for some components, and thus before their Q-tables have
  36  * been saved away.  To handle this case, multiplier tables are preset
  37  * to zeroes; the result of the IDCT will be a neutral gray level.
  38  */
  39 
  40 
  41 /* Private subobject for this module */
  42 
  43 typedef struct {
  44   struct jpeg_inverse_dct pub;  /* public fields */
  45 
  46   /* This array contains the IDCT method code that each multiplier table
  47    * is currently set up for, or -1 if it's not yet set up.
  48    * The actual multiplier tables are pointed to by dct_table in the
  49    * per-component comp_info structures.
  50    */
  51   int cur_method[MAX_COMPONENTS];
  52 } my_idct_controller;
  53 
  54 typedef my_idct_controller * my_idct_ptr;
  55 
  56 
  57 /* Allocated multiplier tables: big enough for any supported variant */
  58 
  59 typedef union {
  60   ISLOW_MULT_TYPE islow_array[DCTSIZE2];
  61 #ifdef DCT_IFAST_SUPPORTED
  62   IFAST_MULT_TYPE ifast_array[DCTSIZE2];
  63 #endif
  64 #ifdef DCT_FLOAT_SUPPORTED
  65   FLOAT_MULT_TYPE float_array[DCTSIZE2];
  66 #endif
  67 } multiplier_table;
  68 
  69 
  70 /* The current scaled-IDCT routines require ISLOW-style multiplier tables,
  71  * so be sure to compile that code if either ISLOW or SCALING is requested.
  72  */
  73 #ifdef DCT_ISLOW_SUPPORTED
  74 #define PROVIDE_ISLOW_TABLES
  75 #else
  76 #ifdef IDCT_SCALING_SUPPORTED
  77 #define PROVIDE_ISLOW_TABLES
  78 #endif
  79 #endif
  80 
  81 
  82 /*
  83  * Prepare for an output pass.
  84  * Here we select the proper IDCT routine for each component and build
  85  * a matching multiplier table.
  86  */
  87 
  88 METHODDEF(void)
  89 start_pass (j_decompress_ptr cinfo)
  90 {
  91   my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
  92   int ci, i;
  93   jpeg_component_info *compptr;
  94   int method = 0;
  95   inverse_DCT_method_ptr method_ptr = NULL;
  96   JQUANT_TBL * qtbl;
  97 
  98   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  99        ci++, compptr++) {
 100     /* Select the proper IDCT routine for this component's scaling */
 101     switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) {
 102 #ifdef IDCT_SCALING_SUPPORTED
 103     case ((1 << 8) + 1):
 104       method_ptr = jpeg_idct_1x1;
 105       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 106       break;
 107     case ((2 << 8) + 2):
 108       method_ptr = jpeg_idct_2x2;
 109       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 110       break;
 111     case ((3 << 8) + 3):
 112       method_ptr = jpeg_idct_3x3;
 113       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 114       break;
 115     case ((4 << 8) + 4):
 116       method_ptr = jpeg_idct_4x4;
 117       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 118       break;
 119     case ((5 << 8) + 5):
 120       method_ptr = jpeg_idct_5x5;
 121       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 122       break;
 123     case ((6 << 8) + 6):
 124       method_ptr = jpeg_idct_6x6;
 125       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 126       break;
 127     case ((7 << 8) + 7):
 128       method_ptr = jpeg_idct_7x7;
 129       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 130       break;
 131     case ((9 << 8) + 9):
 132       method_ptr = jpeg_idct_9x9;
 133       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 134       break;
 135     case ((10 << 8) + 10):
 136       method_ptr = jpeg_idct_10x10;
 137       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 138       break;
 139     case ((11 << 8) + 11):
 140       method_ptr = jpeg_idct_11x11;
 141       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 142       break;
 143     case ((12 << 8) + 12):
 144       method_ptr = jpeg_idct_12x12;
 145       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 146       break;
 147     case ((13 << 8) + 13):
 148       method_ptr = jpeg_idct_13x13;
 149       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 150       break;
 151     case ((14 << 8) + 14):
 152       method_ptr = jpeg_idct_14x14;
 153       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 154       break;
 155     case ((15 << 8) + 15):
 156       method_ptr = jpeg_idct_15x15;
 157       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 158       break;
 159     case ((16 << 8) + 16):
 160       method_ptr = jpeg_idct_16x16;
 161       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 162       break;
 163     case ((16 << 8) + 8):
 164       method_ptr = jpeg_idct_16x8;
 165       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 166       break;
 167     case ((14 << 8) + 7):
 168       method_ptr = jpeg_idct_14x7;
 169       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 170       break;
 171     case ((12 << 8) + 6):
 172       method_ptr = jpeg_idct_12x6;
 173       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 174       break;
 175     case ((10 << 8) + 5):
 176       method_ptr = jpeg_idct_10x5;
 177       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 178       break;
 179     case ((8 << 8) + 4):
 180       method_ptr = jpeg_idct_8x4;
 181       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 182       break;
 183     case ((6 << 8) + 3):
 184       method_ptr = jpeg_idct_6x3;
 185       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 186       break;
 187     case ((4 << 8) + 2):
 188       method_ptr = jpeg_idct_4x2;
 189       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 190       break;
 191     case ((2 << 8) + 1):
 192       method_ptr = jpeg_idct_2x1;
 193       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 194       break;
 195     case ((8 << 8) + 16):
 196       method_ptr = jpeg_idct_8x16;
 197       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 198       break;
 199     case ((7 << 8) + 14):
 200       method_ptr = jpeg_idct_7x14;
 201       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 202       break;
 203     case ((6 << 8) + 12):
 204       method_ptr = jpeg_idct_6x12;
 205       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 206       break;
 207     case ((5 << 8) + 10):
 208       method_ptr = jpeg_idct_5x10;
 209       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 210       break;
 211     case ((4 << 8) + 8):
 212       method_ptr = jpeg_idct_4x8;
 213       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 214       break;
 215     case ((3 << 8) + 6):
 216       method_ptr = jpeg_idct_3x6;
 217       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 218       break;
 219     case ((2 << 8) + 4):
 220       method_ptr = jpeg_idct_2x4;
 221       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 222       break;
 223     case ((1 << 8) + 2):
 224       method_ptr = jpeg_idct_1x2;
 225       method = JDCT_ISLOW;      /* jidctint uses islow-style table */
 226       break;
 227 #endif
 228     case ((DCTSIZE << 8) + DCTSIZE):
 229       switch (cinfo->dct_method) {
 230 #ifdef DCT_ISLOW_SUPPORTED
 231       case JDCT_ISLOW:
 232         method_ptr = jpeg_idct_islow;
 233         method = JDCT_ISLOW;
 234         break;
 235 #endif
 236 #ifdef DCT_IFAST_SUPPORTED
 237       case JDCT_IFAST:
 238         method_ptr = jpeg_idct_ifast;
 239         method = JDCT_IFAST;
 240         break;
 241 #endif
 242 #ifdef DCT_FLOAT_SUPPORTED
 243       case JDCT_FLOAT:
 244         method_ptr = jpeg_idct_float;
 245         method = JDCT_FLOAT;
 246         break;
 247 #endif
 248       default:
 249         ERREXIT(cinfo, JERR_NOT_COMPILED);
 250         break;
 251       }
 252       break;
 253     default:
 254       ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
 255                compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);
 256       break;
 257     }
 258     idct->pub.inverse_DCT[ci] = method_ptr;
 259     /* Create multiplier table from quant table.
 260      * However, we can skip this if the component is uninteresting
 261      * or if we already built the table.  Also, if no quant table
 262      * has yet been saved for the component, we leave the
 263      * multiplier table all-zero; we'll be reading zeroes from the
 264      * coefficient controller's buffer anyway.
 265      */
 266     if (! compptr->component_needed || idct->cur_method[ci] == method)
 267       continue;
 268     qtbl = compptr->quant_table;
 269     if (qtbl == NULL)           /* happens if no data yet for component */
 270       continue;
 271     idct->cur_method[ci] = method;
 272     switch (method) {
 273 #ifdef PROVIDE_ISLOW_TABLES
 274     case JDCT_ISLOW:
 275       {
 276         /* For LL&M IDCT method, multipliers are equal to raw quantization
 277          * coefficients, but are stored as ints to ensure access efficiency.
 278          */
 279         ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
 280         for (i = 0; i < DCTSIZE2; i++) {
 281           ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
 282         }
 283       }
 284       break;
 285 #endif
 286 #ifdef DCT_IFAST_SUPPORTED
 287     case JDCT_IFAST:
 288       {
 289         /* For AA&N IDCT method, multipliers are equal to quantization
 290          * coefficients scaled by scalefactor[row]*scalefactor[col], where
 291          *   scalefactor[0] = 1
 292          *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
 293          * For integer operation, the multiplier table is to be scaled by
 294          * IFAST_SCALE_BITS.
 295          */
 296         IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
 297 #define CONST_BITS 14
 298         static const INT16 aanscales[DCTSIZE2] = {
 299           /* precomputed values scaled up by 14 bits */
 300           16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
 301           22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
 302           21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
 303           19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
 304           16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
 305           12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
 306            8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
 307            4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
 308         };
 309         SHIFT_TEMPS
 310 
 311         for (i = 0; i < DCTSIZE2; i++) {
 312           ifmtbl[i] = (IFAST_MULT_TYPE)
 313             DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
 314                                   (INT32) aanscales[i]),
 315                     CONST_BITS-IFAST_SCALE_BITS);
 316         }
 317       }
 318       break;
 319 #endif
 320 #ifdef DCT_FLOAT_SUPPORTED
 321     case JDCT_FLOAT:
 322       {
 323         /* For float AA&N IDCT method, multipliers are equal to quantization
 324          * coefficients scaled by scalefactor[row]*scalefactor[col], where
 325          *   scalefactor[0] = 1
 326          *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
 327          */
 328         FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
 329         int row, col;
 330         static const double aanscalefactor[DCTSIZE] = {
 331           1.0, 1.387039845, 1.306562965, 1.175875602,
 332           1.0, 0.785694958, 0.541196100, 0.275899379
 333         };
 334 
 335         i = 0;
 336         for (row = 0; row < DCTSIZE; row++) {
 337           for (col = 0; col < DCTSIZE; col++) {
 338             fmtbl[i] = (FLOAT_MULT_TYPE)
 339               ((double) qtbl->quantval[i] *
 340                aanscalefactor[row] * aanscalefactor[col]);
 341             i++;
 342           }
 343         }
 344       }
 345       break;
 346 #endif
 347     default:
 348       ERREXIT(cinfo, JERR_NOT_COMPILED);
 349       break;
 350     }
 351   }
 352 }
 353 
 354 
 355 /*
 356  * Initialize IDCT manager.
 357  */
 358 
 359 GLOBAL(void)
 360 jinit_inverse_dct (j_decompress_ptr cinfo)
 361 {
 362   my_idct_ptr idct;
 363   int ci;
 364   jpeg_component_info *compptr;
 365 
 366   idct = (my_idct_ptr)
 367     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
 368                                 SIZEOF(my_idct_controller));
 369   cinfo->idct = (struct jpeg_inverse_dct *) idct;
 370   idct->pub.start_pass = start_pass;
 371 
 372   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
 373        ci++, compptr++) {
 374     /* Allocate and pre-zero a multiplier table for each component */
 375     compptr->dct_table =
 376       (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
 377                                   SIZEOF(multiplier_table));
 378     MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
 379     /* Mark multiplier table not yet set up for any method */
 380     idct->cur_method[ci] = -1;
 381   }
 382 }