summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp')
-rw-r--r--media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp789
1 files changed, 0 insertions, 789 deletions
diff --git a/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp b/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp
deleted file mode 100644
index 778c88c..0000000
--- a/media/libstagefright/codecs/aacdec/esc_iquant_scaling.cpp
+++ /dev/null
@@ -1,789 +0,0 @@
-/* ------------------------------------------------------------------
- * Copyright (C) 1998-2009 PacketVideo
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied.
- * See the License for the specific language governing permissions
- * and limitations under the License.
- * -------------------------------------------------------------------
- */
-/*
-
- Pathname: ./src/esc_iquant_scaling.c
- Funtions: esc_iquant_scaling
-
-------------------------------------------------------------------------------
- REVISION HISTORY
-
- Description: Modified from esc_iquant_fxp.c code
-
- Description: Eliminated unused variables to avoid warnings, changed header
-
- Who: Date:
- Description:
-
-------------------------------------------------------------------------------
- INPUT AND OUTPUT DEFINITIONS
-
- Inputs:
- quantSpec[] = array of quantized compressed spectral coefficients, of
- data type Int and length sfbWidth.
-
- sfbWidth = number of array elements in quantSpec and the output array
- coef, data type Int.
-
- coef[] = output array of uncompressed coefficients, stored in a
- variable Q format, depending on the maximum value found
- for the group, array of Int32, length sfbWdith to be
- overwritten.
-
- QFormat = the output Q format for the array coef[].
-
-
- scale = scaling factor after separating power of 2 factor out from
- 0.25*(sfb_scale - 100), i.e., 0.25*sfb_scale.
-
- maxInput = maximum absolute value of quantSpec.
-
- Local Stores/Buffers/Pointers Needed: None.
-
- Global Stores/Buffers/Pointers Needed:
- inverseQuantTable = lookup table of const integer values to the one third
- power stored in Q27 format, in file iquant_table.c, const
- array of UInt32, of size 1025.
-
- Outputs: None
-
- Pointers and Buffers Modified:
- coef[] contents are overwritten with the uncompressed values from
- quantSpec[]
-
-
-
-
- Local Stores Modified: None.
-
- Global Stores Modified: None.
-
-------------------------------------------------------------------------------
- FUNCTION DESCRIPTION
-
- This function performs the inverse quantization of the spectral coeficients
- read from huffman decoding. It takes each input array value to the four
- thirds power, then scales it according to the scaling factor input argument
- ,and stores the result in the output array in a variable Q format
- depending upon the maximum input value found.
-
-------------------------------------------------------------------------------
- REQUIREMENTS
-
- This function shall not have static or global variables.
-
-------------------------------------------------------------------------------
- REFERENCES
-
- (1) ISO/IEC 13818-7:1997 Titled "Information technology - Generic coding
- of moving pictures and associated audio information - Part 7: Advanced
- Audio Coding (AAC)", Section 10.3, "Decoding process", page 43.
-
- (2) MPEG-2 NBC Audio Decoder
- "This software module was originally developed by AT&T, Dolby
- Laboratories, Fraunhofer Gesellschaft IIS in the course of development
- of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
- 3. This software module is an implementation of a part of one or more
- MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
- Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio
- standards free license to this software module or modifications thereof
- for use in hardware or software products claiming conformance to the
- MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software
- module in hardware or software products are advised that this use may
- infringe existing patents. The original developer of this software
- module and his/her company, the subsequent editors and their companies,
- and ISO/IEC have no liability for use of this software module or
- modifications thereof in an implementation. Copyright is not released
- for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
- developer retains full right to use the code for his/her own purpose,
- assign or donate the code to a third party and to inhibit third party
- from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
- This copyright notice must be included in all copies or derivative
- works."
- Copyright(c)1996.
-
-------------------------------------------------------------------------------
- PSEUDO-CODE
-
- maxInput = 0;
-
- FOR (i = sfbWidth - 1; i >= 0; i--)
- x = quantSpec[i];
-
- IF ( x >= 0)
- absX = x;
- ELSE
- absX = -x;
- ENDIF
-
- coef[i] = absX;
-
- IF (absX > maxInput)
- maxInput = absX;
- ENDIF
- ENDFOR
-
- IF (maxInput == 0)
- *pQFormat = QTABLE;
- ELSE
- temp = inverseQuantTable[(maxInput >> ORDER) + 1];
-
- temp += ((1 << (QTABLE))-1);
-
- temp >>= (QTABLE-1);
-
- temp *= maxInput;
-
- binaryDigits = 0;
- WHILE( temp != 0)
- temp >>= 1;
- binaryDigits++;
- WEND
-
- IF (binaryDigits < (SIGNED32BITS - QTABLE))
- binaryDigits = SIGNED32BITS - QTABLE;
- ENDIF
-
- *pQFormat = SIGNED32BITS - binaryDigits;
- shift = QTABLE - *pQFormat;
-
- IF (maxInput < TABLESIZE)
- FOR (i = sfbWidth - 1; i >= 0; i--)
- x = quantSpec[i];
-
- absX = coef[i];
-
- tmp_coef = x * (inverseQuantTable[absX] >> shift);
-
- b_low = (tmp_coef & 0xFFFF);
- b_high = (tmp_coef >> 16);
-
- mult_low = ( (UInt32) b_low * scale );
- mult_high = ( (Int32) b_high * scale );
-
- mult_low >>= 16;
-
- coef[i] = (Int32) (mult_high + mult_low);
-
- ENDFOR
- ELSE
- FOR (i = sfbWidth; i >= 0 ; i--)
- x = quantSpec[i];
- absX = coef[i];
-
- IF (absX < TABLESIZE)
- tmp_coef = x * (inverseQuantTable[absX] >> shift);
- ELSE
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
-
- approxOneThird = (w1 * FACTOR) >> shift;
-
-
- x1 = index * SPACING;
- w2 = inverseQuantTable[index+1];
-
- deltaOneThird = (w2 - w1) * (absX - x1);
-
- deltaOneThird >>= (shift + ORDER - 1);
-
- tmp_coef = x * (approxOneThird + deltaOneThird);
-
- ENDIF
-
- b_low = (mult_high & 0xFFFF);
- b_high = (mult_high >> 16);
-
- mult_low = ( (UInt32) b_low * scale );
- mult_high = ( (Int32) b_high * scale );
-
- mult_low >>= 16;
-
- coef[i] = (Int32) (mult_high + mult_low);
-
- ENDFOR
- ENDIF
- ENDIF
-
- RETURN
-
-
-------------------------------------------------------------------------------
- RESOURCES USED
- When the code is written for a specific target processor the
- the resources used should be documented below.
-
- STACK USAGE: [stack count for this module] + [variable to represent
- stack usage for each subroutine called]
-
- where: [stack usage variable] = stack usage for [subroutine
- name] (see [filename].ext)
-
- DATA MEMORY USED: x words
-
- PROGRAM MEMORY USED: x words
-
- CLOCK CYCLES: [cycle count equation for this module] + [variable
- used to represent cycle count for each subroutine
- called]
-
- where: [cycle count variable] = cycle count for [subroutine
- name] (see [filename].ext)
-
-------------------------------------------------------------------------------
-*/
-
-/*----------------------------------------------------------------------------
-; INCLUDES
-----------------------------------------------------------------------------*/
-#include "pv_audio_type_defs.h"
-#include "iquant_table.h"
-#include "esc_iquant_scaling.h"
-#include "aac_mem_funcs.h" /* For pv_memset */
-
-#include "fxp_mul32.h"
-
-/*----------------------------------------------------------------------------
-; MACROS
-; Define module specific macros here
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; DEFINES
-; Include all pre-processor statements here. Include conditional
-; compile variables also.
-----------------------------------------------------------------------------*/
-/*
- * Read further on what order is.
- * Note: If ORDER is not a multiple of 3, FACTOR is not an integer.
- * Note: Portions of this function assume ORDER is 3, and so does the table
- * in iquant_table.c
- */
-#define ORDER (3)
-/*
- * For input values > TABLESIZE, multiply by FACTOR to get x ^ (1/3)
- * FACTOR = 2 ^ (ORDER/3)
- */
-#define FACTOR (2)
-
-/*
- * This is one more than the range of expected inputs.
- */
-#define INPUTRANGE (8192)
-
-/*
- * SPACING is 2 ^ ORDER, and is the spacing between points when in the
- * interpolation range.
- */
-#define SPACING (1<<ORDER)
-
-/*
- * The actual table size is one more than TABLESIZE, to allow for
- * interpolation for numbers near 8191
- */
-#define TABLESIZE (INPUTRANGE/SPACING)
-
-/*
- * Format the table is stored in.
- */
-#define QTABLE (27)
-
-/*
- * Number of bits for data in a signed 32 bit integer.
- */
-#define SIGNED32BITS (31)
-
-/*
- * Round up value for intermediate values obtained from the table
- */
-#define ROUND_UP (( ((UInt32) 1) << (QTABLE) )-1)
-
-#define MASK_LOW16 0xffff
-#define UPPER16 16
-
-/*----------------------------------------------------------------------------
-; LOCAL FUNCTION DEFINITIONS
-; Function Prototype declaration
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; LOCAL VARIABLE DEFINITIONS
-; Variable declaration - defined here and used outside this module
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; EXTERNAL FUNCTION REFERENCES
-; Declare functions defined elsewhere and referenced in this module
-----------------------------------------------------------------------------*/
-
-/*----------------------------------------------------------------------------
-; EXTERNAL VARIABLES REFERENCES
-; Declare variables used in this module but defined elsewhere
-----------------------------------------------------------------------------*/
-
-/*
- * Processing in this function is performed in these steps:
- *
- * 1) Find the overall Q format for the entire group of inputs. This consists
- * of:
- * a) Finding the maximum input
- * b) estimate the maximum output
- * c) Using the table, get max ^ (4/3), taking into account the table is
- * in q format.
- * 2) For each array element, see if the value is directly inside the table.
- * a) If yes, just multiply by table value by itself, then shift as
- * appropriate.
- * b) If no, get an approximation (described below) for x ^ (1/3) by linearly
- * interpolating using lower values in the table, then multiply by a
- * correction factor, then multiply by x (see below).
- *
- * It more accurate to interpolate x ^ (1/3) then x ^ (4/3), so that is stored
- * in the lookup table. For values not in the table, interpolation is used:
- *
- * We want y = x ^ (4/3) = x * (x ^ (1/3))
- *
- * Let x = w * (2 ^ m) where m is a constant, = ORDER
- *
- * then x ^ (1/3) = w ^ (1/3) * (2 ^ (m/3))
- *
- * w is most likely not an integer, so an interpolation with floor(w) and
- * ceil(w) can be performed to approximate w ^ (1/3) by getting values out of
- * the table. Then to get x ^ (1/3), multiply by FACTOR. If m = 0, 3, 6,
- * then FACTOR is a simple power of 2, so a shift can do the job.
- *
- * The actual code employs some more tricks to speed things up, and because
- * the table is stored in Q format.
- *
- * Rather than saving the sign of each input, the unsigned value of
- * abs(x) ^ (1/3) is multiplied by the signed input value.
- */
-
-
-
-#if ( defined(_ARM) || defined(_ARM_V4))
-
-/*
- * Absolute value for 16 bit-numbers
- */
-__inline Int32 abs2(Int32 x)
-{
- Int32 z;
- /*
- z = x - (x<0);
- x = z ^ sign(z)
- */
- __asm
- {
- sub z, x, x, lsr #31
- eor x, z, z, asr #31
- }
- return (x);
-}
-
-
-#define pv_abs(x) abs2(x)
-
-
-#elif (defined(PV_ARM_GCC_V5)||defined(PV_ARM_GCC_V4))
-
-/*
- * Absolute value for 16 bit-numbers
- */
-__inline Int32 abs2(Int32 x)
-{
- register Int32 z;
- register Int32 y;
- register Int32 ra = x;
- asm volatile(
- "sub %0, %2, %2, lsr #31\n\t"
- "eor %1, %0, %0, asr #31"
- : "=&r*i"(z),
- "=&r*i"(y)
- : "r"(ra));
-
- return (y);
-}
-
-#define pv_abs(x) abs2(x)
-
-
-#else
-
-#define pv_abs(x) ((x) > 0)? (x) : (-x)
-
-#endif
-
-
-
-
-
-void esc_iquant_scaling(
- const Int16 quantSpec[],
- Int32 coef[],
- const Int sfbWidth,
- Int const QFormat,
- UInt16 scale,
- Int maxInput)
-{
- Int i;
- Int x;
- Int y;
- Int index;
- Int shift;
- UInt absX;
- UInt32 w1, w2;
- UInt32 deltaOneThird;
- UInt32 x1;
- UInt32 approxOneThird;
- Int32 mult_high;
-
-
-#if ( defined(_ARM) || defined(_ARM_V4))
-
- {
- Int32 *temp;
- Int32 R12, R11, R10, R9;
-
- deltaOneThird = sizeof(Int32) * sfbWidth;
- temp = coef;
-
- // from standard library call for __rt_memset
- __asm
- {
- MOV R12, #0x0
- MOV R11, #0x0
- MOV R10, #0x0
- MOV R9, #0x0
- SUBS deltaOneThird, deltaOneThird, #0x20
-loop:
- STMCSIA temp!, {R12, R11, R10, R9}
- STMCSIA temp!, {R12, R11, R10, R9}
- SUBCSS deltaOneThird, deltaOneThird, #0x20
- BCS loop
-
- MOVS deltaOneThird, deltaOneThird, LSL #28
- STMCSIA temp!, {R12, R11, R10, R9}
- STMMIIA temp!, {R12, R11}
- }
- }
-
-#else
- pv_memset(coef, 0, sizeof(Int32) * sfbWidth);
-#endif
-
- if (maxInput > 0)
- {
-
- shift = QTABLE - QFormat;
-
- if (scale != 0)
- {
- if (maxInput < TABLESIZE)
- {
-
- for (i = sfbWidth - 1; i >= 0; i -= 4)
- {
- x = quantSpec[i];
- y = quantSpec[i-1];
- if (x)
- {
- absX = pv_abs(x);
- mult_high = (x * (inverseQuantTable[absX] >> shift));
- coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
-
- if (y)
- {
- absX = pv_abs(y);
- mult_high = y * (inverseQuantTable[absX] >> shift);
- coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
-
- x = quantSpec[i-2];
- y = quantSpec[i-3];
- if (x)
- {
- absX = pv_abs(x);
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
-
- if (y)
- {
- absX = pv_abs(y);
- mult_high = y * (inverseQuantTable[absX] >> shift);
- coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
- } /* end for (i = sfbWidth - 1; i >= 0; i--) */
-
- } /* end if (maxInput < TABLESIZE)*/
-
- else /* maxInput >= TABLESIZE) */
- {
- for (i = sfbWidth - 1; i >= 0; i -= 4)
- {
- x = quantSpec[i];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
-
- }
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i] = fxp_mul32_by_16(mult_high, scale) << 1;
-
- }
- } /* if(x) */
-
-
- x = quantSpec[i-1];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = (x * (inverseQuantTable[absX] >> shift));
- coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
-
- }
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-1] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
- } /* if(x) */
-
- x = quantSpec[i-2];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-2] = fxp_mul32_by_16(mult_high, scale) << 1;
- }
- } /* if(x) */
-
- x = quantSpec[i-3];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
-
- }
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-3] = fxp_mul32_by_16(mult_high, scale) << 1;
-
- }
- } /* if(x) */
-
- } /* end for (i = sfbWidth - 1; i >= 0; i--) */
- } /* end else for if (maxInput < TABLESIZE)*/
- }
- else /* scale == 0 */
- {
- if (maxInput < TABLESIZE)
- {
- for (i = sfbWidth - 1; i >= 0; i -= 4)
- {
- x = quantSpec[i];
- y = quantSpec[i-1];
- if (x)
- {
- absX = pv_abs(x);
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i] = mult_high >> 1;
- }
-
- if (y)
- {
- absX = pv_abs(y);
- mult_high = y * (inverseQuantTable[absX] >> shift);
- coef[i-1] = mult_high >> 1;
- }
-
- x = quantSpec[i-2];
- y = quantSpec[i-3];
- if (x)
- {
- absX = pv_abs(x);
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-2] = mult_high >> 1;
- }
-
- if (y)
- {
- absX = pv_abs(y);
- mult_high = y * (inverseQuantTable[absX] >> shift);
- coef[i-3] = mult_high >> 1;
- }
- }
-
- } /* end if (maxInput < TABLESIZE)*/
-
- else /* maxInput >= TABLESIZE) */
- {
- for (i = sfbWidth - 1; i >= 0; i -= 4)
- {
- x = quantSpec[i];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i] = (mult_high >> 1);
- } /* end if (absX < TABLESIZE) */
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i] = (mult_high >> 1);
- }
- } /* if(x) */
-
- x = quantSpec[i-1];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-1] = (mult_high >> 1);
- } /* end if (absX < TABLESIZE) */
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-1] = (mult_high >> 1);
- }
- } /* if(x) */
-
- x = quantSpec[i-2];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-2] = (mult_high >> 1);
- } /* end if (absX < TABLESIZE) */
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-2] = (mult_high >> 1);
- }
- } /* if(x) */
-
- x = quantSpec[i-3];
- if (x)
- {
- absX = pv_abs(x);
- if (absX < TABLESIZE)
- {
- mult_high = x * (inverseQuantTable[absX] >> shift);
- coef[i-3] = (mult_high >> 1);
- } /* end if (absX < TABLESIZE) */
- else
- {
- index = absX >> ORDER;
- w1 = inverseQuantTable[index];
- w2 = inverseQuantTable[index+1];
- approxOneThird = (w1 * FACTOR) >> shift;
- x1 = index << ORDER;
- deltaOneThird = (w2 - w1) * (absX - x1);
- deltaOneThird >>= (shift + 2);
- mult_high = x * (approxOneThird + deltaOneThird);
- coef[i-3] = (mult_high >> 1);
- }
-
- } /* if(x) */
-
- } /* end for (i = sfbWidth - 1; i >= 0; i--) */
-
- } /* end else for if (maxInput < TABLESIZE)*/
-
- } /* end else for if(scale!=0) */
-
- } /* end else for if(maxInput == 0) */
-
-} /* end esc_iquant_fxp */
-
-