Remove in-place translations support.
[dcpomatic.git] / src / lib / encode_server.cc
index c30fc8f30323ae52682682e2332c9fcb0e09300a..036ea58a5df92b94cb5cde24e6a7666be195f3a4 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2018 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
 
 */
 
+
 /** @file src/encode_server.cc
  *  @brief Class to describe a server to which we can send
  *  encoding work, and a class to implement such a server.
  */
 
-#include "encode_server.h"
-#include "util.h"
-#include "dcpomatic_socket.h"
-#include "image.h"
-#include "dcp_video.h"
+
+#include "compose.hpp"
 #include "config.h"
+#include "constants.h"
 #include "cross.h"
-#include "player_video.h"
-#include "compose.hpp"
-#include "log.h"
+#include "dcp_video.h"
 #include "dcpomatic_log.h"
+#include "dcpomatic_socket.h"
+#include "encode_server.h"
 #include "encoded_log_entry.h"
+#include "image.h"
+#include "log.h"
+#include "player_video.h"
 #include "version.h"
-#include "warnings.h"
 #include <dcp/raw_convert.h>
+#include <dcp/warnings.h>
 #include <libcxml/cxml.h>
-DCPOMATIC_DISABLE_WARNINGS
+LIBDCP_DISABLE_WARNINGS
 #include <libxml++/libxml++.h>
-DCPOMATIC_ENABLE_WARNINGS
+LIBDCP_ENABLE_WARNINGS
 #include <boost/algorithm/string.hpp>
 #include <boost/scoped_array.hpp>
-#include <boost/foreach.hpp>
 #ifdef HAVE_VALGRIND_H
 #include <valgrind/memcheck.h>
 #endif
@@ -54,21 +55,24 @@ DCPOMATIC_ENABLE_WARNINGS
 
 #include "i18n.h"
 
+
 using std::string;
 using std::vector;
 using std::list;
 using std::cout;
 using std::cerr;
 using std::fixed;
-using boost::shared_ptr;
+using std::shared_ptr;
+using std::make_shared;
 using boost::thread;
 using boost::bind;
 using boost::scoped_array;
 using boost::optional;
+using dcp::ArrayData;
 using dcp::Size;
-using dcp::Data;
 using dcp::raw_convert;
 
+
 EncodeServer::EncodeServer (bool verbose, int num_threads)
 #if !defined(RUNNING_ON_VALGRIND) || RUNNING_ON_VALGRIND == 0
        : Server (ENCODE_FRAME_PORT)
@@ -81,8 +85,11 @@ EncodeServer::EncodeServer (bool verbose, int num_threads)
 
 }
 
+
 EncodeServer::~EncodeServer ()
 {
+       boost::this_thread::disable_interruption dis;
+
        {
                boost::mutex::scoped_lock lm (_mutex);
                _terminate = true;
@@ -104,15 +111,12 @@ EncodeServer::~EncodeServer ()
        }
 
        _broadcast.io_service.stop ();
-       if (_broadcast.thread.joinable()) {
-               try {
-                       _broadcast.thread.join ();
-               } catch (...) {
-
-               }
-       }
+       try {
+               _broadcast.thread.join ();
+       } catch (...) {}
 }
 
+
 /** @param after_read Filled in with gettimeofday() after reading the input from the network.
  *  @param after_encode Filled in with gettimeofday() after encoding the image.
  */
