170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * jddctmgr.c
370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Copyright (C) 1994-1996, Thomas G. Lane.
570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file is part of the Independent JPEG Group's software.
670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * For conditions of distribution and use, see the accompanying README file.
770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This file contains the inverse-DCT management logic.
970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * This code selects a particular IDCT implementation to be used,
1070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * and it performs related housekeeping chores.  No code in this file
1170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is executed per IDCT step, only during output pass setup.
1270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine *
1370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Note that the IDCT routines are responsible for performing coefficient
1470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * dequantization as well as the IDCT proper.  This module sets up the
1570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * dequantization multiplier table needed by the IDCT routine.
1670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
1770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
1870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define JPEG_INTERNALS
1970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jinclude.h"
2070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jpeglib.h"
2170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#include "jdct.h"		/* Private declarations for DCT subsystem */
2270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
2370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT
2470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  #undef ANDROID_ARMV6_IDCT
2570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  #ifdef __arm__
2670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    #include <machine/cpu-features.h>
2770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    #if __ARM_ARCH__ >= 6
2870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      #define ANDROID_ARMV6_IDCT
2970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    #else
3070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      #warning "ANDROID_ARMV6_IDCT is disabled"
3170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    #endif
3270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  #endif
3370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
3470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT
3670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
3770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Intentionally declare the prototype with arguments of primitive types instead
3870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * of type-defined ones. This will at least generate some warnings if jmorecfg.h
3970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * is changed and becomes incompatible with the assembly code.
4070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
4170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkineextern void armv6_idct(short *coefs, int *quans, unsigned char **rows, int col);
4270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
4370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinevoid jpeg_idct_armv6 (j_decompress_ptr cinfo, jpeg_component_info * compptr,
4470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JCOEFPTR coef_block,
4570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		 JSAMPARRAY output_buf, JDIMENSION output_col)
4670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
4770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  IFAST_MULT_TYPE *dct_table = (IFAST_MULT_TYPE *)compptr->dct_table;
4870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  armv6_idct(coef_block, dct_table, output_buf, output_col);
4970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
5070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
5270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
5370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
5470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The decompressor input side (jdinput.c) saves away the appropriate
5570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * quantization table for each component at the start of the first scan
5670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * involving that component.  (This is necessary in order to correctly
5770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * decode files that reuse Q-table slots.)
5870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * When we are ready to make an output pass, the saved Q-table is converted
5970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to a multiplier table that will actually be used by the IDCT routine.
6070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * The multiplier table contents are IDCT-method-dependent.  To support
6170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * application changes in IDCT method between scans, we can remake the
6270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * multiplier tables if necessary.
6370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * In buffered-image mode, the first output pass may occur before any data
6470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * has been seen for some components, and thus before their Q-tables have
6570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * been saved away.  To handle this case, multiplier tables are preset
6670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * to zeroes; the result of the IDCT will be a neutral gray level.
6770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
6870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
6970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Private subobject for this module */
7170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef struct {
7370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  struct jpeg_inverse_dct pub;	/* public fields */
7470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
7570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  /* This array contains the IDCT method code that each multiplier table
7670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * is currently set up for, or -1 if it's not yet set up.
7770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * The actual multiplier tables are pointed to by dct_table in the
7870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   * per-component comp_info structures.
7970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine   */
8070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int cur_method[MAX_COMPONENTS];
8170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} my_idct_controller;
8270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef my_idct_controller * my_idct_ptr;
8470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* Allocated multiplier tables: big enough for any supported variant */
8770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
8870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinetypedef union {
8970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  ISLOW_MULT_TYPE islow_array[DCTSIZE2];
9070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED
9170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  IFAST_MULT_TYPE ifast_array[DCTSIZE2];
9270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
9370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED
9470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  FLOAT_MULT_TYPE float_array[DCTSIZE2];
9570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
9670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine} multiplier_table;
9770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
9970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/* The current scaled-IDCT routines require ISLOW-style multiplier tables,
10070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * so be sure to compile that code if either ISLOW or SCALING is requested.
10170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
10270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_ISLOW_SUPPORTED
10370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define PROVIDE_ISLOW_TABLES
10470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else
10570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef IDCT_SCALING_SUPPORTED
10670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define PROVIDE_ISLOW_TABLES
10770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
10870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
10970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
11270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Prepare for an output pass.
11370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Here we select the proper IDCT routine for each component and build
11470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * a matching multiplier table.
11570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
11670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
11770a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineMETHODDEF(void)
11870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinestart_pass (j_decompress_ptr cinfo)
11970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
12070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_idct_ptr idct = (my_idct_ptr) cinfo->idct;
12170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci, i;
12270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jpeg_component_info *compptr;
12370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int method = 0;
12470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  inverse_DCT_method_ptr method_ptr = NULL;
12570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  JQUANT_TBL * qtbl;
12670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
12770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
12870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       ci++, compptr++) {
12970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Select the proper IDCT routine for this component's scaling */
13070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    switch (compptr->DCT_scaled_size) {
13170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef IDCT_SCALING_SUPPORTED
13270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case 1:
13370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method_ptr = jpeg_idct_1x1;
13470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method = JDCT_ISLOW;	/* jidctred uses islow-style table */
13570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
13670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case 2:
13770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method_ptr = jpeg_idct_2x2;
13870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method = JDCT_ISLOW;	/* jidctred uses islow-style table */
13970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
14070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case 4:
14170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method_ptr = jpeg_idct_4x4;
14270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      method = JDCT_ISLOW;	/* jidctred uses islow-style table */
14370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
14470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
14570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case DCTSIZE:
14670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      switch (cinfo->dct_method) {
14770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT
14870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      case JDCT_ISLOW:
14970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      case JDCT_IFAST:
15070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method_ptr = jpeg_idct_armv6;
15170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method = JDCT_IFAST;
15270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	break;
15370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* ANDROID_ARMV6_IDCT */
15470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_ISLOW_SUPPORTED
15570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      case JDCT_ISLOW:
15670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method_ptr = jpeg_idct_islow;
15770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method = JDCT_ISLOW;
15870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	break;
15970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
16070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED
16170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      case JDCT_IFAST:
16270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method_ptr = jpeg_idct_ifast;
16370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method = JDCT_IFAST;
16470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	break;
16570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
16670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* ANDROID_ARMV6_IDCT */
16770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED
16870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      case JDCT_FLOAT:
16970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method_ptr = jpeg_idct_float;
17070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	method = JDCT_FLOAT;
17170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	break;
17270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
17370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      default:
17470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	ERREXIT(cinfo, JERR_NOT_COMPILED);
17570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	break;
17670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
17770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
17870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    default:
17970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT1(cinfo, JERR_BAD_DCTSIZE, compptr->DCT_scaled_size);
18070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
18170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
18270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    idct->pub.inverse_DCT[ci] = method_ptr;
18370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Create multiplier table from quant table.
18470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * However, we can skip this if the component is uninteresting
18570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * or if we already built the table.  Also, if no quant table
18670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * has yet been saved for the component, we leave the
18770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * multiplier table all-zero; we'll be reading zeroes from the
18870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     * coefficient controller's buffer anyway.
18970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine     */
19070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (! compptr->component_needed || idct->cur_method[ci] == method)
19170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
19270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    qtbl = compptr->quant_table;
19370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    if (qtbl == NULL)		/* happens if no data yet for component */
19470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      continue;
19570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    idct->cur_method[ci] = method;
19670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    switch (method) {
19770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef PROVIDE_ISLOW_TABLES
19870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case JDCT_ISLOW:
19970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      {
20070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* For LL&M IDCT method, multipliers are equal to raw quantization
20170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 * coefficients, but are stored as ints to ensure access efficiency.
20270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 */
20370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	ISLOW_MULT_TYPE * ismtbl = (ISLOW_MULT_TYPE *) compptr->dct_table;
20470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	for (i = 0; i < DCTSIZE2; i++) {
20570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  ismtbl[i] = (ISLOW_MULT_TYPE) qtbl->quantval[i];
20670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	}
20770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
20870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
20970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
21070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_IFAST_SUPPORTED
21170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case JDCT_IFAST:
21270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      {
21370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* For AA&N IDCT method, multipliers are equal to quantization
21470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 * coefficients scaled by scalefactor[row]*scalefactor[col], where
21570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 *   scalefactor[0] = 1
21670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
21770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 * For integer operation, the multiplier table is to be scaled by
21870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 * IFAST_SCALE_BITS.
21970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 */
22070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	IFAST_MULT_TYPE * ifmtbl = (IFAST_MULT_TYPE *) compptr->dct_table;
22170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef ANDROID_ARMV6_IDCT
22270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* Precomputed values scaled up by 15 bits. */
22370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	static const unsigned short scales[DCTSIZE2] = {
22470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  32768, 45451, 42813, 38531, 32768, 25746, 17734,  9041,
22570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  45451, 63042, 59384, 53444, 45451, 35710, 24598, 12540,
22670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  42813, 59384, 55938, 50343, 42813, 33638, 23170, 11812,
22770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  38531, 53444, 50343, 45308, 38531, 30274, 20853, 10631,
22870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  32768, 45451, 42813, 38531, 32768, 25746, 17734,  9041,
22970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  25746, 35710, 33638, 30274, 25746, 20228, 13933,  7103,
23070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  17734, 24598, 23170, 20853, 17734, 13933,  9598,  4893,
23170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	   9041, 12540, 11812, 10631,  9041,  7103,  4893,  2494,
23270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	};
23370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* Inverse map of [7, 5, 1, 3, 0, 2, 4, 6]. */
23470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	static const char orders[DCTSIZE] = {4, 2, 5, 3, 6, 1, 7, 0};
23570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* Reorder the columns after transposing. */
23670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	for (i = 0; i < DCTSIZE2; ++i) {
23770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  int j = ((i & 7) << 3) + orders[i >> 3];
23870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  ifmtbl[j] = (qtbl->quantval[i] * scales[i] + 2) >> 2;
23970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	}
24070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#else /* ANDROID_ARMV6_IDCT */
24170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
24270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#define CONST_BITS 14
24370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	static const INT16 aanscales[DCTSIZE2] = {
24470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  /* precomputed values scaled up by 14 bits */
24570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
24670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  22725, 31521, 29692, 26722, 22725, 17855, 12299,  6270,
24770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  21407, 29692, 27969, 25172, 21407, 16819, 11585,  5906,
24870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  19266, 26722, 25172, 22654, 19266, 15137, 10426,  5315,
24970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  16384, 22725, 21407, 19266, 16384, 12873,  8867,  4520,
25070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  12873, 17855, 16819, 15137, 12873, 10114,  6967,  3552,
25170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	   8867, 12299, 11585, 10426,  8867,  6967,  4799,  2446,
25270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	   4520,  6270,  5906,  5315,  4520,  3552,  2446,  1247
25370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	};
25470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	SHIFT_TEMPS
25570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
25670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	for (i = 0; i < DCTSIZE2; i++) {
25770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  ifmtbl[i] = (IFAST_MULT_TYPE)
25870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	    DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
25970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				  (INT32) aanscales[i]),
26070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine		    CONST_BITS-IFAST_SCALE_BITS);
26170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	}
26270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif /* ANDROID_ARMV6_IDCT */
26370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
26470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
26570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
26670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#ifdef DCT_FLOAT_SUPPORTED
26770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    case JDCT_FLOAT:
26870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      {
26970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	/* For float AA&N IDCT method, multipliers are equal to quantization
27070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 * coefficients scaled by scalefactor[row]*scalefactor[col], where
27170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 *   scalefactor[0] = 1
27270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 *   scalefactor[k] = cos(k*PI/16) * sqrt(2)    for k=1..7
27370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	 */
27470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
27570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	int row, col;
27670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	static const double aanscalefactor[DCTSIZE] = {
27770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  1.0, 1.387039845, 1.306562965, 1.175875602,
27870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  1.0, 0.785694958, 0.541196100, 0.275899379
27970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	};
28070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
28170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	i = 0;
28270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	for (row = 0; row < DCTSIZE; row++) {
28370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  for (col = 0; col < DCTSIZE; col++) {
28470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	    fmtbl[i] = (FLOAT_MULT_TYPE)
28570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	      ((double) qtbl->quantval[i] *
28670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	       aanscalefactor[row] * aanscalefactor[col]);
28770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	    i++;
28870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	  }
28970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine	}
29070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      }
29170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
29270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine#endif
29370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    default:
29470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      ERREXIT(cinfo, JERR_NOT_COMPILED);
29570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      break;
29670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    }
29770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
29870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
29970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
30070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
30170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine/*
30270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine * Initialize IDCT manager.
30370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine */
30470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
30570a18cd874a22452aca9e39e22275ed4538ed20bVladimir ChtchetkineGLOBAL(void)
30670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkinejinit_inverse_dct (j_decompress_ptr cinfo)
30770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine{
30870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  my_idct_ptr idct;
30970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  int ci;
31070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  jpeg_component_info *compptr;
31170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  idct = (my_idct_ptr)
31370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
31470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				SIZEOF(my_idct_controller));
31570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  cinfo->idct = (struct jpeg_inverse_dct *) idct;
31670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  idct->pub.start_pass = start_pass;
31770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine
31870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
31970a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine       ci++, compptr++) {
32070a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Allocate and pre-zero a multiplier table for each component */
32170a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    compptr->dct_table =
32270a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
32370a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine				  SIZEOF(multiplier_table));
32470a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    MEMZERO(compptr->dct_table, SIZEOF(multiplier_table));
32570a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    /* Mark multiplier table not yet set up for any method */
32670a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine    idct->cur_method[ci] = -1;
32770a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine  }
32870a18cd874a22452aca9e39e22275ed4538ed20bVladimir Chtchetkine}
329