History

avfilter/af_afir: refactor crossfade code

Paul B Mahol committed 2 years ago

Commit 6579d951 parent bbdd6042 files · +52 −88Browse files

Unified · Split

2 files
  1. libavfilter/af_afir.c +2 −88
  2. libavfilter/afir_template.c +50 −0
libavfilter/af_afir.c+2−88
@@ -63,96 +63,10 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch) · 62 unmodified lines
63 for (int offset = 0; offset < out->nb_samples; offset += min_part_size) {63 for (int offset = 0; offset < out->nb_samples; offset += min_part_size) {
64 switch (s->format) {64 switch (s->format) {
65 case AV_SAMPLE_FMT_FLTP:65 case AV_SAMPLE_FMT_FLTP:
66 if (ctx->is_disabled || s->prev_is_disabled) {66 fir_quantums_float(ctx, s, out, min_part_size, ch, offset, prev_selir, selir);
67 const float *in = (const float *)s->in->extended_data[ch] + offset;
68 const float *xfade0 = (const float *)s->xfade[0]->extended_data[ch];
69 const float *xfade1 = (const float *)s->xfade[1]->extended_data[ch];
70 float *src0 = (float *)s->fadein[0]->extended_data[ch];
71 float *src1 = (float *)s->fadein[1]->extended_data[ch];
72 float *dst = ((float *)out->extended_data[ch]) + offset;
73
74 if (ctx->is_disabled && !s->prev_is_disabled) {
75 memset(src0, 0, min_part_size * sizeof(float));
76 fir_quantum_float(ctx, s->fadein[0], ch, offset, 0, selir);
77 for (int n = 0; n < min_part_size; n++)
78 dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
79 } else if (!ctx->is_disabled && s->prev_is_disabled) {
80 memset(src1, 0, min_part_size * sizeof(float));
81 fir_quantum_float(ctx, s->fadein[1], ch, offset, 0, selir);
82 for (int n = 0; n < min_part_size; n++)
83 dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
84 } else {
85 memcpy(dst, in, sizeof(float) * min_part_size);
86 }
87 } else if (prev_selir != selir && s->loading[ch] != 0) {
88 const float *xfade0 = (const float *)s->xfade[0]->extended_data[ch];
89 const float *xfade1 = (const float *)s->xfade[1]->extended_data[ch];
90 float *src0 = (float *)s->fadein[0]->extended_data[ch];
91 float *src1 = (float *)s->fadein[1]->extended_data[ch];
92 float *dst = ((float *)out->extended_data[ch]) + offset;
93
94 memset(src0, 0, min_part_size * sizeof(float));
95 memset(src1, 0, min_part_size * sizeof(float));
96
97 fir_quantum_float(ctx, s->fadein[0], ch, offset, 0, prev_selir);
98 fir_quantum_float(ctx, s->fadein[1], ch, offset, 0, selir);
99
100 if (s->loading[ch] > s->max_offset[selir]) {
101 for (int n = 0; n < min_part_size; n++)
102 dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
103 s->loading[ch] = 0;
104 } else {
105 memcpy(dst, src0, min_part_size * sizeof(float));
106 }
107 } else {
108 fir_quantum_float(ctx, out, ch, offset, offset, selir);
109 }
110 break;67 break;
111 case AV_SAMPLE_FMT_DBLP:68 case AV_SAMPLE_FMT_DBLP:
112 if (ctx->is_disabled || s->prev_is_disabled) {69 fir_quantums_double(ctx, s, out, min_part_size, ch, offset, prev_selir, selir);
113 const double *in = (const double *)s->in->extended_data[ch] + offset;
114 const double *xfade0 = (const double *)s->xfade[0]->extended_data[ch];
115 const double *xfade1 = (const double *)s->xfade[1]->extended_data[ch];
116 double *src0 = (double *)s->fadein[0]->extended_data[ch];
117 double *src1 = (double *)s->fadein[1]->extended_data[ch];
118 double *dst = ((double *)out->extended_data[ch]) + offset;
119
120 if (ctx->is_disabled && !s->prev_is_disabled) {
121 memset(src0, 0, min_part_size * sizeof(double));
122 fir_quantum_double(ctx, s->fadein[0], ch, offset, 0, selir);
123 for (int n = 0; n < min_part_size; n++)
124 dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
125 } else if (!ctx->is_disabled && s->prev_is_disabled) {
126 memset(src1, 0, min_part_size * sizeof(double));
127 fir_quantum_double(ctx, s->fadein[1], ch, offset, 0, selir);
128 for (int n = 0; n < min_part_size; n++)
129 dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
130 } else {
131 memcpy(dst, in, sizeof(double) * min_part_size);
132 }
133 } else if (prev_selir != selir && s->loading[ch] != 0) {
134 const double *xfade0 = (const double *)s->xfade[0]->extended_data[ch];
135 const double *xfade1 = (const double *)s->xfade[1]->extended_data[ch];
136 double *src0 = (double *)s->fadein[0]->extended_data[ch];
137 double *src1 = (double *)s->fadein[1]->extended_data[ch];
138 double *dst = ((double *)out->extended_data[ch]) + offset;
139
140 memset(src0, 0, min_part_size * sizeof(double));
141 memset(src1, 0, min_part_size * sizeof(double));
142
143 fir_quantum_double(ctx, s->fadein[0], ch, offset, 0, prev_selir);
144 fir_quantum_double(ctx, s->fadein[1], ch, offset, 0, selir);
145
146 if (s->loading[ch] > s->max_offset[selir]) {
147 for (int n = 0; n < min_part_size; n++)
148 dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
149 s->loading[ch] = 0;
150 } else {
151 memcpy(dst, src0, min_part_size * sizeof(double));
152 }
153 } else {
154 fir_quantum_double(ctx, out, ch, offset, offset, selir);
155 }
156 break;70 break;
157 }71 }
158 72
libavfilter/afir_template.c+50−0
@@ -242,3 +242,53 @@ static int fn(fir_quantum)(AVFilterContext *ctx, AVFrame *out, int ch, int ioffs · 241 unmodified lines
242 242
243 return 0;243 return 0;
244}244}
245
246static void fn(fir_quantums)(AVFilterContext *ctx, AudioFIRContext *s, AVFrame *out,
247 int min_part_size, int ch, int offset,
248 int prev_selir, int selir)
249{
250 if (ctx->is_disabled || s->prev_is_disabled) {
251 const ftype *in = (const ftype *)s->in->extended_data[ch] + offset;
252 const ftype *xfade0 = (const ftype *)s->xfade[0]->extended_data[ch];
253 const ftype *xfade1 = (const ftype *)s->xfade[1]->extended_data[ch];
254 ftype *src0 = (ftype *)s->fadein[0]->extended_data[ch];
255 ftype *src1 = (ftype *)s->fadein[1]->extended_data[ch];
256 ftype *dst = ((ftype *)out->extended_data[ch]) + offset;
257
258 if (ctx->is_disabled && !s->prev_is_disabled) {
259 memset(src0, 0, min_part_size * sizeof(ftype));
260 fn(fir_quantum)(ctx, s->fadein[0], ch, offset, 0, selir);
261 for (int n = 0; n < min_part_size; n++)
262 dst[n] = xfade1[n] * src0[n] + xfade0[n] * in[n];
263 } else if (!ctx->is_disabled && s->prev_is_disabled) {
264 memset(src1, 0, min_part_size * sizeof(ftype));
265 fn(fir_quantum)(ctx, s->fadein[1], ch, offset, 0, selir);
266 for (int n = 0; n < min_part_size; n++)
267 dst[n] = xfade1[n] * in[n] + xfade0[n] * src1[n];
268 } else {
269 memcpy(dst, in, sizeof(ftype) * min_part_size);
270 }
271 } else if (prev_selir != selir && s->loading[ch] != 0) {
272 const ftype *xfade0 = (const ftype *)s->xfade[0]->extended_data[ch];
273 const ftype *xfade1 = (const ftype *)s->xfade[1]->extended_data[ch];
274 ftype *src0 = (ftype *)s->fadein[0]->extended_data[ch];
275 ftype *src1 = (ftype *)s->fadein[1]->extended_data[ch];
276 ftype *dst = ((ftype *)out->extended_data[ch]) + offset;
277
278 memset(src0, 0, min_part_size * sizeof(ftype));
279 memset(src1, 0, min_part_size * sizeof(ftype));
280
281 fn(fir_quantum)(ctx, s->fadein[0], ch, offset, 0, prev_selir);
282 fn(fir_quantum)(ctx, s->fadein[1], ch, offset, 0, selir);
283
284 if (s->loading[ch] > s->max_offset[selir]) {
285 for (int n = 0; n < min_part_size; n++)
286 dst[n] = xfade1[n] * src0[n] + xfade0[n] * src1[n];
287 s->loading[ch] = 0;
288 } else {
289 memcpy(dst, src0, min_part_size * sizeof(ftype));
290 }
291 } else {
292 fn(fir_quantum)(ctx, out, ch, offset, offset, selir);
293 }
294}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t