+ return dcp::Size ();
+}
+
+/** @return Size of the frame */
+dcp::Size
+Film::frame_size () const
+{
+ return fit_ratio_within (container()->ratio(), full_frame ());
+}
+
+dcp::EncryptedKDM
+Film::make_kdm (
+ shared_ptr<dcp::Certificate> target,
+ boost::filesystem::path dcp_dir,
+ dcp::LocalTime from,
+ dcp::LocalTime until
+ ) const
+{
+ shared_ptr<const Signer> signer = make_signer ();
+
+ dcp::DCP dcp (dir (dcp_dir.string ()));
+
+ try {
+ dcp.read ();
+ } catch (...) {
+ throw KDMError (_("Could not read DCP to make KDM for"));
+ }
+
+ dcp.cpls().front()->set_mxf_keys (key ());
+
+ return dcp::DecryptedKDM (
+ dcp.cpls().front(), from, until, "DCP-o-matic", dcp.cpls().front()->content_title_text(), dcp::LocalTime().as_string()
+ ).encrypt (signer, target);
+}
+
+list<dcp::EncryptedKDM>
+Film::make_kdms (
+ list<shared_ptr<Screen> > screens,
+ boost::filesystem::path dcp,
+ dcp::LocalTime from,
+ dcp::LocalTime until
+ ) const
+{
+ list<dcp::EncryptedKDM> kdms;
+
+ for (list<shared_ptr<Screen> >::iterator i = screens.begin(); i != screens.end(); ++i) {
+ kdms.push_back (make_kdm ((*i)->certificate, dcp, from, until));
+ }
+
+ return kdms;
+}
+
+/** @return The approximate disk space required to encode a DCP of this film with the
+ * current settings, in bytes.
+ */
+uint64_t
+Film::required_disk_space () const
+{
+ return uint64_t (j2k_bandwidth() / 8) * length().seconds();
+}
+
+/** This method checks the disk that the Film is on and tries to decide whether or not
+ * there will be enough space to make a DCP for it. If so, true is returned; if not,
+ * false is returned and required and availabe are filled in with the amount of disk space
+ * required and available respectively (in Gb).
+ *
+ * Note: the decision made by this method isn't, of course, 100% reliable.
+ */
+bool
+Film::should_be_enough_disk_space (double& required, double& available) const
+{
+ boost::filesystem::space_info s = boost::filesystem::space (internal_video_mxf_dir ());
+ required = double (required_disk_space ()) / 1073741824.0f;
+ available = double (s.available) / 1073741824.0f;
+ return (available - required) > 1;