@@ -121,12 +125,16 @@ EncodeServer::process (shared_ptr<Socket> socket, struct timeval& after_read, st
 {
        Socket::ReadDigestScope ds (socket);
 
-       uint32_t length = socket->read_uint32 ();
+       auto length = socket->read_uint32 ();
+       if (length > 65536) {
+               throw NetworkError("Malformed encode request (too large)");
+       }
+
        scoped_array<char> buffer (new char[length]);
-       socket->read (reinterpret_cast<uint8_t*> (buffer.get()), length);
+       socket->read (reinterpret_cast<uint8_t*>(buffer.get()), length);
 
        string s (buffer.get());
-       shared_ptr<cxml::Document> xml (new cxml::Document ("EncodingRequest"));
+       auto xml = make_shared<cxml::Document>("EncodingRequest");
        xml->read_string (s);
        /* This is a double-check; the server shouldn't even be on the candidate list
           if it is the wrong version, but it doesn't hurt to make sure here.
@@ -137,7 +145,7 @@ EncodeServer::process (shared_ptr<Socket> socket, struct timeval& after_read, st
                return -1;
        }
 
-       shared_ptr<PlayerVideo> pvf (new PlayerVideo (xml, socket));
+       auto pvf = make_shared<PlayerVideo>(xml, socket);
 
        if (!ds.check()) {
                throw NetworkError ("Checksums do not match");
@@ -147,14 +155,14 @@ EncodeServer::process (shared_ptr<Socket> socket, struct timeval& after_read, st
 
        gettimeofday (&after_read, 0);
 
-       Data encoded = dcp_video_frame.encode_locally ();
+       auto encoded = dcp_video_frame.encode_locally ();
 
        gettimeofday (&after_encode, 0);
 
        try {
                Socket::WriteDigestScope ds (socket);
                socket->write (encoded.size());
-               socket->write (encoded.data().get(), encoded.size());
+               socket->write (encoded.data(), encoded.size());
        } catch (std::exception& e) {
                cerr << "Send failed; frame " << dcp_video_frame.index() << "\n";
                LOG_ERROR ("Send failed; frame %1", dcp_video_frame.index());
@@ -164,6 +172,7 @@ EncodeServer::process (shared_ptr<Socket> socket, struct timeval& after_read, st
        return dcp_video_frame.index ();
 }
 
+
 void
 EncodeServer::worker_thread ()
 {
@@ -177,7 +186,7 @@ EncodeServer::worker_thread ()
                        return;
                }
 
-               shared_ptr<Socket> socket = _queue.front ();
+               auto socket = _queue.front ();
                _queue.pop_front ();
 
                lock.unlock ();
@@ -210,13 +219,11 @@ EncodeServer::worker_thread ()
                        struct timeval end;
                        gettimeofday (&end, 0);
 
-                       shared_ptr<EncodedLogEntry> e (
-                               new EncodedLogEntry (
-                                       frame, ip,
-                                       seconds(after_read) - seconds(start),
-                                       seconds(after_encode) - seconds(after_read),
-                                       seconds(end) - seconds(after_encode)
-                                       )
+                       auto e = make_shared<EncodedLogEntry>(
+                               frame, ip,
+                               seconds(after_read) - seconds(start),
+                               seconds(after_encode) - seconds(after_read),
+                               seconds(end) - seconds(after_encode)
                                );
 
                        if (_verbose) {
@@ -230,6 +237,7 @@ EncodeServer::worker_thread ()
        }
 }
 
+
 void
 EncodeServer::run ()
 {
@@ -255,11 +263,12 @@ EncodeServer::run ()
        Server::run ();
 }
 
+
 void
 EncodeServer::broadcast_thread ()
 try
 {
-       boost::asio::ip::address address = boost::asio::ip::address_v4::any ();
+       auto address = boost::asio::ip::address_v4::any ();
        boost::asio::ip::udp::endpoint listen_endpoint (address, HELLO_PORT);
 
        _broadcast.socket = new boost::asio::ip::udp::socket (_broadcast.io_service);
@@ -279,6 +288,7 @@ catch (...)
        store_current ();
 }
 
+
 void
 EncodeServer::broadcast_received ()
 {
@@ -287,29 +297,29 @@ EncodeServer::broadcast_received ()
        if (strcmp (_broadcast.buffer, DCPOMATIC_HELLO) == 0) {
                /* Reply to the client saying what we can do */
                xmlpp::Document doc;
-               xmlpp::Element* root = doc.create_root_node ("ServerAvailable");
+               auto root = doc.create_root_node ("ServerAvailable");
                root->add_child("Threads")->add_child_text (raw_convert<string> (_worker_threads.size ()));
                root->add_child("Version")->add_child_text (raw_convert<string> (SERVER_LINK_VERSION));
-               string xml = doc.write_to_string ("UTF-8");
+               auto xml = doc.write_to_string ("UTF-8");
 
                if (_verbose) {
                        cout << "Offering services to master " << _broadcast.send_endpoint.address().to_string () << "\n";
                }
 
                try {
-                       shared_ptr<Socket> socket (new Socket);
+                       auto socket = make_shared<Socket>();
                        socket->connect (boost::asio::ip::tcp::endpoint (_broadcast.send_endpoint.address(), MAIN_SERVER_PRESENCE_PORT));
-                       socket->write (xml.length() + 1);
-                       socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
+                       socket->write (xml.bytes() + 1);
+                       socket->write ((uint8_t *) xml.c_str(), xml.bytes() + 1);
                } catch (...) {
 
                }
 
                try {
-                       shared_ptr<Socket> socket (new Socket);
+                       auto socket = make_shared<Socket>();
                        socket->connect (boost::asio::ip::tcp::endpoint (_broadcast.send_endpoint.address(), BATCH_SERVER_PRESENCE_PORT));
-                       socket->write (xml.length() + 1);
-                       socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
+                       socket->write (xml.bytes() + 1);
+                       socket->write ((uint8_t *) xml.c_str(), xml.bytes() + 1);
                } catch (...) {
 
                }
@@ -324,13 +334,13 @@ EncodeServer::broadcast_received ()
        }
 }
 
+
 void
 EncodeServer::handle (shared_ptr<Socket> socket)
 {
        boost::mutex::scoped_lock lock (_mutex);
 
-       Waker waker;
-       waker.nudge ();
+       _waker.nudge ();
 
        /* Wait until the queue has gone down a bit */
        while (_queue.size() >= _worker_threads.size() * 2 && !_terminate) {