Try to actually use colour conversion; bump libdcp in cscript.
[dcpomatic.git] / src / lib / dcp_video_frame.cc
index 10f1e4ad170816ff1e44b15f982051f0f8a5ba92..cde9f8a328323d030d9fabca906be94acdf14dce 100644 (file)
@@ -77,11 +77,12 @@ using libdcp::Size;
  *  @param l Log to write to.
  */
 DCPVideoFrame::DCPVideoFrame (
-       shared_ptr<const Image> image, int f, Eyes eyes, int dcp_fps, int bw, shared_ptr<Log> l
+       shared_ptr<const Image> image, int f, Eyes eyes, ColourConversion c, int dcp_fps, int bw, shared_ptr<Log> l
        )
        : _image (image)
        , _frame (f)
        , _eyes (eyes)
+       , _conversion (c)
        , _frames_per_second (dcp_fps)
        , _j2k_bandwidth (bw)
        , _log (l)
@@ -95,11 +96,27 @@ DCPVideoFrame::DCPVideoFrame (
 shared_ptr<EncodedData>
 DCPVideoFrame::encode_locally ()
 {
+       shared_ptr<libdcp::LUT> in_lut;
+       if (_conversion.input_gamma_linearised) {
+               in_lut = libdcp::SRGBLinearisedGammaLUT::cache.get (12, _conversion.input_gamma);
+       } else {
+               in_lut = libdcp::GammaLUT::cache.get (12, _conversion.input_gamma);
+       }
+
+       /* XXX: libdcp should probably use boost */
+       
+       double matrix[3][3];
+       for (int i = 0; i < 3; ++i) {
+               for (int j = 0; j < 3; ++j) {
+                       matrix[i][j] = _conversion.matrix (i, j);
+               }
+       }
+       
        shared_ptr<libdcp::XYZFrame> xyz = libdcp::rgb_to_xyz (
                _image,
-               libdcp::SRGBLinearisedGammaLUT::cache.get (12, 2.4),
-               libdcp::GammaLUT::cache.get (16, 1 / 2.6),
-               libdcp::colour_matrix::srgb_to_xyz
+               in_lut,
+               libdcp::GammaLUT::cache.get (16, 1 / _conversion.output_gamma),
+               matrix
                );
                
        /* Set the max image and component sizes based on frame_rate */
@@ -185,7 +202,19 @@ DCPVideoFrame::encode_locally ()
                throw EncodeError (N_("JPEG2000 encoding failed"));
        }
 
-       _log->log (String::compose (N_("Finished locally-encoded frame %1"), _frame));
+       switch (_eyes) {
+       case EYES_BOTH:
+               _log->log (String::compose (N_("Finished locally-encoded frame %1 for mono"), _frame));
+               break;
+       case EYES_LEFT:
+               _log->log (String::compose (N_("Finished locally-encoded frame %1 for L"), _frame));
+               break;
+       case EYES_RIGHT:
+               _log->log (String::compose (N_("Finished locally-encoded frame %1 for R"), _frame));
+               break;
+       default:
+               break;
+       }
 
        shared_ptr<EncodedData> enc (new LocallyEncodedData (cio->buffer, cio_tell (cio)));
 
@@ -201,17 +230,19 @@ DCPVideoFrame::encode_locally ()
  *  @return Encoded data.
  */
 shared_ptr<EncodedData>
-DCPVideoFrame::encode_remotely (ServerDescription const * serv)
+DCPVideoFrame::encode_remotely (ServerDescription serv)
 {
        boost::asio::io_service io_service;
        boost::asio::ip::tcp::resolver resolver (io_service);
-       boost::asio::ip::tcp::resolver::query query (serv->host_name(), boost::lexical_cast<string> (Config::instance()->server_port ()));
+       boost::asio::ip::tcp::resolver::query query (serv.host_name(), boost::lexical_cast<string> (Config::instance()->server_port ()));
        boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve (query);
 
        shared_ptr<Socket> socket (new Socket);
 
        socket->connect (*endpoint_iterator);
 
+       /* XXX: colour conversion! */
+
        stringstream s;
        s << "encode please\n"
          << "width " << _image->size().width << "\n"