Merge master.
[dcpomatic.git] / src / lib / video_content.cc
index 0d9a8fc45c491c24b664751daf3f4a4df73f15ab..9822d77634c659a583de5314a4904032da104ec4 100644 (file)
@@ -32,6 +32,7 @@
 #include "exceptions.h"
 #include "frame_rate_change.h"
 #include "log.h"
+#include "safe_stringstream.h"
 
 #include "i18n.h"
 
@@ -45,7 +46,6 @@ int const VideoContentProperty::VIDEO_SCALE     = 4;
 int const VideoContentProperty::COLOUR_CONVERSION = 5;
 
 using std::string;
-using std::stringstream;
 using std::setprecision;
 using std::cout;
 using std::vector;
@@ -217,7 +217,7 @@ VideoContent::information () const
                return "";
        }
        
-       stringstream s;
+       SafeStringStream s;
 
        s << String::compose (
                _("%1x%2 pixels (%3:1)"),
@@ -309,7 +309,7 @@ VideoContent::set_scale (VideoContentScale s)
 string
 VideoContent::identifier () const
 {
-       stringstream s;
+       SafeStringStream s;
        s << Content::identifier()
          << "_" << crop().left
          << "_" << crop().right
@@ -479,10 +479,10 @@ VideoContentScale::as_xml (xmlpp::Node* node) const
 string
 VideoContentScale::id () const
 {
-       stringstream s;
+       SafeStringStream s;
        
        if (_ratio) {
-               s << _ratio->id () << "_";
+               s << _ratio->id ();
        } else {
                s << (_scale ? "S1" : "S0");
        }
@@ -504,29 +504,44 @@ VideoContentScale::name () const
        return _("No scale");
 }
 
+VideoContentScale
+VideoContentScale::from_id (string id)
+{
+       Ratio const * r = Ratio::from_id (id);
+       if (r) {
+               return VideoContentScale (r);
+       }
+
+       if (id == "S0") {
+               return VideoContentScale (false);
+       }
+
+       return VideoContentScale (true);
+}
+               
 /** @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<const VideoContent> c, dcp::Size display_container, dcp::Size film_container) const
+VideoContentScale::size (shared_ptr<const VideoContent> c, dcp::Size display_container, dcp::Size film_container, int round) const
 {
        if (_ratio) {
-               return fit_ratio_within (_ratio->ratio (), display_container);
+               return fit_ratio_within (_ratio->ratio (), display_container, round);
        }
 
        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 fit_ratio_within (ac.ratio (), display_container, 1);
        }
 
        /* 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
+               round_to (c->video_size().width  * float(display_container.width)  / film_container.width, round),
+               round_to (c->video_size().height * float(display_container.height) / film_container.height, round)
                );
 }