LCOV - code coverage report
Current view: top level - media/libjpeg - jddctmgr.c (source / functions) Hit Total Coverage
Test: output.info Lines: 0 118 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 2 0.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.13