diff options
| author | Carl Hetherington <cth@carlh.net> | 2019-05-25 23:30:28 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2019-05-25 23:30:28 +0000 |
| commit | 677eaab5c03e9c614ae2bc417a43bd5c1295bb8d (patch) | |
| tree | 1f3c192c5f4c48a4b354774f351b7308cfca9021 | |
| parent | 67bd9c7a2fad1568ac10b771a76a601937c20174 (diff) | |
Fix slightly unbelievable out-of-bounds array access when setting up the audio map for mixdown-to-stereo.v2.14.5
| -rw-r--r-- | src/lib/audio_mapping.cc | 2 | ||||
| -rw-r--r-- | src/wx/film_viewer.cc | 28 |
2 files changed, 22 insertions, 8 deletions
diff --git a/src/lib/audio_mapping.cc b/src/lib/audio_mapping.cc index 86add09f4..f07d5dece 100644 --- a/src/lib/audio_mapping.cc +++ b/src/lib/audio_mapping.cc @@ -163,6 +163,8 @@ AudioMapping::AudioMapping (cxml::ConstNodePtr node, int state_version) void AudioMapping::set (int input_channel, int output_channel, float g) { + DCPOMATIC_ASSERT (input_channel < int(_gain.size())); + DCPOMATIC_ASSERT (output_channel < int(_gain[0].size())); _gain[input_channel][output_channel] = g; } diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 0fc338247..098fc2598 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -186,14 +186,26 @@ FilmViewer::recreate_butler () Map so that Lt = L(-3dB) + Ls(-3dB) + C(-6dB) + Lfe(-10dB) Rt = R(-3dB) + Rs(-3dB) + C(-6dB) + Lfe(-10dB) */ - map.set (dcp::LEFT, 0, 1 / sqrt(2)); // L -> Lt - map.set (dcp::RIGHT, 1, 1 / sqrt(2)); // R -> Rt - map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt - map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt - map.set (dcp::LFE, 0, 1 / sqrt(10)); // Lfe -> Lt - map.set (dcp::LFE, 1, 1 / sqrt(10)); // Lfe -> Rt - map.set (dcp::LS, 0, 1 / sqrt(2)); // Ls -> Lt - map.set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt + if (_film->audio_channels() > 0) { + map.set (dcp::LEFT, 0, 1 / sqrt(2)); // L -> Lt + } + if (_film->audio_channels() > 1) { + map.set (dcp::RIGHT, 1, 1 / sqrt(2)); // R -> Rt + } + if (_film->audio_channels() > 2) { + map.set (dcp::CENTRE, 0, 1 / 2.0); // C -> Lt + map.set (dcp::CENTRE, 1, 1 / 2.0); // C -> Rt + } + if (_film->audio_channels() > 3) { + map.set (dcp::LFE, 0, 1 / sqrt(10)); // Lfe -> Lt + map.set (dcp::LFE, 1, 1 / sqrt(10)); // Lfe -> Rt + } + if (_film->audio_channels() > 4) { + map.set (dcp::LS, 0, 1 / sqrt(2)); // Ls -> Lt + } + if (_film->audio_channels() > 5) { + map.set (dcp::RS, 1, 1 / sqrt(2)); // Rs -> Rt + } } _butler.reset (new Butler(_player, map, _audio_channels, bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true)); |
