Data Structures | Macros | Functions | Variables
af_astats.c File Reference
#include <float.h>
#include <math.h>
#include "libavutil/opt.h"
#include "audio.h"
#include "avfilter.h"
#include "internal.h"

Go to the source code of this file.

Data Structures

struct  ChannelStats
struct  AudioStatsContext


#define HISTOGRAM_SIZE   8192
#define MEASURE_NONE   0
#define MEASURE_DC_OFFSET   (1 << 0)
#define MEASURE_MIN_LEVEL   (1 << 1)
#define MEASURE_MAX_LEVEL   (1 << 2)
#define MEASURE_MIN_DIFFERENCE   (1 << 3)
#define MEASURE_MAX_DIFFERENCE   (1 << 4)
#define MEASURE_MEAN_DIFFERENCE   (1 << 5)
#define MEASURE_RMS_DIFFERENCE   (1 << 6)
#define MEASURE_PEAK_LEVEL   (1 << 7)
#define MEASURE_RMS_LEVEL   (1 << 8)
#define MEASURE_RMS_PEAK   (1 << 9)
#define MEASURE_RMS_TROUGH   (1 << 10)
#define MEASURE_CREST_FACTOR   (1 << 11)
#define MEASURE_FLAT_FACTOR   (1 << 12)
#define MEASURE_PEAK_COUNT   (1 << 13)
#define MEASURE_BIT_DEPTH   (1 << 14)
#define MEASURE_DYNAMIC_RANGE   (1 << 15)
#define MEASURE_ZERO_CROSSINGS   (1 << 16)
#define MEASURE_NUMBER_OF_SAMPLES   (1 << 18)
#define MEASURE_NUMBER_OF_NANS   (1 << 19)
#define MEASURE_NUMBER_OF_INFS   (1 << 20)
#define MEASURE_NOISE_FLOOR   (1 << 22)
#define MEASURE_NOISE_FLOOR_COUNT   (1 << 23)
#define OFFSET(x)   offsetof(AudioStatsContext, x)
#define LINEAR_TO_DB(x)   (log10(x) * 20)
#define UPDATE_STATS_P(type, update_func, update_float, channel_func)
#define UPDATE_STATS_I(type, update_func, update_float, channel_func)
#define UPDATE_STATS(planar, type, sample, normalizer_suffix, int_sample)


