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: ./src/calc_gsfb_table.c
     21 
     22 ------------------------------------------------------------------------------
     23  REVISION HISTORY
     24 
     25  Description:  Modified from original shareware code
     26 
     27  Description: (1) Modified to bring in-line with PV standards
     28               (2) Removed if(pFrameInfo->islong), only short windows will
     29                   call this routine from getics.c
     30 
     31  Description: Modified per review comments
     32 
     33  Who:                       Date:
     34  Description:
     35 
     36 ------------------------------------------------------------------------------
     37  INPUT AND OUTPUT DEFINITIONS
     38 
     39  Inputs:
     40     pFrameInfo  = pointer to structure that holds information for current
     41                   frame. Data type FrameInfo
     42 
     43     group[]     = array that contains the grouping information of short
     44                   windows (stop index of windows in each group).
     45                   Data type Int
     46 
     47  Local Stores/Buffers/Pointers Needed:
     48     None
     49 
     50  Global Stores/Buffers/Pointers Needed:
     51     None
     52 
     53  Outputs:
     54     None
     55 
     56  Pointers and Buffers Modified:
     57     pFrameInfo -> frame_sfb_top   contains the cumulative bandwidth of
     58                                     scalefactor bands in each group
     59 
     60  Local Stores Modified:
     61     None
     62 
     63  Global Stores Modified:
     64     None
     65 
     66 ------------------------------------------------------------------------------
     67  FUNCTION DESCRIPTION
     68 
     69  This function is only invoked when short windows are present. It calculates
     70  the number of groups in one frame, and the scalefactor bandwidth of each
     71  scalefactor band in each group.
     72  All windows within one group share the same scalefactors and are interleaved
     73  on a scalefactor band basis. Within each group, the actual length of one
     74  scalefactor band equals to the number of windows times the number of
     75  coefficients in a regular scalefactor band.
     76 
     77 ------------------------------------------------------------------------------
     78  REQUIREMENTS
     79 
     80  This function shall replace the contents of pFrameInfo->frame_sfb_top
     81  with the cumulative bandwidth of each scalefactor band in each group
     82 
     83 ------------------------------------------------------------------------------
     84  REFERENCES
     85 
     86  (1) MPEG-2 NBC Audio Decoder
     87    "This software module was originally developed by AT&T, Dolby
     88    Laboratories, Fraunhofer Gesellschaft IIS in the course of development
     89    of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
     90    3. This software module is an implementation of a part of one or more
     91    MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
     92    Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
     93    standards free license to this software module or modifications thereof
     94    for use in hardware or software products claiming conformance to the
     95    MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
     96    module in hardware or software products are advised that this use may
     97    infringe existing patents. The original developer of this software
     98    module and his/her company, the subsequent editors and their companies,
     99    and ISO/IEC have no liability for use of this software module or
    100    modifications thereof in an implementation. Copyright is not released
    101    for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
    102    developer retains full right to use the code for his/her own purpose,
    103    assign or donate the code to a third party and to inhibit third party
    104    from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
    105    This copyright notice must be included in all copies or derivative
    106    works."
    107    Copyright(c)1996.
    108 
    109  (2) ISO/IEC 14496-3: 1999(E)
    110     Subpart 4       p54.    4.5.2.3.2   decoding process
    111 
    112 ------------------------------------------------------------------------------
    113  PSEUDO-CODE
    114 
    115     offset      = 0;
    116     group_idx   = 0;
    117 
    118     DO
    119         pFrameInfo->group_len[group_idx] = group[group_idx] - offset;
    120         offset = group[group_idx];
    121         group_idx++;
    122 
    123     WHILE (offset < NUM_SHORT_WINDOWS);
    124 
    125 
    126     pFrameInfo->num_groups = group_idx;
    127 
    128     pFrameSfbTop = pFrameInfo->frame_sfb_top;
    129     offset = 0;
    130 
    131     FOR (group_idx = 0; group_idx < pFrameInfo->num_groups; group_idx++)
    132 
    133         len = pFrameInfo->group_len[group_idx];
    134 
    135         FOR (sfb = 0; sfb < pFrameInfo->sfb_per_win[group_idx]; sfb++)
    136 
    137             offset += pFrameInfo->sfb_width_128[sfb] * len;
    138             *pFrameSfbTop++ = offset;
    139 
    140         ENDFOR
    141 
    142     ENDFOR
    143 
    144 ------------------------------------------------------------------------------
    145  RESOURCES USED
    146    When the code is written for a specific target processor the
    147      the resources used should be documented below.
    148 
    149  STACK USAGE: [stack count for this module] + [variable to represent
    150           stack usage for each subroutine called]
    151 
    152      where: [stack usage variable] = stack usage for [subroutine
    153          name] (see [filename].ext)
    154 
    155  DATA MEMORY USED: x words
    156 
    157  PROGRAM MEMORY USED: x words
    158 
    159  CLOCK CYCLES: [cycle count equation for this module] + [variable
    160            used to represent cycle count for each subroutine
    161            called]
    162 
    163      where: [cycle count variable] = cycle count for [subroutine
    164         name] (see [filename].ext)
    165 
    166 ------------------------------------------------------------------------------
    167 */
    168 
    169 
    170 /*----------------------------------------------------------------------------
    171 ; INCLUDES
    172 ----------------------------------------------------------------------------*/
    173 #include    "pv_audio_type_defs.h"
    174 #include    "huffman.h"
    175 #include    "aac_mem_funcs.h"
    176 
    177 /*----------------------------------------------------------------------------
    178 ; MACROS
    179 ; Define module specific macros here
    180 ----------------------------------------------------------------------------*/
    181 
    182 /*----------------------------------------------------------------------------
    183 ; DEFINES
    184 ; Include all pre-processor statements here. Include conditional
    185 ; compile variables also.
    186 ----------------------------------------------------------------------------*/
    187 
    188 /*----------------------------------------------------------------------------
    189 ; LOCAL FUNCTION DEFINITIONS
    190 ; Function Prototype declaration
    191 ----------------------------------------------------------------------------*/
    192 
    193 /*----------------------------------------------------------------------------
    194 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    195 ; Variable declaration - defined here and used outside this module
    196 ----------------------------------------------------------------------------*/
    197 
    198 /*----------------------------------------------------------------------------
    199 ; EXTERNAL FUNCTION REFERENCES
    200 ; Declare functions defined elsewhere and referenced in this module
    201 ----------------------------------------------------------------------------*/
    202 
    203 /*----------------------------------------------------------------------------
    204 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    205 ; Declare variables used in this module but defined elsewhere
    206 ----------------------------------------------------------------------------*/
    207 
    208 /*----------------------------------------------------------------------------
    209 ; FUNCTION CODE
    210 ----------------------------------------------------------------------------*/
    211 void  calc_gsfb_table(
    212     FrameInfo   *pFrameInfo,
    213     Int         group[])
    214 {
    215 
    216     Int      group_idx;
    217     Int      offset;
    218     Int     *pFrameSfbTop;
    219     Int     *pSfbWidth128;
    220     Int      sfb;
    221     Int      nsfb;
    222     Int      len;
    223     Int      ngroups;
    224 
    225     /* clear out the default values set by infoinit */
    226     /* */
    227     pv_memset(pFrameInfo->frame_sfb_top,
    228               0,
    229               MAXBANDS*sizeof(pFrameInfo->frame_sfb_top[0]));
    230     /* */
    231     /* first calculate the group length*/
    232     offset      = 0;
    233     ngroups     = 0;
    234     do
    235     {
    236         pFrameInfo->group_len[ngroups] = group[ngroups] - offset;
    237         offset = group[ngroups];
    238         ngroups++;
    239 
    240     }
    241     while (offset < NUM_SHORT_WINDOWS);
    242 
    243 
    244     /* calculate the cumulative scalefactor bandwidth for one frame */
    245     pFrameInfo->num_groups = ngroups;
    246 
    247     pFrameSfbTop = pFrameInfo->frame_sfb_top;
    248     offset = 0;
    249 
    250 
    251     for (group_idx = 0; group_idx < ngroups; group_idx++)
    252     {
    253         len  = pFrameInfo->group_len[  group_idx];
    254         nsfb = pFrameInfo->sfb_per_win[group_idx];
    255 
    256         pSfbWidth128 = pFrameInfo->sfb_width_128;
    257 
    258         for (sfb = nsfb; sfb > 0; sfb--)
    259         {
    260             offset += *pSfbWidth128++ * len;
    261             *pFrameSfbTop++ = offset;
    262         }
    263     }
    264 
    265 
    266 } /* calc_gsfb_table */
    267 
    268