35 #define FRONT_CENTER 2 36 #define LOW_FREQUENCY 3 39 #define FRONT_LEFT_OF_CENTER 6 40 #define FRONT_RIGHT_OF_CENTER 7 45 #define TOP_FRONT_LEFT 12 46 #define TOP_FRONT_CENTER 13 47 #define TOP_FRONT_RIGHT 14 48 #define TOP_BACK_LEFT 15 49 #define TOP_BACK_CENTER 16 50 #define TOP_BACK_RIGHT 17 51 #define STEREO_LEFT 29 52 #define STEREO_RIGHT 30 55 #define SURROUND_DIRECT_LEFT 33 56 #define SURROUND_DIRECT_RIGHT 34 57 #define LOW_FREQUENCY_2 35 59 #define SQRT3_2 1.22474487139158904909 63 return (!layout || !!(layout & (layout - 1)));
88 double center_mix_level,
double surround_mix_level,
90 double *matrix_out,
int stride,
93 int i, j, out_i, out_j;
94 double matrix[64][64] = {{0}};
97 int in_channels, out_channels;
103 unaccounted = in_layout & ~out_layout;
108 memset(matrix_out, 0, out_channels * stride *
sizeof(*matrix_out));
121 for (i = 0; i < 64; i++) {
122 if (in_layout & out_layout & (1ULL << i))
129 if ((in_layout & AV_CH_LAYOUT_STEREO) == AV_CH_LAYOUT_STEREO) {
141 if (out_layout & AV_CH_FRONT_CENTER) {
145 if (in_layout & AV_CH_FRONT_CENTER)
161 if (unaccounted & (AV_CH_BACK_LEFT | AV_CH_SIDE_LEFT)) {
172 }
else if (out_layout & AV_CH_FRONT_CENTER) {
179 if (out_layout & AV_CH_BACK_CENTER) {
185 if (in_layout & AV_CH_SIDE_LEFT) {
207 }
else if (out_layout & AV_CH_FRONT_CENTER) {
215 if (out_layout & AV_CH_BACK_LEFT) {
218 if (in_layout & AV_CH_BACK_LEFT) {
225 }
else if (out_layout & AV_CH_BACK_CENTER) {
243 }
else if (out_layout & AV_CH_FRONT_CENTER) {
254 }
else if (out_layout & AV_CH_FRONT_CENTER) {
262 if (out_layout & AV_CH_FRONT_CENTER) {
273 for (out_i = i = 0; out_i < out_channels && i < 64; i++) {
275 for (out_j = j = 0; out_j < in_channels && j < 64; j++) {
276 matrix_out[out_i * stride + out_j] = matrix[i][j];
277 sum += fabs(matrix[i][j]);
278 if (in_layout & (1ULL << j))
281 maxcoef =
FFMAX(maxcoef, sum);
282 if (out_layout & (1ULL << i))
287 if (normalize && maxcoef > 1.0) {
288 for (i = 0; i < out_channels; i++)
289 for (j = 0; j < in_channels; j++)
290 matrix_out[i * stride + j] /= maxcoef;
#define AV_CH_TOP_FRONT_RIGHT
#define AV_CH_LAYOUT_SURROUND
#define FRONT_RIGHT_OF_CENTER
#define AV_CH_TOP_FRONT_LEFT
#define AV_CH_SURROUND_DIRECT_RIGHT
#define AV_CH_LAYOUT_STEREO
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
#define AV_CH_TOP_BACK_LEFT
static int sane_layout(uint64_t layout)
#define AV_CH_LOW_FREQUENCY
#define AV_CH_STEREO_RIGHT
See AV_CH_STEREO_LEFT.
#define AV_CH_LAYOUT_STEREO_DOWNMIX
#define AV_CH_FRONT_LEFT_OF_CENTER
#define AV_CH_FRONT_CENTER
#define AV_CH_FRONT_RIGHT_OF_CENTER
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
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 AVRESAMPLE_MAX_CHANNELS
static av_always_inline int even(uint64_t layout)
Replacements for frequently missing libm functions.
#define AV_CH_TOP_BACK_RIGHT
#define FRONT_LEFT_OF_CENTER
#define AV_CH_BACK_CENTER
common internal and external API header
#define AV_CH_SURROUND_DIRECT_LEFT
#define AV_CH_FRONT_RIGHT
#define AV_CH_STEREO_LEFT
Stereo downmix.