Final 350 project

Dependencies:   uzair Camera_LS_Y201 F7_Ethernet LCD_DISCO_F746NG NetworkAPI SDFileSystem mbed

Committer:
shoaib_ahmed
Date:
Mon Jul 31 09:16:35 2017 +0000
Revision:
0:791a779d6220
final project;

Who changed what in which revision?

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