| 132 | } |
| 133 | |
| 134 | static 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; |
no test coverage detected