+ auto map = AudioMapping(_film->audio_channels(), 2);
+ float const overall_gain = 2 / (4 + sqrt(2));
+ float const minus_3dB = 1 / sqrt(2);
+ switch (_film->audio_channels()) {
+ case 2:
+ map.set(dcp::Channel::LEFT, 0, 1);
+ map.set(dcp::Channel::RIGHT, 1, 1);
+ break;
+ case 4:
+ map.set(dcp::Channel::LEFT, 0, overall_gain);
+ map.set(dcp::Channel::RIGHT, 1, overall_gain);
+ map.set(dcp::Channel::CENTRE, 0, overall_gain * minus_3dB);
+ map.set(dcp::Channel::CENTRE, 1, overall_gain * minus_3dB);
+ map.set(dcp::Channel::LS, 0, overall_gain);
+ break;
+ default:
+ map.set(dcp::Channel::LEFT, 0, overall_gain);
+ map.set(dcp::Channel::RIGHT, 1, overall_gain);
+ map.set(dcp::Channel::CENTRE, 0, overall_gain * minus_3dB);
+ map.set(dcp::Channel::CENTRE, 1, overall_gain * minus_3dB);
+ map.set(dcp::Channel::LS, 0, overall_gain);
+ map.set(dcp::Channel::RS, 1, overall_gain);
+ break;
+ }
+ return map;
+}
+
+
+AudioMapping
+FFmpegEncoder::many_channel_map() const
+{
+ auto map = AudioMapping(_film->audio_channels(), _output_audio_channels);
+ for (int i = 0; i < _film->audio_channels(); ++i) {
+ map.set(i, i, 1);
+ }
+ return map;
+}
+
+
+void
+FFmpegEncoder::go ()
+{
+ {
+ auto job = _job.lock ();
+ DCPOMATIC_ASSERT (job);
+ job->sub (_("Encoding"));
+ }
+
+ Waker waker;
+
+ list<FileEncoderSet> file_encoders;
+
+ int const files = _split_reels ? _film->reels().size() : 1;