+ _index = node->number_child<int> ("Index");
+ _frames_per_second = node->number_child<int> ("FramesPerSecond");
+ _j2k_bandwidth = node->number_child<int> ("J2KBandwidth");
+ _resolution = Resolution (node->optional_number_child<int>("Resolution").get_value_or (RESOLUTION_2K));
+}
+
+shared_ptr<dcp::OpenJPEGImage>
+DCPVideo::convert_to_xyz (shared_ptr<const PlayerVideo> frame, dcp::NoteHandler note)
+{
+ shared_ptr<dcp::OpenJPEGImage> xyz;
+
+ shared_ptr<Image> image = frame->image (bind (&PlayerVideo::keep_xyz_or_rgb, _1), true, false);
+ if (frame->colour_conversion()) {
+ xyz = dcp::rgb_to_xyz (
+ image->data()[0],
+ image->size(),
+ image->stride()[0],
+ frame->colour_conversion().get(),
+ note
+ );
+ } else {
+ xyz.reset (new dcp::OpenJPEGImage (image->data()[0], image->size(), image->stride()[0]));
+ }
+
+ return xyz;
+}
+
+/** J2K-encode this frame on the local host.
+ * @return Encoded data.
+ */
+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,
+ comment.empty() ? "libdcp" : comment
+ );
+
+ switch (_frame->eyes()) {
+ case EYES_BOTH:
+ LOG_DEBUG_ENCODE (N_("Finished locally-encoded frame %1 for mono"), _index);
+ break;
+ case EYES_LEFT:
+ LOG_DEBUG_ENCODE (N_("Finished locally-encoded frame %1 for L"), _index);
+ break;
+ case EYES_RIGHT:
+ LOG_DEBUG_ENCODE (N_("Finished locally-encoded frame %1 for R"), _index);
+ break;
+ default:
+ break;
+ }
+
+ return enc;