X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_encoder.cc;h=6b3118537694ba6e64dacaac0d9edf093789fd18;hb=3dfe3b92df03eee932f3c92336197559c11a5913;hp=e29d37cec96915ed916618e45dad4182b8daf57f;hpb=2fc2c321a45f9cfb1d1e09989f346ee6d44c0fa4;p=dcpomatic.git diff --git a/src/lib/ffmpeg_encoder.cc b/src/lib/ffmpeg_encoder.cc index e29d37cec..6b3118537 100644 --- a/src/lib/ffmpeg_encoder.cc +++ b/src/lib/ffmpeg_encoder.cc @@ -41,8 +41,10 @@ using std::map; using boost::shared_ptr; using boost::bind; using boost::weak_ptr; +using boost::optional; using namespace dcpomatic; +/** @param key Key to use to encrypt MP4 outputs */ FFmpegEncoder::FFmpegEncoder ( shared_ptr film, weak_ptr job, @@ -51,9 +53,13 @@ FFmpegEncoder::FFmpegEncoder ( bool mixdown_to_stereo, bool split_reels, int x264_crf +#ifdef DCPOMATIC_VARIANT_SWAROOP + , optional key + , optional id +#endif ) : Encoder (film, job) - , _history (1000) + , _history (200) { int const files = split_reels ? film->reels().size() : 1; for (int i = 0; i < files; ++i) { @@ -79,6 +85,10 @@ FFmpegEncoder::FFmpegEncoder ( _film->three_d(), filename, extension +#ifdef DCPOMATIC_VARIANT_SWAROOP + , key + , id +#endif ) ); } @@ -120,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 (); @@ -140,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 (); @@ -156,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; @@ -173,7 +190,7 @@ FFmpegEncoder::go () } } -float +optional FFmpegEncoder::current_rate () const { return _history.rate (); @@ -196,20 +213,36 @@ FFmpegEncoder::FileEncoderSet::FileEncoderSet ( bool three_d, boost::filesystem::path output, string extension +#ifdef DCPOMATIC_VARIANT_SWAROOP + , optional key + , optional id +#endif ) { if (three_d) { /// TRANSLATORS: L here is an abbreviation for "left", to indicate the left-eye part of a 3D export _encoders[EYES_LEFT] = shared_ptr( - new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1_%2%3", output.string(), _("L"), extension)) + new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1_%2%3", output.string(), _("L"), extension) +#ifdef DCPOMATIC_VARIANT_SWAROOP + , key, id +#endif + ) ); /// TRANSLATORS: R here is an abbreviation for "right", to indicate the right-eye part of a 3D export _encoders[EYES_RIGHT] = shared_ptr( - new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1_%2%3", output.string(), _("R"), extension)) + new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1_%2%3", output.string(), _("R"), extension) +#ifdef DCPOMATIC_VARIANT_SWAROOP + , key, id +#endif + ) ); } else { _encoders[EYES_BOTH] = shared_ptr( - new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1%2", output.string(), extension)) + new FFmpegFileEncoder(video_frame_size, video_frame_rate, audio_frame_rate, channels, format, x264_crf, String::compose("%1%2", output.string(), extension) +#ifdef DCPOMATIC_VARIANT_SWAROOP + , key, id +#endif + ) ); } } @@ -217,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;