static int query_formats (AVFilterContext *ctx)
static void reset_stats (AudioStatsContext *s)
static int config_output (AVFilterLink *outlink)
static void bit_depth (AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
static void update_minmax (AudioStatsContext *s, ChannelStats *p, double d)
static void update_stat (AudioStatsContext *s, ChannelStats *p, double d, double nd, int64_t i)
static void update_float_stat (AudioStatsContext *s, ChannelStats *p, float d)
static void update_double_stat (AudioStatsContext *s, ChannelStats *p, double d)
static void set_meta (AVDictionary **metadata, int chan, const char *key, const char *fmt, double val)
static void set_metadata (AudioStatsContext *s, AVDictionary **metadata)
static int filter_channel (AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static int filter_frame (AVFilterLink *inlink, AVFrame *buf)
static void print_stats (AVFilterContext *ctx)
static av_cold void uninit (AVFilterContext *ctx)


static const AVOption astats_options []
static const AVFilterPad astats_inputs []
static const AVFilterPad astats_outputs []
const AVFilter ff_af_astats

Macro Definition Documentation


#define HISTOGRAM_SIZE   8192

Definition at line 30 of file af_astats.c.



Definition at line 31 of file af_astats.c.



Definition at line 33 of file af_astats.c.


#define MEASURE_NONE   0

Definition at line 34 of file af_astats.c.


#define MEASURE_DC_OFFSET   (1 << 0)

Definition at line 36 of file af_astats.c.


#define MEASURE_MIN_LEVEL   (1 << 1)

Definition at line 37 of file af_astats.c.


#define MEASURE_MAX_LEVEL   (1 << 2)

Definition at line 38 of file af_astats.c.


#define MEASURE_MIN_DIFFERENCE   (1 << 3)

Definition at line 39 of file af_astats.c.


#define MEASURE_MAX_DIFFERENCE   (1 << 4)

Definition at line 40 of file af_astats.c.


#define MEASURE_MEAN_DIFFERENCE   (1 << 5)

Definition at line 41 of file af_astats.c.


#define MEASURE_RMS_DIFFERENCE   (1 << 6)

Definition at line 42 of file af_astats.c.


#define MEASURE_PEAK_LEVEL   (1 << 7)

Definition at line 43 of file af_astats.c.


#define MEASURE_RMS_LEVEL   (1 << 8)

Definition at line 44 of file af_astats.c.


#define MEASURE_RMS_PEAK   (1 << 9)

Definition at line 45 of file af_astats.c.


#define MEASURE_RMS_TROUGH   (1 << 10)

Definition at line 46 of file af_astats.c.


#define MEASURE_CREST_FACTOR   (1 << 11)

Definition at line 47 of file af_astats.c.


#define MEASURE_FLAT_FACTOR   (1 << 12)

Definition at line 48 of file af_astats.c.


#define MEASURE_PEAK_COUNT   (1 << 13)

Definition at line 49 of file af_astats.c.


#define MEASURE_BIT_DEPTH   (1 << 14)

Definition at line 50 of file af_astats.c.


#define MEASURE_DYNAMIC_RANGE   (1 << 15)

Definition at line 51 of file af_astats.c.


#define MEASURE_ZERO_CROSSINGS   (1 << 16)

Definition at line 52 of file af_astats.c.



Definition at line 53 of file af_astats.c.


#define MEASURE_NUMBER_OF_SAMPLES   (1 << 18)

Definition at line 54 of file af_astats.c.


#define MEASURE_NUMBER_OF_NANS   (1 << 19)

Definition at line 55 of file af_astats.c.


#define MEASURE_NUMBER_OF_INFS   (1 << 20)

Definition at line 56 of file af_astats.c.



Definition at line 57 of file af_astats.c.


#define MEASURE_NOISE_FLOOR   (1 << 22)

Definition at line 58 of file af_astats.c.


#define MEASURE_NOISE_FLOOR_COUNT   (1 << 23)

Definition at line 59 of file af_astats.c.



Definition at line 61 of file af_astats.c.


#define OFFSET (   x)    offsetof(AudioStatsContext, x)

Definition at line 108 of file af_astats.c.


Definition at line 109 of file af_astats.c.


#define LINEAR_TO_DB (   x)    (log10(x) * 20)

Definition at line 407 of file af_astats.c.


#define UPDATE_STATS_P (   type,
for (int c = start; c < end; c++) { \
ChannelStats *p = &s->chstats[c]; \
const type *src = (const type *)data[c]; \
const type * const srcend = src + samples; \
for (; src < srcend; src++) { \
update_func; \
update_float; \
} \
channel_func; \

Definition at line 556 of file af_astats.c.


#define UPDATE_STATS_I (   type,
for (int c = start; c < end; c++) { \
ChannelStats *p = &s->chstats[c]; \
const type *src = (const type *)data[0]; \
const type * const srcend = src + samples * channels; \
for (src += c; src < srcend; src += channels) { \
update_func; \
update_float; \
} \
channel_func; \

Definition at line 568 of file af_astats.c.


#define UPDATE_STATS (   planar,
if ((s->measure_overall | s->measure_perchannel) & ~MEASURE_MINMAXPEAK) { \
UPDATE_STATS_##planar(type, update_stat(s, p, sample, sample normalizer_suffix, int_sample), s->is_float ? update_float_stat(s, p, sample) : s->is_double ? update_double_stat(s, p, sample) : (void)NULL, ); \
} else { \
UPDATE_STATS_##planar(type, update_minmax(s, p, sample), , p->nmin = p->min normalizer_suffix; p->nmax = p->max normalizer_suffix;); \

Definition at line 580 of file af_astats.c.

Function Documentation



◆ query_formats()

static int query_formats ( AVFilterContext ctx)

Definition at line 148 of file af_astats.c.

◆ reset_stats()

static void reset_stats ( AudioStatsContext s)

Definition at line 182 of file af_astats.c.

Referenced by config_output(), and filter_frame().

◆ config_output()

static int config_output ( AVFilterLink outlink)

Definition at line 221 of file af_astats.c.

◆ bit_depth()

static void bit_depth ( AudioStatsContext s,
uint64_t  mask,
uint64_t  imask,
AVRational depth 

Definition at line 254 of file af_astats.c.

Referenced by call_resize_kernel(), check_add_res(), check_idct(), check_idct_dc(), check_idct_multiple(), check_ipred(), check_itxfm(), check_loop_filter(), check_loop_filter_intra(), check_loopfilter(), check_mc(), check_sao_band(), check_sao_edge(), checkasm_check_h264pred(), checkasm_check_h264qpel(), checkasm_check_hevc_add_res(), checkasm_check_hevc_epel(), checkasm_check_hevc_epel_bi(), checkasm_check_hevc_epel_bi_w(), checkasm_check_hevc_epel_uni(), checkasm_check_hevc_epel_uni_w(), checkasm_check_hevc_idct(), checkasm_check_hevc_qpel(), checkasm_check_hevc_qpel_bi(), checkasm_check_hevc_qpel_bi_w(), checkasm_check_hevc_qpel_uni(), checkasm_check_hevc_qpel_uni_w(), checkasm_check_hevc_sao(), copy_subcoefs(), cuvid_test_capabilities(), dct4x4_impl(), dct8x8(), dnxhd_calc_bits_thread(), ff_bwdif_init_x86(), ff_dnxhd_find_cid(), ff_get_qtpalette(), ff_h264_pred_init(), ff_h264_pred_init_aarch64(), ff_h264_pred_init_arm(), ff_h264_pred_init_mips(), ff_h264chroma_init(), ff_h264chroma_init_aarch64(), ff_h264chroma_init_arm(), ff_h264chroma_init_mips(), ff_h264chroma_init_ppc(), ff_h264chroma_init_x86(), ff_h264dsp_init(), ff_h264dsp_init_aarch64(), ff_h264dsp_init_arm(), ff_h264dsp_init_mips(), ff_h264dsp_init_ppc(), ff_h264dsp_init_x86(), ff_h264qpel_init(), ff_h264qpel_init_aarch64(), ff_h264qpel_init_arm(), ff_h264qpel_init_mips(), ff_h264qpel_init_ppc(), ff_h264qpel_init_x86(), ff_hevc_dsp_init(), ff_hevc_dsp_init_aarch64(), ff_hevc_dsp_init_arm(), ff_hevc_dsp_init_mips(), ff_hevc_dsp_init_neon(), ff_hevc_dsp_init_ppc(), ff_hevc_dsp_init_x86(), ff_hevc_pred_init(), ff_hevc_pred_init_mips(), ff_isom_get_vpcc_features(), ff_spatial_idwt_init(), ff_yadif_init_x86(), ftx(), get_pixel_format(), h264_pred_init_neon(), h264dsp_init_neon(), hl_decode_mb(), hl_decode_mb_444(), mkv_write_track(), pps_scc_extension(), PRED4x4(), print_stats(), randomize_loopfilter_buffers(), set_metadata(), sps_scc_extension(), vaapi_av1_get_bit_depth_idx(), vaapi_encode_h265_init_sequence_params(), X264_frame(), and xavs2_init().

◆ update_minmax()

static void update_minmax ( AudioStatsContext s,
ChannelStats p,
double  d 

Definition at line 270 of file af_astats.c.

◆ update_stat()

static void update_stat ( AudioStatsContext s,
ChannelStats p,
double  d,
double  nd,
int64_t  i 

Definition at line 278 of file af_astats.c.

◆ update_float_stat()

static void update_float_stat ( AudioStatsContext s,
ChannelStats p,
float  d 

Definition at line 375 of file af_astats.c.

◆ update_double_stat()

static void update_double_stat ( AudioStatsContext s,
ChannelStats p,
double  d 

Definition at line 384 of file af_astats.c.

◆ set_meta()

static void set_meta ( AVDictionary **  metadata,
int  chan,
const char *  key,
const char *  fmt,
double  val 

Definition at line 393 of file af_astats.c.

Referenced by do_vif(), and set_metadata().

◆ set_metadata()

static void set_metadata ( AudioStatsContext s,
AVDictionary **  metadata 

Definition at line 409 of file af_astats.c.

Referenced by filter_frame().

◆ filter_channel()

static int filter_channel ( AVFilterContext ctx,
void *  arg,
int  jobnr,
int  nb_jobs 

Definition at line 587 of file af_astats.c.

Referenced by filter_frame().

◆ filter_frame()

static int filter_frame ( AVFilterLink inlink,
AVFrame buf 

Definition at line 634 of file af_astats.c.

◆ print_stats()

static void print_stats ( AVFilterContext ctx)

Definition at line 656 of file af_astats.c.

Referenced by uninit().

◆ uninit()

static av_cold void uninit ( AVFilterContext ctx)

Definition at line 806 of file af_astats.c.

Variable Documentation

◆ astats_options

const AVOption astats_options[]

Definition at line 111 of file af_astats.c.

◆ astats_inputs

const AVFilterPad astats_inputs[]
Initial value:
= {
.name = "default",
.filter_frame = filter_frame,
{ NULL }

Definition at line 822 of file af_astats.c.

◆ astats_outputs

const AVFilterPad astats_outputs[]
Initial value:
= {
.name = "default",
.config_props = config_output,
{ NULL }

Definition at line 831 of file af_astats.c.

◆ ff_af_astats

const AVFilter ff_af_astats
Initial value:
= {
.name = "astats",
.description = NULL_IF_CONFIG_SMALL("Show time domain statistics about audio frames."),
.query_formats = query_formats,
.priv_size = sizeof(AudioStatsContext),
.priv_class = &astats_class,

Definition at line 840 of file af_astats.c.

const char data[16]
Definition: mxf.c:142
static int config_output(AVFilterLink *outlink)
Definition: af_astats.c:221
static void update_stat(AudioStatsContext *s, ChannelStats *p, double d, double nd, int64_t i)
Definition: af_astats.c:278
static void update_minmax(AudioStatsContext *s, ChannelStats *p, double d)
Definition: af_astats.c:270
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
Definition: filter_design.txt:243
#define s(width, name)
Definition: cbs_vp9.c:257
Definition: avutil.h:202
static int filter_frame(AVFilterLink *inlink, AVFrame *buf)
Definition: af_astats.c:634
static const AVFilterPad outputs[]
Definition: af_acontrast.c:203
Definition: aptx.h:33
static void update_double_stat(AudioStatsContext *s, ChannelStats *p, double d)
Definition: af_astats.c:384
static void update_float_stat(AudioStatsContext *s, ChannelStats *p, float d)
Definition: af_astats.c:375
static av_cold void uninit(AVFilterContext *ctx)
Definition: af_astats.c:806
#define NULL
Definition: coverity.c:32
#define src
Definition: vp8dsp.c:255
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
Definition: af_astats.c:91
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:117
#define sample
Definition: flacdsp_template.c:44
static const AVFilterPad astats_inputs[]
Definition: af_astats.c:822
static int query_formats(AVFilterContext *ctx)
Definition: af_astats.c:148
Filter the word “frame” indicates either a video frame or a group of audio samples
Definition: filter_design.txt:8
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
Definition: avfilter.h:117
#define flags(name, subs,...)
Definition: cbs_av1.c:561
Definition: af_astats.c:61
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1<< 16)) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(UINT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(UINT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out->ch+ch,(const uint8_t **) in->ch+ch, off *(out-> planar
Definition: audioconvert.c:56
static const AVFilterPad astats_outputs[]
Definition: af_astats.c:831