FFmpeg
dither_template.c
Go to the documentation of this file.
1 /*
2  * This file is part of libswresample
3  *
4  * libswresample is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * libswresample is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with libswresample; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18 
19 #if defined(TEMPLATE_DITHER_DBL)
20 # define RENAME(N) N ## _double
21 # define DELEM double
22 # define CLIP(v) while(0)
23 
24 #elif defined(TEMPLATE_DITHER_FLT)
25 # define RENAME(N) N ## _float
26 # define DELEM float
27 # define CLIP(v) while(0)
28 
29 #elif defined(TEMPLATE_DITHER_S32)
30 # define RENAME(N) N ## _int32
31 # define DELEM int32_t
32 # define CLIP(v) v = FFMAX(FFMIN(v, INT32_MAX), INT32_MIN)
33 
34 #elif defined(TEMPLATE_DITHER_S16)
35 # define RENAME(N) N ## _int16
36 # define DELEM int16_t
37 # define CLIP(v) v = FFMAX(FFMIN(v, INT16_MAX), INT16_MIN)
38 
39 #else
40 ERROR
41 #endif
42 
43 void RENAME(swri_noise_shaping)(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count){
44  int pos = s->dither.ns_pos;
45  int i, j, ch;
46  int taps = s->dither.ns_taps;
47  float S = s->dither.ns_scale;
48  float S_1 = s->dither.ns_scale_1;
49 
50  av_assert2((taps&3) != 2);
51  av_assert2((taps&3) != 3 || s->dither.ns_coeffs[taps] == 0);
52 
53  for (ch=0; ch<srcs->ch_count; ch++) {
54  const float *noise = ((const float *)noises->ch[ch]) + s->dither.noise_pos;
55  const DELEM *src = (const DELEM*)srcs->ch[ch];
56  DELEM *dst = (DELEM*)dsts->ch[ch];
57  float *ns_errors = s->dither.ns_errors[ch];
58  const float *ns_coeffs = s->dither.ns_coeffs;
59  pos = s->dither.ns_pos;
60  for (i=0; i<count; i++) {
61  double d1, d = src[i]*S_1;
62  for(j=0; j<taps-2; j+=4) {
63  d -= ns_coeffs[j ] * ns_errors[pos + j ]
64  +ns_coeffs[j + 1] * ns_errors[pos + j + 1]
65  +ns_coeffs[j + 2] * ns_errors[pos + j + 2]
66  +ns_coeffs[j + 3] * ns_errors[pos + j + 3];
67  }
68  if(j < taps)
69  d -= ns_coeffs[j] * ns_errors[pos + j];
70  pos = pos ? pos - 1 : taps - 1;
71  d1 = rint(d + noise[i]);
72  ns_errors[pos + taps] = ns_errors[pos] = d1 - d;
73  d1 *= S;
74  CLIP(d1);
75  dst[i] = d1;
76  }
77  }
78 
79  s->dither.ns_pos = pos;
80 }
81 
82 #undef RENAME
83 #undef DELEM
84 #undef CLIP
S
#define S(s, c, i)
Definition: flacdsp_template.c:46
AudioData
Definition: swresample_internal.h:45
s
#define s(width, name)
Definition: cbs_vp9.c:257
SwrContext
The libswresample context.
Definition: swresample_internal.h:95
rint
#define rint
Definition: tablegen.h:41
ERROR
static void ERROR(const char *str)
Definition: audio_fifo.c:58
src
#define src
Definition: vp8dsp.c:255
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:64
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:271
RENAME
#define RENAME(name)
Definition: ffv1.h:195
pos
unsigned int pos
Definition: spdifenc.c:412
noise
static int noise(AVBSFContext *ctx, AVPacket *pkt)
Definition: noise_bsf.c:121
CLIP
@ CLIP
Definition: qdrw.c:36
d
d
Definition: ffmpeg_filter.c:153