Home | History | Annotate | Download | only in aacdec
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 
     20  Pathname: pulse_nc.c
     21 
     22 ------------------------------------------------------------------------------
     23  REVISION HISTORY
     24 
     25  Description:  Modified from original shareware code
     26 
     27  Description:  Modified to pass variables by reference to eliminate use
     28                of global variables.
     29 
     30  Description:  Modified to bring code in-line with PV standards.
     31 
     32  Description: Pass in max as input argument.
     33 
     34  Description: Went back to the if-statement to check for max.
     35 
     36  Who:                       Date:
     37  Description:
     38 
     39 ------------------------------------------------------------------------------
     40  INPUT AND OUTPUT DEFINITIONS
     41 
     42  Inputs:
     43     coef[]         =  Array of quantized spectral coefficents.
     44                       (Int [])
     45 
     46     pPulseInfo     =  Pointer to structure which contains noiseless
     47                       encoding info, includes information about the pulse data,
     48                       pulse amplitude, etc.
     49                       (const PulseInfo *)
     50 
     51     pLongFrameInfo =  Pointer to structure that holds information about
     52                       each group. (long block flag, number of windows,
     53                       scalefactor bands per group, etc.)
     54 
     55                       Variable is named (pLongFrameInfo) because this function
     56                       is only used for LONG windows.
     57                       (FrameInfo *)
     58     max             = Pointer to the maximum value of coef[]
     59 
     60  Local Stores/Buffers/Pointers Needed:
     61     None
     62 
     63  Global Stores/Buffers/Pointers Needed:
     64     None
     65 
     66  Outputs:
     67     None
     68 
     69  Pointers and Buffers Modified:
     70     coef[]  =  coefficient contents are modified by the encoded pulse
     71 
     72  Local Stores Modified:
     73 
     74  Global Stores Modified:
     75 
     76 ------------------------------------------------------------------------------
     77  FUNCTION DESCRIPTION
     78 
     79  This function adds pulses to defined ranges of coefficients in the window,
     80  for the case of LONG windows.  The pulses are unsigned, so
     81  negative coefficients subtract the pulse, and positive coefficients add it.
     82  (The ampltiude of the coefficient is always increased by the pulse)
     83 
     84  A maximum of 4 coefficients may be modified by a pulse, and these
     85  coefficients must all occur in the same scalefactor band.
     86 
     87  The number of pulse-encoded coefficients to be processed by this function
     88  is communicated to this function via pPulseInfo->number_pulse
     89 
     90  This value is equal to the actual number of pulses - 1.
     91  (e.g if pPulseInfo->number_pulse == 0, one pulse is assumed)
     92  This function must not be called if no pulse encoded data exists.
     93  The function assumes that at least one pulse exists.
     94 ------------------------------------------------------------------------------
     95  REQUIREMENTS
     96 
     97  This module shall correctly add transmitted pulse(s) to the correct
     98  coefficients in a LONG window.
     99 
    100 ------------------------------------------------------------------------------
    101  REFERENCES
    102  (1) ISO/IEC 14496-3:1999(E)
    103      Part 3
    104         Subpart 4.6.3.3 Decoding Process
    105 
    106  (2) MPEG-2 NBC Audio Decoder
    107    "This software module was originally developed by AT&T, Dolby
    108    Laboratories, Fraunhofer Gesellschaft IIS in the course of development
    109    of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
    110    3. This software module is an implementation of a part of one or more
    111    MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
    112    Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
    113    standards free license to this software module or modifications thereof
    114    for use in hardware or software products claiming conformance to the
    115    MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
    116    module in hardware or software products are advised that this use may
    117    infringe existing patents. The original developer of this software
    118    module and his/her company, the subsequent editors and their companies,
    119    and ISO/IEC have no liability for use of this software module or
    120    modifications thereof in an implementation. Copyright is not released
    121    for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
    122    developer retains full right to use the code for his/her  own purpose,
    123    assign or donate the code to a third party and to inhibit third party
    124    from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
    125    This copyright notice must be included in all copies or derivative
    126    works."
    127    Copyright(c)1996.
    128 
    129 ------------------------------------------------------------------------------
    130  PSEUDO-CODE
    131 
    132     index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb];
    133 
    134     pPulseOffset = &(pPulseInfo->pulse_offset[0]);
    135 
    136     pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
    137 
    138     pCoef        = &(Coef[index]);
    139 
    140     FOR (index = pPulseInfo->number_pulse; index >= 0; index--)
    141 
    142         pCoef   = pCoef + *(pPulseOffset);
    143         pPulseOffset = pPulseOffset + 1;
    144 
    145         IF (*pCoef > 0)
    146             *(pCoef) = *(pCoef) + *(pPulseAmp);
    147             pPulseAmp     = pPulseAmp + 1;
    148         ELSE
    149             *(pCoef) = *(pCoef) - *(pPulseAmp);
    150             pPulseAmp     = pPulseAmp + 1;
    151         ENDIF
    152 
    153     ENDFOR
    154 
    155 ------------------------------------------------------------------------------
    156  RESOURCES USED
    157    When the code is written for a specific target processor the
    158      the resources used should be documented below.
    159 
    160  STACK USAGE: [stack count for this module] + [variable to represent
    161           stack usage for each subroutine called]
    162 
    163      where: [stack usage variable] = stack usage for [subroutine
    164          name] (see [filename].ext)
    165 
    166  DATA MEMORY USED: x words
    167 
    168  PROGRAM MEMORY USED: x words
    169 
    170  CLOCK CYCLES: [cycle count equation for this module] + [variable
    171            used to represent cycle count for each subroutine
    172            called]
    173 
    174      where: [cycle count variable] = cycle count for [subroutine
    175         name] (see [filename].ext)
    176 
    177 ------------------------------------------------------------------------------
    178 */
    179 
    180 
    181 /*----------------------------------------------------------------------------
    182 ; INCLUDES
    183 ----------------------------------------------------------------------------*/
    184 #include "pv_audio_type_defs.h"
    185 #include "s_frameinfo.h"
    186 #include "s_pulseinfo.h"
    187 #include "pulse_nc.h"
    188 
    189 /*----------------------------------------------------------------------------
    190 ; MACROS
    191 ; Define module specific macros here
    192 ----------------------------------------------------------------------------*/
    193 
    194 /*---------------------------------------------------------------------------
    195 ; DEFINES
    196 ; Include all pre-processor statements here. Include conditional
    197 ; compile variables also.
    198 ----------------------------------------------------------------------------*/
    199 
    200 /*----------------------------------------------------------------------------
    201 ; LOCAL FUNCTION DEFINITIONS
    202 ; Function Prototype declaration
    203 ----------------------------------------------------------------------------*/
    204 
    205 /*----------------------------------------------------------------------------
    206 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    207 ; Variable declaration - defined here and used outside this module
    208 ----------------------------------------------------------------------------*/
    209 
    210 /*----------------------------------------------------------------------------
    211 ; EXTERNAL FUNCTION REFERENCES
    212 ; Declare functions defined elsewhere and referenced in this module
    213 ----------------------------------------------------------------------------*/
    214 
    215 /*----------------------------------------------------------------------------
    216 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    217 ; Declare variables used in this module but defined elsewhere
    218 ----------------------------------------------------------------------------*/
    219 
    220 /*----------------------------------------------------------------------------
    221 ; FUNCTION CODE
    222 ----------------------------------------------------------------------------*/
    223 
    224 void pulse_nc(
    225     Int16      coef[],
    226     const PulseInfo  *pPulseInfo,
    227     const FrameInfo  *pLongFrameInfo,
    228     Int      *max)
    229 {
    230     Int index;
    231 
    232     Int16 *pCoef;
    233     Int temp;
    234 
    235     const Int *pPulseOffset;
    236     const Int *pPulseAmp;
    237 
    238     /*--- Find the scalefactor band where pulse-encoded data starts ---*/
    239 
    240     if (pPulseInfo->pulse_start_sfb > 0)
    241     {
    242         index = pLongFrameInfo->win_sfb_top[0][pPulseInfo->pulse_start_sfb - 1];
    243     }
    244     else
    245     {
    246         index = 0;
    247     }
    248 
    249     /*-------------------------------------------------------------------------
    250       Each pulse index is stored as an offset from the previous pulse
    251 
    252       Example - here we have a sfb that is 20 coefficients in length:
    253 
    254       [0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17][18][19]
    255       [ ][ ][ ][ ][ ][P][P][ ][ ][ ][  ][  ][  ][  ][  ][ P][  ][  ][  ][ P]
    256 
    257       The array pointed to by pPulseOffset == [5][1][9][4]
    258 
    259       pPulseAmp is of the same length as pPulseOffset, and contains
    260       an individual pulse amplitude for each coefficient.
    261     --------------------------------------------------------------------------*/
    262 
    263     pCoef        = &(coef[index]);
    264 
    265     pPulseOffset = &(pPulseInfo->pulse_offset[0]);
    266 
    267     pPulseAmp    = &(pPulseInfo->pulse_amp[0]);
    268 
    269     for (index = pPulseInfo->number_pulse; index > 0; index--)
    270     {
    271         pCoef  += *pPulseOffset++;
    272 
    273         temp = *pCoef;
    274 
    275         if (temp > 0)
    276         {
    277             temp += *(pPulseAmp++);
    278             *pCoef = (Int16)temp;
    279             if (temp > *max)
    280             {
    281                 *max = temp;
    282             }
    283         }
    284         else
    285         {
    286             temp -= *(pPulseAmp++);
    287             *pCoef = (Int16)temp;
    288             if (-temp > *max)
    289             {
    290                 *max = -temp;
    291             }
    292         }
    293 
    294     } /* for() */
    295 
    296     return;
    297 
    298 } /* pulse_nc */
    299