~ubuntu-branches/debian/wheezy/vlc/wheezy

« back to all changes in this revision

Viewing changes to extras/faad2/libfaad/ssr_fb.c

Tags: upstream-0.7.2.final
ImportĀ upstreamĀ versionĀ 0.7.2.final

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
 
3
** Copyright (C) 2003-2004 M. Bakker, Ahead Software 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
** Commercial non-GPL licensing of this software is possible.
 
23
** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
 
24
**
 
25
** $Id: ssr_fb.c,v 1.10 2004/01/05 14:05:12 menno Exp $
 
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
 
 
45
    fb_info *fb = (fb_info*)faad_malloc(sizeof(fb_info));
 
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
 
 
65
    if (fb) faad_free(fb);
 
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
 
 
105
    transf_buf = (real_t*)faad_malloc(2*nlong*sizeof(real_t));
 
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
 
 
178
    faad_free(transf_buf);
 
179
}
 
180
 
 
181
 
 
182
#endif