X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_encoder.cc;h=6b3118537694ba6e64dacaac0d9edf093789fd18;hb=f62398d081db17afd1816bfc8312afb386f22e78;hp=7c641f5ab5e684720bc0187ef48307bdff4cea88;hpb=4d11fe7cea71b0564df9a21a3cc706509d12b0d1;p=dcpomatic.git diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc index 7c641f5ab..6b3118537 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) { @@ -130,6 +130,8 @@ FFmpegEncoder::go () job->sub (_("Encoding")); } + Waker waker; + list reel_periods = _film->reels (); list::const_iterator reel = reel_periods.begin (); list::iterator encoder = _file_encoders.begin (); @@ -150,8 +152,11 @@ FFmpegEncoder::go () } for (int j = 0; j < gets_per_frame; ++j) { - pair, DCPTime> v = _butler->get_video (); - encoder->get(v.first->eyes())->video(v.first, v.second); + pair, DCPTime> v = _butler->get_video (true, 0); + shared_ptr fe = encoder->get (v.first->eyes()); + if (fe) { + fe->video(v.first, v.second); + } } _history.event (); @@ -166,6 +171,8 @@ FFmpegEncoder::go () job->set_progress (float(i.get()) / _film->length().get()); } + waker.nudge (); + _butler->get_audio (interleaved, audio_frames); /* XXX: inefficient; butler interleaves and we deinterleave again */ float* p = interleaved; @@ -183,7 +190,7 @@ FFmpegEncoder::go () } } -float +optional FFmpegEncoder::current_rate () const { return _history.rate (); @@ -243,6 +250,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;