pvmp3_reorder.cpp revision 3418835893f85c68029cfae0491ec47b07184829
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 119void 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