/*
- Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
- This program is free software; you can redistribute it and/or modify
+ This file is part of DCP-o-matic.
+
+ DCP-o-matic is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ DCP-o-matic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with DCP-o-matic. If not, see <http://www.gnu.org/licenses/>.
*/
#include "job.h"
#include "cross.h"
#include "audio_buffers.h"
-#include "md5_digester.h"
#include "version.h"
#include "font.h"
#include "util.h"
if (_film->is_signed() && !Config::instance()->signer_chain()->valid ()) {
throw InvalidSignerError ();
}
-
- job->sub (_("Encoding image data"));
}
void
}
lock.lock ();
-
- shared_ptr<Job> job = _job.lock ();
- DCPOMATIC_ASSERT (job);
- int64_t total = _film->length().frames_round (_film->video_frame_rate ());
- if (_film->three_d ()) {
- /* _full_written and so on are incremented for each eye, so we need to double the total
- frames to get the correct progress.
- */
- total *= 2;
- }
- if (total) {
- job->set_progress (float (_full_written + _fake_written + _repeat_written) / total);
- }
}
while (_queued_full_in_memory > _maximum_frames_in_memory) {
BOOST_FOREACH (ReelWriter& i, _reels) {
- cpl->add (i.create_reel (_reel_assets, _fonts));
-
shared_ptr<Job> job = _job.lock ();
DCPOMATIC_ASSERT (job);
i.calculate_digests (job);
+
+ cpl->add (i.create_reel (_reel_assets, _fonts));
}
dcp::XMLMetadata meta;
void
Writer::write (list<shared_ptr<Font> > fonts)
{
- /* Just keep a list of fonts and we'll deal with them in ::finish */
- copy (fonts.begin (), fonts.end (), back_inserter (_fonts));
+ /* Just keep a list of unique fonts and we'll deal with them in ::finish */
+
+ BOOST_FOREACH (shared_ptr<Font> i, fonts) {
+ bool got = false;
+ BOOST_FOREACH (shared_ptr<Font> j, _fonts) {
+ if (*i == *j) {
+ got = true;
+ }
+ }
+
+ if (!got) {
+ _fonts.push_back (i);
+ }
+ }
}
bool
void
Writer::set_encoder_threads (int threads)
{
- _maximum_frames_in_memory = lrint (threads * 1.1);
+ /* I think the scaling factor here should be the ratio of the longest frame
+ encode time to the shortest; if the thread count is T, longest time is L
+ and the shortest time S we could encode L/S frames per thread whilst waiting
+ for the L frame to encode so we might have to store LT/S frames.
+
+ However we don't want to use too much memory, so keep it a bit lower than we'd
+ perhaps like. A J2K frame is typically about 1Mb so 3 here will mean we could
+ use about 240Mb with 72 encoding threads.
+ */
+ _maximum_frames_in_memory = lrint (threads * 3);
}
void