Numerous fixes to A/B mode so that at least it doesn't crash (#72).
authorCarl Hetherington <cth@carlh.net>
Fri, 8 Mar 2013 21:03:28 +0000 (21:03 +0000)
committerCarl Hetherington <cth@carlh.net>
Fri, 8 Mar 2013 21:03:28 +0000 (21:03 +0000)
22 files changed:
src/lib/ab_transcoder.cc
src/lib/combiner.cc
src/lib/combiner.h
src/lib/dcp_video_frame.cc
src/lib/dcp_video_frame.h
src/lib/delay_line.cc
src/lib/delay_line.h
src/lib/film.cc
src/lib/film.h
src/lib/gain.cc
src/lib/gain.h
src/lib/matcher.cc
src/lib/matcher.h
src/lib/processor.h
src/lib/server.cc
src/lib/server.h
src/lib/transcoder.cc
src/tools/dvdomatic.cc
src/tools/servomatic_cli.cc
src/tools/servomatic_gui.cc
src/tools/servomatictest.cc
test/test.cc

index 4ed5d02ca7018e3f90048448c49114dd2106253c..3a1cd83d77473ccfed80da473c39244e50ff80c6 100644 (file)
@@ -40,6 +40,7 @@
 
 using std::string;
 using boost::shared_ptr;
+using boost::dynamic_pointer_cast;
 
 /** @param a Film to use for the left half of the screen.
  *  @param b Film to use for the right half of the screen.
@@ -54,6 +55,7 @@ ABTranscoder::ABTranscoder (
        , _film_b (b)
        , _job (j)
        , _encoder (e)
+       , _combiner (new Combiner (a->log()))
 {
        _da = decoder_factory (_film_a, o);
        _db = decoder_factory (_film_b, o);
@@ -92,17 +94,24 @@ void
 ABTranscoder::go ()
 {
        _encoder->process_begin ();
+
+       bool done[3] = { false, false, false };
        
        while (1) {
-               bool const va = _da.video->pass ();
-               bool const vb = _db.video->pass ();
-               bool const a = _da.audio->pass ();
+               done[0] = _da.video->pass ();
+               done[1] = _db.video->pass ();
+               
+               if (!done[2] && _da.audio && dynamic_pointer_cast<Decoder> (_da.audio) != dynamic_pointer_cast<Decoder> (_da.video)) {
+                       done[2] = _da.audio->pass ();
+               } else {
+                       done[2] = true;
+               }
 
                if (_job) {
                        _da.video->set_progress (_job);
                }
 
-               if (va && vb && a) {
+               if (done[0] && done[1] && done[2]) {
                        break;
                }
        }
index 68aafd2a24d97d65b183dfcf97f0edd97a5fb48c..12ce4a96e289b6c09da748808f28dac6ed629526 100644 (file)
@@ -22,7 +22,7 @@
 
 using boost::shared_ptr;
 
-Combiner::Combiner (Log* log)
+Combiner::Combiner (shared_ptr<Log> log)
        : VideoProcessor (log)
 {
 
index 7fad1aeae84d44a486bb1d2b09b680274669e5c0..68026eaff7eec0814f7017f140ac1c8b8ed12095 100644 (file)
@@ -31,7 +31,7 @@
 class Combiner : public VideoProcessor
 {
 public:
-       Combiner (Log* log);
+       Combiner (boost::shared_ptr<Log> log);
 
        void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
        void process_video_b (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
index 67617c63ccf5c75dab214d26853ef84c9ebfd335..d735122b5ce3ccd7e8ddf6f711f6e198fd2f94ef 100644 (file)
@@ -80,7 +80,7 @@ using libdcp::Size;
 DCPVideoFrame::DCPVideoFrame (
        shared_ptr<const Image> yuv, shared_ptr<Subtitle> sub,
        Size out, int p, int subtitle_offset, float subtitle_scale,
-       Scaler const * s, int f, int dcp_fps, string pp, int clut, int bw, Log* l
+       Scaler const * s, int f, int dcp_fps, string pp, int clut, int bw, shared_ptr<Log> l
        )
        : _input (yuv)
        , _subtitle (sub)
index 6794765acefbc1f7a7f85a9cb57449fa1d3e5fe4..4ceb07d2649905a87a80ebf9daa6712e97fc8d96 100644 (file)
@@ -107,7 +107,7 @@ class DCPVideoFrame
 public:
        DCPVideoFrame (
                boost::shared_ptr<const Image>, boost::shared_ptr<Subtitle>, libdcp::Size,
-               int, int, float, Scaler const *, int, int, std::string, int, int, Log *
+               int, int, float, Scaler const *, int, int, std::string, int, int, boost::shared_ptr<Log>
                );
        
        virtual ~DCPVideoFrame ();
@@ -135,7 +135,7 @@ private:
        int _colour_lut;                 ///< Colour look-up table to use
        int _j2k_bandwidth;              ///< J2K bandwidth to use
 
-       Log* _log; ///< log
+       boost::shared_ptr<Log> _log; ///< log
 
        opj_image_cmptparm_t _cmptparm[3]; ///< libopenjpeg's opj_image_cmptparm_t
        opj_image* _image;                 ///< libopenjpeg's image container 
index 4ad17278169574f6a9af75bd233d7509a80473f3..53da9a41283a25c5dc9d6ebfa9a5b4a1d51cc4e4 100644 (file)
@@ -30,7 +30,7 @@ using boost::shared_ptr;
 /** @param channels Number of channels of audio.
  *  @param frames Delay in frames, +ve to move audio later.
  */
