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