1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: long_term_synthesis.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made the following changes based on the review comments. 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1. Separated "shift_factor>=0" on line 395 to "shift_factor>0" 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and "shift_factor=0" two cases. 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2. Added comments on line 393 to explain why factor 2 is being 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to calculate shift_factor. 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. Added comments for short window implementation. 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 4. Changed "*(pPredicted_spectral++) = *pPredicted_spectral>>2" 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to "*(pPredicted++)>>=2" although they are the same. 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 5. Changed pseudo code "X+=Y" to "X=X+Y". 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 6. Fixed ending comment of "for" loop. 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 7. Passed in the size of the array and deleted some of the 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber include files. 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Unroll the loops. 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed index "wnd" in previous line 584 with "wnd_offset" 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and made other correspondent changes to the code. 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Based on Ken's suggestion, modified the function with the 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber passing-in Q format as scalefactor band basis in order to 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber simplify TNS block functions. 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Optimization. 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made changes based on review comments. 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1. Changed misspellings. 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2. Changed win_sfb_top[] from two dimensional array to one 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dimensional array and correspondently changed the code. 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. Changed function prototype to remove some redundant 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber informations. 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 4. Fixed the adjusting Q format part code. 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 5. Fixed lines 825, 826 with correct updating pointers. 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Due to TNS and LTP Q format issue, added code to adjust 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber predicted_spectral() to maximum resolution before perform 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long term synthesis. 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified based on review comments. 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed "max" data type from UInt to UInt32. 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Changed so that nothing is done for the case of "all zero" 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber data coming from the output of Trans4m_time_2_freq. Also, included more 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber efficient calculation of the abs(x). And, I updated the pseudocode. 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Use an auxiliary variable temp, to avoid using the same 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pointer and a post-increment pointer in the same line. This may not 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber work with all compilers. 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win_seq = type of window sequence (WINDOW_SEQUENCE). 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_per_win = number of scalefactor bands for each window, 1024 for 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber long window, 128 for short window, type of Int. 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win_sfb_top = buffer (Int16) containing the top coefficient per 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scalefactor band for each window. 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber win_prediction_used = buffer (Int) containing the prediction flag 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber information for short windows. Each item in the 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber buffer toggles prediction on(1)/off(0) for each 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber window separately. 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_prediction_used = buffer (Int) containing the prediction flag 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber information for scalefactor band(sfb). Each item 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber toggle prediction on(1)/off(0) on each scalefactor 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber band of every window. 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber current_frame = channel buffer (Int32) containing the dequantized 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral coefficients or errors of current frame. 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber q_format = buffer (Int) containing Q format for each scalefactor band of 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber input current_frame. 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber predicted_spectral = buffer (Int32) containing predicted spectral 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber components of current frame. 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_q_format = Q format (Int) for predicted spectral components of 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber current frame. 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coef_per_win = number of coefficients per window for short windows. 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber type of Int. 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber short_window_num = number of short windows, type of Int. 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reconstruct_sfb_num = number of scalefactor bands used for reconstruction 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for short windows, type of Int. 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber current_frame contents are the dequantized spectrum with a prediction 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber vector added when prediction is turned on. 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber q_format contents are updated with the new Q format (Int) for each 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scalefactor band of output current_frame buffer. 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function performs long term synthesis using transmitted spectral 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber coeffients or errors and predicted spectral components. 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Long term synthesis is part of long term prediction (LTP) which is used to 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber reduce the redundancy of a signal between successive coding frames. The 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber functionality of long term synthesis is to reconstruct the frequency domain 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral by adding the predicted spectral components and the transmitted 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral error when prediction is turned on. 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E) 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Part 3: Audio 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4.6.6 Long Term Prediction (LTP) 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by Nokia in the course 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of development of the MPEG-2 AAC/MPEG-4 Audio standard ISO/IEC13818-7, 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 14496-1, 2 and 3. This software module is an implementation of a part 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of one or more MPEG-2 AAC/MPEG-4 Audio tools as specified by the MPEG-2 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aac/MPEG-4 Audio standard. ISO/IEC gives users of the MPEG-2aac/MPEG-4 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standards free license to this software module or modifications 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber thereof for use in hardware or software products claiming conformance 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to the MPEG-2 aac/MPEG-4 Audio standards. Those intending to use this 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber software module in hardware or software products are advised that this 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber use may infringe existing patents. The original developer of this 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber software module, the subsequent editors and their companies, and ISO/IEC 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber have no liability for use of this software module or modifications 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber thereof in an implementation. Copyright is not released for non MPEG-2 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aac/MPEG-4 Audio conforming products. The original developer retains 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber full right to use the code for the developer's own purpose, assign or 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber donate the code to a third party and to inhibit third party from using 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the code for non MPEG-2 aac/MPEG-4 Audio conforming products. This 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber copyright notice must be included in all copies or derivative works. 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright (c)1997. 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = &predicted_spectral[0]; 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral_start = pPredicted_spectral; 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSfb_prediction_used = &sfb_prediction_used[0]; 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (win_seq != EIGHT_SHORT_SEQUENCE) 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = 0; 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = &pWin_sfb_top[0]; 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = &q_format[0]; 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (i = sfb_per_frame; i>0; i--) 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (*(pSfb_prediction_used++) != FALSE) 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_offset = pPredicted_spectral_start + 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset; 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame = ¤t_frame[sfb_offset]; 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2; 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max = 0; 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--) 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = *(pPredicted_spectral++); 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (tmpInt32 < 0) 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = -tmpInt32; 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max |= tmpInt32; 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt = 0; 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (max != 0) 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WHILE (max < 0x40000000L) 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max <<= 1; 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt++; 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDWHILE 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber adjusted_pred_q = pred_q_format + tmpInt; 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = *(pQ_format) - adjusted_pred_q; 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((shift_factor >= 0) && (shift_factor < 31)) 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = shift_factor + 1; 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++)>>1); 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++)>>1); 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++)>>1); 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++)>>1); 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q - 1; 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSEIF (shift_factor >= 31) 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q; 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSEIF ((shift_factor < 0) && (shift_factor > -31)) 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = 1 - shift_factor; 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = *(pQ_format) - 1; 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF [ IF (*(pSfb_prediction_used++) != FALSE) ] 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = *pWinSfbTop; 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = pWinSfbTop + 1; 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = pQ_format + 1; 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR [ FOR (i = sfb_per_frame; i>0; i--) ] 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSE 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame_start = ¤t_frame[0]; 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format_start = &q_format[0]; 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_sfb = sfb_per_win[0]; 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (wnd=0; wnd<short_window_num; wnd++) 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = &pWin_sfb_top[0]; 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = pQ_format_start; 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (win_prediction_used[wnd] != FALSE) 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = 0; 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (i = reconstruct_sfb_num; i > 0; i--) 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_offset = pPredicted_spectral_start + 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset; 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame = pCurrent_frame_start + sfb_offset; 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2; 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max = 0; 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = (*pWinSfbTop - sfb_offset); j>0 ; j--) 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = *(pPredicted_spectral++); 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (tmpInt32 < 0) 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = -tmpInt32; 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max |= tmpInt32; 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt = 0; 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (max != 0) 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WHILE (max < 0x40000000L) 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max <<= 1; 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt++; 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDWHILE 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) <<= tmpInt; 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber adjusted_pred_q = pred_q_format + tmpInt; 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = *(pQ_format) - adjusted_pred_q; 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF ((shift_factor >= 0) && (shift_factor < 31)) 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = shift_factor + 1; 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) + 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>1); 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) + 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>1); 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) + 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>1); 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pCurrent_frame>>shift_factor) + 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>1); 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q - 1; 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSEIF (shift_factor >= 31) 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = *(pPredicted_spectral++); 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q; 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ELSEIF ((shift_factor < 0) && (shift_factor > -31)) 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber THEN 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = 1 - shift_factor; 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FOR (j = quarter_sfb_width; j>0 ; j--) 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = (*pCurrent_frame>>1) + 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++)>>shift_factor); 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = *(pQ_format) - 1; 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = *pWinSfbTop; 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = pWinSfbTop + 1; 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = pQ_format + 1; 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR [ FOR (i = reconstruct_sfb_num; i > 0; i--) ] 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF [ IF (win_prediction_used[wnd] != FALSE) ] 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral_start = pPredicted_spectral_start + num_sfb; 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame_start = pCurrent_frame_start + num_sfb; 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber wnd_offset = wnd_offset + num_sfb; 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format_start = pQ_format_start + num_sfb; 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDFOR [ FOR (wnd=0; wnd<short_window_num; wnd++) ] 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF [ IF (win_seq != EIGHT_SHORT_SEQUENCE) ] 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RETURN 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "e_window_sequence.h" 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "long_term_synthesis.h" 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid long_term_synthesis( 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber WINDOW_SEQUENCE win_seq, 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb_per_win, 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 win_sfb_top[], 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int win_prediction_used[], 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb_prediction_used[], 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 current_frame[], 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int q_format[], /* for each sfb */ 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 predicted_spectral[], 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int pred_q_format, /* for predicted_spectral[] */ 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int coef_per_win, 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int short_window_num, 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int reconstruct_sfb_num) 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Define all local variables 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Scalefactor band offset */ 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sfb_offset; 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Window index */ 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int wnd; 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to array containing predicted samples */ 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pPredicted_spectral; 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to the beginning of array containing predicted samples */ 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pPredicted_spectral_start; 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pPredicted_offset; 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to array containing current spectral components for a channel*/ 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pCurrent_frame; 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Another pointer to array containing current spectral components */ 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *pCurrent_frame_start; 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to prediction flag for each scalefactor band */ 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pSfb_prediction_used; 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to top coef per scalefactor band */ 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pWinSfbTop; 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Pointer to q_format array */ 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pQ_format; 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *pQ_format_start; 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 temp; 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int i; 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int j; 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int quarter_sfb_width; 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int num_sfb; 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int shift_factor; 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt32 max; 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmpInt32; 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int tmpInt; 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int adjusted_pred_q; 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int pred_shift; 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Function body here 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Initialize pointers */ 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = &predicted_spectral[0]; 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral_start = pPredicted_spectral; 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * NOTE: 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * sfb_prediction_used[] start from 0 or 1 depending on nok_lt_decode.c; 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * currently we agree to make it start from 0; 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pSfb_prediction_used = &sfb_prediction_used[0]; 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*********************************/ 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* LTP synthesis for long window */ 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*********************************/ 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (win_seq != EIGHT_SHORT_SEQUENCE) 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*******************************************************/ 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Reconstruction of current frequency domain spectrum */ 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*******************************************************/ 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Initialize scalefactor band offset */ 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = 0; 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Reconstruction is processed on scalefactor band basis. 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1. When prediction is turned on, all the predicted spectral 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * components will be used for reconstruction. 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2. When prediction is turned off, reconstruction is not 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * needed. Spectral components of current frame will directly 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * come from the transmitted data. 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = &win_sfb_top[0]; 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = &q_format[0]; 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = sfb_per_win; i > 0; i--) 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Check prediction flag for each scalefactor band. */ 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (*(pSfb_prediction_used++) != FALSE) 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Prediction is on. Do reconstruction routine. 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Reconstruct spectral component of current 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * frame by adding the predicted spectral 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * components and the quantized prediction 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * errors that reconstructed from transmitted 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * data when prediction is turned on. 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Set pointers to the offset of scalefactor bands */ 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_offset = pPredicted_spectral_start + 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset; 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame = ¤t_frame[sfb_offset]; 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (*pWinSfbTop - sfb_offset) is number of coefficients 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * of the scalefactor band. 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ">>2" is used to set up for later unrolling the loop. 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2; 672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Adjust pred_q_format and predicted_spectral() to 675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * maximum resolution. 676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max = 0; 678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Find the maximum absolute value */ 682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--) 683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = *(pPredicted_spectral++); 685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note: overflow is protected here even though 688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = 0x80000000 is very rare case. 689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if (tmpInt32 == LONG_MIN) 691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = LONG_MAX; 693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if (tmpInt32 < 0) 695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = -tmpInt32; 697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max |= tmpInt32 ^(tmpInt32 >> 31); 701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * IF the LTP data is all zeros 705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (max == 0) - do nothing for this sfb. 706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (max != 0) 709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Find the number of bits to reach the max resolution */ 711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt = 0; 712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (max < 0x40000000L) 714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max <<= 1; 716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt++; 717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The following codes are combinded into shift factor 721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * adjusting and reconstruction section. 722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pPredicted_spectral = pPredicted_offset; 724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * for(j = quarter_sfb_width; j>0 ; j--) 725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Adjust Q format for predicted_spectral() */ 735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber adjusted_pred_q = pred_q_format + tmpInt; 736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Adjust Q format to prevent overflow that may occur during 739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * frequency domain reconstruction. 740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = *(pQ_format) - adjusted_pred_q; 745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((shift_factor >= 0) && (shift_factor < 31)) 747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = shift_factor + 1; 749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = tmpInt - 1; 750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pred_shift >= 0) 752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated new Q format for current scalefactor band */ 789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q - 1; 790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (shift_factor >= 31) 792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated new Q format for current scalefactor band */ 806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q ; 807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if ((shift_factor < 0) && (shift_factor > -31)) 809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = 1 - shift_factor; 811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = tmpInt - shift_factor; 812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pred_shift >= 0) 814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = -pred_shift; 834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Updated new Q format for current scalefactor band 854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * This is NOT a pointer decrement 856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*pQ_format)--; 858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (max != 0) */ 861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For case (shift_factor <= -31), *pCurrent_frame and 864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *pQ_format do not need to be updated. 865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (*(pSfb_prediction_used++) != FALSE) */ 868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated to next scalefactor band. */ 870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = *(pWinSfbTop++); 871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated pointer to next scalefactor band's Q-format */ 873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format++; 874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (i = sfb_per_frame; i>0; i--) */ 876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (win_seq!=EIGHT_SHORT_SEQUENCE) */ 878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /**********************************/ 880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* LTP synthesis for short window */ 881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /**********************************/ 882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /******************************************************/ 885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*Reconstruction of current frequency domain spectrum */ 886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /******************************************************/ 887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame_start = ¤t_frame[0]; 888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format_start = &q_format[0]; 890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber num_sfb = sfb_per_win; 892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Reconstruction is processed on window basis */ 894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (wnd = 0; wnd < short_window_num; wnd++) 895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pWinSfbTop = &win_sfb_top[0]; 897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format = pQ_format_start; 899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Check if prediction flag is on for each window */ 901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (win_prediction_used[wnd] != FALSE) 902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Initialize scalefactor band offset */ 904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = 0; 905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Reconstruction is processed on scalefactor band basis. 908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 1. When prediction is turned on, all the predicted 909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * spectral components will be used for reconstruction. 910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 2. When prediction is turned off, reconstruction is 911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * not needed. Spectral components of current frame 912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * will directly come from the transmitted data. 913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * According to ISO/IEC 14496-3 pg.91 917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Only the spectral components in first eight scalefactor 918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * bands are added to the quantized prediction error. 919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = reconstruct_sfb_num; i > 0; i--) 921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Set pointer to the offset of scalefactor bands */ 923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_offset = pPredicted_spectral_start + 924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset; 925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame = pCurrent_frame_start + sfb_offset; 926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Prediction is on. Do reconstruction routine. 929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Reconstruct spectral component of 930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * current frame by adding the predicted 931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * spectral components and the quantized 932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * prediction errors that reconstructed 933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * from transmitted data when prediction 934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * is turned on. 935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * (*pWinSfbTop - sfb_offset) is number of coefficients 939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * of the scalefactor band. 940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ">>2" is used to set up for later unrolling the loop. 941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quarter_sfb_width = (*pWinSfbTop - sfb_offset) >> 2; 943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Adjust pred_q_format and predicted_spectral() to 946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * maximum resolution. 947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max = 0; 949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Find the maximum absolute value */ 952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = (*pWinSfbTop - sfb_offset); j > 0 ; j--) 953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt32 = *(pPredicted_spectral++); 955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Note: overflow is protected here even though 959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = 0x80000000 is very rare case. 960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if (tmpInt32 == LONG_MIN) 962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = LONG_MAX; 964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if (tmpInt32 < 0) 966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmpInt32 = -tmpInt32; 968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max |= tmpInt32 ^(tmpInt32 >> 31); 972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (max != 0) 975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Find the number of bits to reach 977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * the max resolution 978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt = 0; 980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (max < 0x40000000L) 982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max <<= 1; 984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmpInt++; 985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * The following codes are combined into shift factor 988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * adjusting and reconstruction section. 989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pPredicted_spectral = pPredicted_offset; 991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * for(j = quarter_sfb_width; j>0 ; j--) 992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *(pPredicted_spectral++) <<= tmpInt; 997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Adjust Q format for predicted_spectral() */ 1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber adjusted_pred_q = pred_q_format + tmpInt; 1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Adjust Q format to prevent overflow that may occur 1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * during frequency domain reconstruction. 1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral = pPredicted_offset; 1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = *(pQ_format) - adjusted_pred_q; 1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((shift_factor >= 0) && (shift_factor < 31)) 1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = shift_factor + 1; 1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = tmpInt - 1; 1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pred_shift >= 0) 1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) << pred_shift); 1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> shift_factor; 1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp 1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber + (*(pPredicted_spectral++) >> 1); 1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated new Q format for current scalefactor band*/ 1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q - 1; 1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (shift_factor >= 31) 1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = 1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pPredicted_spectral++) << tmpInt; 1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated new Q format for current scalefactor band*/ 1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = adjusted_pred_q; 1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if ((shift_factor < 0) && (shift_factor > -31)) 1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber shift_factor = 1 - shift_factor; 1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = tmpInt - shift_factor; 1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pred_shift >= 0) 1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) << pred_shift); 1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pred_shift = -pred_shift; 1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = quarter_sfb_width; j > 0 ; j--) 1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp = *pCurrent_frame >> 1; 1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pCurrent_frame++) = temp + 1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (*(pPredicted_spectral++) >> pred_shift); 1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated new Q format for current scalefactor band*/ 1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQ_format) = *(pQ_format) - 1; 1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * For case (shift_factor <= -31), *pCurrent_frame and 1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *pQ_format do not need to be updated. 1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (max != 0) */ 1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated to next scalefactor band. */ 1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sfb_offset = *(pWinSfbTop++); 1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated pointer to next scalefactor band's Q-format */ 1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format++; 1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (i = reconstruct_sfb_num; i > 0; i--) */ 1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (win_prediction_used[wnd] != FALSE) */ 1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Updated to next window */ 1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pPredicted_spectral_start += coef_per_win; 1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pCurrent_frame_start += coef_per_win; 1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQ_format_start += num_sfb; 1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for (wnd=0; wnd<short_window_num; wnd++) */ 1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* else */ 1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /*---------------------------------------------------------------------------- 1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ; Return nothing or data or data pointer 1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ----------------------------------------------------------------------------*/ 1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return; 1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* long_term_synthesis */ 1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1159