-DelayLine::DelayLine (Log* log, int channels, int frames)
+DelayLine::DelayLine (shared_ptr<Log> log, int channels, int frames)
        : AudioProcessor (log)
        , _negative_delay_remaining (0)
        , _frames (frames)
index 4d6f1313bd1e5af24fbaf3ed8b61a13312e754cd..c51784f353ab7edbbdcd373f6bcb42da5957bf8c 100644 (file)
@@ -26,7 +26,7 @@ class AudioBuffers;
 class DelayLine : public AudioProcessor
 {
 public:
-       DelayLine (Log* log, int channels, int frames);
+       DelayLine (boost::shared_ptr<Log> log, int channels, int frames);
        
        void process_audio (boost::shared_ptr<AudioBuffers>);
 
index 20e08c0377551af253ad2347285a401a415ecca4..8028f40ef0ee0bf6e849cd9798a43f3bed81b40e 100644 (file)
@@ -144,12 +144,13 @@ Film::Film (string d, bool must_exist)
                read_metadata ();
        }
 
-       _log = new FileLog (file ("log"));
+       _log.reset (new FileLog (file ("log")));
 }
 
 Film::Film (Film const & o)
        : boost::enable_shared_from_this<Film> (o)
-       , _log (0)
+       /* note: the copied film shares the original's log */
+       , _log               (o._log)
        , _directory         (o._directory)
        , _name              (o._name)
        , _use_dci_name      (o._use_dci_name)
@@ -188,12 +189,12 @@ Film::Film (Film const & o)
        , _source_frame_rate (o._source_frame_rate)
        , _dirty             (o._dirty)
 {
-
+       
 }
 
 Film::~Film ()
 {
-       delete _log;
+
 }
 
 string
index 88f6fbcd7cac889542608b7d7e564024a42ee611..2ab4a94509657d4b382bc16f093599016188e26d 100644 (file)
@@ -77,7 +77,7 @@ public:
        /** @return Logger.
         *  It is safe to call this from any thread.
         */
