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 
     21    PacketVideo Corp.
     22    MP3 Decoder Library
     23 
     24    Filename: pvmp3_reorder.cpp
     25 
     26 
     27      Date: 09/21/2007
     28 
     29 ------------------------------------------------------------------------------
     30  REVISION HISTORY
     31 
     32 
     33  Description:
     34 
     35 ------------------------------------------------------------------------------
     36  INPUT AND OUTPUT DEFINITIONS
     37 
     38  Inputs:
     39 
     40     int32 xr[ ],                rescaled data
     41     struct gr_info_s *gr_info,  granule structure
     42     mp3Header *info,            mp3 header info
     43     int32  Scratch_mem[198]     for temporary usage
     44 
     45  Outputs:
     46 
     47     int32 xr[ ],                reordered data
     48 
     49 ------------------------------------------------------------------------------
     50  FUNCTION DESCRIPTION
     51 
     52  If short blocks are used (block_type[gr][ch]=='10'), the rescaled data
     53  xr[scf_band][window][freq_line] shall be reordered in polyphase subband
     54  order, xr[subband][window][freq_line], prior to the IMDCT operation.
     55 
     56 ------------------------------------------------------------------------------
     57  REQUIREMENTS
     58 
     59 
     60 ------------------------------------------------------------------------------
     61  REFERENCES
     62  [1] ISO MPEG Audio Subgroup Software Simulation Group (1996)
     63      ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
     64 
     65 
     66 ------------------------------------------------------------------------------
     67  PSEUDO-CODE
     68 
     69 ------------------------------------------------------------------------------
     70 */
     71 
     72 
     73 /*----------------------------------------------------------------------------
     74 ; INCLUDES
     75 ----------------------------------------------------------------------------*/
     76 #include "pv_mp3dec_fxd_op.h"
     77 #include "pvmp3_dec_defs.h"
     78 #include "pvmp3_reorder.h"
     79 #include "pvmp3_tables.h"
     80 #include "mp3_mem_funcs.h"
     81 
     82 /*----------------------------------------------------------------------------
     83 ; MACROS
     84 ; Define module specific macros here
     85 ----------------------------------------------------------------------------*/
     86 
     87 
     88 /*----------------------------------------------------------------------------
     89 ; DEFINES
     90 ; Include all pre-processor statements here. Include conditional
     91 ; compile variables also.
     92 ----------------------------------------------------------------------------*/
     93 
     94 
     95 /*----------------------------------------------------------------------------
     96 ; LOCAL FUNCTION DEFINITIONS
     97 ; Function Prototype declaration
     98 ----------------------------------------------------------------------------*/
     99 
    100 /*----------------------------------------------------------------------------
    101 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    102 ; Variable declaration - defined here and used outside this module
    103 ----------------------------------------------------------------------------*/
    104 
    105 /*----------------------------------------------------------------------------
    106 ; EXTERNAL FUNCTION REFERENCES
    107 ; Declare functions defined elsewhere and referenced in this module
    108 ----------------------------------------------------------------------------*/
    109 
    110 /*----------------------------------------------------------------------------
    111 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    112 ; Declare variables used in this module but defined elsewhere
    113 ----------------------------------------------------------------------------*/
    114 
    115 /*----------------------------------------------------------------------------
    116 ; FUNCTION CODE
    117 ----------------------------------------------------------------------------*/
    118 
    119 void pvmp3_reorder(int32 xr[SUBBANDS_NUMBER*FILTERBANK_BANDS],
    120                    granuleInfo *gr_info,
    121                    int32  *used_freq_lines,
    122                    mp3Header *info,
    123                    int32  Scratch_mem[198])
    124 {
    125     int32 sfreq =  info->version_x + (info->version_x << 1);
    126     sfreq += info->sampling_frequency;
    127 
    128     if (gr_info->window_switching_flag && (gr_info->block_type == 2))
    129     {
    130         int32   sfb_lines;
    131         int32   freq;
    132         int32   src_line;
    133         int32   sfb;
    134         if (gr_info->mixed_block_flag)
    135         {
    136             /* REORDERING FOR REST SWITCHED SHORT */
    137             sfb = 3;  /* no reorder for low 2 subbands */
    138             src_line = 36;
    139         }
    140         else
    141         {  /* pure short */
    142             sfb = 0;
    143             src_line = 0;
    144         }
    145         int16 ct = src_line;
    146 
    147         for (; sfb < 13; sfb++)
    148         {
    149             if (*used_freq_lines > 3*mp3_sfBandIndex[sfreq].s[sfb+1])
    150             {
    151                 sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
    152 
    153                 for (freq = 0; freq < 3*sfb_lines; freq += 3)
    154                 {
    155                     int32 tmp1 = xr[src_line];
    156                     int32 tmp2 = xr[src_line+(sfb_lines)];
    157                     int32 tmp3 = xr[src_line+(sfb_lines<<1)];
    158                     src_line++;
    159                     Scratch_mem[freq  ] = tmp1;
    160                     Scratch_mem[freq+1] = tmp2;
    161                     Scratch_mem[freq+2] = tmp3;
    162                 }
    163                 src_line += (sfb_lines << 1);
    164 
    165                 pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
    166                 ct += sfb_lines + (sfb_lines << 1);
    167 
    168             }
    169             else
    170             {
    171 
    172                 sfb_lines = mp3_sfBandIndex[sfreq].s[sfb+1]  - mp3_sfBandIndex[sfreq].s[sfb];
    173 
    174                 for (freq = 0; freq < 3*sfb_lines; freq += 3)
    175                 {
    176                     int32 tmp1 = xr[src_line];
    177                     int32 tmp2 = xr[src_line+(sfb_lines)];
    178                     int32 tmp3 = xr[src_line+(sfb_lines<<1)];
    179                     src_line++;
    180                     Scratch_mem[freq  ] = tmp1;
    181                     Scratch_mem[freq+1] = tmp2;
    182                     Scratch_mem[freq+2] = tmp3;
    183                 }
    184 
    185                 pv_memcpy(&xr[ct], Scratch_mem, sfb_lines*3*sizeof(int32));
    186 
    187                 *used_freq_lines = mp3_sfBandIndex[sfreq].s[sfb+1] * 3;
    188 
    189                 sfb = 13;   /* force out of the for-loop */
    190             }
    191         }
    192     }
    193 }
    194 
    195 
    196 
    197 
    198