FFmpeg
Classes | Macros | Typedefs | Enumerations | Functions | Variables
af_atempo.c File Reference

tempo scaling audio filter – an implementation of WSOLA algorithm More...

#include <float.h>
#include "libavcodec/avfft.h"
#include "libavutil/avassert.h"
#include "libavutil/avstring.h"
#include "libavutil/channel_layout.h"
#include "libavutil/eval.h"
#include "libavutil/opt.h"
#include "libavutil/samplefmt.h"
#include "avfilter.h"
#include "audio.h"
#include "internal.h"

Classes

struct  AudioFragment
 A fragment of audio waveform. More...
 
struct  ATempoContext
 Filter state machine. More...
 

Macros

#define OFFSET(x)   offsetof(ATempoContext, x)
 
#define RE_MALLOC_OR_FAIL(field, field_size)
 
#define yae_init_xdat(scalar_type, scalar_max)
 A helper macro for initializing complex data buffer with scalar data of a given type.
 
#define yae_blend(scalar_type)
 A helper macro for blending the overlap region of previous and current audio fragment. More...
 

Typedefs

typedef struct AudioFragment AudioFragment
 A fragment of audio waveform.
 
typedef struct ATempoContext ATempoContext
 Filter state machine.
 

Enumerations

enum  FilterState {
  YAE_LOAD_FRAGMENT, YAE_ADJUST_POSITION, YAE_RELOAD_FRAGMENT, YAE_OUTPUT_OVERLAP_ADD,
  YAE_FLUSH_OUTPUT
}
 Filter state machine states.
 

Functions

 AVFILTER_DEFINE_CLASS (atempo)
 

Variables

AVFilter ff_af_atempo
 

Detailed Description

tempo scaling audio filter – an implementation of WSOLA algorithm

Based on MIT licensed yaeAudioTempoFilter.h and yaeAudioFragment.h from Apprentice Video player by Pavel Koshevoy. https://sourceforge.net/projects/apprenticevideo/

An explanation of SOLA algorithm is available at http://www.surina.net/article/time-and-pitch-scaling.html

WSOLA is very similar to SOLA, only one major difference exists between these algorithms. SOLA shifts audio fragments along the output stream, where as WSOLA shifts audio fragments along the input stream.

The advantage of WSOLA algorithm is that the overlap region size is always the same, therefore the blending function is constant and can be precomputed.

Macro Definition Documentation

§ RE_MALLOC_OR_FAIL

#define RE_MALLOC_OR_FAIL (   field,
  field_size 
)
Value:
do { \
av_freep(&field); \
field = av_malloc(field_size); \
if (!field) { \
yae_release_buffers(atempo); \
return AVERROR(ENOMEM); \
} \
} while (0)
void * av_malloc(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:77

§ yae_blend

#define yae_blend (   scalar_type)
Value:
do { \
const scalar_type *aaa = (const scalar_type *)a; \
const scalar_type *bbb = (const scalar_type *)b; \
\
scalar_type *out = (scalar_type *)dst; \
scalar_type *out_end = (scalar_type *)dst_end; \
int64_t i; \
\
for (i = 0; i < overlap && out < out_end; \
i++, atempo->position[1]++, wa++, wb++) { \
float w0 = *wa; \
float w1 = *wb; \
int j; \
\
for (j = 0; j < atempo->channels; \
j++, aaa++, bbb++, out++) { \
float t0 = (float)*aaa; \
float t1 = (float)*bbb; \
\
*out = \
frag->position[0] + i < 0 ? \
*aaa : \
(scalar_type)(t0 * w0 + t1 * w1); \
} \
} \
dst = (uint8_t *)out; \
} while (0)

A helper macro for blending the overlap region of previous and current audio fragment.

Variable Documentation

§ ff_af_atempo

AVFilter ff_af_atempo
Initial value:
= {
.name = "atempo",
.description = NULL_IF_CONFIG_SMALL("Adjust audio tempo."),
.init = init,
.uninit = uninit,
.query_formats = query_formats,
.process_command = process_command,
.priv_size = sizeof(ATempoContext),
.priv_class = &atempo_class,
.inputs = atempo_inputs,
.outputs = atempo_outputs,
}
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
struct ATempoContext ATempoContext
Filter state machine.