-       Log* log () const {
+       boost::shared_ptr<Log> log () const {
                return _log;
        }
 
@@ -382,7 +382,7 @@ public:
 private:
        
        /** Log to write to */
-       Log* _log;
+       boost::shared_ptr<Log> _log;
 
        /** Any running ExamineContentJob, or 0 */
        boost::shared_ptr<ExamineContentJob> _examine_content_job;
index cec3b3c62c4d3acf64238600c3f62d19119c3c26..df7011d2e8100a14e537234d9e6d6fb0e2fb8d57 100644 (file)
@@ -22,7 +22,7 @@
 using boost::shared_ptr;
 
 /** @param gain gain in dB */
-Gain::Gain (Log* log, float gain)
+Gain::Gain (shared_ptr<Log> log, float gain)
        : AudioProcessor (log)
        , _gain (gain)
 {
index 716ee9b51abd38b4e578ec86726ae6d601ce0884..d462e5aeee2471988d203cee7805c8c2f458c400 100644 (file)
@@ -22,7 +22,7 @@
 class Gain : public AudioProcessor
 {
 public:
-       Gain (Log* log, float gain);
+       Gain (boost::shared_ptr<Log> log, float gain);
 
        void process_audio (boost::shared_ptr<AudioBuffers>);
 
index 4cd2643381ab8138ebf6862b931cf3eff3f0f0ac..48f6ed9126dd980c13b79b6665a3a82ad203bf9b 100644 (file)
@@ -26,7 +26,7 @@
 using std::min;
 using boost::shared_ptr;
 
-Matcher::Matcher (Log* log, int sample_rate, float frames_per_second)
+Matcher::Matcher (shared_ptr<Log> log, int sample_rate, float frames_per_second)
        : AudioVideoProcessor (log)
        , _sample_rate (sample_rate)
        , _frames_per_second (frames_per_second)
index 60bb8743226078628adfb7246fe2a3922c83a7b3..b1680e13106301380a62412d926e56d6cdbfdef1 100644 (file)
@@ -24,7 +24,7 @@
 class Matcher : public AudioVideoProcessor
 {
 public:
-       Matcher (Log* log, int sample_rate, float frames_per_second);
+       Matcher (boost::shared_ptr<Log> log, int sample_rate, float frames_per_second);
        void process_video (boost::shared_ptr<Image> i, bool, boost::shared_ptr<Subtitle> s);
        void process_audio (boost::shared_ptr<AudioBuffers>);
        void process_end ();
index 19d7c4b0c82e80e0ec22ee6a259a3f7d69efb0f0..1ba396f2f5decc945e339ba0a633ff4751bf3ef9 100644 (file)
@@ -40,7 +40,7 @@ public:
        /** Construct a Processor.
         *  @param log Log to use.
         */
-       Processor (Log* log)
+       Processor (boost::shared_ptr<Log> log)
                : _log (log)
        {}
 
@@ -50,7 +50,7 @@ public:
        virtual void process_end () {}
 
 protected:
-       Log* _log; ///< log to write to
+       boost::shared_ptr<Log> _log; ///< log to write to
 };
 
 /** @class AudioVideoProcessor
@@ -62,7 +62,7 @@ public:
        /** Construct an AudioVideoProcessor.
         *  @param log Log to write to.
         */
-       AudioVideoProcessor (Log* log)
+       AudioVideoProcessor (boost::shared_ptr<Log> log)
                : Processor (log)
        {}
 };
@@ -76,7 +76,7 @@ public:
        /** Construct an AudioProcessor.
         *  @param log Log to write to.
         */
-       AudioProcessor (Log* log)
+       AudioProcessor (boost::shared_ptr<Log> log)
                : Processor (log)
        {}
 };
@@ -90,7 +90,7 @@ public:
        /** Construct an VideoProcessor.
         *  @param log Log to write to.
         */
-       VideoProcessor (Log* log)
+       VideoProcessor (boost::shared_ptr<Log> log)
                : Processor (log)
        {}
 };
index 76a25bfbbf909598ff91b71cb2c756bfe31da724..9c5a77f681b2903390fec271f5610c62cd2d8b16 100644 (file)
@@ -77,7 +77,7 @@ ServerDescription::as_metadata () const
        return s.str ();
 }
 
