... | ... |
@@ -101,6 +101,7 @@ AVFILTER_DEFINE_CLASS(showcqt); |
101 | 101 |
static av_cold void uninit(AVFilterContext *ctx) |
102 | 102 |
{ |
103 | 103 |
int k; |
104 |
+ |
|
104 | 105 |
ShowCQTContext *s = ctx->priv; |
105 | 106 |
av_fft_end(s->fft_context); |
106 | 107 |
s->fft_context = NULL; |
... | ... |
@@ -159,41 +160,38 @@ static int config_output(AVFilterLink *outlink) |
159 | 159 |
int rate = inlink->sample_rate; |
160 | 160 |
double max_len = rate * (double) s->timeclamp; |
161 | 161 |
int64_t start_time, end_time; |
162 |
+ |
|
162 | 163 |
s->fft_bits = ceil(log2(max_len)); |
163 | 164 |
fft_len = 1 << s->fft_bits; |
164 | 165 |
|
165 |
- if (rate % (s->fps * s->count)) |
|
166 |
- { |
|
166 |
+ if (rate % (s->fps * s->count)) { |
|
167 | 167 |
av_log(ctx, AV_LOG_ERROR, "Rate (%u) is not divisible by fps*count (%u*%u)\n", rate, s->fps, s->count); |
168 | 168 |
return AVERROR(EINVAL); |
169 | 169 |
} |
170 | 170 |
|
171 |
- s->fft_data = av_malloc_array(fft_len, sizeof(*s->fft_data)); |
|
172 |
- s->coeff_sort = av_malloc_array(fft_len, sizeof(*s->coeff_sort)); |
|
173 |
- s->fft_result_left = av_malloc_array(fft_len, sizeof(*s->fft_result_left)); |
|
171 |
+ s->fft_data = av_malloc_array(fft_len, sizeof(*s->fft_data)); |
|
172 |
+ s->coeff_sort = av_malloc_array(fft_len, sizeof(*s->coeff_sort)); |
|
173 |
+ s->fft_result_left = av_malloc_array(fft_len, sizeof(*s->fft_result_left)); |
|
174 | 174 |
s->fft_result_right = av_malloc_array(fft_len, sizeof(*s->fft_result_right)); |
175 |
- s->fft_context = av_fft_init(s->fft_bits, 0); |
|
175 |
+ s->fft_context = av_fft_init(s->fft_bits, 0); |
|
176 | 176 |
|
177 | 177 |
if (!s->fft_data || !s->coeff_sort || !s->fft_result_left || !s->fft_result_right || !s->fft_context) |
178 | 178 |
return AVERROR(ENOMEM); |
179 | 179 |
|
180 | 180 |
/* initializing font */ |
181 |
- for (x = 0; x < VIDEO_WIDTH; x++) |
|
182 |
- { |
|
183 |
- if (x >= (12*3+8)*16 && x < (12*4+8)*16) |
|
184 |
- { |
|
181 |
+ for (x = 0; x < VIDEO_WIDTH; x++) { |
|
182 |
+ if (x >= (12*3+8)*16 && x < (12*4+8)*16) { |
|
185 | 183 |
float fx = (x-(12*3+8)*16) * (1.0f/192.0f); |
186 | 184 |
float sv = sinf(M_PI*fx); |
187 | 185 |
s->font_color[x] = sv*sv*255.0f + 0.5f; |
188 |
- } |
|
189 |
- else |
|
186 |
+ } else { |
|
190 | 187 |
s->font_color[x] = 0; |
188 |
+ } |
|
191 | 189 |
} |
192 | 190 |
|
193 | 191 |
av_log(ctx, AV_LOG_INFO, "Calculating spectral kernel, please wait\n"); |
194 | 192 |
start_time = av_gettime_relative(); |
195 |
- for (k = 0; k < VIDEO_WIDTH; k++) |
|
196 |
- { |
|
193 |
+ for (k = 0; k < VIDEO_WIDTH; k++) { |
|
197 | 194 |
int hlen = fft_len >> 1; |
198 | 195 |
float total = 0; |
199 | 196 |
float partial = 0; |
... | ... |
@@ -220,8 +218,7 @@ static int config_output(AVFilterLink *outlink) |
220 | 220 |
/* also optimizing window func */ |
221 | 221 |
sw_step = sw = sin(2.0*M_PI*(1.0/tlen)); |
222 | 222 |
cw_step = cw = cos(2.0*M_PI*(1.0/tlen)); |
223 |
- for (x = 1; x < 0.5 * tlen; x++) |
|
224 |
- { |
|
223 |
+ for (x = 1; x < 0.5 * tlen; x++) { |
|
225 | 224 |
double cv_tmp, cw_tmp; |
226 | 225 |
double cw2, cw3, sw2; |
227 | 226 |
|
... | ... |
@@ -241,8 +238,7 @@ static int config_output(AVFilterLink *outlink) |
241 | 241 |
sw = sw * cw_step + cw * sw_step; |
242 | 242 |
cw = cw_tmp; |
243 | 243 |
} |
244 |
- for (; x < hlen; x++) |
|
245 |
- { |
|
244 |
+ for (; x < hlen; x++) { |
|
246 | 245 |
s->fft_data[hlen + x].re = 0; |
247 | 246 |
s->fft_data[hlen + x].im = 0; |
248 | 247 |
s->fft_data[hlen - x].re = 0; |
... | ... |
@@ -251,8 +247,7 @@ static int config_output(AVFilterLink *outlink) |
251 | 251 |
av_fft_permute(s->fft_context, s->fft_data); |
252 | 252 |
av_fft_calc(s->fft_context, s->fft_data); |
253 | 253 |
|
254 |
- for (x = 0; x < fft_len; x++) |
|
255 |
- { |
|
254 |
+ for (x = 0; x < fft_len; x++) { |
|
256 | 255 |
s->coeff_sort[x].index = x; |
257 | 256 |
s->coeff_sort[x].value = s->fft_data[x].re; |
258 | 257 |
} |
... | ... |
@@ -261,11 +256,9 @@ static int config_output(AVFilterLink *outlink) |
261 | 261 |
for (x = 0; x < fft_len; x++) |
262 | 262 |
total += fabsf(s->coeff_sort[x].value); |
263 | 263 |
|
264 |
- for (x = 0; x < fft_len; x++) |
|
265 |
- { |
|
264 |
+ for (x = 0; x < fft_len; x++) { |
|
266 | 265 |
partial += fabsf(s->coeff_sort[x].value); |
267 |
- if (partial > (total * s->coeffclamp * COEFF_CLAMP)) |
|
268 |
- { |
|
266 |
+ if (partial > total * s->coeffclamp * COEFF_CLAMP) { |
|
269 | 267 |
s->coeffs_len[k] = fft_len - x; |
270 | 268 |
num_coeffs += s->coeffs_len[k]; |
271 | 269 |
s->coeffs[k] = av_malloc_array(s->coeffs_len[k], sizeof(*s->coeffs[k])); |
... | ... |
@@ -320,8 +313,7 @@ static int plot_cqt(AVFilterLink *inlink) |
320 | 320 |
s->fft_result_right[0].im = 0; |
321 | 321 |
s->fft_result_left[0].re = 2.0f * s->fft_result_left[0].re; |
322 | 322 |
s->fft_result_left[0].im = 0; |
323 |
- for (x = 1; x <= (fft_len >> 1); x++) |
|
324 |
- { |
|
323 |
+ for (x = 1; x <= fft_len >> 1; x++) { |
|
325 | 324 |
FFTSample tmpy = s->fft_result_left[fft_len-x].im - s->fft_result_left[x].im; |
326 | 325 |
|
327 | 326 |
s->fft_result_right[x].re = s->fft_result_left[x].im + s->fft_result_left[fft_len-x].im; |
... | ... |
@@ -336,15 +328,13 @@ static int plot_cqt(AVFilterLink *inlink) |
336 | 336 |
} |
337 | 337 |
|
338 | 338 |
/* calculating cqt */ |
339 |
- for (x = 0; x < VIDEO_WIDTH; x++) |
|
340 |
- { |
|
339 |
+ for (x = 0; x < VIDEO_WIDTH; x++) { |
|
341 | 340 |
int u; |
342 | 341 |
float g = 1.0f / s->gamma; |
343 | 342 |
FFTComplex l = {0,0}; |
344 | 343 |
FFTComplex r = {0,0}; |
345 | 344 |
|
346 |
- for (u = 0; u < s->coeffs_len[x]; u++) |
|
347 |
- { |
|
345 |
+ for (u = 0; u < s->coeffs_len[x]; u++) { |
|
348 | 346 |
FFTSample value = s->coeffs[x][u].value; |
349 | 347 |
int index = s->coeffs[x][u].index; |
350 | 348 |
l.re += value * s->fft_result_left[index].re; |
... | ... |
@@ -362,16 +352,14 @@ static int plot_cqt(AVFilterLink *inlink) |
362 | 362 |
result[x][2] = 255.0f * powf(FFMIN(1.0f,result[x][2]), g); |
363 | 363 |
} |
364 | 364 |
|
365 |
- for (x = 0; x < VIDEO_WIDTH; x++) |
|
366 |
- { |
|
365 |
+ for (x = 0; x < VIDEO_WIDTH; x++) { |
|
367 | 366 |
s->spectogram[s->spectogram_index][x][0] = result[x][0] + 0.5f; |
368 | 367 |
s->spectogram[s->spectogram_index][x][1] = result[x][1] + 0.5f; |
369 | 368 |
s->spectogram[s->spectogram_index][x][2] = result[x][2] + 0.5f; |
370 | 369 |
} |
371 | 370 |
|
372 | 371 |
/* drawing */ |
373 |
- if (!s->spectogram_count) |
|
374 |
- { |
|
372 |
+ if (!s->spectogram_count) { |
|
375 | 373 |
uint8_t *data = (uint8_t*) s->outpicref->data[0]; |
376 | 374 |
int linesize = s->outpicref->linesize[0]; |
377 | 375 |
float rcp_result[VIDEO_WIDTH]; |
... | ... |
@@ -380,21 +368,16 @@ static int plot_cqt(AVFilterLink *inlink) |
380 | 380 |
rcp_result[x] = 1.0f / (result[x][3]+0.0001f); |
381 | 381 |
|
382 | 382 |
/* drawing bar */ |
383 |
- for (y = 0; y < SPECTOGRAM_HEIGHT; y++) |
|
384 |
- { |
|
383 |
+ for (y = 0; y < SPECTOGRAM_HEIGHT; y++) { |
|
385 | 384 |
float height = (SPECTOGRAM_HEIGHT - y) * (1.0f/SPECTOGRAM_HEIGHT); |
386 | 385 |
uint8_t *lineptr = data + y * linesize; |
387 |
- for (x = 0; x < VIDEO_WIDTH; x++) |
|
388 |
- { |
|
386 |
+ for (x = 0; x < VIDEO_WIDTH; x++) { |
|
389 | 387 |
float mul; |
390 |
- if (result[x][3] <= height) |
|
391 |
- { |
|
388 |
+ if (result[x][3] <= height) { |
|
392 | 389 |
*lineptr++ = 0; |
393 | 390 |
*lineptr++ = 0; |
394 | 391 |
*lineptr++ = 0; |
395 |
- } |
|
396 |
- else |
|
397 |
- { |
|
392 |
+ } else { |
|
398 | 393 |
mul = (result[x][3] - height) * rcp_result[x]; |
399 | 394 |
*lineptr++ = mul * result[x][0] + 0.5f; |
400 | 395 |
*lineptr++ = mul * result[x][1] + 0.5f; |
... | ... |
@@ -405,28 +388,22 @@ static int plot_cqt(AVFilterLink *inlink) |
405 | 405 |
} |
406 | 406 |
|
407 | 407 |
/* drawing font */ |
408 |
- for (y = 0; y < FONT_HEIGHT; y++) |
|
409 |
- { |
|
408 |
+ for (y = 0; y < FONT_HEIGHT; y++) { |
|
410 | 409 |
uint8_t *lineptr = data + (SPECTOGRAM_HEIGHT + y) * linesize; |
411 | 410 |
memcpy(lineptr, s->spectogram[s->spectogram_index], VIDEO_WIDTH*3); |
412 | 411 |
} |
413 |
- for (x = 0; x < VIDEO_WIDTH; x += VIDEO_WIDTH/10) |
|
414 |
- { |
|
412 |
+ for (x = 0; x < VIDEO_WIDTH; x += VIDEO_WIDTH/10) { |
|
415 | 413 |
int u; |
416 | 414 |
static const char str[] = "EF G A BC D "; |
417 | 415 |
uint8_t *startptr = data + SPECTOGRAM_HEIGHT * linesize + x * 3; |
418 |
- for (u = 0; str[u]; u++) |
|
419 |
- { |
|
416 |
+ for (u = 0; str[u]; u++) { |
|
420 | 417 |
int v; |
421 |
- for (v = 0; v < 16; v++) |
|
422 |
- { |
|
418 |
+ for (v = 0; v < 16; v++) { |
|
423 | 419 |
uint8_t *p = startptr + 2 * v * linesize + 16 * 3 * u; |
424 | 420 |
int ux = x + 16 * u; |
425 | 421 |
int mask; |
426 |
- for (mask = 0x80; mask; mask >>= 1) |
|
427 |
- { |
|
428 |
- if (mask & avpriv_vga16_font[str[u] * 16 + v]) |
|
429 |
- { |
|
422 |
+ for (mask = 0x80; mask; mask >>= 1) { |
|
423 |
+ if (mask & avpriv_vga16_font[str[u] * 16 + v]) { |
|
430 | 424 |
p[0] = p[linesize] = 255 - s->font_color[ux]; |
431 | 425 |
p[1] = p[linesize+1] = 0; |
432 | 426 |
p[2] = p[linesize+2] = s->font_color[ux]; |
... | ... |
@@ -443,18 +420,15 @@ static int plot_cqt(AVFilterLink *inlink) |
443 | 443 |
} |
444 | 444 |
|
445 | 445 |
/* drawing spectogram/sonogram */ |
446 |
- if (linesize == VIDEO_WIDTH * 3) |
|
447 |
- { |
|
446 |
+ if (linesize == VIDEO_WIDTH * 3) { |
|
448 | 447 |
int total_length = VIDEO_WIDTH * SPECTOGRAM_HEIGHT * 3; |
449 | 448 |
int back_length = VIDEO_WIDTH * s->spectogram_index * 3; |
450 | 449 |
data += SPECTOGRAM_START * VIDEO_WIDTH * 3; |
451 | 450 |
memcpy(data, s->spectogram[s->spectogram_index], total_length - back_length); |
452 | 451 |
data += total_length - back_length; |
453 |
- if(back_length) |
|
452 |
+ if (back_length) |
|
454 | 453 |
memcpy(data, s->spectogram[0], back_length); |
455 |
- } |
|
456 |
- else |
|
457 |
- { |
|
454 |
+ } else { |
|
458 | 455 |
for (y = 0; y < SPECTOGRAM_HEIGHT; y++) |
459 | 456 |
memcpy(data + (SPECTOGRAM_START + y) * linesize, s->spectogram[(s->spectogram_index + y) % SPECTOGRAM_HEIGHT], VIDEO_WIDTH * 3); |
460 | 457 |
} |
... | ... |
@@ -478,10 +452,8 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) |
478 | 478 |
int remaining; |
479 | 479 |
float *audio_data; |
480 | 480 |
|
481 |
- if (!insamples) |
|
482 |
- { |
|
483 |
- while (s->remaining_fill < (fft_len >> 1)) |
|
484 |
- { |
|
481 |
+ if (!insamples) { |
|
482 |
+ while (s->remaining_fill < (fft_len >> 1)) { |
|
485 | 483 |
int ret, x; |
486 | 484 |
memset(&s->fft_data[fft_len - s->remaining_fill], 0, sizeof(*s->fft_data) * s->remaining_fill); |
487 | 485 |
ret = plot_cqt(inlink); |
... | ... |
@@ -497,21 +469,17 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) |
497 | 497 |
remaining = insamples->nb_samples; |
498 | 498 |
audio_data = (float*) insamples->data[0]; |
499 | 499 |
|
500 |
- while (remaining) |
|
501 |
- { |
|
502 |
- if (remaining >= s->remaining_fill) |
|
503 |
- { |
|
500 |
+ while (remaining) { |
|
501 |
+ if (remaining >= s->remaining_fill) { |
|
504 | 502 |
int i = insamples->nb_samples - remaining; |
505 | 503 |
int j = fft_len - s->remaining_fill; |
506 | 504 |
int m, ret; |
507 |
- for (m = 0; m < s->remaining_fill; m++) |
|
508 |
- { |
|
505 |
+ for (m = 0; m < s->remaining_fill; m++) { |
|
509 | 506 |
s->fft_data[j+m].re = audio_data[2*(i+m)]; |
510 | 507 |
s->fft_data[j+m].im = audio_data[2*(i+m)+1]; |
511 | 508 |
} |
512 | 509 |
ret = plot_cqt(inlink); |
513 |
- if (ret < 0) |
|
514 |
- { |
|
510 |
+ if (ret < 0) { |
|
515 | 511 |
av_frame_free(&insamples); |
516 | 512 |
return ret; |
517 | 513 |
} |
... | ... |
@@ -519,14 +487,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *insamples) |
519 | 519 |
for (m = 0; m < fft_len-step; m++) |
520 | 520 |
s->fft_data[m] = s->fft_data[m+step]; |
521 | 521 |
s->remaining_fill = step; |
522 |
- } |
|
523 |
- else |
|
524 |
- { |
|
522 |
+ } else { |
|
525 | 523 |
int i = insamples->nb_samples - remaining; |
526 | 524 |
int j = fft_len - s->remaining_fill; |
527 | 525 |
int m; |
528 |
- for (m = 0; m < remaining; m++) |
|
529 |
- { |
|
526 |
+ for (m = 0; m < remaining; m++) { |
|
530 | 527 |
s->fft_data[m+j].re = audio_data[2*(i+m)]; |
531 | 528 |
s->fft_data[m+j].im = audio_data[2*(i+m)+1]; |
532 | 529 |
} |