annotate ffmpeg/libswresample/dither_template.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
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