~ubuntu-branches/ubuntu/lucid/mpg123/lucid

« back to all changes in this revision

Viewing changes to src/decode_4to1.c

Tags: upstream-0.60
ImportĀ upstreamĀ versionĀ 0.60

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
        decode_4to1.c: ...with 4to1 downsampling / decoding of every 4th sample
 
3
 
 
4
        copyright 1995-2006 by the mpg123 project - free software under the terms of the LGPL 2.1
 
5
        see COPYING and AUTHORS files in distribution or http://mpg123.de
 
6
        initially written by Michael Hipp
 
7
 
 
8
        dunno why it sounds THIS annoying (maybe we should adapt the window?)
 
9
        absolutely not optimized for this operation
 
10
*/
 
11
 
 
12
#include <stdlib.h>
 
13
#include <math.h>
 
14
#include <string.h>
 
15
 
 
16
#include "config.h"
 
17
#include "mpg123.h"
 
18
 
 
19
#define WRITE_SAMPLE(samples,sum,clip) \
 
20
  if( (sum) > 32767.0) { *(samples) = 0x7fff; (clip)++; } \
 
21
  else if( (sum) < -32768.0) { *(samples) = -0x8000; (clip)++; } \
 
22
  else { *(samples) = sum; }
 
23
 
 
24
int synth_4to1_8bit(real *bandPtr,int channel,unsigned char *samples,int *pnt)
 
25
{
 
26
  short samples_tmp[16];
 
27
  short *tmp1 = samples_tmp + channel;
 
28
  int i,ret;
 
29
  int pnt1 = 0;
 
30
 
 
31
  ret = synth_4to1(bandPtr,channel,(unsigned char *) samples_tmp,&pnt1);
 
32
  samples += channel + *pnt;
 
33
 
 
34
  for(i=0;i<8;i++) {
 
35
    *samples = conv16to8[*tmp1>>AUSHIFT];
 
36
    samples += 2;
 
37
    tmp1 += 2;
 
38
  }
 
39
  *pnt += 16;
 
40
 
 
41
  return ret;
 
42
}
 
43
 
 
44
int synth_4to1_8bit_mono(real *bandPtr,unsigned char *samples,int *pnt)
 
45
{
 
46
  short samples_tmp[16];
 
47
  short *tmp1 = samples_tmp;
 
48
  int i,ret;
 
49
  int pnt1 = 0;
 
50
 
 
51
  ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
 
52
  samples += *pnt;
 
53
 
 
54
  for(i=0;i<8;i++) {
 
55
    *samples++ = conv16to8[*tmp1>>AUSHIFT];
 
56
    tmp1 += 2;
 
57
  }
 
58
  *pnt += 8;
 
59
 
 
60
  return ret;
 
61
}
 
62
 
 
63
 
 
64
int synth_4to1_8bit_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
 
65
{
 
66
  short samples_tmp[16];
 
67
  short *tmp1 = samples_tmp;
 
68
  int i,ret;
 
69
  int pnt1 = 0;
 
70
 
 
71
  ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
 
72
  samples += *pnt;
 
73
 
 
74
  for(i=0;i<8;i++) {
 
75
    *samples++ = conv16to8[*tmp1>>AUSHIFT];
 
76
    *samples++ = conv16to8[*tmp1>>AUSHIFT];
 
77
    tmp1 += 2;
 
78
  }
 
79
  *pnt += 16;
 
80
 
 
81
  return ret;
 
82
}
 
83
 
 
84
int synth_4to1_mono(real *bandPtr,unsigned char *samples,int *pnt)
 
85
{
 
86
  short samples_tmp[16];
 
87
  short *tmp1 = samples_tmp;
 
88
  int i,ret;
 
89
  int pnt1 = 0;
 
90
 
 
91
  ret = synth_4to1(bandPtr,0,(unsigned char *) samples_tmp,&pnt1);
 
92
  samples += *pnt;
 
93
 
 
94
  for(i=0;i<8;i++) {
 
95
    *( (short *)samples) = *tmp1;
 
96
    samples += 2;
 
97
    tmp1 += 2;
 
98
  }
 
99
  *pnt += 16;
 
100
 
 
101
  return ret;
 
102
}
 
103
 
 
104
int synth_4to1_mono2stereo(real *bandPtr,unsigned char *samples,int *pnt)
 
105
{
 
106
  int i,ret;
 
107
 
 
108
  ret = synth_4to1(bandPtr,0,samples,pnt);
 
109
  samples = samples + *pnt - 32;
 
110
 
 
111
  for(i=0;i<8;i++) {
 
112
    ((short *)samples)[1] = ((short *)samples)[0];
 
113
    samples+=4;
 
114
  }
 
115
 
 
116
  return ret;
 
117
}
 
