MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / build_matrix

Function build_matrix

libswresample/rematrix.c:134–345  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

132}
133
134static void build_matrix(const AVChannelLayout *in_ch_layout, const AVChannelLayout *out_ch_layout,
135 double center_mix_level, double surround_mix_level,
136 double lfe_mix_level, double maxval, double rematrix_volume, double *matrix_param,
137 ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding)
138{
139 double matrix[NUM_NAMED_CHANNELS][NUM_NAMED_CHANNELS]={{0}};
140 uint64_t unaccounted = av_channel_layout_subset(in_ch_layout, UINT64_MAX) &
141 ~av_channel_layout_subset(out_ch_layout, UINT64_MAX);
142 double maxcoef=0;
143 int i, j;
144
145 for(i=0; i<FF_ARRAY_ELEMS(matrix); i++){
146 if( av_channel_layout_index_from_channel(in_ch_layout, i) >= 0
147 && av_channel_layout_index_from_channel(out_ch_layout, i) >= 0)
148 matrix[i][i]= 1.0;
149 }
150
151//FIXME implement dolby surround
152//FIXME implement full ac3
153
154 if(unaccounted & AV_CH_FRONT_CENTER){
155 if (av_channel_layout_subset(out_ch_layout, AV_CH_LAYOUT_STEREO) == AV_CH_LAYOUT_STEREO) {
156 if (av_channel_layout_subset(in_ch_layout, AV_CH_LAYOUT_STEREO)) {
157 matrix[ FRONT_LEFT][FRONT_CENTER]+= center_mix_level;
158 matrix[FRONT_RIGHT][FRONT_CENTER]+= center_mix_level;
159 } else {
160 matrix[ FRONT_LEFT][FRONT_CENTER]+= M_SQRT1_2;
161 matrix[FRONT_RIGHT][FRONT_CENTER]+= M_SQRT1_2;
162 }
163 }else
164 av_assert0(0);
165 }
166 if(unaccounted & AV_CH_LAYOUT_STEREO){
167 if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_CENTER) >= 0) {
168 matrix[FRONT_CENTER][ FRONT_LEFT]+= M_SQRT1_2;
169 matrix[FRONT_CENTER][FRONT_RIGHT]+= M_SQRT1_2;
170 if (av_channel_layout_index_from_channel(in_ch_layout, AV_CHAN_FRONT_CENTER) >= 0)
171 matrix[FRONT_CENTER][ FRONT_CENTER] = center_mix_level*sqrt(2);
172 }else
173 av_assert0(0);
174 }
175
176 if(unaccounted & AV_CH_BACK_CENTER){
177 if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_BACK_LEFT) >= 0) {
178 matrix[ BACK_LEFT][BACK_CENTER]+= M_SQRT1_2;
179 matrix[BACK_RIGHT][BACK_CENTER]+= M_SQRT1_2;
180 } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_SIDE_LEFT) >= 0) {
181 matrix[ SIDE_LEFT][BACK_CENTER]+= M_SQRT1_2;
182 matrix[SIDE_RIGHT][BACK_CENTER]+= M_SQRT1_2;
183 } else if (av_channel_layout_index_from_channel(out_ch_layout, AV_CHAN_FRONT_LEFT) >= 0) {
184 if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY ||
185 matrix_encoding == AV_MATRIX_ENCODING_DPLII) {
186 if (unaccounted & (AV_CH_BACK_LEFT | AV_CH_SIDE_LEFT)) {
187 matrix[FRONT_LEFT ][BACK_CENTER] -= surround_mix_level * M_SQRT1_2;
188 matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level * M_SQRT1_2;
189 } else {
190 matrix[FRONT_LEFT ][BACK_CENTER] -= surround_mix_level;
191 matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level;

Callers 1

swr_build_matrix2Function · 0.85

Calls 3

av_channel_layout_subsetFunction · 0.85
fabsFunction · 0.85

Tested by

no test coverage detected