-Server::Server (Log* log)
+Server::Server (shared_ptr<Log> log)
        : _log (log)
 {
 
index 32ba8dc4b96757fe0d3938317e2fe1c0c9abff2b..89aeca62632c3aeda94bff27b43e7fe494d6efa6 100644 (file)
@@ -76,7 +76,7 @@ private:
 class Server
 {
 public:
-       Server (Log* log);
+       Server (boost::shared_ptr<Log> log);
 
        void run (int num_threads);
 
@@ -88,5 +88,5 @@ private:
        std::list<boost::shared_ptr<Socket> > _queue;
        boost::mutex _worker_mutex;
        boost::condition _worker_condition;
-       Log* _log;
+       boost::shared_ptr<Log> _log;
 };
index 9720ca56ad3654849a31fa258292a60d75f139b3..e0f3a03a2319c02de63918a6201647c48fe478cc 100644 (file)
@@ -38,7 +38,6 @@
 #include "audio_decoder.h"
 
 using std::string;
-using std::cout;
 using boost::shared_ptr;
 using boost::dynamic_pointer_cast;
 
index 4874e6ef856478406fe3571e5e49e52cc0dc2b3c..230e02c88f8e2f8a587257c5bb77be7fe040fdd5 100644 (file)
@@ -482,12 +482,16 @@ class App : public wxApp
 #ifdef DVDOMATIC_POSIX         
                unsetenv ("UBUNTU_MENUPROXY");
 #endif         
-               
+
+               /* This needs to be before setup_i18n, as setup_i18n() will
+                  create a Config object, which needs Scalers to have
+                  been created.
+               */
+               dvdomatic_setup ();
+
                wxInitAllImageHandlers ();
                setup_i18n ();
                
-               dvdomatic_setup ();
-
                if (!film_to_load.empty() && boost::filesystem::is_directory (film_to_load)) {
                        try {
                                film.reset (new Film (film_to_load));
index f8e71319357aed790b43918206e197a579d753f5..6626d45b9b63954bc0c7b18def65efb593a945dc 100644 (file)
 #include "log.h"
 #include "version.h"
 
-using namespace std;
+using std::cerr;
+using std::string;
+using std::cout;
+using boost::shared_ptr;
 
 static void
 help (string n)
@@ -87,8 +90,8 @@ main (int argc, char* argv[])
        }
 
        Scaler::setup_scalers ();
-       FileLog log ("servomatic.log");
-       Server server (&log);
+       shared_ptr<FileLog> log (new FileLog ("servomatic.log"));
+       Server server (log);
        server.run (num_threads);
        return 0;
 }
index 610ba8005eb30aa5c70bac0e27e436571fa8069e..dd169725f988f7f96669afd03378145702390542 100644 (file)
 #include "lib/server.h"
 #include "lib/config.h"
 
-using namespace std;
-using namespace boost;
+using std::cout;
+using std::string;
+using boost::shared_ptr;
+using boost::thread;
+using boost::bind;
 
 enum {
        ID_status = 1,
@@ -52,7 +55,7 @@ private:
        string _log;    
 };
 
-static MemoryLog memory_log;
+static shared_ptr<MemoryLog> memory_log (new MemoryLog);
 
 class StatusDialog : public wxDialog
 {
@@ -77,7 +80,7 @@ public:
 private:
        void update (wxTimerEvent &)
        {
-               _text->ChangeValue (std_to_wx (memory_log.get ()));
+               _text->ChangeValue (std_to_wx (memory_log->get ()));
                _sizer->Layout ();
        }
 
@@ -141,7 +144,7 @@ private:
 
        void main_thread ()
        {
-               Server server (&memory_log);
+               Server server (memory_log);
                server.run (Config::instance()->num_local_encoding_threads ());
        }
 
index 91ad02120950346976b6e22b19ec2d75aca965d7..f5756c6939e7770fc12040838fc2c7b7c0030ad3 100644 (file)
@@ -43,7 +43,7 @@ using std::pair;
 using boost::shared_ptr;
 
 static ServerDescription* server;
-static FileLog log_ ("servomatictest.log");
+static shared_ptr<FileLog> log_ (new FileLog ("servomatictest.log"));
 static int frame = 0;
 
 void
@@ -53,14 +53,14 @@ process_video (shared_ptr<Image> image, bool, shared_ptr<Subtitle> sub)
                new DCPVideoFrame (
                        image, sub,
                        libdcp::Size (1024, 1024), 0, 0, 0,
-                       Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)
+                       Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, log_)
                );
        
        shared_ptr<DCPVideoFrame> remote (
                new DCPVideoFrame (
                        image, sub,
                        libdcp::Size (1024, 1024), 0, 0, 0,
-                       Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, &log_)
+                       Scaler::from_id ("bicubic"), frame, 24, "", 0, 250000000, log_)
                );
 
        cout << "Frame " << frame << ": ";
index 15c34ca78dc23206f0efaa9f83e512701db202de..448168f241ddc16eebb518e8463c6491e74569cf 100644 (file)
@@ -254,9 +254,9 @@ public:
 void
 do_positive_delay_line_test (int delay_length, int data_length)
 {
-       NullLog log;
+       shared_ptr<NullLog> log (new NullLog);
        
-       DelayLine d (&log, 6, delay_length);
+       DelayLine d (log, 6, delay_length);
        shared_ptr<AudioBuffers> data (new AudioBuffers (6, data_length));
 
        int in = 0;
@@ -297,9 +297,9 @@ do_positive_delay_line_test (int delay_length, int data_length)
 void
 do_negative_delay_line_test (int delay_length, int data_length)
 {
-       NullLog log;
+       shared_ptr<NullLog> log (new NullLog);
 
-       DelayLine d (&log, 6, delay_length);
+       DelayLine d (log, 6, delay_length);
        shared_ptr<AudioBuffers> data (new AudioBuffers (6, data_length));
 
        int in = 0;
@@ -406,7 +406,7 @@ BOOST_AUTO_TEST_CASE (client_server_test)
 
        shared_ptr<Subtitle> subtitle (new Subtitle (Position (50, 60), sub_image));
 
-       FileLog log ("build/test/client_server_test.log");
+       shared_ptr<FileLog> log (new FileLog ("build/test/client_server_test.log"));
 
        shared_ptr<DCPVideoFrame> frame (
                new DCPVideoFrame (
@@ -422,14 +422,14 @@ BOOST_AUTO_TEST_CASE (client_server_test)
                        "",
                        0,
                        200000000,
-                       &log
+                       log
                        )
                );
 
        shared_ptr<EncodedData> locally_encoded = frame->encode_locally ();
        BOOST_ASSERT (locally_encoded);
        
-       Server* server = new Server (&log);
+       Server* server = new Server (log);
 
        new thread (boost::bind (&Server::run, server, 2));