Mercurial > mplayer.hg
annotate libfaad2/ssr_fb.c @ 16848:279cd50f2ba0
Switch from our own to the upstream DVD key caching strategy and directory.
Should work just as well while reducing our diff towards upstream and
enhancing compatibility with external libdvdcss implementations.
author | diego |
---|---|
date | Mon, 24 Oct 2005 09:50:42 +0000 |
parents | 2ae5ab4331ca |
children | 59b6fa5b4201 |
rev | line source |
---|---|
10725 | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | |
12527 | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
10725 | 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 ** Commercial non-GPL licensing of this software is possible. | |
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. | |
24 ** | |
14727
2ae5ab4331ca
Remove modification notice from files that have not been locally modified.
diego
parents:
12625
diff
changeset
|
25 ** $Id: ssr_fb.c,v 1.11 2004/02/26 09:29:28 menno Exp $ |
10725 | 26 **/ |
27 | |
28 #include "common.h" | |
29 #include "structs.h" | |
30 | |
31 #ifdef SSR_DEC | |
32 | |
33 #include <string.h> | |
34 #include <stdlib.h> | |
35 #include "syntax.h" | |
36 #include "filtbank.h" | |
37 #include "mdct.h" | |
38 #include "ssr_fb.h" | |
39 #include "ssr_win.h" | |
40 | |
41 fb_info *ssr_filter_bank_init(uint16_t frame_len) | |
42 { | |
43 uint16_t nshort = frame_len/8; | |
44 | |
12527 | 45 fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info)); |
10725 | 46 memset(fb, 0, sizeof(fb_info)); |
47 | |
48 /* normal */ | |
49 fb->mdct256 = faad_mdct_init(2*nshort); | |
50 fb->mdct2048 = faad_mdct_init(2*frame_len); | |
51 | |
52 fb->long_window[0] = sine_long_256; | |
53 fb->short_window[0] = sine_short_32; | |
54 fb->long_window[1] = kbd_long_256; | |
55 fb->short_window[1] = kbd_short_32; | |
56 | |
57 return fb; | |
58 } | |
59 | |
60 void ssr_filter_bank_end(fb_info *fb) | |
61 { | |
62 faad_mdct_end(fb->mdct256); | |
63 faad_mdct_end(fb->mdct2048); | |
64 | |
12527 | 65 if (fb) faad_free(fb); |
10725 | 66 } |
67 | |
68 static INLINE void imdct_ssr(fb_info *fb, real_t *in_data, | |
69 real_t *out_data, uint16_t len) | |
70 { | |
71 mdct_info *mdct; | |
72 | |
73 switch (len) | |
74 { | |
75 case 512: | |
76 mdct = fb->mdct2048; | |
77 break; | |
78 case 64: | |
79 mdct = fb->mdct256; | |
80 break; | |
81 } | |
82 | |
83 faad_imdct(mdct, in_data, out_data); | |
84 } | |
85 | |
86 /* NON-overlapping inverse filterbank for use with SSR */ | |
87 void ssr_ifilter_bank(fb_info *fb, uint8_t window_sequence, uint8_t window_shape, | |
88 uint8_t window_shape_prev, real_t *freq_in, | |
89 real_t *time_out, uint16_t frame_len) | |
90 { | |
91 int16_t i; | |
92 real_t *transf_buf; | |
93 | |
94 real_t *window_long; | |
95 real_t *window_long_prev; | |
96 real_t *window_short; | |
97 real_t *window_short_prev; | |
98 | |
99 uint16_t nlong = frame_len; | |
100 uint16_t nshort = frame_len/8; | |
101 uint16_t trans = nshort/2; | |
102 | |
103 uint16_t nflat_ls = (nlong-nshort)/2; | |
104 | |
12527 | 105 transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t)); |
10725 | 106 |
107 window_long = fb->long_window[window_shape]; | |
108 window_long_prev = fb->long_window[window_shape_prev]; | |
109 window_short = fb->short_window[window_shape]; | |
110 window_short_prev = fb->short_window[window_shape_prev]; | |
111 | |
112 switch (window_sequence) | |
113 { | |
114 case ONLY_LONG_SEQUENCE: | |
115 imdct_ssr(fb, freq_in, transf_buf, 2*nlong); | |
116 for (i = nlong-1; i >= 0; i--) | |
117 { | |
118 time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); | |
119 time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); | |
120 } | |
121 break; | |
122 | |
123 case LONG_START_SEQUENCE: | |
124 imdct_ssr(fb, freq_in, transf_buf, 2*nlong); | |
125 for (i = 0; i < nlong; i++) | |
126 time_out[i] = MUL_R_C(transf_buf[i],window_long_prev[i]); | |
127 for (i = 0; i < nflat_ls; i++) | |
128 time_out[nlong+i] = transf_buf[nlong+i]; | |
129 for (i = 0; i < nshort; i++) | |
130 time_out[nlong+nflat_ls+i] = MUL_R_C(transf_buf[nlong+nflat_ls+i],window_short[nshort-i-1]); | |
131 for (i = 0; i < nflat_ls; i++) | |
132 time_out[nlong+nflat_ls+nshort+i] = 0; | |
133 break; | |
134 | |
135 case EIGHT_SHORT_SEQUENCE: | |
136 imdct_ssr(fb, freq_in+0*nshort, transf_buf+2*nshort*0, 2*nshort); | |
137 imdct_ssr(fb, freq_in+1*nshort, transf_buf+2*nshort*1, 2*nshort); | |
138 imdct_ssr(fb, freq_in+2*nshort, transf_buf+2*nshort*2, 2*nshort); | |
139 imdct_ssr(fb, freq_in+3*nshort, transf_buf+2*nshort*3, 2*nshort); | |
140 imdct_ssr(fb, freq_in+4*nshort, transf_buf+2*nshort*4, 2*nshort); | |
141 imdct_ssr(fb, freq_in+5*nshort, transf_buf+2*nshort*5, 2*nshort); | |
142 imdct_ssr(fb, freq_in+6*nshort, transf_buf+2*nshort*6, 2*nshort); | |
143 imdct_ssr(fb, freq_in+7*nshort, transf_buf+2*nshort*7, 2*nshort); | |
144 for(i = nshort-1; i >= 0; i--) | |
145 { | |
146 time_out[i+0*nshort] = MUL_R_C(transf_buf[nshort*0+i],window_short_prev[i]); | |
147 time_out[i+1*nshort] = MUL_R_C(transf_buf[nshort*1+i],window_short[i]); | |
148 time_out[i+2*nshort] = MUL_R_C(transf_buf[nshort*2+i],window_short_prev[i]); | |
149 time_out[i+3*nshort] = MUL_R_C(transf_buf[nshort*3+i],window_short[i]); | |
150 time_out[i+4*nshort] = MUL_R_C(transf_buf[nshort*4+i],window_short_prev[i]); | |
151 time_out[i+5*nshort] = MUL_R_C(transf_buf[nshort*5+i],window_short[i]); | |
152 time_out[i+6*nshort] = MUL_R_C(transf_buf[nshort*6+i],window_short_prev[i]); | |
153 time_out[i+7*nshort] = MUL_R_C(transf_buf[nshort*7+i],window_short[i]); | |
154 time_out[i+8*nshort] = MUL_R_C(transf_buf[nshort*8+i],window_short_prev[i]); | |
155 time_out[i+9*nshort] = MUL_R_C(transf_buf[nshort*9+i],window_short[i]); | |
156 time_out[i+10*nshort] = MUL_R_C(transf_buf[nshort*10+i],window_short_prev[i]); | |
157 time_out[i+11*nshort] = MUL_R_C(transf_buf[nshort*11+i],window_short[i]); | |
158 time_out[i+12*nshort] = MUL_R_C(transf_buf[nshort*12+i],window_short_prev[i]); | |
159 time_out[i+13*nshort] = MUL_R_C(transf_buf[nshort*13+i],window_short[i]); | |
160 time_out[i+14*nshort] = MUL_R_C(transf_buf[nshort*14+i],window_short_prev[i]); | |
161 time_out[i+15*nshort] = MUL_R_C(transf_buf[nshort*15+i],window_short[i]); | |
162 } | |
163 break; | |
164 | |
165 case LONG_STOP_SEQUENCE: | |
166 imdct_ssr(fb, freq_in, transf_buf, 2*nlong); | |
167 for (i = 0; i < nflat_ls; i++) | |
168 time_out[i] = 0; | |
169 for (i = 0; i < nshort; i++) | |
170 time_out[nflat_ls+i] = MUL_R_C(transf_buf[nflat_ls+i],window_short_prev[i]); | |
171 for (i = 0; i < nflat_ls; i++) | |
172 time_out[nflat_ls+nshort+i] = transf_buf[nflat_ls+nshort+i]; | |
173 for (i = 0; i < nlong; i++) | |
174 time_out[nlong+i] = MUL_R_C(transf_buf[nlong+i],window_long[nlong-1-i]); | |
175 break; | |
176 } | |
177 | |
12527 | 178 faad_free(transf_buf); |
10725 | 179 } |
180 | |
181 | |
182 #endif |