+optional<float>
+VideoContent::fade (VideoFrame f) const
+{
+ DCPOMATIC_ASSERT (f >= 0);
+
+ if (f < fade_in().frames (video_frame_rate ())) {
+ return float (f) / _fade_in.frames (video_frame_rate ());
+ }
+
+ VideoFrame fade_out_start = ContentTime (video_length() - fade_out()).frames (video_frame_rate ());
+ if (f >= fade_out_start) {
+ return 1 - float (f - fade_out_start) / fade_out().frames (video_frame_rate ());
+ }
+
+ return optional<float> ();
+}
+
+string
+VideoContent::processing_description () const
+{
+ /* stringstream is OK here as this string is just for presentation to the user */
+ stringstream d;
+
+ if (video_size().width && video_size().height) {
+ d << String::compose (
+ _("Content video is %1x%2"),
+ video_size_after_3d_split().width,
+ video_size_after_3d_split().height
+ );
+
+ d << " (" << fixed << setprecision(2) << video_size_after_3d_split().ratio() << ":1)\n";
+ }
+
+ 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";
+ }
+
+ shared_ptr<const Film> film = _film.lock ();
+ DCPOMATIC_ASSERT (film);
+
+ 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, 1);
+
+ 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 %1x%2"),
+ 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 ();
+}