Use SafeStringStream instead of std::stringstream to try to fix random crashes on...
[dcpomatic.git] / src / lib / writer.cc
index b058c2801160d301142e00509159aa7a243b57a1..e8d4f90a6cbc181bb7c162cf5bf7efc1179db29c 100644 (file)
 #include "config.h"
 #include "job.h"
 #include "cross.h"
+#include "md5_digester.h"
 
 #include "i18n.h"
 
-#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::GENERAL);
-#define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TIMING);
-#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, Log::WARNING);
+#define LOG_GENERAL(...) _film->log()->log (String::compose (__VA_ARGS__), Log::TYPE_GENERAL);
+#define LOG_TIMING(...) _film->log()->microsecond_log (String::compose (__VA_ARGS__), Log::TYPE_TIMING);
+#define LOG_WARNING_NC(...) _film->log()->log (__VA_ARGS__, Log::TYPE_WARNING);
 
 /* OS X strikes again */
 #undef set_key
@@ -52,7 +53,6 @@ using std::pair;
 using std::string;
 using std::list;
 using std::cout;
-using std::stringstream;
 using boost::shared_ptr;
 using boost::weak_ptr;
 
@@ -135,6 +135,7 @@ Writer::write (shared_ptr<const EncodedData> encoded, int frame, Eyes eyes)
        boost::mutex::scoped_lock lock (_mutex);
 
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
+               /* The queue is too big; wait until that is sorted out */
                _full_condition.wait (lock);
        }
 
@@ -156,7 +157,8 @@ Writer::write (shared_ptr<const EncodedData> encoded, int frame, Eyes eyes)
                _queue.push_back (qi);
                ++_queued_full_in_memory;
        }
-       
+
+       /* Now there's something to do: wake anything wait()ing on _empty_condition */
        _empty_condition.notify_all ();
 }
 
@@ -166,6 +168,7 @@ Writer::fake_write (int frame, Eyes eyes)
        boost::mutex::scoped_lock lock (_mutex);
 
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
+               /* The queue is too big; wait until that is sorted out */
                _full_condition.wait (lock);
        }
        
@@ -187,6 +190,7 @@ Writer::fake_write (int frame, Eyes eyes)
                _queue.push_back (qi);
        }
 
+       /* Now there's something to do: wake anything wait()ing on _empty_condition */
        _empty_condition.notify_all ();
 }
 
@@ -233,16 +237,18 @@ void
 Writer::thread ()
 try
 {
-       while (1)
+       while (true)
        {
                boost::mutex::scoped_lock lock (_mutex);
 
-               while (1) {
+               while (true) {
                        
                        if (_finish || _queued_full_in_memory > _maximum_frames_in_memory || have_sequenced_image_at_queue_head ()) {
+                               /* We've got something to do: go and do it */
                                break;
                        }
 
+                       /* Nothing to do: wait until something happens which may indicate that we do */
                        LOG_TIMING (N_("writer sleeps with a queue of %1"), _queue.size());
                        _empty_condition.wait (lock);
                        LOG_TIMING (N_("writer wakes with a queue of %1"), _queue.size());
@@ -344,6 +350,7 @@ try
                        --_queued_full_in_memory;
                }
 
+               /* The queue has probably just gone down a bit; notify anything wait()ing on _full_condition */
                _full_condition.notify_all ();
        }
 }
@@ -480,6 +487,7 @@ Writer::repeat (int f, Eyes e)
        boost::mutex::scoped_lock lock (_mutex);
 
        while (_queued_full_in_memory > _maximum_frames_in_memory) {
+               /* The queue is too big; wait until that is sorted out */
                _full_condition.wait (lock);
        }
        
@@ -496,6 +504,7 @@ Writer::repeat (int f, Eyes e)
                _queue.push_back (qi);
        }
 
+       /* Now there's something to do: wake anything wait()ing on _empty_condition */
        _empty_condition.notify_all ();
 }
 
@@ -524,9 +533,10 @@ Writer::check_existing_picture_mxf_frame (FILE* mxf, int f, Eyes eyes)
                LOG_GENERAL ("Existing frame %1 is incomplete", f);
                return false;
        }
-       
-       string const existing_hash = md5_digest (data.data(), data.size());
-       if (existing_hash != info.hash) {
+
+       MD5Digester digester;
+       digester.add (data.data(), data.size());
+       if (digester.get() != info.hash) {
                LOG_GENERAL ("Existing frame %1 failed hash check", f);
                return false;
        }
@@ -552,7 +562,7 @@ Writer::check_existing_picture_mxf ()
                ++N;
        }
 
-       while (1) {
+       while (true) {
 
                shared_ptr<Job> job = _job.lock ();
                assert (job);