blob: b4bbd65b9341b8cfd32861ba72e278ff66226eae [file] [log] [blame]
xingri.gaoc18d4472023-02-28 02:51:02 +00001/*
2** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com
4**
5** This program is free software; you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation; either version 2 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program; if not, write to the Free Software
17** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18**
19** Any non-GPL usage of this software or parts of this software is strictly
20** forbidden.
21**
22** The "appropriate copyright message" mentioned in section 2c of the GPLv2
23** must read: "Code from FAAD2 is copyright (c) Nero AG, www.nero.com"
24**
25** Commercial non-GPL licensing of this software is possible.
26** For more info contact Nero AG through Mpeg4AAClicense@nero.com.
27**
28** $Id: lt_predict.c,v 1.27 2007/11/01 12:33:31 menno Exp $
29**/
30
31
32#include "common.h"
33#include "structs.h"
34
35#ifdef LTP_DEC
36
37#include "syntax.h"
38#include "lt_predict.h"
39#include "filtbank.h"
40#include "tns.h"
41
42
43/* static function declarations */
44static int16_t real_to_int16(real_t sig_in);
45
46
47/* check if the object type is an object type that can have LTP */
48uint8_t is_ltp_ot(uint8_t object_type)
49{
50#ifdef LTP_DEC
51 if ((object_type == LTP)
52#ifdef ERROR_RESILIENCE
53 || (object_type == ER_LTP)
54#endif
55#ifdef LD_DEC
56 || (object_type == LD)
57#endif
58 ) {
59 return 1;
60 }
61#endif
62
63 return 0;
64}
65
66ALIGN static const real_t codebook[8] = {
67 REAL_CONST(0.570829),
68 REAL_CONST(0.696616),
69 REAL_CONST(0.813004),
70 REAL_CONST(0.911304),
71 REAL_CONST(0.984900),
72 REAL_CONST(1.067894),
73 REAL_CONST(1.194601),
74 REAL_CONST(1.369533)
75};
76
77void lt_prediction(ic_stream *ics, ltp_info *ltp, real_t *spec,
78 int16_t *lt_pred_stat, fb_info *fb, uint8_t win_shape,
79 uint8_t win_shape_prev, uint8_t sr_index,
80 uint8_t object_type, uint16_t frame_len)
81{
82 uint8_t sfb;
83 uint16_t bin, i, num_samples;
yuliang.hu77fab5b2024-07-19 18:32:11 +080084 ALIGN static real_t x_est[2048];
85 ALIGN static real_t X_est[2048];
86 memset(x_est, 0, sizeof(x_est));
87 memset(X_est, 0, sizeof(X_est));
xingri.gaoc18d4472023-02-28 02:51:02 +000088
89 if (ics->window_sequence != EIGHT_SHORT_SEQUENCE) {
90 if (ltp->data_present) {
91 num_samples = frame_len << 1;
92
93 for (i = 0; i < num_samples; i++) {
94 /* The extra lookback M (N/2 for LD, 0 for LTP) is handled
95 in the buffer updating */
96
97#if 0
98 x_est[i] = MUL_R_C(lt_pred_stat[num_samples + i - ltp->lag],
99 codebook[ltp->coef]);
100#else
101 /* lt_pred_stat is a 16 bit int, multiplied with the fixed point real
102 this gives a real for x_est
103 */
104 x_est[i] = (real_t)lt_pred_stat[num_samples + i - ltp->lag] * codebook[ltp->coef];
105#endif
106 }
107
108 filter_bank_ltp(fb, ics->window_sequence, win_shape, win_shape_prev,
109 x_est, X_est, object_type, frame_len);
110
111 tns_encode_frame(ics, &(ics->tns), sr_index, object_type, X_est,
112 frame_len);
113
114 for (sfb = 0; sfb < ltp->last_band; sfb++) {
115 if (ltp->long_used[sfb]) {
116 uint16_t low = ics->swb_offset[sfb];
117 uint16_t high = min(ics->swb_offset[sfb + 1], ics->swb_offset_max);
118
119 for (bin = low; bin < high; bin++) {
120 spec[bin] += X_est[bin];
121 }
122 }
123 }
124 }
125 }
126}
127
128#ifdef FIXED_POINT
129static INLINE int16_t real_to_int16(real_t sig_in)
130{
131 if (sig_in >= 0) {
132 sig_in += (1 << (REAL_BITS - 1));
133 if (sig_in >= REAL_CONST(32768)) {
134 return 32767;
135 }
136 } else {
137 sig_in += -(1 << (REAL_BITS - 1));
138 if (sig_in <= REAL_CONST(-32768)) {
139 return -32768;
140 }
141 }
142
143 return (sig_in >> REAL_BITS);
144}
145#else
146static INLINE int16_t real_to_int16(real_t sig_in)
147{
148 if (sig_in >= 0) {
149#ifndef HAS_LRINTF
150 sig_in += 0.5f;
151#endif
152 if (sig_in >= 32768.0f) {
153 return 32767;
154 }
155 } else {
156#ifndef HAS_LRINTF
157 sig_in += -0.5f;
158#endif
159 if (sig_in <= -32768.0f) {
160 return -32768;
161 }
162 }
163
164 return lrintf(sig_in);
165}
166#endif
167
168void lt_update_state(int16_t *lt_pred_stat, real_t *time, real_t *overlap,
169 uint16_t frame_len, uint8_t object_type)
170{
171 uint16_t i;
172
173 /*
174 * The reference point for index i and the content of the buffer
175 * lt_pred_stat are arranged so that lt_pred_stat(0 ... N/2 - 1) contains the
176 * last aliased half window from the IMDCT, and lt_pred_stat(N/2 ... N-1)
177 * is always all zeros. The rest of lt_pred_stat (i<0) contains the previous
178 * fully reconstructed time domain samples, i.e., output of the decoder.
179 *
180 * These values are shifted up by N*2 to avoid (i<0)
181 *
182 * For the LD object type an extra 512 samples lookback is accomodated here.
183 */
184#ifdef LD_DEC
185 if (object_type == LD) {
186 for (i = 0; i < frame_len; i++) {
187 lt_pred_stat[i] /* extra 512 */ = lt_pred_stat[i + frame_len];
188 lt_pred_stat[frame_len + i] = lt_pred_stat[i + (frame_len * 2)];
189 lt_pred_stat[(frame_len * 2) + i] = real_to_int16(time[i]);
190 lt_pred_stat[(frame_len * 3) + i] = real_to_int16(overlap[i]);
191 }
192 } else {
193#endif
194 for (i = 0; i < frame_len; i++) {
195 lt_pred_stat[i] = lt_pred_stat[i + frame_len];
196 lt_pred_stat[frame_len + i] = real_to_int16(time[i]);
197 lt_pred_stat[(frame_len * 2) + i] = real_to_int16(overlap[i]);
198#if 0 /* set to zero once upon initialisation */
199 lt_pred_stat[(frame_len * 3) + i] = 0;
200#endif
201 }
202#ifdef LD_DEC
203 }
204#endif
205}
206
207#endif