Go to the documentation of this file.
   63                            int out_channels, 
int ptr_align, 
int samples_align,
 
   74         if (ptr_align == 1 && samples_align == 1) {
 
   82                 snprintf(chan_str, 
sizeof(chan_str), 
"[%d to %d] ",
 
   83                          in_channels, out_channels);
 
   85                 snprintf(chan_str, 
sizeof(chan_str), 
"[%d to any] ",
 
   87         } 
else if (out_channels) {
 
   88                 snprintf(chan_str, 
sizeof(chan_str), 
"[any to %d] ",
 
   91             snprintf(chan_str, 
sizeof(chan_str), 
"[any to any] ");
 
   99 #define MIX_FUNC_NAME(fmt, cfmt) mix_any_ ## fmt ##_## cfmt ##_c 
  101 #define MIX_FUNC_GENERIC(fmt, cfmt, stype, ctype, sumtype, expr)            \ 
  102 static void MIX_FUNC_NAME(fmt, cfmt)(stype **samples, ctype **matrix,       \ 
  103                                      int len, int out_ch, int in_ch)        \ 
  106     stype temp[AVRESAMPLE_MAX_CHANNELS];                                    \ 
  107     for (i = 0; i < len; i++) {                                             \ 
  108         for (out = 0; out < out_ch; out++) {                                \ 
  110             for (in = 0; in < in_ch; in++)                                  \ 
  111                 sum += samples[in][i] * matrix[out][in];                    \ 
  114         for (out = 0; out < out_ch; out++)                                  \ 
  115             samples[out][i] = temp[out];                                    \ 
  126 static 
void mix_2_to_1_fltp_flt_c(
float **
samples, 
float **matrix, 
int len,
 
  127                                   int out_ch, 
int in_ch)
 
  132     float m0    = matrix[0][0];
 
  133     float m1    = matrix[0][1];
 
  136         *dst++ = *
src0++ * m0 + *
src1++ * m1;
 
  137         *dst++ = *
src0++ * m0 + *
src1++ * m1;
 
  138         *dst++ = *
src0++ * m0 + *
src1++ * m1;
 
  139         *dst++ = *
src0++ * m0 + *
src1++ * m1;
 
  143         *dst++ = *
src0++ * m0 + *
src1++ * m1;
 
  149                                   int out_ch, 
int in_ch)
 
  154     float m0      = matrix[0][0];
 
  155     float m1      = matrix[0][1];
 
  171                                  int out_ch, 
int in_ch)
 
  176     int16_t m0    = matrix[0][0];
 
  177     int16_t m1    = matrix[0][1];
 
  180         *dst++ = (*
src0++ * m0 + *
src1++ * m1) >> 8;
 
  181         *dst++ = (*
src0++ * m0 + *
src1++ * m1) >> 8;
 
  182         *dst++ = (*
src0++ * m0 + *
src1++ * m1) >> 8;
 
  183         *dst++ = (*
src0++ * m0 + *
src1++ * m1) >> 8;
 
  187         *dst++ = (*
src0++ * m0 + *
src1++ * m1) >> 8;
 
  193                                   int out_ch, 
int in_ch)
 
  199     float m0    = matrix[0][0];
 
  200     float m1    = matrix[1][0];
 
  226                                   int out_ch, 
int in_ch)
 
  237     float *m0   = matrix[0];
 
  238     float *m1   = matrix[1];
 
  243         *dst0++ = 
v0      * m0[0] +
 
  249         *dst1++ = 
v0      * m1[0] +
 
  260                                   int out_ch, 
int in_ch)
 
  275         *dst0++ = 
v0 * matrix[0][0] + v1 * matrix[0][1];
 
  276         *dst1++ = 
v0 * matrix[1][0] + v1 * matrix[1][1];
 
  277         *dst2++ = 
v0 * matrix[2][0] + v1 * matrix[2][1];
 
  278         *dst3++ = 
v0 * matrix[3][0] + v1 * matrix[3][1];
 
  279         *dst4++ = 
v0 * matrix[4][0] + v1 * matrix[4][1];
 
  280         *dst5++ = 
v0 * matrix[5][0] + v1 * matrix[5][1];
 
  311                           2, 1, 1, 1, 
"C", mix_2_to_1_fltp_flt_c);
 
  374                                         sizeof(*matrix_dbl));
 
  431     int len = 