118
 
 
119
int synth_4to1(real *bandPtr,int channel,unsigned char *out,int *pnt)
 
120
{
 
121
  static real buffs[2][2][0x110];
 
122
  static const int step = 2;
 
123
  static int bo = 1;
 
124
  short *samples = (short *) (out + *pnt);
 
125
 
 
126
  real *b0,(*buf)[0x110];
 
127
  int clip = 0; 
 
128
  int bo1;
 
129
 
 
130
  if(have_eq_settings)
 
131
    do_equalizer(bandPtr,channel);
 
132
 
 
133
  if(!channel) {
 
134
    bo--;
 
135
    bo &= 0xf;
 
136
    buf = buffs[0];
 
137
  }
 
138
  else {
 
139
    samples++;
 
140
    buf = buffs[1];
 
141
  }
 
142
 
 
143
  if(bo & 0x1) {
 
144
    b0 = buf[0];
 
145
    bo1 = bo;
 
146
    dct64(buf[1]+((bo+1)&0xf),buf[0]+bo,bandPtr);
 
147
  }
 
148
  else {
 
149
    b0 = buf[1];
 
150
    bo1 = bo+1;
 
151
    dct64(buf[0]+bo,buf[1]+bo+1,bandPtr);
 
152
  }
 
153
 
 
154
  {
 
155
    register int j;
 
156
    real *window = decwin + 16 - bo1;
 
157
 
 
158
    for (j=4;j;j--,b0+=0x30,window+=0x70)
 
159
    {
 
160
      real sum;
 
161
      sum  = *window++ * *b0++;
 
162
      sum -= *window++ * *b0++;
 
163
      sum += *window++ * *b0++;
 
164
      sum -= *window++ * *b0++;
 
165
      sum += *window++ * *b0++;
 
166
      sum -= *window++ * *b0++;
 
167
      sum += *window++ * *b0++;
 
168
      sum -= *window++ * *b0++;
 
169
      sum += *window++ * *b0++;
 
170
      sum -= *window++ * *b0++;
 
171
      sum += *window++ * *b0++;
 
172
      sum -= *window++ * *b0++;
 
173
      sum += *window++ * *b0++;
 
174
      sum -= *window++ * *b0++;
 
175
      sum += *window++ * *b0++;
 
176
      sum -= *window++ * *b0++;
 
177
 
 
178
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
179
#if 0
 
180
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
181
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
182
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
183
#endif
 
184
    }
 
185
 
 
186
    {
 
187
      real sum;
 
188
      sum  = window[0x0] * b0[0x0];
 
189
      sum += window[0x2] * b0[0x2];
 
190
      sum += window[0x4] * b0[0x4];
 
191
      sum += window[0x6] * b0[0x6];
 
192
      sum += window[0x8] * b0[0x8];
 
193
      sum += window[0xA] * b0[0xA];
 
194
      sum += window[0xC] * b0[0xC];
 
195
      sum += window[0xE] * b0[0xE];
 
196
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
197
#if 0
 
198
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
199
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
200
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
201
#endif
 
202
      b0-=0x40,window-=0x80;
 
203
    }
 
204
    window += bo1<<1;
 
205
 
 
206
    for (j=3;j;j--,b0-=0x50,window-=0x70)
 
207
    {
 
208
      real sum;
 
209
      sum = -*(--window) * *b0++;
 
210
      sum -= *(--window) * *b0++;
 
211
      sum -= *(--window) * *b0++;
 
212
      sum -= *(--window) * *b0++;
 
213
      sum -= *(--window) * *b0++;
 
214
      sum -= *(--window) * *b0++;
 
215
      sum -= *(--window) * *b0++;
 
216
      sum -= *(--window) * *b0++;
 
217
      sum -= *(--window) * *b0++;
 
218
      sum -= *(--window) * *b0++;
 
219
      sum -= *(--window) * *b0++;
 
220
      sum -= *(--window) * *b0++;
 
221
      sum -= *(--window) * *b0++;
 
222
      sum -= *(--window) * *b0++;
 
223
      sum -= *(--window) * *b0++;
 
224
      sum -= *(--window) * *b0++;
 
225
 
 
226
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
227
#if 0
 
228
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
229
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
230
      WRITE_SAMPLE(samples,sum,clip); samples += step;
 
231
#endif
 
232
    }
 
233
  }
 
234
  
 
235
  *pnt += 32;
 
236
 
 
237
  return clip;
 
238
}
 
239
 
 
240