Path: blob/master/3rdparty/libjpeg-turbo/src/jddctmgr.c
16337 views
/*1* jddctmgr.c2*3* This file was part of the Independent JPEG Group's software:4* Copyright (C) 1994-1996, Thomas G. Lane.5* Modified 2002-2010 by Guido Vollbeding.6* libjpeg-turbo Modifications:7* Copyright 2009 Pierre Ossman <[email protected]> for Cendio AB8* Copyright (C) 2010, 2015, D. R. Commander.9* Copyright (C) 2013, MIPS Technologies, Inc., California.10* For conditions of distribution and use, see the accompanying README.ijg11* file.12*13* This file contains the inverse-DCT management logic.14* This code selects a particular IDCT implementation to be used,15* and it performs related housekeeping chores. No code in this file16* is executed per IDCT step, only during output pass setup.17*18* Note that the IDCT routines are responsible for performing coefficient19* dequantization as well as the IDCT proper. This module sets up the20* dequantization multiplier table needed by the IDCT routine.21*/2223#define JPEG_INTERNALS24#include "jinclude.h"25#include "jpeglib.h"26#include "jdct.h" /* Private declarations for DCT subsystem */27#include "jsimddct.h"28#include "jpegcomp.h"293031/*32* The decompressor input side (jdinput.c) saves away the appropriate33* quantization table for each component at the start of the first scan34* involving that component. (This is necessary in order to correctly35* decode files that reuse Q-table slots.)36* When we are ready to make an output pass, the saved Q-table is converted37* to a multiplier table that will actually be used by the IDCT routine.38* The multiplier table contents are IDCT-method-dependent. To support39* application changes in IDCT method between scans, we can remake the40* multiplier tables if necessary.41* In buffered-image mode, the first output pass may occur before any data42* has been seen for some components, and thus before their Q-tables have43* been saved away. To handle this case, multiplier tables are preset44* to zeroes; the result of the IDCT will be a neutral gray level.45*/464748/* Private subobject for this module */4950typedef struct {51struct jpeg_inverse_dct pub; /* public fields */5253/* This array contains the IDCT method code that each multiplier table54* is currently set up for, or -1 if it's not yet set up.55* The actual multiplier tables are pointed to by dct_table in the56* per-component comp_info structures.57*/58int cur_method[MAX_COMPONENTS];59} my_idct_controller;6061typedef my_idct_controller *my_idct_ptr;626364/* Allocated multiplier tables: big enough for any supported variant */6566typedef union {67ISLOW_MULT_TYPE islow_array[DCTSIZE2];68#ifdef DCT_IFAST_SUPPORTED69IFAST_MULT_TYPE ifast_array[DCTSIZE2];70#endif71#ifdef DCT_FLOAT_SUPPORTED72FLOAT_MULT_TYPE float_array[DCTSIZE2];73#endif74} multiplier_table;757677/* The current scaled-IDCT routines require ISLOW-style multiplier tables,78* so be sure to compile that code if either ISLOW or SCALING is requested.79*/80#ifdef DCT_ISLOW_SUPPORTED81#define PROVIDE_ISLOW_TABLES82#else83#ifdef IDCT_SCALING_SUPPORTED84#define PROVIDE_ISLOW_TABLES85#endif86#endif878889/*90* Prepare for an output pass.91* Here we select the proper IDCT routine for each component and build92* a matching multiplier table.93*/9495METHODDEF(void)96start_pass (j_decompress_ptr cinfo)97{98my_idct_ptr idct = (my_idct_ptr) cinfo->idct;99int ci, i;100jpeg_component_info *compptr;101int method = 0;102inverse_DCT_method_ptr method_ptr = NULL;103JQUANT_TBL *qtbl;104105for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;106ci++, compptr++) {107/* Select the proper IDCT routine for this component's scaling */108switch (compptr->_DCT_scaled_size) {109#ifdef IDCT_SCALING_SUPPORTED110case 1:111method_ptr = jpeg_idct_1x1;112method = JDCT_ISLOW; /* jidctred uses islow-style table */113break;114case 2:115if (jsimd_can_idct_2x2())116method_ptr = jsimd_idct_2x2;117else118method_ptr = jpeg_idct_2x2;119method = JDCT_ISLOW; /* jidctred uses islow-style table */120break;121case 3:122method_ptr = jpeg_idct_3x3;123method = JDCT_ISLOW; /* jidctint uses islow-style table */124break;125case 4:126if (jsimd_can_idct_4x4())127method_ptr = jsimd_idct_4x4;128else129method_ptr = jpeg_idct_4x4;130method = JDCT_ISLOW; /* jidctred uses islow-style table */131break;132case 5:133method_ptr = jpeg_idct_5x5;134method = JDCT_ISLOW; /* jidctint uses islow-style table */135break;136case 6:137#if defined(__mips__)138if (jsimd_can_idct_6x6())139method_ptr = jsimd_idct_6x6;140else141#endif142method_ptr = jpeg_idct_6x6;143method = JDCT_ISLOW; /* jidctint uses islow-style table */144break;145case 7:146method_ptr = jpeg_idct_7x7;147method = JDCT_ISLOW; /* jidctint uses islow-style table */148break;149#endif150case DCTSIZE:151switch (cinfo->dct_method) {152#ifdef DCT_ISLOW_SUPPORTED153case JDCT_ISLOW:154if (jsimd_can_idct_islow())155method_ptr = jsimd_idct_islow;156else157method_ptr = jpeg_idct_islow;158method = JDCT_ISLOW;159break;160#endif161#ifdef DCT_IFAST_SUPPORTED162case JDCT_IFAST:163if (jsimd_can_idct_ifast())164method_ptr = jsimd_idct_ifast;165else166method_ptr = jpeg_idct_ifast;167method = JDCT_IFAST;168break;169#endif170#ifdef DCT_FLOAT_SUPPORTED171case JDCT_FLOAT:172if (jsimd_can_idct_float())173method_ptr = jsimd_idct_float;174else175method_ptr = jpeg_idct_float;176method = JDCT_FLOAT;177break;178#endif179default:180ERREXIT(cinfo, JERR_NOT_COMPILED);181break;182}183break;184#ifdef IDCT_SCALING_SUPPORTED185case 9:186method_ptr = jpeg_idct_9x9;187method = JDCT_ISLOW; /* jidctint uses islow-style table */188break;189case 10:190method_ptr = jpeg_idct_10x10;191method = JDCT_ISLOW; /* jidctint uses islow-style table */192break;193case 11:194method_ptr = jpeg_idct_11x11;195method = JDCT_ISLOW; /* jidctint uses islow-style table */196break;197case 12:198#if defined(__mips__)199if (jsimd_can_idct_12x12())200method_ptr = jsimd_idct_12x12;201else202#endif203method_ptr = jpeg_idct_12x12;204method = JDCT_ISLOW; /* jidctint uses islow-style table */205break;206case 13:207method_ptr = jpeg_idct_13x13;208method = JDCT_ISLOW; /* jidctint uses islow-style table */209break;210case 14:211method_ptr = jpeg_idct_14x14;212method = JDCT_ISLOW; /* jidctint uses islow-style table */213break;214case 15:215method_ptr = jpeg_idct_15x15;216method = JDCT_ISLOW; /* jidctint uses islow-style table */217break;218case 16:219method_ptr = jpeg_idct_16x16;220method = JDCT_ISLOW; /* jidctint uses islow-style table */221break;222#endif223default:224ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->_DCT_scaled_size);225break;226}227idct->pub.inverse_DCT[ci] = method_ptr;228/* Create multiplier table from quant table.229* However, we can skip this if the component is uninteresting230* or if we already built the table. Also, if no quant table231* has yet been saved for the component, we leave the232* multiplier table all-zero; we'll be reading zeroes from the233* coefficient controller's buffer anyway.234*/235if (! compptr->component_needed || idct->cur_method[ci] == method)236continue;237qtbl = compptr->quant_table;238if (qtbl == NULL) /* happens if no data yet for component */239continue;240idct->cur_method[ci] = method;241switch (method) {242#ifdef PROVIDE_ISLOW_TABLES243case JDCT_ISLOW:244{245/* For LL&M IDCT method, multipliers are equal to raw quantization246* coefficients, but are stored as ints to ensure access efficiency.247*/248ISLOW_MULT_TYPE *ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;249for (i = 0; i < DCTSIZE2; i++) {250ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];251}252}253break;254#endif255#ifdef DCT_IFAST_SUPPORTED256case JDCT_IFAST:257{258/* For AA&N IDCT method, multipliers are equal to quantization259* coefficients scaled by scalefactor[row]*scalefactor[col], where260* scalefactor[0] = 1261* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7262* For integer operation, the multiplier table is to be scaled by263* IFAST_SCALE_BITS.264*/265IFAST_MULT_TYPE *ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;266#define CONST_BITS 14267static const INT16 aanscales[DCTSIZE2] = {268/* precomputed values scaled up by 14 bits */26916384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,27022725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,27121407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,27219266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,27316384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,27412873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,2758867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,2764520, 6270, 5906, 5315, 4520, 3552, 2446, 1247277};278SHIFT_TEMPS279280for (i = 0; i < DCTSIZE2; i++) {281ifmtbl[i] = (IFAST_MULT_TYPE)282DESCALE(MULTIPLY16V16((JLONG) qtbl->quantval[i],283(JLONG) aanscales[i]),284CONST_BITS-IFAST_SCALE_BITS);285}286}287break;288#endif289#ifdef DCT_FLOAT_SUPPORTED290case JDCT_FLOAT:291{292/* For float AA&N IDCT method, multipliers are equal to quantization293* coefficients scaled by scalefactor[row]*scalefactor[col], where294* scalefactor[0] = 1295* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7296*/297FLOAT_MULT_TYPE *fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;298int row, col;299static const double aanscalefactor[DCTSIZE] = {3001.0, 1.387039845, 1.306562965, 1.175875602,3011.0, 0.785694958, 0.541196100, 0.275899379302};303304i = 0;305for (row = 0; row < DCTSIZE; row++) {306for (col = 0; col < DCTSIZE; col++) {307fmtbl[i] = (FLOAT_MULT_TYPE)308((double) qtbl->quantval[i] *309aanscalefactor[row] * aanscalefactor[col]);310i++;311}312}313}314break;315#endif316default:317ERREXIT(cinfo, JERR_NOT_COMPILED);318break;319}320}321}322323324/*325* Initialize IDCT manager.326*/327328GLOBAL(void)329jinit_inverse_dct (j_decompress_ptr cinfo)330{331my_idct_ptr idct;332int ci;333jpeg_component_info *compptr;334335idct = (my_idct_ptr)336(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,337sizeof(my_idct_controller));338cinfo->idct = (struct jpeg_inverse_dct *) idct;339idct->pub.start_pass = start_pass;340341for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;342ci++, compptr++) {343/* Allocate and pre-zero a multiplier table for each component */344compptr->dct_table =345(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,346sizeof(multiplier_table));347MEMZERO(compptr->dct_table, sizeof(multiplier_table));348/* Mark multiplier table not yet set up for any method */349idct->cur_method[ci] = -1;350}351}352353354