Home | History | Annotate | Download | only in src
      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: getmask.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                Replaced for-loop style memory initialization with memset()
     30 
     31  Description: (1) Modified to bring code in-line with PV standard
     32               (2) Removed multiple returns, Replaced multiple 'if's with
     33                   switch
     34 
     35  Description: (1) Modified per review comments
     36               (2) increment pointer pMask after memset
     37 
     38  Description: Make the maximum number of bits requested from getbits
     39               become a constant.
     40 
     41  Description: Typecast 1 to UInt32 for bitmask to avoid masking on a 16-bit
     42               platform
     43 
     44  Description: Replace some instances of getbits to get9_n_lessbits
     45               when the number of bits read is 9 or less.
     46 
     47  Who:                                   Date: MM/DD/YYYY
     48  Description:
     49 
     50 ------------------------------------------------------------------------------
     51  INPUT AND OUTPUT DEFINITIONS
     52 
     53  Inputs:
     54         pFrameInfo  = pointer to structure that holds information for current
     55                       frame, Type FrameInfo
     56 
     57         pInputStream= pointer to structure that holds input stream information
     58                       Type BITS
     59 
     60         pGroup      = pointer to array that holds the stop window index for
     61                       each group in current frame, Type Int
     62 
     63         max_sfb     = number of active sfbs for each window, Type Int
     64 
     65         mask[]      = array that holds the MS_mask information
     66                       Type Int
     67 
     68  Local Stores/Buffers/Pointers Needed:
     69     None
     70 
     71  Global Stores/Buffers/Pointers Needed:
     72     None
     73 
     74  Outputs:
     75     mask_present = 0    (no Mid/Side mixed)
     76                    2    (Mid/Side mixed present for entire frame)
     77                    1    (Mid/Side mixed information read from bitstream)
     78                    -1   (invalid mask_present read from bitstream)
     79 
     80  Pointers and Buffers Modified:
     81     pMask   contents replaced by MS information of each scalefactor band
     82 
     83  Local Stores Modified:
     84     None
     85 
     86  Global Stores Modified:
     87     None
     88 
     89 ------------------------------------------------------------------------------
     90  FUNCTION DESCRIPTION
     91 
     92  This function reads the Mid/Side(MS) mask information from the input
     93  bitstream. If the mask_present field is equal to 2, the mask bits is set to
     94  1 for the entire frame. If mask_present has a value of 0, the function
     95  returns 0, If mask_present is set to 1, the Mid/Side(MS) information is
     96  read from the input stream. When mask_present is 3, an error code (-1) is
     97  generated.
     98  The Mid/Side(MS) information is later used for mixing the left and right
     99  channel sounds. Each scalefactor band has its own MS information.
    100 
    101  (ISO comments: read a synthesis mask,  read a synthesis mask uses
    102                 EXTENDED_MS_MASK and grouped mask )
    103 
    104 ------------------------------------------------------------------------------
    105  REQUIREMENTS
    106 
    107  This function shall replace the contents of pMask with the MS information
    108  of each scalefactor band
    109 
    110 ------------------------------------------------------------------------------
    111  REFERENCES
    112 
    113  (1) MPEG-2 NBC Audio Decoder
    114    "This software module was originally developed by AT&T, Dolby
    115    Laboratories, Fraunhofer Gesellschaft IIS in the course of development
    116    of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and
    117    3. This software module is an implementation of a part of one or more
    118    MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4
    119    Audio standard. ISO/IEC  gives users of the MPEG-2 NBC/MPEG-4 Audio
    120    standards free license to this software module or modifications thereof
    121    for use in hardware or software products claiming conformance to the
    122    MPEG-2 NBC/MPEG-4 Audio  standards. Those intending to use this software
    123    module in hardware or software products are advised that this use may
    124    infringe existing patents. The original developer of this software
    125    module and his/her company, the subsequent editors and their companies,
    126    and ISO/IEC have no liability for use of this software module or
    127    modifications thereof in an implementation. Copyright is not released
    128    for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original
    129    developer retains full right to use the code for his/her own purpose,
    130    assign or donate the code to a third party and to inhibit third party
    131    from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products.
    132    This copyright notice must be included in all copies or derivative
    133    works."
    134    Copyright(c)1996.
    135 
    136  (2) ISO/IEC 14496-3: 1999(E)
    137     Subpart 4
    138                     p15     (Table 4.4.5    getmask)
    139 
    140 ------------------------------------------------------------------------------
    141  PSEUDO-CODE
    142 
    143     CALL getbits(LEN_MASK_PRES, pInputStream)
    144     MODIFYING (pInputStream)
    145     RETURNING (mask present information)
    146     mask_present = mask present information
    147 
    148     SWITCH (mask_present)
    149 
    150         CASE (0):
    151             BREAK;
    152 
    153         CASE (2):
    154             nwin = pFrameInfo->num_win;
    155             FOR(win = 0; win < nwin; win = *(pGroup++))
    156 
    157                 FOR(sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
    158                     *(pMask++) = 1;
    159                 ENDFOR
    160 
    161             ENDFOR
    162 
    163             BREAK;
    164 
    165         CASE(1):
    166 
    167             nwin = pFrameInfo->num_win;
    168 
    169                 nToDo = max_sfb;
    170 
    171                 WHILE (nToDo > 0)
    172                     nCall = nToDo;
    173 
    174                     IF (nCall > MAX_GETBITS)
    175                     THEN
    176                         nCall = MAX_GETBITS;
    177                     ENDIF
    178 
    179                     tempMask =
    180                         getbits(
    181                             nCall,
    182                             pInputStream);
    183 
    184                     bitmask = 1 << (nCall - 1);
    185                     FOR (sfb = nCall; sfb > 0; sfb--)
    186                        *(pMask++) = (tempMask & bitmask) >> (sfb - 1);
    187                         bitmask >>= 1;
    188                     ENDFOR
    189 
    190                     nToDo -= nCall;
    191                 END WHILE
    192 
    193                 pv_memset(
    194                     pMask,
    195                     0,
    196                     (pFrameInfo->sfb_per_win[win]-max_sfb)*sizeof(*pMask));
    197 
    198             ENDFOR (win)
    199 
    200             BREAK
    201 
    202         DEFAULT:
    203             mask_present = -1
    204 
    205     ENDSWITCH
    206 
    207     RETURN  mask_present
    208 
    209 ------------------------------------------------------------------------------
    210 */
    211 
    212 
    213 /*----------------------------------------------------------------------------
    214 ; INCLUDES
    215 ----------------------------------------------------------------------------*/
    216 #include    "pv_audio_type_defs.h"
    217 #include    "huffman.h"
    218 #include    "aac_mem_funcs.h"
    219 #include    "e_maskstatus.h"
    220 
    221 /*----------------------------------------------------------------------------
    222 ; MACROS
    223 ; Define module specific macros here
    224 ----------------------------------------------------------------------------*/
    225 
    226 /*----------------------------------------------------------------------------
    227 ; DEFINES
    228 ; Include all pre-processor statements here. Include conditional
    229 ; compile variables also.
    230 ----------------------------------------------------------------------------*/
    231 
    232 /*----------------------------------------------------------------------------
    233 ; LOCAL FUNCTION DEFINITIONS
    234 ; Function Prototype declaration
    235 ----------------------------------------------------------------------------*/
    236 
    237 /*----------------------------------------------------------------------------
    238 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    239 ; Variable declaration - defined here and used outside this module
    240 ----------------------------------------------------------------------------*/
    241 
    242 /*----------------------------------------------------------------------------
    243 ; EXTERNAL FUNCTION REFERENCES
    244 ; Declare functions defined elsewhere and referenced in this module
    245 ----------------------------------------------------------------------------*/
    246 
    247 /*----------------------------------------------------------------------------
    248 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    249 ; Declare variables used in this module but defined elsewhere
    250 ----------------------------------------------------------------------------*/
    251 
    252 /*----------------------------------------------------------------------------
    253 ; FUNCTION CODE
    254 ----------------------------------------------------------------------------*/
    255 Int getmask(
    256     FrameInfo   *pFrameInfo,
    257     BITS        *pInputStream,
    258     Int         group[],
    259     Int         max_sfb,
    260     Int         mask[])
    261 {
    262 
    263     Int     win; /* window index */
    264     Int     sfb;
    265     Int     mask_present;
    266     Int    *pMask;
    267     Int    *pGroup;
    268     Int     nwin;
    269     Int     nCall;
    270     Int     nToDo;
    271     UInt32  tempMask;
    272     UInt32  bitmask;
    273 
    274     pMask  = mask;
    275     pGroup = group;
    276 
    277     mask_present =
    278         get9_n_lessbits(
    279             LEN_MASK_PRES,
    280             pInputStream);
    281 
    282     switch (mask_present)
    283     {
    284         case(MASK_NOT_PRESENT):
    285             /* special EXTENDED_MS_MASK cases */
    286             /* no ms at all */
    287             break;
    288 
    289         case(MASK_ALL_FRAME):
    290             /* MS for whole spectrum on, mask bits set to 1 */
    291             nwin = pFrameInfo->num_win;
    292             for (win = 0; win < nwin; win = *(pGroup++))
    293             {
    294                 for (sfb = pFrameInfo->sfb_per_win[win]; sfb > 0; sfb--)
    295                 {
    296                     *(pMask++) = 1; /* cannot use memset for Int type */
    297                 }
    298 
    299             }
    300 
    301             break;
    302 
    303         case(MASK_FROM_BITSTREAM):
    304             /* MS_mask_present==1, get mask information*/
    305             nwin = pFrameInfo->num_win;
    306             for (win = 0; win < nwin; win = *(pGroup++))
    307             {
    308                 /*
    309                  * the following code is equivalent to
    310                  *
    311                  * for(sfb = max_sfb; sfb > 0; sfb--)
    312                  * {
    313                  *   *(pMask++) =
    314                  *       getbits(
    315                  *           LEN_MASK,
    316                  *           pInputStream);
    317                  * }
    318                  *
    319                  * in order to save the calls to getbits, the above
    320                  * for-loop is broken into two parts
    321                  */
    322 
    323                 nToDo = max_sfb;
    324 
    325                 while (nToDo > 0)
    326                 {
    327                     nCall = nToDo;
    328 
    329                     if (nCall > MAX_GETBITS)
    330                     {
    331                         nCall = MAX_GETBITS;
    332                     }
    333 
    334                     tempMask =
    335                         getbits(
    336                             nCall,
    337                             pInputStream);
    338 
    339                     bitmask = (UInt32) 1 << (nCall - 1);
    340                     for (sfb = nCall; sfb > 0; sfb--)
    341                     {
    342                         *(pMask++) = (Int)((tempMask & bitmask) >> (sfb - 1));
    343                         bitmask >>= 1;
    344                     }
    345 
    346                     nToDo -= nCall;
    347                 }
    348 
    349                 /*
    350                  * set remaining sfbs to zero
    351                  * re-use nCall to save one variable on stack
    352                  */
    353 
    354                 nCall = pFrameInfo->sfb_per_win[win] - max_sfb;
    355 
    356 
    357                 if (nCall >= 0)
    358                 {
    359                     pv_memset(pMask,
    360                               0,
    361                               nCall*sizeof(*pMask));
    362 
    363                     pMask += nCall;
    364                 }
    365                 else
    366                 {
    367                     mask_present = MASK_ERROR;
    368                     break;
    369                 }
    370 
    371 
    372             } /* for (win) */
    373 
    374             break;
    375 
    376         default:
    377             /* error */
    378             break;
    379 
    380     } /* switch (mask_present) */
    381 
    382     return mask_present;
    383 
    384 } /* getmask */
    385