#include "encode_server_description.h"
#include "compose.hpp"
#include <libcxml/cxml.h>
-#include <boost/foreach.hpp>
#include <iostream>
#include "i18n.h"
using std::list;
using std::cout;
using std::exception;
-using boost::shared_ptr;
-using boost::weak_ptr;
+using std::shared_ptr;
+using std::weak_ptr;
using boost::optional;
using dcp::Data;
using namespace dcpomatic;
J2KEncoder::~J2KEncoder ()
{
+ boost::mutex::scoped_lock lm (_threads_mutex);
terminate_threads ();
}
LOG_GENERAL_NC (N_("Terminating encoder threads"));
- terminate_threads ();
+ {
+ boost::mutex::scoped_lock lm (_threads_mutex);
+ terminate_threads ();
+ }
/* Something might have been thrown during terminate_threads */
rethrow ();
LOG_GENERAL (N_("Encode left-over frame %1"), (*i)->index ());
try {
_writer->write (
- (*i)->encode_locally(),
+ shared_ptr<dcp::Data>(new dcp::ArrayData((*i)->encode_locally())),
(*i)->index(),
(*i)->eyes()
);
{
_waker.nudge ();
- size_t threads = _threads->size();
+ size_t threads = 0;
+ {
+ boost::mutex::scoped_lock lm (_threads_mutex);
+ threads = _threads->size();
+ }
boost::mutex::scoped_lock queue_lock (_queue_mutex);
LOG_DEBUG_ENCODE("Frame @ %1 J2K", to_string(time));
/* This frame already has J2K data, so just write it */
_writer->write (pv->j2k(), position, pv->eyes ());
+ frame_done ();
} else if (_last_player_video[pv->eyes()] && _writer->can_repeat(position) && pv->same (_last_player_video[pv->eyes()])) {
LOG_DEBUG_ENCODE("Frame @ %1 REPEAT", to_string(time));
_writer->repeat (position, pv->eyes ());
_last_player_video_time = time;
}
+
+/** Caller must hold a lock on _threads_mutex */
void
J2KEncoder::terminate_threads ()
{
lock.unlock ();
- optional<Data> encoded;
+ shared_ptr<Data> encoded;
/* We need to encode this input */
if (server) {
try {
- encoded = vf->encode_remotely (server.get ());
+ encoded.reset(new dcp::ArrayData(vf->encode_remotely(server.get())));
if (remote_backoff > 0) {
LOG_GENERAL ("%1 was lost, but now she is found; removing backoff", server->host_name ());
} else {
try {
LOG_TIMING ("start-local-encode thread=%1 frame=%2", thread_id(), vf->index());
- encoded = vf->encode_locally ();
+ encoded.reset(new dcp::ArrayData(vf->encode_locally()));
LOG_TIMING ("finish-local-encode thread=%1 frame=%2", thread_id(), vf->index());
} catch (std::exception& e) {
/* This is very bad, so don't cope with it, just pass it on */
}
if (encoded) {
- _writer->write (encoded.get(), vf->index (), vf->eyes ());
+ _writer->write (encoded, vf->index(), vf->eyes());
frame_done ();
} else {
lock.lock ();
void
J2KEncoder::servers_list_changed ()
{
+ boost::mutex::scoped_lock lm (_threads_mutex);
+
terminate_threads ();
_threads.reset (new boost::thread_group());
}
}
- BOOST_FOREACH (EncodeServerDescription i, EncodeServerFinder::instance()->servers()) {
+ for (auto i: EncodeServerFinder::instance()->servers()) {
if (!i.current_link_version()) {
continue;
}