src->nb_samples;
 
  439             src->samples_align >= aligned_len) {
 
  457                 data0[j++] = 
src->data[
i];
 
  493 #define GET_MATRIX_CONVERT(suffix, scale)                                   \ 
  494     if (!am->matrix_ ## suffix[0]) {                                        \ 
  495         av_log(am->avr, AV_LOG_ERROR, "matrix is not set\n");               \ 
  496         return AVERROR(EINVAL);                                             \ 
  498     for (o = 0, o0 = 0; o < am->out_channels; o++) {                        \ 
  499         for (i = 0, i0 = 0; i < am->in_channels; i++) {                     \ 
  500             if (am->input_skip[i] || am->output_zero[o])                    \ 
  501                 matrix[o * stride + i] = 0.0;                               \ 
  503                 matrix[o * stride + i] = am->matrix_ ## suffix[o0][i0] *    \ 
  505             if (!am->input_skip[i])                                         \ 
  508         if (!am->output_zero[o])                                            \ 
  544             if (matrix[o * 
stride + 
i] != 0.0) {
 
  551         if (o < am->in_channels) {
 
  553                 if (matrix[
i * 
stride + o] != 0.0) {
 
  562             if (o < am->in_channels)
 
  579             if ((o != 
i && matrix[o * 
stride + 
i] != 0.0) ||
 
  580                 (o == 
i && matrix[o * 
stride + 
i] != 1.0)) {
 
  588                     if (i0 != 
i && matrix[o * 
stride + i0] != 0.0) {
 
  605             if (matrix[o * 
stride + 
i] != 0.0) {
 
  627             if ((o != 
i && matrix[o * 
stride + 
i] != 0.0) ||
 
  628                 (o == 
i && matrix[o * 
stride + 
i] != 1.0)) {
 
  637             if (o0 != 
i && matrix[o0 * 
stride + 
i] != 0.0) {
 
  655     int i, o, i0, o0, 
ret;
 
  656     char in_layout_name[128];
 
  657     char out_layout_name[128];
 
  675 #define CONVERT_MATRIX(type, expr)                                          \ 
  676     am->matrix_## type[0] = av_mallocz(am->out_matrix_channels *            \ 
  677                                        am->in_matrix_channels  *            \ 
  678                                        sizeof(*am->matrix_## type[0]));     \ 
  679     if (!am->matrix_## type[0])                                             \ 
  680         return AVERROR(ENOMEM);                                             \ 
  681     for (o = 0, o0 = 0; o < am->out_channels; o++) {                        \ 
  682         if (am->output_zero[o] || am->output_skip[o])                       \ 
  685             am->matrix_## type[o0] = am->matrix_## type[o0 - 1] +           \ 
  686                                      am->in_matrix_channels;                \ 
  687         for (i = 0, i0 = 0; i < am->in_channels; i++) {                     \ 
  689             if (am->input_skip[i] || am->output_zero[i])                    \ 
  691             v = matrix[o * stride + i];                                     \ 
  692             am->matrix_## type[o0][i0] = expr;                              \ 
  697     am->matrix = (void **)am->matrix_## type; 
  725            in_layout_name, out_layout_name);
 
  
static void error(const char *err)
double * mix_matrix
mix matrix only used if avresample_set_matrix() is called before avresample_open()
int16_t * matrix_q8[AVRESAMPLE_MAX_CHANNELS]
@ AV_SAMPLE_FMT_FLTP
float, planar
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static void mix_2_to_1_s16p_q8_c(int16_t **samples, int16_t **matrix, int len, int out_ch, int in_ch)
double lfe_mix_level
lfe mix level
static void mix_2_to_6_fltp_flt_c(float **samples, float **matrix, int len, int out_ch, int in_ch)
enum AVMixCoeffType coeff_type
int ff_audio_data_set_channels(AudioData *a, int channels)
#define AVRESAMPLE_MAX_CHANNELS
AV_MIX_COEFF_TYPE_Q15
16-bit 8.8 fixed-point
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
int out_channels
number of output channels
static void mix_2_to_1_s16p_flt_c(int16_t **samples, float **matrix, int len, int out_ch, int in_ch)
enum AVMatrixEncoding matrix_encoding
matrixed stereo encoding
static void mix_6_to_2_fltp_flt_c(float **samples, float **matrix, int len, int out_ch, int in_ch)
int32_t * matrix_q15[AVRESAMPLE_MAX_CHANNELS]
int ff_audio_mix_set_matrix(AudioMix *am, const double *matrix, int stride)
Set the current mixing matrix.
AV_MIX_COEFF_TYPE_FLT
32-bit 17.15 fixed-point
int output_skip[AVRESAMPLE_MAX_CHANNELS]
Audio buffer used for intermediate storage between conversion phases.
static const char *const coeff_type_names[]
#define MIX_FUNC_NAME(fmt, cfmt)
enum attribute_deprecated AVMixCoeffType
static void mix_1_to_2_fltp_flt_c(float **samples, float **matrix, int len, int out_ch, int in_ch)
int ff_audio_mix(AudioMix *am, AudioData *src)
Apply channel mixing to audio data using the current mixing matrix.
int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, double center_mix_level, double surround_mix_level, double lfe_mix_level, int normalize, double *matrix_out, int stride, enum AVMatrixEncoding matrix_encoding)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
void() mix_func(uint8_t **src, void **matrix, int len, int out_ch, int in_ch)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
float * matrix_flt[AVRESAMPLE_MAX_CHANNELS]
int output_zero[AVRESAMPLE_MAX_CHANNELS]
double surround_mix_level
surround mix level
void ff_audio_mix_init_x86(AudioMix *am)
int input_skip[AVRESAMPLE_MAX_CHANNELS]
static av_cold int mix_function_init(AudioMix *am)
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
uint64_t in_channel_layout
input channel layout
int in_channels
number of input channels
double center_mix_level
center mix level
void ff_audio_mix_free(AudioMix **am_p)
Free an AudioMix context.
AVSampleFormat
Audio sample formats.
AudioMix * ff_audio_mix_alloc(AVAudioResampleContext *avr)
Allocate and initialize an AudioMix context.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * func_descr_generic
int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Fill an audio buffer with silence.
void ff_audio_mix_set_func(AudioMix *am, enum AVSampleFormat fmt, enum AVMixCoeffType coeff_type, int in_channels, int out_channels, int ptr_align, int samples_align, const char *descr, void *mix_func)
Set mixing function if the parameters match.
static void reduce_matrix(AudioMix *am, const double *matrix, int stride)
enum AVSampleFormat internal_sample_fmt
internal sample format
#define GET_MATRIX_CONVERT(suffix, scale)
#define MIX_FUNC_GENERIC(fmt, cfmt, stype, ctype, sumtype, expr)
#define CONVERT_MATRIX(type, expr)
Filter the word “frame” indicates either a video frame or a group of audio samples
int ff_audio_mix_get_matrix(AudioMix *am, double *matrix, int stride)
Get the current mixing matrix.
AVAudioResampleContext * avr
enum AVMixCoeffType mix_coeff_type
mixing coefficient type
int normalize_mix_level
enable mix level normalization
uint64_t out_channel_layout
output channel layout