X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fffmpeg_encoder.cc;h=61e489f071c112e6d092438430ba919e83654a2d;hp=6c006167028bb63fdf999c71bb48b24fdbf4c37a;hb=f515b8daea9d28200be803bb64ff17e9f30343c4;hpb=09c0b4dc1566f11f35ec05be415be1b95bd9976c diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc index 6c0061670..61e489f07 100644 --- a/src/lib/ffmpeg_encoder.cc +++ b/src/lib/ffmpeg_encoder.cc @@ -59,7 +59,7 @@ FFmpegEncoder::FFmpegEncoder ( #endif ) : Encoder (film, job) - , _history (1000) + , _history (200) { int const files = split_reels ? film->reels().size() : 1; for (int i = 0; i < files; ++i) { @@ -152,8 +152,15 @@ FFmpegEncoder::go () } for (int j = 0; j < gets_per_frame; ++j) { - pair, DCPTime> v = _butler->get_video (true, 0); - encoder->get(v.first->eyes())->video(v.first, v.second); + Butler::Error e; + pair, DCPTime> v = _butler->get_video (true, &e); + if (!v.first) { + throw ProgrammingError(__FILE__, __LINE__, String::compose("butler returned no video; error was %1", static_cast(e))); + } + shared_ptr fe = encoder->get (v.first->eyes()); + if (fe) { + fe->video(v.first, v.second); + } } _history.event (); @@ -247,6 +254,17 @@ FFmpegEncoder::FileEncoderSet::FileEncoderSet ( shared_ptr FFmpegEncoder::FileEncoderSet::get (Eyes eyes) const { + if (_encoders.size() == 1) { + /* We are doing a 2D export... */ + if (eyes == EYES_LEFT) { + /* ...but we got some 3D data; put the left eye into the output... */ + eyes = EYES_BOTH; + } else if (eyes == EYES_RIGHT) { + /* ...and ignore the right eye.*/ + return shared_ptr(); + } + } + map >::const_iterator i = _encoders.find (eyes); DCPOMATIC_ASSERT (i != _encoders.end()); return i->second;