JDDCTMGR.C
上传用户:wep9318
上传日期:2007-01-07
资源大小:893k
文件大小:9k
源码类别:

图片显示

开发平台:

Visual C++

  1. /*
  2.  * jddctmgr.c
  3.  *
  4.  * Copyright (C) 1994, 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 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. #define JPEG_INTERNALS
  18. #include "jinclude.h"
  19. #include "jpeglib.h"
  20. #include "jdct.h" /* Private declarations for DCT subsystem */
  21. /* Private subobject for this module */
  22. typedef struct {
  23.   struct jpeg_inverse_dct pub; /* public fields */
  24.   /* Record the IDCT method type actually selected for each component */
  25.   J_DCT_METHOD real_method[MAX_COMPONENTS];
  26. } my_idct_controller;
  27. typedef my_idct_controller * my_idct_ptr;
  28. /* ZIG[i] is the zigzag-order position of the i'th element of a DCT block */
  29. /* read in natural order (left to right, top to bottom). */
  30. static const int ZIG[DCTSIZE2] = {
  31.      0,  1,  5,  6, 14, 15, 27, 28,
  32.      2,  4,  7, 13, 16, 26, 29, 42,
  33.      3,  8, 12, 17, 25, 30, 41, 43,
  34.      9, 11, 18, 24, 31, 40, 44, 53,
  35.     10, 19, 23, 32, 39, 45, 52, 54,
  36.     20, 22, 33, 38, 46, 51, 55, 60,
  37.     21, 34, 37, 47, 50, 56, 59, 61,
  38.     35, 36, 48, 49, 57, 58, 62, 63
  39. };
  40. /* The current scaled-IDCT routines require ISLOW-style multiplier tables,
  41.  * so be sure to compile that code if either ISLOW or SCALING is requested.
  42.  */
  43. #ifdef DCT_ISLOW_SUPPORTED
  44. #define PROVIDE_ISLOW_TABLES
  45. #else
  46. #ifdef IDCT_SCALING_SUPPORTED
  47. #define PROVIDE_ISLOW_TABLES
  48. #endif
  49. #endif
  50. /*
  51.  * Initialize for an input scan.
  52.  *
  53.  * Verify that all referenced Q-tables are present, and set up
  54.  * the multiplier table for each one.
  55.  * With a multiple-scan JPEG file, this is called during each input scan,
  56.  * NOT during the final output pass where the IDCT is actually done.
  57.  * The purpose is to save away the current Q-table contents just in case
  58.  * the encoder changes tables between scans.  This decoder will dequantize
  59.  * any component using the Q-table which was current at the start of the
  60.  * first scan using that component.
  61.  */
  62. METHODDEF void
  63. start_input_pass (j_decompress_ptr cinfo)
  64. {
  65.   my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
  66.   int ci, qtblno, i;
  67.   jpeg_component_info *compptr;
  68.   JQUANT_TBL * qtbl;
  69.   for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  70.     compptr = cinfo->cur_comp_info[ci];
  71.     qtblno = compptr->quant_tbl_no;
  72.     /* Make sure specified quantization table is present */
  73.     if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
  74. cinfo->quant_tbl_ptrs[qtblno] == NULL)
  75.       ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
  76.     qtbl = cinfo->quant_tbl_ptrs[qtblno];
  77.     /* Create multiplier table from quant table, unless we already did so. */
  78.     if (compptr->dct_table != NULL)
  79.       continue;
  80.     switch (idct->real_method[compptr->component_index]) {
  81. #ifdef PROVIDE_ISLOW_TABLES
  82.     case JDCT_ISLOW:
  83.       {
  84. /* For LL&M IDCT method, multipliers are equal to raw quantization
  85.  * coefficients, but are stored in natural order as ints.
  86.  */
  87. ISLOW_MULT_TYPE * ismtbl;
  88. compptr->dct_table =
  89.   (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  90.       DCTSIZE2 * SIZEOF(ISLOW_MULT_TYPE));
  91. ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
  92. for (i = 0; i < DCTSIZE2; i++) {
  93.   ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[ZIG[i]];
  94. }
  95.       }
  96.       break;
  97. #endif
  98. #ifdef DCT_IFAST_SUPPORTED
  99.     case JDCT_IFAST:
  100.       {
  101. /* For AA&N IDCT method, multipliers are equal to quantization
  102.  * coefficients scaled by scalefactor[row]*scalefactor[col], where
  103.  *   scalefactor[0] = 1
  104.  *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
  105.  * For integer operation, the multiplier table is to be scaled by
  106.  * IFAST_SCALE_BITS.  The multipliers are stored in natural order.
  107.  */
  108. IFAST_MULT_TYPE * ifmtbl;
  109. #define CONST_BITS 14
  110. static const INT16 aanscales[DCTSIZE2] = {
  111.   /* precomputed values scaled up by 14 bits */
  112.   16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
  113.   22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
  114.   21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
  115.   19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
  116.   16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
  117.   12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
  118.    8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
  119.    4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
  120. };
  121. SHIFT_TEMPS
  122. compptr->dct_table =
  123.   (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  124.       DCTSIZE2 * SIZEOF(IFAST_MULT_TYPE));
  125. ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
  126. for (i = 0; i < DCTSIZE2; i++) {
  127.   ifmtbl[i] = (IFAST_MULT_TYPE)
  128.     DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[ZIG[i]],
  129.   (INT32) aanscales[i]),
  130.     CONST_BITS-IFAST_SCALE_BITS);
  131. }
  132.       }
  133.       break;
  134. #endif
  135. #ifdef DCT_FLOAT_SUPPORTED
  136.     case JDCT_FLOAT:
  137.       {
  138. /* For float AA&N IDCT method, multipliers are equal to quantization
  139.  * coefficients scaled by scalefactor[row]*scalefactor[col], where
  140.  *   scalefactor[0] = 1
  141.  *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
  142.  * The multipliers are stored in natural order.
  143.  */
  144. FLOAT_MULT_TYPE * fmtbl;
  145. int row, col;
  146. static const double aanscalefactor[DCTSIZE] = {
  147.   1.0, 1.387039845, 1.306562965, 1.175875602,
  148.   1.0, 0.785694958, 0.541196100, 0.275899379
  149. };
  150. compptr->dct_table =
  151.   (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  152.       DCTSIZE2 * SIZEOF(FLOAT_MULT_TYPE));
  153. fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
  154. i = 0;
  155. for (row = 0; row < DCTSIZE; row++) {
  156.   for (col = 0; col < DCTSIZE; col++) {
  157.     fmtbl[i] = (FLOAT_MULT_TYPE)
  158.       ((double) qtbl->quantval[ZIG[i]] *
  159.        aanscalefactor[row] * aanscalefactor[col]);
  160.     i++;
  161.   }
  162. }
  163.       }
  164.       break;
  165. #endif
  166.     default:
  167.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  168.       break;
  169.     }
  170.   }
  171. }
  172. /*
  173.  * Prepare for an output pass that will actually perform IDCTs.
  174.  *
  175.  * start_input_pass should already have been done for all components
  176.  * of interest; we need only verify that this is true.
  177.  * Note that uninteresting components are not required to have loaded tables.
  178.  * This allows the master controller to stop before reading the whole file
  179.  * if it has obtained the data for the interesting component(s).
  180.  */
  181. METHODDEF void
  182. start_output_pass (j_decompress_ptr cinfo)
  183. {
  184.   jpeg_component_info *compptr;
  185.   int ci;
  186.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  187.        ci++, compptr++) {
  188.     if (! compptr->component_needed)
  189.       continue;
  190.     if (compptr->dct_table == NULL)
  191.       ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, compptr->quant_tbl_no);
  192.   }
  193. }
  194. /*
  195.  * Initialize IDCT manager.
  196.  */
  197. GLOBAL void
  198. jinit_inverse_dct (j_decompress_ptr cinfo)
  199. {
  200.   my_idct_ptr idct;
  201.   int ci;
  202.   jpeg_component_info *compptr;
  203.   idct = (my_idct_ptr)
  204.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  205. SIZEOF(my_idct_controller));
  206.   cinfo->idct = (struct jpeg_inverse_dct *) idct;
  207.   idct->pub.start_input_pass = start_input_pass;
  208.   idct->pub.start_output_pass = start_output_pass;
  209.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  210.        ci++, compptr++) {
  211.     compptr->dct_table = NULL; /* initialize tables to "not prepared" */
  212.     switch (compptr->DCT_scaled_size) {
  213. #ifdef IDCT_SCALING_SUPPORTED
  214.     case 1:
  215.       idct->pub.inverse_DCT[ci] = jpeg_idct_1x1;
  216.       idct->real_method[ci] = JDCT_ISLOW; /* jidctred uses islow-style table */
  217.       break;
  218.     case 2:
  219.       idct->pub.inverse_DCT[ci] = jpeg_idct_2x2;
  220.       idct->real_method[ci] = JDCT_ISLOW; /* jidctred uses islow-style table */
  221.       break;
  222.     case 4:
  223.       idct->pub.inverse_DCT[ci] = jpeg_idct_4x4;
  224.       idct->real_method[ci] = JDCT_ISLOW; /* jidctred uses islow-style table */
  225.       break;
  226. #endif
  227.     case DCTSIZE:
  228.       switch (cinfo->dct_method) {
  229. #ifdef DCT_ISLOW_SUPPORTED
  230.       case JDCT_ISLOW:
  231. idct->pub.inverse_DCT[ci] = jpeg_idct_islow;
  232. idct->real_method[ci] = JDCT_ISLOW;
  233. break;
  234. #endif
  235. #ifdef DCT_IFAST_SUPPORTED
  236.       case JDCT_IFAST:
  237. idct->pub.inverse_DCT[ci] = jpeg_idct_ifast;
  238. idct->real_method[ci] = JDCT_IFAST;
  239. break;
  240. #endif
  241. #ifdef DCT_FLOAT_SUPPORTED
  242.       case JDCT_FLOAT:
  243. idct->pub.inverse_DCT[ci] = jpeg_idct_float;
  244. idct->real_method[ci] = JDCT_FLOAT;
  245. break;
  246. #endif
  247.       default:
  248. ERREXIT(cinfo, JERR_NOT_COMPILED);
  249. break;
  250.       }
  251.       break;
  252.     default:
  253.       ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
  254.       break;
  255.     }
  256.   }
  257. }