diff options
| author | Carl Hetherington <cth@carlh.net> | 2018-06-05 02:19:20 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2018-06-05 02:19:20 +0100 |
| commit | fdcbd7eb473950f784fba05dcbf4bff115dbbd06 (patch) | |
| tree | 3b093448a6aee50d4705ac7551bedc26a03860bd /src/lib/writer.cc | |
| parent | 0dc44faca9db0192fb0fa3af80ca206979041b61 (diff) | |
Don't allow the queue to get too big with REPEAT frames otherwisev2.13.26
there's a long delay at the end of the job while they are written.
We must still write FULL frames even if the queue is long (we only
stop doing that if the queue has too many FULL frames i.e. too much
memory consumption). With this commit we stop writing REPEAT/FAKE
frames when the queue gets long and assume there will always be a
sequence image for writing and hence the main writer thread will reduce
the queue given time.
Diffstat (limited to 'src/lib/writer.cc')
| -rw-r--r-- | src/lib/writer.cc | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/src/lib/writer.cc b/src/lib/writer.cc index 896d59cfc..39d6f6118 100644 --- a/src/lib/writer.cc +++ b/src/lib/writer.cc @@ -75,6 +75,7 @@ Writer::Writer (shared_ptr<const Film> film, weak_ptr<Job> j) , _finish (false) , _queued_full_in_memory (0) , _maximum_frames_in_memory (0) + , _maximum_queue_size (0) , _full_written (0) , _fake_written (0) , _repeat_written (0) @@ -128,7 +129,7 @@ Writer::write (Data encoded, Frame frame, Eyes eyes) boost::mutex::scoped_lock lock (_state_mutex); while (_queued_full_in_memory > _maximum_frames_in_memory) { - /* The queue is too big; wait until that is sorted out */ + /* There are too many full frames in memory; wait until that is sorted out */ _full_condition.wait (lock); } @@ -171,7 +172,7 @@ Writer::repeat (Frame frame, Eyes eyes) { boost::mutex::scoped_lock lock (_state_mutex); - while (_queued_full_in_memory > _maximum_frames_in_memory) { + while (_queue.size() > _maximum_queue_size) { /* The queue is too big; wait until that is sorted out */ _full_condition.wait (lock); } @@ -199,7 +200,7 @@ Writer::fake_write (Frame frame, Eyes eyes) { boost::mutex::scoped_lock lock (_state_mutex); - while (_queued_full_in_memory > _maximum_frames_in_memory) { + while (_queue.size() > _maximum_queue_size) { /* The queue is too big; wait until that is sorted out */ _full_condition.wait (lock); } @@ -405,6 +406,7 @@ try } lock.lock (); + _full_condition.notify_all (); } while (_queued_full_in_memory > _maximum_frames_in_memory) { @@ -440,10 +442,8 @@ try lock.lock (); i->encoded.reset (); --_queued_full_in_memory; + _full_condition.notify_all (); } - - /* The queue has probably just gone down a bit; notify anything wait()ing on _full_condition */ - _full_condition.notify_all (); } } catch (...) @@ -713,6 +713,7 @@ void Writer::set_encoder_threads (int threads) { _maximum_frames_in_memory = lrint (threads * Config::instance()->frames_in_memory_multiplier()); + _maximum_queue_size = lrint (threads * 16); } void |
