~ubuntu-branches/ubuntu/maverick/blender/maverick

« back to all changes in this revision

Viewing changes to extern/fftw/dft/ct.c

  • Committer: Bazaar Package Importer
  • Author(s): Khashayar Naderehvandi, Khashayar Naderehvandi, Alessio Treglia
  • Date: 2009-01-22 16:53:59 UTC
  • mfrom: (14.1.1 experimental)
  • Revision ID: james.westby@ubuntu.com-20090122165359-v0996tn7fbit64ni
Tags: 2.48a+dfsg-1ubuntu1
[ Khashayar Naderehvandi ]
* Merge from debian experimental (LP: #320045), Ubuntu remaining changes:
  - Add patch correcting header file locations.
  - Add libvorbis-dev and libgsm1-dev to Build-Depends.
  - Use avcodec_decode_audio2() in source/blender/src/hddaudio.c

[ Alessio Treglia ]
* Add missing previous changelog entries.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (c) 2003, 2006 Matteo Frigo
 
3
 * Copyright (c) 2003, 2006 Massachusetts Institute of Technology
 
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
 */
 
20
 
 
21
/* $Id: ct.c,v 1.52 2006-01-27 02:10:50 athena Exp $ */
 
22
 
 
23
#include "ct.h"
 
24
 
 
25
ct_solver *(*X(mksolver_ct_hook))(size_t, INT, int, ct_mkinferior) = 0;
 
26
 
 
27
typedef struct {
 
28
     plan_dft super;
 
29
     plan *cld;
 
30
     plan *cldw;
 
31
     INT r;
 
32
} P;
 
33
 
 
34
static void apply_dit(const plan *ego_, R *ri, R *ii, R *ro, R *io)
 
35
{
 
36
     const P *ego = (const P *) ego_;
 
37
     plan_dft *cld;
 
38
     plan_dftw *cldw;
 
39
 
 
40
     cld = (plan_dft *) ego->cld;
 
41
     cld->apply(ego->cld, ri, ii, ro, io);
 
42
 
 
43
     cldw = (plan_dftw *) ego->cldw;
 
44
     cldw->apply(ego->cldw, ro, io);
 
45
}
 
46
 
 
47
static void apply_dif(const plan *ego_, R *ri, R *ii, R *ro, R *io)
 
48
{
 
49
     const P *ego = (const P *) ego_;
 
50
     plan_dft *cld;
 
51
     plan_dftw *cldw;
 
52
 
 
53
     cldw = (plan_dftw *) ego->cldw;
 
54
     cldw->apply(ego->cldw, ri, ii);
 
55
 
 
56
     cld = (plan_dft *) ego->cld;
 
57
     cld->apply(ego->cld, ri, ii, ro, io);
 
58
}
 
59
 
 
60
static void awake(plan *ego_, enum wakefulness wakefulness)
 
61
{
 
62
     P *ego = (P *) ego_;
 
63
     X(plan_awake)(ego->cld, wakefulness);
 
64
     X(plan_awake)(ego->cldw, wakefulness);
 
65
}
 
66
 
 
67
static void destroy(plan *ego_)
 
68
{
 
69
     P *ego = (P *) ego_;
 
70
     X(plan_destroy_internal)(ego->cldw);
 
71
     X(plan_destroy_internal)(ego->cld);
 
72
}
 
73
 
 
74
static void print(const plan *ego_, printer *p)
 
75
{
 
76
     const P *ego = (const P *) ego_;
 
77
     p->print(p, "(dft-ct-%s/%D%(%p%)%(%p%))",
 
78
              ego->super.apply == apply_dit ? "dit" : "dif",
 
79
              ego->r, ego->cldw, ego->cld);
 
80
}
 
81
 
 
82
static int applicable0(const ct_solver *ego, const problem *p_, planner *plnr)
 
83
{
 
84
     const problem_dft *p = (const problem_dft *) p_;
 
85
     INT r;
 
86
 
 
87
     return (1
 
88
             && p->sz->rnk == 1
 
89
             && p->vecsz->rnk <= 1 
 
90
 
 
91
             /* DIF destroys the input and we don't like it */
 
92
             && (ego->dec == DECDIT || 
 
93
                 p->ri == p->ro || 
 
94
                 !NO_DESTROY_INPUTP(plnr))
 
95
                  
 
96
             && ((r = X(choose_radix)(ego->r, p->sz->dims[0].n)) > 1)
 
97
             && p->sz->dims[0].n > r);
 
98
}
 
99
 
 
100
 
 
101
int X(ct_applicable)(const ct_solver *ego, const problem *p_, planner *plnr)
 
102
{
 
103
     const problem_dft *p;
 
104
 
 
105
     if (!applicable0(ego, p_, plnr))
 
106
          return 0;
 
107
 
 
108
     p = (const problem_dft *) p_;
 
109
 
 
110
     /* emulate fftw2 behavior */
 
111
     if (NO_VRECURSEP(plnr) && (p->vecsz->rnk > 0))
 
112
          return 0;
 
113
 
 
114
     return 1;
 
115
}
 
116
 
 
117
 
 
118
static plan *mkplan(const solver *ego_, const problem *p_, planner *plnr)
 
119
{
 
120
     const ct_solver *ego = (const ct_solver *) ego_;
 
121
     const problem_dft *p;
 
122
     P *pln = 0;
 
123
     plan *cld = 0, *cldw = 0;
 
124
     INT n, r, m, vl, ivs, ovs;
 
125
     iodim *d;
 
126
     tensor *t1, *t2;
 
127
 
 
128
     static const plan_adt padt = {
 
129
          X(dft_solve), awake, print, destroy
 
130
     };
 
131
 
 
132
     if ((NO_NONTHREADEDP(plnr)) || !X(ct_applicable)(ego, p_, plnr))
 
133
          return (plan *) 0;
 
134
 
 
135
     p = (const problem_dft *) p_;
 
136
     d = p->sz->dims;
 
137
     n = d[0].n;
 
138
     r = X(choose_radix)(ego->r, n);
 
139
     m = n / r;
 
140
 
 
141
     X(tensor_tornk1)(p->vecsz, &vl, &ivs, &ovs);
 
142
 
 
143
     switch (ego->dec) {
 
144
         case DECDIT:
 
145
         {
 
146
              cldw = ego->mkcldw(ego, 
 
147
                                 DECDIT, r, m, d[0].os, vl, ovs, 0, m,
 
148
                                 p->ro, p->io, plnr);
 
149
              if (!cldw) goto nada;
 
150
 
 
151
              t1 = X(mktensor_1d)(r, d[0].is, m * d[0].os);
 
152
              t2 = X(tensor_append)(t1, p->vecsz);
 
153
              X(tensor_destroy)(t1);
 
154
 
 
155
              cld = X(mkplan_d)(plnr, 
 
156
                                X(mkproblem_dft_d)(
 
157
                                     X(mktensor_1d)(m, r * d[0].is, d[0].os),
 
158
                                     t2, p->ri, p->ii, p->ro, p->io)
 
159
                   );
 
160
              if (!cld) goto nada;
 
161
 
 
162
              pln = MKPLAN_DFT(P, &padt, apply_dit);
 
163
              break;
 
164
         }
 
165
         case DECDIF:
 
166
         {
 
167
              cldw = ego->mkcldw(ego,
 
168
                                 DECDIF, r, m, d[0].is, vl, ivs, 0, m,
 
169
                                 p->ri, p->ii, plnr);
 
170
              if (!cldw) goto nada;
 
171
 
 
172
              t1 = X(mktensor_1d)(r, m * d[0].is, d[0].os);
 
173
              t2 = X(tensor_append)(t1, p->vecsz);
 
174
              X(tensor_destroy)(t1);
 
175
 
 
176
              cld = X(mkplan_d)(plnr, 
 
177
                                X(mkproblem_dft_d)(
 
178
                                     X(mktensor_1d)(m, d[0].is, r * d[0].os),
 
179
                                     t2, p->ri, p->ii, p->ro, p->io)
 
180
                   );
 
181
              if (!cld) goto nada;
 
182
              
 
183
              pln = MKPLAN_DFT(P, &padt, apply_dif);
 
184
              break;
 
185
         }
 
186
 
 
187
         default: A(0);
 
188
              
 
189
     }
 
190
 
 
191
     pln->cld = cld;
 
192
     pln->cldw = cldw;
 
193
     pln->r = r;
 
194
     X(ops_add)(&cld->ops, &cldw->ops, &pln->super.super.ops);
 
195
 
 
196
     /* inherit could_prune_now_p attribute from cldw */
 
197
     pln->super.super.could_prune_now_p = cldw->could_prune_now_p;
 
198
     return &(pln->super.super);
 
199
 
 
200
 nada:
 
201
     X(plan_destroy_internal)(cldw);
 
202
     X(plan_destroy_internal)(cld);
 
203
     return (plan *) 0;
 
204
}
 
205
 
 
206
ct_solver *X(mksolver_ct)(size_t size, INT r, int dec, ct_mkinferior mkcldw)
 
207
{
 
208
     static const solver_adt sadt = { PROBLEM_DFT, mkplan };
 
209
     ct_solver *slv = (ct_solver *)X(mksolver)(size, &sadt);
 
210
     slv->r = r;
 
211
     slv->dec = dec;
 
212
     slv->mkcldw = mkcldw;
 
213
     return slv;
 
214
}
 
215
 
 
216
plan *X(mkplan_dftw)(size_t size, const plan_adt *adt, dftwapply apply)
 
217
{
 
218
     plan_dftw *ego;
 
219
 
 
220
     ego = (plan_dftw *) X(mkplan)(size, adt);
 
221
     ego->apply = apply;
 
222
 
 
223
     return &(ego->super);
 
224
}