Merge master; fix crash on new film.
[dcpomatic.git] / src / lib / encoder.cc
index 46d11c55640e2fbf92a0789748f9f9a284c1d0b8..c1d1041ae539f9cdab1f087291eb2d8d7104abbb 100644 (file)
@@ -86,13 +86,20 @@ Encoder::process_begin ()
                s << String::compose (N_("Will resample audio from %1 to %2"), _film->audio_frame_rate(), _film->target_audio_sample_rate());
                _film->log()->log (s.str ());
 
-               /* We will be using planar float data when we call the resampler */
+               /* We will be using planar float data when we call the
+                  resampler.  As far as I can see, the audio channel
+                  layout is not necessary for our purposes; it seems
+                  only to be used get the number of channels and
+                  decide if rematrixing is needed.  It won't be, since
+                  input and output layouts are the same.
+               */
+
                _swr_context = swr_alloc_set_opts (
                        0,
-                       _film->audio_channel_layout(),
+                       av_get_default_channel_layout (_film->audio_mapping().dcp_channels ()),
                        AV_SAMPLE_FMT_FLTP,
                        _film->target_audio_sample_rate(),
-                       _film->audio_channel_layout(),
+                       av_get_default_channel_layout (_film->audio_mapping().dcp_channels ()),
                        AV_SAMPLE_FMT_FLTP,
                        _film->audio_frame_rate(),
                        0, 0
@@ -128,9 +135,9 @@ void
 Encoder::process_end ()
 {
 #if HAVE_SWRESAMPLE    
-       if (_film->has_audio() && _film->audio_channels() && _swr_context) {
+       if (_film->has_audio() && _swr_context) {
 
-               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_channels(), 256));
+               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_mapping().dcp_channels(), 256));
                        
                while (1) {
                        int const frames = swr_convert (_swr_context, (uint8_t **) out->data(), 256, 0, 0);
@@ -233,7 +240,7 @@ Encoder::frame_done ()
 }
 
 void
-Encoder::process_video (shared_ptr<Image> image, bool same, shared_ptr<Subtitle> sub)
+Encoder::process_video (shared_ptr<const Image> image, bool same, shared_ptr<Subtitle> sub)
 {
        FrameRateConversion frc (_film->video_frame_rate(), _film->dcp_frame_rate());
        
@@ -296,7 +303,7 @@ Encoder::process_video (shared_ptr<Image> image, bool same, shared_ptr<Subtitle>
 }
 
 void
-Encoder::process_audio (shared_ptr<AudioBuffers> data)
+Encoder::process_audio (shared_ptr<const AudioBuffers> data)
 {
 #if HAVE_SWRESAMPLE
        /* Maybe sample-rate convert */
@@ -305,7 +312,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
                /* Compute the resampled frames count and add 32 for luck */
                int const max_resampled_frames = ceil ((int64_t) data->frames() * _film->target_audio_sample_rate() / _film->audio_frame_rate()) + 32;
 
-               shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_channels(), max_resampled_frames));
+               shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_mapping().dcp_channels(), max_resampled_frames));
 
                /* Resample audio */
                int const resampled_frames = swr_convert (
@@ -335,7 +342,9 @@ Encoder::terminate_threads ()
        lock.unlock ();
 
        for (list<boost::thread *>::iterator i = _threads.begin(); i != _threads.end(); ++i) {
-               (*i)->join ();
+               if ((*i)->joinable ()) {
+                       (*i)->join ();
+               }
                delete *i;
        }
 }
@@ -416,7 +425,7 @@ Encoder::encoder_thread (ServerDescription* server)
                }
 
                if (remote_backoff > 0) {
-                       dvdomatic_sleep (remote_backoff);
+                       dcpomatic_sleep (remote_backoff);
                }
 
                lock.lock ();