Merge in 0.70 branch with 0.71 fix.
[dcpomatic.git] / src / lib / encoder.cc
index 4a829bafda0ee1cae08306344c3b7ff546a2f250..910d7c58e535cba24edd1d54fcc6c05906ba7608 100644 (file)
@@ -42,6 +42,7 @@ using std::stringstream;
 using std::vector;
 using std::list;
 using std::cout;
+using std::make_pair;
 using namespace boost;
 
 int const Encoder::_history_size = 25;
@@ -136,7 +137,7 @@ void
 Encoder::process_end ()
 {
 #if HAVE_SWRESAMPLE    
-       if (_film->audio_stream() && _swr_context) {
+       if (_film->audio_stream() && _film->audio_stream()->channels() && _swr_context) {
 
                shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_stream()->channels(), 256));
                        
@@ -207,6 +208,12 @@ Encoder::process_end ()
                        _film->log()->log (String::compose ("Local encode failed (%1)", e.what ()));
                }
        }
+
+       /* Now do links (or copies on windows) to duplicate frames */
+       for (list<pair<int, int> >::iterator i = _links_required.begin(); i != _links_required.end(); ++i) {
+               link (_opt->frame_out_path (i->first, false), _opt->frame_out_path (i->second, false));
+               link (_opt->hash_out_path (i->first, false), _opt->hash_out_path (i->second, false));
+       }
 }      
 
 /** @return an estimate of the current number of frames we are encoding per second,
@@ -305,9 +312,11 @@ Encoder::process_video (shared_ptr<Image> image, bool same, boost::shared_ptr<Su
        }
 
        if (same && _last_real_frame) {
-               /* Use the last frame that we encoded */
-               link (_opt->frame_out_path (_last_real_frame.get(), false), _opt->frame_out_path (_video_frame, false));
-               link (_opt->hash_out_path (_last_real_frame.get(), false), _opt->hash_out_path (_video_frame, false));
+               /* Use the last frame that we encoded.  We need to postpone doing the actual link,
+                  as on windows the link is really a copy and the reference frame might not have
+                  finished encoding yet.
+               */
+               _links_required.push_back (make_pair (_last_real_frame.get(), _video_frame));
        } else {
                /* Queue this new frame for encoding */
                pair<string, string> const s = Filter::ffmpeg_strings (_film->filters());
@@ -316,7 +325,7 @@ Encoder::process_video (shared_ptr<Image> image, bool same, boost::shared_ptr<Su
                                          new DCPVideoFrame (
                                                  image, sub, _opt->out_size, _opt->padding, _film->subtitle_offset(), _film->subtitle_scale(),
                                                  _film->scaler(), _video_frame, _film->frames_per_second(), s.second,
-                                                 Config::instance()->colour_lut_index (), Config::instance()->j2k_bandwidth (),
+                                                 _film->colour_lut(), _film->j2k_bandwidth(),
                                                  _film->log()
                                                  )
                                          ));
@@ -341,6 +350,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
 
                if (this_range.second < required_range.first || required_range.second < this_range.first) {
                        /* No part of this audio is within the required range */
+                       _audio_frame += data->frames();
                        return;
                } else if (required_range.first >= this_range.first && required_range.first < this_range.second) {
                        /* Trim start */
@@ -392,6 +402,8 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
                b->make_silent (libdcp::LFE);
                b->make_silent (libdcp::LS);
                b->make_silent (libdcp::RS);
+
+               data = b;
        }
 
        write_audio (data);