#endif
)
: Encoder (film, job)
- , _history (1000)
+ , _history (200)
{
int const files = split_reels ? film->reels().size() : 1;
for (int i = 0; i < files; ++i) {
map = AudioMapping (ch, 2);
float const overall_gain = 2 / (4 + sqrt(2));
float const minus_3dB = 1 / sqrt(2);
- map.set (dcp::LEFT, 0, overall_gain);
- map.set (dcp::RIGHT, 1, overall_gain);
- map.set (dcp::CENTRE, 0, overall_gain * minus_3dB);
- map.set (dcp::CENTRE, 1, overall_gain * minus_3dB);
- map.set (dcp::LS, 0, overall_gain);
- map.set (dcp::RS, 1, overall_gain);
+ if (ch == 2) {
+ map.set (dcp::LEFT, 0, 1);
+ map.set (dcp::RIGHT, 1, 1);
+ } else if (ch == 4) {
+ map.set (dcp::LEFT, 0, overall_gain);
+ map.set (dcp::RIGHT, 1, overall_gain);
+ map.set (dcp::CENTRE, 0, overall_gain * minus_3dB);
+ map.set (dcp::CENTRE, 1, overall_gain * minus_3dB);
+ map.set (dcp::LS, 0, overall_gain);
+ } else if (ch >= 6) {
+ map.set (dcp::LEFT, 0, overall_gain);
+ map.set (dcp::RIGHT, 1, overall_gain);
+ map.set (dcp::CENTRE, 0, overall_gain * minus_3dB);
+ map.set (dcp::CENTRE, 1, overall_gain * minus_3dB);
+ map.set (dcp::LS, 0, overall_gain);
+ map.set (dcp::RS, 1, overall_gain);
+ }
+ /* XXX: maybe we should do something better for >6 channel DCPs */
} else {
_output_audio_channels = ch;
map = AudioMapping (ch, ch);
}
for (int j = 0; j < gets_per_frame; ++j) {
- pair<shared_ptr<PlayerVideo>, DCPTime> v = _butler->get_video (true, 0);
+ Butler::Error e;
+ pair<shared_ptr<PlayerVideo>, DCPTime> v = _butler->get_video (true, &e);
+ _butler->rethrow ();
+ if (!v.first) {
+ throw ProgrammingError(__FILE__, __LINE__, String::compose("butler returned no video; error was %1", static_cast<int>(e)));
+ }
shared_ptr<FFmpegFileEncoder> fe = encoder->get (v.first->eyes());
if (fe) {
fe->video(v.first, v.second);