X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fvideo_content.cc;h=5864342a265c0fc873c302490acb3191f8f251bd;hb=e6f28e7cda23c1ba3c49cc1bf2dc1491c2f87160;hp=b33a37cb8ce385892d3b2aac663e05857e46cc1d;hpb=79ce26d031d109177ba4b0f637fa2960345a37a3;p=dcpomatic.git diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index b33a37cb8..5864342a2 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -155,7 +155,7 @@ void VideoContent::as_xml (xmlpp::Node* node) const { boost::mutex::scoped_lock lm (_mutex); - node->add_child("VideoLength")->add_child_text (lexical_cast (_video_length)); + node->add_child("VideoLength")->add_child_text (lexical_cast (_video_length.get ())); node->add_child("VideoWidth")->add_child_text (lexical_cast (_video_size.width)); node->add_child("VideoHeight")->add_child_text (lexical_cast (_video_size.height)); node->add_child("VideoFrameRate")->add_child_text (lexical_cast (_video_frame_rate)); @@ -317,7 +317,13 @@ VideoContent::set_video_frame_type (VideoFrameType t) string VideoContent::technical_summary () const { - return String::compose ("video: length %1, size %2x%3, rate %4", video_length(), video_size().width, video_size().height, video_frame_rate()); + return String::compose ( + "video: length %1, size %2x%3, rate %4", + video_length_after_3d_combine().seconds(), + video_size().width, + video_size().height, + video_frame_rate() + ); } dcp::Size @@ -326,6 +332,7 @@ VideoContent::video_size_after_3d_split () const dcp::Size const s = video_size (); switch (video_frame_type ()) { case VIDEO_FRAME_TYPE_2D: + case VIDEO_FRAME_TYPE_3D_ALTERNATE: return s; case VIDEO_FRAME_TYPE_3D_LEFT_RIGHT: return dcp::Size (s.width / 2, s.height); @@ -436,19 +443,30 @@ VideoContentScale::name () const return _("No scale"); } -libdcp::Size -VideoContentScale::size (shared_ptr c, libdcp::Size container) const +/** @param display_container Size of the container that we are displaying this content in. + * @param film_container The size of the film's image. + */ +dcp::Size +VideoContentScale::size (shared_ptr c, dcp::Size display_container, dcp::Size film_container) const { if (_ratio) { - return fit_ratio_within (_ratio->ratio (), container); + return fit_ratio_within (_ratio->ratio (), display_container); } - /* Force scale if the container is smaller than the content's image */ - if (_scale || container.width < c->video_size().width || container.height < c->video_size().height) { - return fit_ratio_within (c->video_size().ratio (), container); + dcp::Size const ac = c->video_size_after_crop (); + + /* Force scale if the film_container is smaller than the content's image */ + if (_scale || film_container.width < ac.width || film_container.height < ac.height) { + return fit_ratio_within (ac.ratio (), display_container); } - return c->video_size (); + /* Scale the image so that it will be in the right place in film_container, even if display_container is a + different size. + */ + return dcp::Size ( + c->video_size().width * float(display_container.width) / film_container.width, + c->video_size().height * float(display_container.height) / film_container.height + ); } void