Remove multi-reel, for now, and sort out Size vs libdcp::Size.
[dcpomatic.git] / src / lib / server.cc
index e8a9804ed1ca1c83acca2d6cc4085c4d68787117..1bb8f205ed65e734606d82196cacd3cf91ae115e 100644 (file)
 #include "config.h"
 #include "subtitle.h"
 
-using namespace std;
-using namespace boost;
+using std::string;
+using std::stringstream;
+using std::multimap;
+using std::vector;
+using boost::shared_ptr;
+using boost::algorithm::is_any_of;
+using boost::algorithm::split;
+using boost::thread;
+using boost::bind;
 
 /** Create a server description from a string of metadata returned from as_metadata().
  *  @param v Metadata.
@@ -85,12 +92,12 @@ Server::process (shared_ptr<Socket> socket)
                return -1;
        }
 
-       Size in_size (get_required_int (kv, "input_width"), get_required_int (kv, "input_height"));
+       libdcp::Size in_size (get_required_int (kv, "input_width"), get_required_int (kv, "input_height"));
        int pixel_format_int = get_required_int (kv, "input_pixel_format");
-       Size out_size (get_required_int (kv, "output_width"), get_required_int (kv, "output_height"));
+       libdcp::Size out_size (get_required_int (kv, "output_width"), get_required_int (kv, "output_height"));
        int padding = get_required_int (kv, "padding");
        int subtitle_offset = get_required_int (kv, "subtitle_offset");
-       int subtitle_scale = get_required_int (kv, "subtitle_scale");
+       float subtitle_scale = get_required_float (kv, "subtitle_scale");
        string scaler_id = get_required_string (kv, "scaler");
        int frame = get_required_int (kv, "frame");
        int frames_per_second = get_required_int (kv, "frames_per_second");
@@ -98,7 +105,7 @@ Server::process (shared_ptr<Socket> socket)
        int colour_lut_index = get_required_int (kv, "colour_lut");
        int j2k_bandwidth = get_required_int (kv, "j2k_bandwidth");
        Position subtitle_position (get_optional_int (kv, "subtitle_x"), get_optional_int (kv, "subtitle_y"));
-       Size subtitle_size (get_optional_int (kv, "subtitle_width"), get_optional_int (kv, "subtitle_height"));
+       libdcp::Size subtitle_size (get_optional_int (kv, "subtitle_width"), get_optional_int (kv, "subtitle_height"));
 
        /* This checks that colour_lut_index is within range */
        colour_lut_index_to_name (colour_lut_index);
@@ -106,13 +113,13 @@ Server::process (shared_ptr<Socket> socket)
        PixelFormat pixel_format = (PixelFormat) pixel_format_int;
        Scaler const * scaler = Scaler::from_id (scaler_id);
        
-       shared_ptr<Image> image (new AlignedImage (pixel_format, in_size));
+       shared_ptr<Image> image (new SimpleImage (pixel_format, in_size, true));
 
        image->read_from_socket (socket);
 
        shared_ptr<Subtitle> sub;
        if (subtitle_size.width && subtitle_size.height) {
-               shared_ptr<Image> subtitle_image (new AlignedImage (PIX_FMT_RGBA, subtitle_size));
+               shared_ptr<Image> subtitle_image (new SimpleImage (PIX_FMT_RGBA, subtitle_size, true));
                subtitle_image->read_from_socket (socket);
                sub.reset (new Subtitle (subtitle_position, subtitle_image));
        }
@@ -123,7 +130,16 @@ Server::process (shared_ptr<Socket> socket)
                );
        
        shared_ptr<EncodedData> encoded = dcp_video_frame.encode_locally ();
-       encoded->send (socket);
+       try {
+               encoded->send (socket);
+       } catch (std::exception& e) {
+               _log->log (String::compose (
+                                  "Send failed; frame %1, data size %2, pixel format %3, image size %4x%5, %6 components",
+                                  frame, encoded->size(), image->pixel_format(), image->size().width, image->size().height, image->components()
+                                  )
+                       );
+               throw;
+       }
 
        return frame;
 }
@@ -132,7 +148,7 @@ void
 Server::worker_thread ()
 {
        while (1) {
-               mutex::scoped_lock lock (_worker_mutex);
+               boost::mutex::scoped_lock lock (_worker_mutex);
                while (_queue.empty ()) {
                        _worker_condition.wait (lock);
                }
@@ -150,7 +166,7 @@ Server::worker_thread ()
                try {
                        frame = process (socket);
                } catch (std::exception& e) {
-                       cerr << "Error: " << e.what() << "\n";
+                       _log->log (String::compose ("Error: %1", e.what()));
                }
                
                socket.reset ();
@@ -176,13 +192,13 @@ Server::run (int num_threads)
                _worker_threads.push_back (new thread (bind (&Server::worker_thread, this)));
        }
 
-       asio::io_service io_service;
-       asio::ip::tcp::acceptor acceptor (io_service, asio::ip::tcp::endpoint (asio::ip::tcp::v4(), Config::instance()->server_port ()));
+       boost::asio::io_service io_service;
+       boost::asio::ip::tcp::acceptor acceptor (io_service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), Config::instance()->server_port ()));
        while (1) {
                shared_ptr<Socket> socket (new Socket);
                acceptor.accept (socket->socket ());
 
-               mutex::scoped_lock lock (_worker_mutex);
+               boost::mutex::scoped_lock lock (_worker_mutex);
                
                /* Wait until the queue has gone down a bit */
                while (int (_queue.size()) >= num_threads * 2) {