Try to fix crash on finishing off DCPs with mono -> 5.1 conversions.
authorCarl Hetherington <cth@carlh.net>
Mon, 18 Feb 2013 09:55:07 +0000 (09:55 +0000)
committerCarl Hetherington <cth@carlh.net>
Mon, 18 Feb 2013 09:55:07 +0000 (09:55 +0000)
src/lib/encoder.cc
src/lib/encoder.h

index d64622cbaa711b1dd046796e97e0318ad1b1bc21..f252563792374bbac363be6af999e55f5d08f716 100644 (file)
@@ -140,7 +140,7 @@ Encoder::process_end ()
                        }
 
                        out->set_frames (frames);
-                       _writer->write (out);
+                       write_audio (out);
                }
 
                swr_free (&_swr_context);
@@ -319,23 +319,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
        }
 #endif
 
-       if (_film->audio_channels() == 1) {
-               /* We need to switch things around so that the mono channel is on
-                  the centre channel of a 5.1 set (with other channels silent).
-               */
-
-               shared_ptr<AudioBuffers> b (new AudioBuffers (6, data->frames ()));
-               b->make_silent (libdcp::LEFT);
-               b->make_silent (libdcp::RIGHT);
-               memcpy (b->data()[libdcp::CENTRE], data->data()[0], data->frames() * sizeof(float));
-               b->make_silent (libdcp::LFE);
-               b->make_silent (libdcp::LS);
-               b->make_silent (libdcp::RS);
-
-               data = b;
-       }
-
-       _writer->write (data);
+       write_audio (data);
 }
 
 void
@@ -435,3 +419,25 @@ Encoder::encoder_thread (ServerDescription* server)
                _condition.notify_all ();
        }
 }
+
+void
+Encoder::write_audio (shared_ptr<const AudioBuffers> data)
+{
+       if (_film->audio_channels() == 1) {
+               /* We need to switch things around so that the mono channel is on
+                  the centre channel of a 5.1 set (with other channels silent).
+               */
+
+               shared_ptr<AudioBuffers> b (new AudioBuffers (6, data->frames ()));
+               b->make_silent (libdcp::LEFT);
+               b->make_silent (libdcp::RIGHT);
+               memcpy (b->data()[libdcp::CENTRE], data->data()[0], data->frames() * sizeof(float));
+               b->make_silent (libdcp::LFE);
+               b->make_silent (libdcp::LS);
+               b->make_silent (libdcp::RS);
+
+               data = b;
+       }
+
+       _writer->write (data);
+}
index 69a5c5a2378c67e31dbe4d033474483b2c038fc4..86880bc34942561ba12a1488feb00663c2c9d6d8 100644 (file)
@@ -88,7 +88,7 @@ private:
        
        void frame_done ();
        
-       void write_audio (boost::shared_ptr<const AudioBuffers> audio);
+       void write_audio (boost::shared_ptr<const AudioBuffers> data);
 
        void encoder_thread (ServerDescription *);
        void terminate_threads ();