| @@ -54,6 +54,8 @@ · 53 unmodified lines |
| 54 | #define SURROUND_DIRECT_LEFT 33 | 54 | #define SURROUND_DIRECT_LEFT 33 |
| 55 | #define SURROUND_DIRECT_RIGHT 34 | 55 | #define SURROUND_DIRECT_RIGHT 34 |
| 56 | | 56 | |
| | 57 | #define SQRT3_2 1.22474487139158904909 /* sqrt(3/2) */ |
| | 58 | |
| 57 | static av_always_inline int even(uint64_t layout) | 59 | static av_always_inline int even(uint64_t layout) |
| 58 | { | 60 | { |
| 59 | return (!layout || (layout & (layout - 1))); | 61 | return (!layout || (layout & (layout - 1))); |
| @@ -83,14 +85,21 @@ static int sane_layout(uint64_t layout) · 23 unmodified lines |
| 83 | int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, | 85 | int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, |
| 84 | double center_mix_level, double surround_mix_level, | 86 | double center_mix_level, double surround_mix_level, |
| 85 | double lfe_mix_level, int normalize, | 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 | int i, j, out_i, out_j; | 91 | int i, j, out_i, out_j; |
| 89 | double matrix[64][64] = {{0}}; | 92 | double matrix[64][64] = {{0}}; |
| 90 | int64_t unaccounted = in_layout & ~out_layout; | 93 | int64_t unaccounted; |
| 91 | double maxcoef = 0; | 94 | double maxcoef = 0; |
| 92 | int in_channels, out_channels; | 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 | in_channels = av_get_channel_layout_nb_channels( in_layout); | 103 | in_channels = av_get_channel_layout_nb_channels( in_layout); |
| 95 | out_channels = av_get_channel_layout_nb_channels(out_layout); | 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 | matrix[SIDE_LEFT ][BACK_CENTER] += M_SQRT1_2; | 149 | matrix[SIDE_LEFT ][BACK_CENTER] += M_SQRT1_2; |
| 141 | matrix[SIDE_RIGHT][BACK_CENTER] += M_SQRT1_2; | 150 | matrix[SIDE_RIGHT][BACK_CENTER] += M_SQRT1_2; |
| 142 | } else if (out_layout & AV_CH_FRONT_LEFT) { | 151 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 143 | matrix[FRONT_LEFT ][BACK_CENTER] += surround_mix_level * M_SQRT1_2; | 152 | if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY || |
| 144 | matrix[FRONT_RIGHT][BACK_CENTER] += surround_mix_level * M_SQRT1_2; | 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 | } else if (out_layout & AV_CH_FRONT_CENTER) { | 165 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 146 | matrix[FRONT_CENTER][BACK_CENTER] += surround_mix_level * M_SQRT1_2; | 166 | matrix[FRONT_CENTER][BACK_CENTER] += surround_mix_level * M_SQRT1_2; |
| 147 | } else | 167 | } else |
| @@ -163,8 +183,20 @@ int avresample_build_matrix(uint64_t in_layout, uint64_t out_layout, · 15 unmodified lines |
| 163 | matrix[SIDE_RIGHT][BACK_RIGHT] += 1.0; | 183 | matrix[SIDE_RIGHT][BACK_RIGHT] += 1.0; |
| 164 | } | 184 | } |
| 165 | } else if (out_layout & AV_CH_FRONT_LEFT) { | 185 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 166 | matrix[FRONT_LEFT ][BACK_LEFT ] += surround_mix_level; | 186 | if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { |
| 167 | matrix[FRONT_RIGHT][BACK_RIGHT] += surround_mix_level; | 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 | } else if (out_layout & AV_CH_FRONT_CENTER) { | 200 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 169 | matrix[FRONT_CENTER][BACK_LEFT ] += surround_mix_level * M_SQRT1_2; | 201 | matrix[FRONT_CENTER][BACK_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 170 | matrix[FRONT_CENTER][BACK_RIGHT] += surround_mix_level * M_SQRT1_2; | 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 | matrix[BACK_CENTER][SIDE_LEFT ] += M_SQRT1_2; | 219 | matrix[BACK_CENTER][SIDE_LEFT ] += M_SQRT1_2; |
| 188 | matrix[BACK_CENTER][SIDE_RIGHT] += M_SQRT1_2; | 220 | matrix[BACK_CENTER][SIDE_RIGHT] += M_SQRT1_2; |
| 189 | } else if (out_layout & AV_CH_FRONT_LEFT) { | 221 | } else if (out_layout & AV_CH_FRONT_LEFT) { |
| 190 | matrix[FRONT_LEFT ][SIDE_LEFT ] += surround_mix_level; | 222 | if (matrix_encoding == AV_MATRIX_ENCODING_DOLBY) { |
| 191 | matrix[FRONT_RIGHT][SIDE_RIGHT] += surround_mix_level; | 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 | } else if (out_layout & AV_CH_FRONT_CENTER) { | 236 | } else if (out_layout & AV_CH_FRONT_CENTER) { |
| 193 | matrix[FRONT_CENTER][SIDE_LEFT ] += surround_mix_level * M_SQRT1_2; | 237 | matrix[FRONT_CENTER][SIDE_LEFT ] += surround_mix_level * M_SQRT1_2; |
| 194 | matrix[FRONT_CENTER][SIDE_RIGHT] += surround_mix_level * M_SQRT1_2; | 238 | matrix[FRONT_CENTER][SIDE_RIGHT] += surround_mix_level * M_SQRT1_2; |