Allow more complete control over the libdcp/DCP-o-matic metadata written to various...
[dcpomatic.git] / src / lib / dcp_video.cc
index 9d7ccf56593c20893e6a694dfb744a35a15b06ca..7b06f8cfca3cd6975b3a63c63d00598b4004fb12 100644 (file)
@@ -115,12 +115,15 @@ DCPVideo::convert_to_xyz (shared_ptr<const PlayerVideo> frame, dcp::NoteHandler
 Data
 DCPVideo::encode_locally ()
 {
+       string const comment = Config::instance()->dcp_j2k_comment();
+
        Data enc = compress_j2k (
                convert_to_xyz (_frame, boost::bind(&Log::dcp_log, dcpomatic_log.get(), _1, _2)),
                _j2k_bandwidth,
                _frames_per_second,
                _frame->eyes() == EYES_LEFT || _frame->eyes() == EYES_RIGHT,
-               _resolution == RESOLUTION_4K
+               _resolution == RESOLUTION_4K,
+               comment.empty() ? "libdcp" : comment
                );
 
        switch (_frame->eyes()) {
@@ -165,23 +168,31 @@ DCPVideo::encode_remotely (EncodeServerDescription serv, int timeout)
 
        LOG_DEBUG_ENCODE (N_("Sending frame %1 to remote"), _index);
 
-       /* Send XML metadata */
-       string xml = doc.write_to_string ("UTF-8");
-       socket->write (xml.length() + 1);
-       socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
+       {
+               Socket::WriteDigestScope ds (socket);
+
+               /* Send XML metadata */
+               string xml = doc.write_to_string ("UTF-8");
+               socket->write (xml.length() + 1);
+               socket->write ((uint8_t *) xml.c_str(), xml.length() + 1);
 
-       /* Send binary data */
-       LOG_TIMING("start-remote-send thread=%1", thread_id ());
-       _frame->write_to_socket (socket);
+               /* Send binary data */
+               LOG_TIMING("start-remote-send thread=%1", thread_id ());
+               _frame->write_to_socket (socket);
+       }
 
        /* Read the response (JPEG2000-encoded data); this blocks until the data
           is ready and sent back.
        */
+       Socket::ReadDigestScope ds (socket);
        LOG_TIMING("start-remote-encode thread=%1", thread_id ());
        Data e (socket->read_uint32 ());
        LOG_TIMING("start-remote-receive thread=%1", thread_id ());
        socket->read (e.data().get(), e.size());
        LOG_TIMING("finish-remote-receive thread=%1", thread_id ());
+       if (!ds.check()) {
+               throw NetworkError ("Checksums do not match");
+       }
 
        LOG_DEBUG_ENCODE (N_("Finished remotely-encoded frame %1"), _index);