JCDCTMGR.c
上传用户:qiutianh
上传日期:2022-08-08
资源大小:939k
文件大小:13k
源码类别:

图形图象

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////
  2. //
  3. // Note : this file is included as part of the Smaller Animals Software
  4. // JpegFile package. Though this file has not been modified from it's 
  5. // original IJG 6a form, it is not the responsibility on the Independent
  6. // JPEG Group to answer questions regarding this code.
  7. //
  8. // Any questions you have about this code should be addressed to :
  9. //
  10. // CHRISDL@PAGESZ.NET - the distributor of this package.
  11. //
  12. // Remember, by including this code in the JpegFile package, Smaller 
  13. // Animals Software assumes all responsibilities for answering questions
  14. // about it. If we (SA Software) can't answer your questions ourselves, we 
  15. // will direct you to people who can.
  16. //
  17. // Thanks, CDL.
  18. //
  19. ////////////////////////////////////////////////////////////////////////
  20. /*
  21.  * jcdctmgr.c
  22.  *
  23.  * Copyright (C) 1994-1996, Thomas G. Lane.
  24.  * This file is part of the Independent JPEG Group's software.
  25.  * For conditions of distribution and use, see the accompanying README file.
  26.  *
  27.  * This file contains the forward-DCT management logic.
  28.  * This code selects a particular DCT implementation to be used,
  29.  * and it performs related housekeeping chores including coefficient
  30.  * quantization.
  31.  */
  32. #define JPEG_INTERNALS
  33. #include "jinclude.h"
  34. #include "jpeglib.h"
  35. #include "jdct.h" /* Private declarations for DCT subsystem */
  36. /* Private subobject for this module */
  37. typedef struct {
  38.   struct jpeg_forward_dct pub; /* public fields */
  39.   /* Pointer to the DCT routine actually in use */
  40.   forward_DCT_method_ptr do_dct;
  41.   /* The actual post-DCT divisors --- not identical to the quant table
  42.    * entries, because of scaling (especially for an unnormalized DCT).
  43.    * Each table is given in normal array order.
  44.    */
  45.   DCTELEM * divisors[NUM_QUANT_TBLS];
  46. #ifdef DCT_FLOAT_SUPPORTED
  47.   /* Same as above for the floating-point case. */
  48.   float_DCT_method_ptr do_float_dct;
  49.   FAST_FLOAT * float_divisors[NUM_QUANT_TBLS];
  50. #endif
  51. } my_fdct_controller;
  52. typedef my_fdct_controller * my_fdct_ptr;
  53. /*
  54.  * Initialize for a processing pass.
  55.  * Verify that all referenced Q-tables are present, and set up
  56.  * the divisor table for each one.
  57.  * In the current implementation, DCT of all components is done during
  58.  * the first pass, even if only some components will be output in the
  59.  * first scan.  Hence all components should be examined here.
  60.  */
  61. METHODDEF(void)
  62. start_pass_fdctmgr (j_compress_ptr cinfo)
  63. {
  64.   my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
  65.   int ci, qtblno, i;
  66.   jpeg_component_info *compptr;
  67.   JQUANT_TBL * qtbl;
  68.   DCTELEM * dtbl;
  69.   for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
  70.        ci++, compptr++) {
  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.     /* Compute divisors for this quant table */
  78.     /* We may do this more than once for same table, but it's not a big deal */
  79.     switch (cinfo->dct_method) {
  80. #ifdef DCT_ISLOW_SUPPORTED
  81.     case JDCT_ISLOW:
  82.       /* For LL&M IDCT method, divisors are equal to raw quantization
  83.        * coefficients multiplied by 8 (to counteract scaling).
  84.        */
  85.       if (fdct->divisors[qtblno] == NULL) {
  86. fdct->divisors[qtblno] = (DCTELEM *)
  87.   (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  88.       DCTSIZE2 * SIZEOF(DCTELEM));
  89.       }
  90.       dtbl = fdct->divisors[qtblno];
  91.       for (i = 0; i < DCTSIZE2; i++) {
  92. dtbl[i] = ((DCTELEM) qtbl->quantval[i]) << 3;
  93.       }
  94.       break;
  95. #endif
  96. #ifdef DCT_IFAST_SUPPORTED
  97.     case JDCT_IFAST:
  98.       {
  99. /* For AA&N IDCT method, divisors are equal to quantization
  100.  * coefficients scaled by scalefactor[row]*scalefactor[col], where
  101.  *   scalefactor[0] = 1
  102.  *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
  103.  * We apply a further scale factor of 8.
  104.  */
  105. #define CONST_BITS 14
  106. static const short aanscales[DCTSIZE2] = {
  107.   /* precomputed values scaled up by 14 bits */
  108.   16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
  109.   22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
  110.   21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
  111.   19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
  112.   16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
  113.   12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
  114.    8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
  115.    4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
  116. };
  117. SHIFT_TEMPS
  118. if (fdct->divisors[qtblno] == NULL) {
  119.   fdct->divisors[qtblno] = (DCTELEM *)
  120.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  121. DCTSIZE2 * SIZEOF(DCTELEM));
  122. }
  123. dtbl = fdct->divisors[qtblno];
  124. for (i = 0; i < DCTSIZE2; i++) {
  125.   dtbl[i] = (DCTELEM)
  126.     DESCALE(MULTIPLY16V16((long) qtbl->quantval[i],
  127.   (long) aanscales[i]),
  128.     CONST_BITS-3);
  129. }
  130.       }
  131.       break;
  132. #endif
  133. #ifdef DCT_FLOAT_SUPPORTED
  134.     case JDCT_FLOAT:
  135.       {
  136. /* For float AA&N IDCT method, divisors are equal to quantization
  137.  * coefficients scaled by scalefactor[row]*scalefactor[col], where
  138.  *   scalefactor[0] = 1
  139.  *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
  140.  * We apply a further scale factor of 8.
  141.  * What's actually stored is 1/divisor so that the inner loop can
  142.  * use a multiplication rather than a division.
  143.  */
  144. FAST_FLOAT * fdtbl;
  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. if (fdct->float_divisors[qtblno] == NULL) {
  151.   fdct->float_divisors[qtblno] = (FAST_FLOAT *)
  152.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  153. DCTSIZE2 * SIZEOF(FAST_FLOAT));
  154. }
  155. fdtbl = fdct->float_divisors[qtblno];
  156. i = 0;
  157. for (row = 0; row < DCTSIZE; row++) {
  158.   for (col = 0; col < DCTSIZE; col++) {
  159.     fdtbl[i] = (FAST_FLOAT)
  160.       (1.0 / (((double) qtbl->quantval[i] *
  161.        aanscalefactor[row] * aanscalefactor[col] * 8.0)));
  162.     i++;
  163.   }
  164. }
  165.       }
  166.       break;
  167. #endif
  168.     default:
  169.       ERREXIT(cinfo, JERR_NOT_COMPILED);
  170.       break;
  171.     }
  172.   }
  173. }
  174. /*
  175.  * Perform forward DCT on one or more blocks of a component.
  176.  *
  177.  * The input samples are taken from the sample_data[] array starting at
  178.  * position start_row/start_col, and moving to the right for any additional
  179.  * blocks. The quantized coefficients are returned in coef_blocks[].
  180.  */
  181. METHODDEF(void)
  182. forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
  183.      JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
  184.      JDIMENSION start_row, JDIMENSION start_col,
  185.      JDIMENSION num_blocks)
  186. /* This version is used for integer DCT implementations. */
  187. {
  188.   /* This routine is heavily used, so it's worth coding it tightly. */
  189.   my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
  190.   forward_DCT_method_ptr do_dct = fdct->do_dct;
  191.   DCTELEM * divisors = fdct->divisors[compptr->quant_tbl_no];
  192.   DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
  193.   JDIMENSION bi;
  194.   sample_data += start_row; /* fold in the vertical offset once */
  195.   for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
  196.     /* Load data into workspace, applying unsigned->signed conversion */
  197.     { register DCTELEM *workspaceptr;
  198.       register JSAMPROW elemptr;
  199.       register int elemr;
  200.       workspaceptr = workspace;
  201.       for (elemr = 0; elemr < DCTSIZE; elemr++) {
  202. elemptr = sample_data[elemr] + start_col;
  203. #if DCTSIZE == 8 /* unroll the inner loop */
  204. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  205. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  206. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  207. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  208. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  209. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  210. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  211. *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  212. #else
  213. { register int elemc;
  214.   for (elemc = DCTSIZE; elemc > 0; elemc--) {
  215.     *workspaceptr++ = GETJSAMPLE(*elemptr++) - CENTERJSAMPLE;
  216.   }
  217. }
  218. #endif
  219.       }
  220.     }
  221.     /* Perform the DCT */
  222.     (*do_dct) (workspace);
  223.     /* Quantize/descale the coefficients, and store into coef_blocks[] */
  224.     { register DCTELEM temp, qval;
  225.       register int i;
  226.       register JCOEFPTR output_ptr = coef_blocks[bi];
  227.       for (i = 0; i < DCTSIZE2; i++) {
  228. qval = divisors[i];
  229. temp = workspace[i];
  230. /* Divide the coefficient value by qval, ensuring proper rounding.
  231.  * Since C does not specify the direction of rounding for negative
  232.  * quotients, we have to force the dividend positive for portability.
  233.  *
  234.  * In most files, at least half of the output values will be zero
  235.  * (at default quantization settings, more like three-quarters...)
  236.  * so we should ensure that this case is fast.  On many machines,
  237.  * a comparison is enough cheaper than a divide to make a special test
  238.  * a win.  Since both inputs will be nonnegative, we need only test
  239.  * for a < b to discover whether a/b is 0.
  240.  * If your machine's division is fast enough, define FAST_DIVIDE.
  241.  */
  242. #ifdef FAST_DIVIDE
  243. #define DIVIDE_BY(a,b) a /= b
  244. #else
  245. #define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0
  246. #endif
  247. if (temp < 0) {
  248.   temp = -temp;
  249.   temp += qval>>1; /* for rounding */
  250.   DIVIDE_BY(temp, qval);
  251.   temp = -temp;
  252. } else {
  253.   temp += qval>>1; /* for rounding */
  254.   DIVIDE_BY(temp, qval);
  255. }
  256. output_ptr[i] = (JCOEF) temp;
  257.       }
  258.     }
  259.   }
  260. }
  261. #ifdef DCT_FLOAT_SUPPORTED
  262. METHODDEF(void)
  263. forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
  264.    JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
  265.    JDIMENSION start_row, JDIMENSION start_col,
  266.    JDIMENSION num_blocks)
  267. /* This version is used for floating-point DCT implementations. */
  268. {
  269.   /* This routine is heavily used, so it's worth coding it tightly. */
  270.   my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
  271.   float_DCT_method_ptr do_dct = fdct->do_float_dct;
  272.   FAST_FLOAT * divisors = fdct->float_divisors[compptr->quant_tbl_no];
  273.   FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
  274.   JDIMENSION bi;
  275.   sample_data += start_row; /* fold in the vertical offset once */
  276.   for (bi = 0; bi < num_blocks; bi++, start_col += DCTSIZE) {
  277.     /* Load data into workspace, applying unsigned->signed conversion */
  278.     { register FAST_FLOAT *workspaceptr;
  279.       register JSAMPROW elemptr;
  280.       register int elemr;
  281.       workspaceptr = workspace;
  282.       for (elemr = 0; elemr < DCTSIZE; elemr++) {
  283. elemptr = sample_data[elemr] + start_col;
  284. #if DCTSIZE == 8 /* unroll the inner loop */
  285. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  286. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  287. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  288. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  289. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  290. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  291. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  292. *workspaceptr++ = (FAST_FLOAT)(GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  293. #else
  294. { register int elemc;
  295.   for (elemc = DCTSIZE; elemc > 0; elemc--) {
  296.     *workspaceptr++ = (FAST_FLOAT)
  297.       (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  298.   }
  299. }
  300. #endif
  301.       }
  302.     }
  303.     /* Perform the DCT */
  304.     (*do_dct) (workspace);
  305.     /* Quantize/descale the coefficients, and store into coef_blocks[] */
  306.     { register FAST_FLOAT temp;
  307.       register int i;
  308.       register JCOEFPTR output_ptr = coef_blocks[bi];
  309.       for (i = 0; i < DCTSIZE2; i++) {
  310. /* Apply the quantization and scaling factor */
  311. temp = workspace[i] * divisors[i];
  312. /* Round to nearest integer.
  313.  * Since C does not specify the direction of rounding for negative
  314.  * quotients, we have to force the dividend positive for portability.
  315.  * The maximum coefficient size is +-16K (for 12-bit data), so this
  316.  * code should work for either 16-bit or 32-bit ints.
  317.  */
  318. output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
  319.       }
  320.     }
  321.   }
  322. }
  323. #endif /* DCT_FLOAT_SUPPORTED */
  324. /*
  325.  * Initialize FDCT manager.
  326.  */
  327. GLOBAL(void)
  328. jinit_forward_dct (j_compress_ptr cinfo)
  329. {
  330.   my_fdct_ptr fdct;
  331.   int i;
  332.   fdct = (my_fdct_ptr)
  333.     (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
  334. SIZEOF(my_fdct_controller));
  335.   cinfo->fdct = (struct jpeg_forward_dct *) fdct;
  336.   fdct->pub.start_pass = start_pass_fdctmgr;
  337.   switch (cinfo->dct_method) {
  338. #ifdef DCT_ISLOW_SUPPORTED
  339.   case JDCT_ISLOW:
  340.     fdct->pub.forward_DCT = forward_DCT;
  341.     fdct->do_dct = jpeg_fdct_islow;
  342.     break;
  343. #endif
  344. #ifdef DCT_IFAST_SUPPORTED
  345.   case JDCT_IFAST:
  346.     fdct->pub.forward_DCT = forward_DCT;
  347.     fdct->do_dct = jpeg_fdct_ifast;
  348.     break;
  349. #endif
  350. #ifdef DCT_FLOAT_SUPPORTED
  351.   case JDCT_FLOAT:
  352.     fdct->pub.forward_DCT = forward_DCT_float;
  353.     fdct->do_float_dct = jpeg_fdct_float;
  354.     break;
  355. #endif
  356.   default:
  357.     ERREXIT(cinfo, JERR_NOT_COMPILED);
  358.     break;
  359.   }
  360.   /* Mark divisor tables unallocated */
  361.   for (i = 0; i < NUM_QUANT_TBLS; i++) {
  362.     fdct->divisors[i] = NULL;
  363. #ifdef DCT_FLOAT_SUPPORTED
  364.     fdct->float_divisors[i] = NULL;
  365. #endif
  366.   }
  367. }