+ if ((crop().left || crop().right || crop().top || crop().bottom) && video_size() != dcp::Size (0, 0)) {
+ dcp::Size cropped = video_size_after_crop ();
+ d << String::compose (
+ _("Cropped to %1x%2"),
+ cropped.width, cropped.height
+ );
+
+ d << " (" << fixed << setprecision(2) << cropped.ratio () << ":1)\n";
+ }
+
+ dcp::Size const container_size = film()->frame_size ();
+ dcp::Size const scaled = scale().size (dynamic_pointer_cast<const VideoContent> (shared_from_this ()), container_size, container_size);
+
+ if (scaled != video_size_after_crop ()) {
+ d << String::compose (
+ _("Scaled to %1x%2"),
+ scaled.width, scaled.height
+ );
+
+ d << " (" << fixed << setprecision(2) << scaled.ratio() << ":1)\n";
+ }
+
+ if (scaled != container_size) {
+ d << String::compose (
+ _("Padded with black to fit container %1 (%2x%3)"),
+ film()->container()->nickname (),
+ container_size.width, container_size.height
+ );
+
+ d << " (" << fixed << setprecision(2) << container_size.ratio () << ":1)\n";
+ }
+
+ d << _("Content frame rate");
+ d << " " << fixed << setprecision(4) << video_frame_rate() << "\n";
+
+ FrameRateChange frc (video_frame_rate(), film()->video_frame_rate ());
+ d << frc.description () << "\n";
+
+ return d.str ();
+}
+
+void
+VideoContent::add_properties (list<pair<string, string> >& p) const
+{
+ p.push_back (make_pair (_("Video length"), raw_convert<string> (video_length ()) + " " + _("video frames")));
+ p.push_back (make_pair (_("Video size"), raw_convert<string> (video_size().width) + "x" + raw_convert<string> (video_size().height)));
+ p.push_back (make_pair (_("Video frame rate"), raw_convert<string> (video_frame_rate()) + " " + _("frames per second")));
+}
+
+double
+VideoContent::video_frame_rate () const
+{
+ boost::mutex::scoped_lock lm (_mutex);
+ return _video_frame_rate.get_value_or (film()->video_frame_rate ());