yading@11
|
1
|
yading@11
|
2 #if defined(TEMPLATE_DITHER_DBL)
|
yading@11
|
3 # define RENAME(N) N ## _double
|
yading@11
|
4 # define DELEM double
|
yading@11
|
5 # define CLIP(v)
|
yading@11
|
6
|
yading@11
|
7 #elif defined(TEMPLATE_DITHER_FLT)
|
yading@11
|
8 # define RENAME(N) N ## _float
|
yading@11
|
9 # define DELEM float
|
yading@11
|
10 # define CLIP(v)
|
yading@11
|
11
|
yading@11
|
12 #elif defined(TEMPLATE_DITHER_S32)
|
yading@11
|
13 # define RENAME(N) N ## _int32
|
yading@11
|
14 # define DELEM int32_t
|
yading@11
|
15 # define CLIP(v) v = FFMAX(FFMIN(v, INT32_MAX), INT32_MIN)
|
yading@11
|
16
|
yading@11
|
17 #elif defined(TEMPLATE_DITHER_S16)
|
yading@11
|
18 # define RENAME(N) N ## _int16
|
yading@11
|
19 # define DELEM int16_t
|
yading@11
|
20 # define CLIP(v) v = FFMAX(FFMIN(v, INT16_MAX), INT16_MIN)
|
yading@11
|
21
|
yading@11
|
22 #else
|
yading@11
|
23 ERROR
|
yading@11
|
24 #endif
|
yading@11
|
25
|
yading@11
|
26 void RENAME(swri_noise_shaping)(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count){
|
yading@11
|
27 int pos = s->dither.ns_pos;
|
yading@11
|
28 int i, j, ch;
|
yading@11
|
29 int taps = s->dither.ns_taps;
|
yading@11
|
30 float S = s->dither.ns_scale;
|
yading@11
|
31 float S_1 = s->dither.ns_scale_1;
|
yading@11
|
32
|
yading@11
|
33 av_assert2((taps&3) != 2);
|
yading@11
|
34 av_assert2((taps&3) != 3 || s->dither.ns_coeffs[taps] == 0);
|
yading@11
|
35
|
yading@11
|
36 for (ch=0; ch<srcs->ch_count; ch++) {
|
yading@11
|
37 const float *noise = ((const float *)noises->ch[ch]) + s->dither.noise_pos;
|
yading@11
|
38 const DELEM *src = (const DELEM*)srcs->ch[ch];
|
yading@11
|
39 DELEM *dst = (DELEM*)dsts->ch[ch];
|
yading@11
|
40 float *ns_errors = s->dither.ns_errors[ch];
|
yading@11
|
41 const float *ns_coeffs = s->dither.ns_coeffs;
|
yading@11
|
42 pos = s->dither.ns_pos;
|
yading@11
|
43 for (i=0; i<count; i++) {
|
yading@11
|
44 double d1, d = src[i]*S_1;
|
yading@11
|
45 for(j=0; j<taps-2; j+=4) {
|
yading@11
|
46 d -= ns_coeffs[j ] * ns_errors[pos + j ]
|
yading@11
|
47 +ns_coeffs[j + 1] * ns_errors[pos + j + 1]
|
yading@11
|
48 +ns_coeffs[j + 2] * ns_errors[pos + j + 2]
|
yading@11
|
49 +ns_coeffs[j + 3] * ns_errors[pos + j + 3];
|
yading@11
|
50 }
|
yading@11
|
51 if(j < taps)
|
yading@11
|
52 d -= ns_coeffs[j] * ns_errors[pos + j];
|
yading@11
|
53 pos = pos ? pos - 1 : taps - 1;
|
yading@11
|
54 d1 = rint(d + noise[i]);
|
yading@11
|
55 ns_errors[pos + taps] = ns_errors[pos] = d1 - d;
|
yading@11
|
56 d1 *= S;
|
yading@11
|
57 CLIP(d1);
|
yading@11
|
58 dst[i] = d1;
|
yading@11
|
59 }
|
yading@11
|
60 }
|
yading@11
|
61
|
yading@11
|
62 s->dither.ns_pos = pos;
|
yading@11
|
63 }
|
yading@11
|
64
|
yading@11
|
65 #undef RENAME
|
yading@11
|
66 #undef DELEM
|
yading@11
|
67 #undef CLIP
|