comparison libaf/af_scaletempo.c @ 37108:a88581872033

scaletempo: add hack for smoother speed changes.
author reimar
date Sun, 18 May 2014 16:43:34 +0000
parents a93891202051
children
comparison
equal deleted inserted replaced
37107:3c5c93a30fb7 37108:a88581872033
331 if (frames_overlap <= 0) { 331 if (frames_overlap <= 0) {
332 s->bytes_standing = s->bytes_stride; 332 s->bytes_standing = s->bytes_stride;
333 s->samples_standing = s->bytes_standing / bps; 333 s->samples_standing = s->bytes_standing / bps;
334 s->output_overlap = NULL; 334 s->output_overlap = NULL;
335 } else { 335 } else {
336 int old_overlap = s->bytes_overlap;
336 s->samples_overlap = frames_overlap * nch; 337 s->samples_overlap = frames_overlap * nch;
337 s->bytes_overlap = frames_overlap * nch * bps; 338 s->bytes_overlap = frames_overlap * nch * bps;
338 s->bytes_standing = s->bytes_stride - s->bytes_overlap; 339 s->bytes_standing = s->bytes_stride - s->bytes_overlap;
339 s->samples_standing = s->bytes_standing / bps; 340 s->samples_standing = s->bytes_standing / bps;
340 s->buf_overlap = realloc(s->buf_overlap, s->bytes_overlap); 341 s->buf_overlap = realloc(s->buf_overlap, s->bytes_overlap);
341 s->table_blend = realloc(s->table_blend, s->bytes_overlap * 4); 342 s->table_blend = realloc(s->table_blend, s->bytes_overlap * 4);
342 if(!s->buf_overlap || !s->table_blend) { 343 if(!s->buf_overlap || !s->table_blend) {
343 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n"); 344 mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n");
344 return AF_ERROR; 345 return AF_ERROR;
345 } 346 }
346 memset(s->buf_overlap, 0, s->bytes_overlap); 347 // not necessarily correct, but keeping old data if possible
348 // avoids clicks when changing speed.
349 if (s->bytes_overlap != old_overlap)
350 memset(s->buf_overlap, 0, s->bytes_overlap);
347 if (use_int) { 351 if (use_int) {
348 int32_t* pb = s->table_blend; 352 int32_t* pb = s->table_blend;
349 int64_t blend = 0; 353 int64_t blend = 0;
350 for (i=0; i<frames_overlap; i++) { 354 for (i=0; i<frames_overlap; i++) {
351 int32_t v = blend / frames_overlap; 355 int32_t v = blend / frames_overlap;