summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-05-25 14:38:31 +0100
committerCarl Hetherington <cth@carlh.net>2015-05-25 14:38:31 +0100
commite80732c66bb8907836eafeb816d695f96e063843 (patch)
tree1da686317768b3ab11228c2d7cc8715dd3ed6614 /src/lib
parentd3bd799b42c0a29b415c2a37f6dd8196a97ee541 (diff)
5b5c36d28d07e8cd93af5a3f766fd95f2a506beb from master; increase the number of images that are kept around in memory before pushing to disk.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/encoder.cc6
-rw-r--r--src/lib/writer.cc15
-rw-r--r--src/lib/writer.h12
3 files changed, 20 insertions, 13 deletions
diff --git a/src/lib/encoder.cc b/src/lib/encoder.cc
index 2a6026879..7a0295e4c 100644
--- a/src/lib/encoder.cc
+++ b/src/lib/encoder.cc
@@ -1,5 +1,5 @@
/*
- Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -84,6 +84,8 @@ Encoder::add_worker_threads (ServerDescription d)
for (int i = 0; i < d.threads(); ++i) {
_threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, d)));
}
+
+ _writer->set_encoder_threads (_threads.size ());
}
void
@@ -93,6 +95,8 @@ Encoder::begin ()
_threads.push_back (new boost::thread (boost::bind (&Encoder::encoder_thread, this, optional<ServerDescription> ())));
}
+ _writer->set_encoder_threads (_threads.size ());
+
if (!ServerFinder::instance()->disabled ()) {
_server_found_connection = ServerFinder::instance()->connect (boost::bind (&Encoder::server_found, this, _1));
}
diff --git a/src/lib/writer.cc b/src/lib/writer.cc
index b71ff2891..592275281 100644
--- a/src/lib/writer.cc
+++ b/src/lib/writer.cc
@@ -83,6 +83,7 @@ Writer::Writer (shared_ptr<const Film> f, weak_ptr<Job> j)
, _queued_full_in_memory (0)
, _last_written_frame (-1)
, _last_written_eyes (EYES_RIGHT)
+ , _maximum_frames_in_memory (0)
, _full_written (0)
, _fake_written (0)
, _pushed_to_disk (0)
@@ -152,7 +153,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 ()) {
+ while (_queued_full_in_memory > _maximum_frames_in_memory) {
/* The queue is too big; wait until that is sorted out */
_full_condition.wait (lock);
}
@@ -185,7 +186,7 @@ Writer::fake_write (int frame, Eyes eyes)
{
boost::mutex::scoped_lock lock (_mutex);
- while (_queued_full_in_memory > maximum_frames_in_memory ()) {
+ while (_queued_full_in_memory > _maximum_frames_in_memory) {
/* The queue is too big; wait until that is sorted out */
_full_condition.wait (lock);
}
@@ -267,7 +268,7 @@ try
while (true) {
- if (_finish || _queued_full_in_memory > maximum_frames_in_memory () || have_sequenced_image_at_queue_head ()) {
+ 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;
}
@@ -353,7 +354,7 @@ try
}
}
- while (_queued_full_in_memory > maximum_frames_in_memory ()) {
+ while (_queued_full_in_memory > _maximum_frames_in_memory) {
done_something = true;
/* Too many frames in memory which can't yet be written to the stream.
Write some FULL frames to disk.
@@ -708,8 +709,8 @@ operator== (QueueItem const & a, QueueItem const & b)
return a.frame == b.frame && a.eyes == b.eyes;
}
-int
-Writer::maximum_frames_in_memory () const
+void
+Writer::set_encoder_threads (int threads)
{
- return Config::instance()->num_local_encoding_threads() + 4;
+ _maximum_frames_in_memory = rint (threads * 1.1);
}
diff --git a/src/lib/writer.h b/src/lib/writer.h
index 41d4d4474..e63591a8a 100644
--- a/src/lib/writer.h
+++ b/src/lib/writer.h
@@ -100,6 +100,8 @@ public:
void repeat (int f, Eyes);
void finish ();
+ void set_encoder_threads (int threads);
+
private:
void thread ();
@@ -107,10 +109,6 @@ private:
void check_existing_picture_mxf ();
bool check_existing_picture_mxf_frame (FILE *, int, Eyes);
bool have_sequenced_image_at_queue_head ();
- /** maximum number of frames to hold in memory, for when we are managing
- * ordering
- */
- int maximum_frames_in_memory () const;
/** our Film */
boost::shared_ptr<const Film> _film;
@@ -137,7 +135,11 @@ private:
/** the index of the last written frame */
int _last_written_frame;
Eyes _last_written_eyes;
-
+ /** maximum number of frames to hold in memory, for when we are managing
+ * ordering
+ */
+ int _maximum_frames_in_memory;
+
/** number of FULL written frames */
int _full_written;
/** number of FAKE written frames */