| @@ -54,6 +54,8 @@ · 53 unmodified lines |
| 54 | 54 | #define SURROUND_DIRECT_LEFT 33 |
| 55 | 55 | #define SURROUND_DIRECT_RIGHT 34 |
| 56 | 56 | |
| 57 | +#define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */ |
| 58 | + |
| 57 | 59 | static av_always_inline int even(uint64_t layout) |
| 58 | 60 | { |
| 59 | 61 | return (!layout || (layout & (layout - 1))); |
| @@ -83,14 +85,21 @@ static int sane_layout(uint64_t layout) · 23 unmodified lines |
| 83 | 85 | int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, |
| 84 | 86 | double center_mix_level, double surround_mix_level, |
| 85 | 87 | double lfe_mix_level, int normalize, |
| 86 | | − double *matrix_out, int stride) |
| 88 | + double *matrix_out, int stride, |
| 89 | + enum AVMatrixEncoding matrix_encoding) |
| 87 | 90 | { |
| 88 | 91 | int i, j, out_i, out_j; |
| 89 | 92 | double matrix[64][64] = {{0}}; |
| 90 | | − int64_t unaccounted = in_layout & ~out_layout; |
| 93 | + int64_t unaccounted; |
| 91 | 94 | double maxcoef = 0; |
| 92 | 95 | int in_channels, out_channels; |
| 93 | 96 | |
| 97 | + if ((out_layout & AV_CH_LAYOUT_STEREO_DOWNMIX) == AV_CH_LAYOUT_STEREO_DOWNMIX) { |
| 98 | + out_layout = AV_CH_LAYOUT_STEREO; |
| 99 | + } |
| 100 | + |
| 101 | + unaccounted = in_layout & ~out_layout; |
| 102 | + |
| 94 | 103 | in_channels = av_get_channel_layout_nb_channels( in_layout); |
| 95 | 104 | out_channels = av_get_channel_layout_nb_channels(out_layout); |
| 96 | 105 | |
| @@ -140,8 +149,19 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, · 43 unmodified lines |
| 140 | 149 | matrix[SIDE_LEFT ][BACK_CENTER] += M_SQRT1_2; |
| 141 | 150 | matrix[SIDE_RIGHT][BACK_CENTER] += M_SQRT1_2; |
| 142 | 151 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 143 | | − matrix[FRONT_LEFT ][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 144 | | − matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 152 | + if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY || |
| 153 | + matrix_encoding == AV_MATRIX_ENCODING_DPLII) { |
| 154 | + if (unaccounted & (AV_CH_BACK_LEFT | AV_CH_SIDE_LEFT)) { |
| 155 | + matrix[FRONT_LEFT ][BACK_CENTER] -= surround_mix_level * M_SQRT1_2; |
| 156 | + matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 157 | + } else { |
| 158 | + matrix[FRONT_LEFT ][BACK_CENTER] -= surround_mix_level; |
| 159 | + matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level; |
| 160 | + } |
| 161 | + } else { |
| 162 | + matrix[FRONT_LEFT ][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 163 | + matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 164 | + } |
| 145 | 165 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 146 | 166 | matrix[FRONT_CENTER][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 147 | 167 | } else |
| @@ -163,8 +183,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, · 15 unmodified lines |
| 163 | 183 | matrix[SIDE_RIGHT][BACK_RIGHT] += 1.0; |
| 164 | 184 | } |
| 165 | 185 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 166 | | − matrix[FRONT_LEFT ][BACK_LEFT ] += surround_mix_level; |
| 167 | | − matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level; |
| 186 | + if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { |
| 187 | + matrix[FRONT_LEFT ][BACK_LEFT ] -= surround_mix_level * M_SQRT1_2; |
| 188 | + matrix[FRONT_LEFT ][BACK_RIGHT] -= surround_mix_level * M_SQRT1_2; |
| 189 | + matrix[FRONT_RIGHT][BACK_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 190 | + matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level * M_SQRT1_2; |
| 191 | + } else if (matrix_encoding == AV_MATRIX_ENCODING_DPLII) { |
| 192 | + matrix[FRONT_LEFT ][BACK_LEFT ] -= surround_mix_level * SQRT3_2; |
| 193 | + matrix[FRONT_LEFT ][BACK_RIGHT] -= surround_mix_level * M_SQRT1_2; |
| 194 | + matrix[FRONT_RIGHT][BACK_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 195 | + matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level * SQRT3_2; |
| 196 | + } else { |
| 197 | + matrix[FRONT_LEFT ][BACK_LEFT ] += surround_mix_level; |
| 198 | + matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level; |
| 199 | + } |
| 168 | 200 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 169 | 201 | matrix[FRONT_CENTER][BACK_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 170 | 202 | matrix[FRONT_CENTER][BACK_RIGHT] += surround_mix_level * M_SQRT1_2; |
| @@ -187,8 +219,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, · 16 unmodified lines |
| 187 | 219 | matrix[BACK_CENTER][SIDE_LEFT ] += M_SQRT1_2; |
| 188 | 220 | matrix[BACK_CENTER][SIDE_RIGHT] += M_SQRT1_2; |
| 189 | 221 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 190 | | − matrix[FRONT_LEFT ][SIDE_LEFT ] += surround_mix_level; |
| 191 | | − matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level; |
| 222 | + if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { |
| 223 | + matrix[FRONT_LEFT ][SIDE_LEFT ] -= surround_mix_level * M_SQRT1_2; |
| 224 | + matrix[FRONT_LEFT ][SIDE_RIGHT] -= surround_mix_level * M_SQRT1_2; |
| 225 | + matrix[FRONT_RIGHT][SIDE_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 226 | + matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level * M_SQRT1_2; |
| 227 | + } else if (matrix_encoding == AV_MATRIX_ENCODING_DPLII) { |
| 228 | + matrix[FRONT_LEFT ][SIDE_LEFT ] -= surround_mix_level * SQRT3_2; |
| 229 | + matrix[FRONT_LEFT ][SIDE_RIGHT] -= surround_mix_level * M_SQRT1_2; |
| 230 | + matrix[FRONT_RIGHT][SIDE_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 231 | + matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level * SQRT3_2; |
| 232 | + } else { |
| 233 | + matrix[FRONT_LEFT ][SIDE_LEFT ] += surround_mix_level; |
| 234 | + matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level; |
| 235 | + } |
| 192 | 236 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 193 | 237 | matrix[FRONT_CENTER][SIDE_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 194 | 238 | matrix[FRONT_CENTER][SIDE_RIGHT] += surround_mix_level * M_SQRT1_2; |