2015-05-25 Carl Hetherington <cth@carlh.net>
+ * Increase the number of images that DCP-o-matic will
+ keep around in memory before resorting to pushing them
+ to disk.
+
* Display DCP container size beside the choice
in the DCP tab.
-468a7437c8ec82a8f74ae30197a2c5b04100b75d
2bf46f7c75c59e4cd3d91f1ddd322bdabb19b6f4
f952568be9c4438d5b024c133b18b2590de968e7
349e2950e5541d41e5491c2865734cf6a86e2cbd
ea2becf3a859bc38c783d15f165d71f2ccb8c1d6
21cb435ed5eb250a7f94887ddd75f6b367ea231f
Multi-stream audio stuff.
+77d7a03cf0785140caf37276edac9a1a0c9a8799
/*
- 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
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
_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));
}
, _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)
{
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);
}
{
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);
}
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;
}
}
}
- 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.
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);
}
void repeat (int f, Eyes);
void finish ();
+ void set_encoder_threads (int threads);
+
private:
void thread ();
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;
/** 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 */