Merge master.
authorCarl Hetherington <cth@carlh.net>
Mon, 8 Sep 2014 00:09:22 +0000 (01:09 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 8 Sep 2014 00:09:22 +0000 (01:09 +0100)
ChangeLog
src/lib/video_content.cc
src/lib/video_content.h
src/lib/video_content_scale.cc [new file with mode: 0644]
src/lib/video_content_scale.h [new file with mode: 0644]
src/lib/wscript

index d8210ef9d992dc21feecc26cc60c2e63a347e9d6..2e09eba80bd80c359872e8f19916bbeea10d7e93 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2014-09-07  Carl Hetherington  <cth@carlh.net>
+
+       * Version 1.73.3 released.
+
 2014-09-07  Carl Hetherington  <cth@carlh.net>
 
        * Put no stretch / no scale in the set of choices for default
index 9822d77634c659a583de5314a4904032da104ec4..b5097b35546ecd95d5dc75031911f206b5ac844f 100644 (file)
@@ -56,8 +56,6 @@ using boost::optional;
 using boost::dynamic_pointer_cast;
 using dcp::raw_convert;
 
-vector<VideoContentScale> VideoContentScale::_scales;
-
 VideoContent::VideoContent (shared_ptr<const Film> f)
        : Content (f)
        , _video_length (0)
@@ -433,138 +431,3 @@ VideoContent::set_video_frame_rate (float r)
        signal_changed (VideoContentProperty::VIDEO_FRAME_RATE);
 }
 
-VideoContentScale::VideoContentScale (Ratio const * r)
-       : _ratio (r)
-       , _scale (true)
-{
-
-}
-
-VideoContentScale::VideoContentScale ()
-       : _ratio (0)
-       , _scale (false)
-{
-
-}
-
-VideoContentScale::VideoContentScale (bool scale)
-       : _ratio (0)
-       , _scale (scale)
-{
-
-}
-
-VideoContentScale::VideoContentScale (cxml::NodePtr node)
-       : _ratio (0)
-       , _scale (true)
-{
-       optional<string> r = node->optional_string_child ("Ratio");
-       if (r) {
-               _ratio = Ratio::from_id (r.get ());
-       } else {
-               _scale = node->bool_child ("Scale");
-       }
-}
-
-void
-VideoContentScale::as_xml (xmlpp::Node* node) const
-{
-       if (_ratio) {
-               node->add_child("Ratio")->add_child_text (_ratio->id ());
-       } else {
-               node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
-       }
-}
-
-string
-VideoContentScale::id () const
-{
-       SafeStringStream s;
-       
-       if (_ratio) {
-               s << _ratio->id ();
-       } else {
-               s << (_scale ? "S1" : "S0");
-       }
-       
-       return s.str ();
-}
-
-string
-VideoContentScale::name () const
-{
-       if (_ratio) {
-               return _ratio->nickname ();
-       }
-
-       if (_scale) {
-               return _("No stretch");
-       }
-
-       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, int round) const
-{
-       if (_ratio) {
-               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, 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 (
-               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)
-               );
-}
-
-void
-VideoContentScale::setup_scales ()
-{
-       vector<Ratio const *> ratios = Ratio::all ();
-       for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
-               _scales.push_back (VideoContentScale (*i));
-       }
-
-       _scales.push_back (VideoContentScale (true));
-       _scales.push_back (VideoContentScale (false));
-}
-
-bool
-operator== (VideoContentScale const & a, VideoContentScale const & b)
-{
-       return (a.ratio() == b.ratio() && a.scale() == b.scale());
-}
-
-bool
-operator!= (VideoContentScale const & a, VideoContentScale const & b)
-{
-       return (a.ratio() != b.ratio() || a.scale() != b.scale());
-}
index d32769b5a9dde2ec41128207983e04b9721b8c0e..b3c81d9c3eb807bbc3866d384141ce26f1aaff47 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "content.h"
 #include "colour_conversion.h"
+#include "video_content_scale.h"
 
 class VideoExaminer;
 class Ratio;
@@ -37,45 +38,6 @@ public:
        static int const COLOUR_CONVERSION;
 };
 
-class VideoContentScale
-{
-public:
-       VideoContentScale ();
-       VideoContentScale (Ratio const *);
-       VideoContentScale (bool);
-       VideoContentScale (cxml::NodePtr);
-
-       dcp::Size size (boost::shared_ptr<const VideoContent>, dcp::Size, dcp::Size, int round) const;
-       std::string id () const;
-       std::string name () const;
-       void as_xml (xmlpp::Node *) const;
-
-       Ratio const * ratio () const {
-               return _ratio;
-       }
-
-       bool scale () const {
-               return _scale;
-       }
-
-       static void setup_scales ();
-       static std::vector<VideoContentScale> all () {
-               return _scales;
-       }
-       static VideoContentScale from_id (std::string id);
-
-private:
-       /** a ratio to stretch the content to, or 0 for no stretch */
-       Ratio const * _ratio;
-       /** true if we want to scale the content */
-       bool _scale;
-
-       static std::vector<VideoContentScale> _scales;
-};
-
-bool operator== (VideoContentScale const & a, VideoContentScale const & b);
-bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
-
 class VideoContent : public virtual Content
 {
 public:
diff --git a/src/lib/video_content_scale.cc b/src/lib/video_content_scale.cc
new file mode 100644 (file)
index 0000000..418c46e
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <boost/optional.hpp>
+#include <libxml++/libxml++.h>
+#include <libcxml/cxml.h>
+#include "video_content_scale.h"
+#include "ratio.h"
+#include "safe_stringstream.h"
+#include "util.h"
+
+#include "i18n.h"
+
+using std::vector;
+using std::string;
+using boost::shared_ptr;
+using boost::optional;
+
+vector<VideoContentScale> VideoContentScale::_scales;
+
+VideoContentScale::VideoContentScale (Ratio const * r)
+       : _ratio (r)
+       , _scale (true)
+{
+
+}
+
+VideoContentScale::VideoContentScale ()
+       : _ratio (0)
+       , _scale (false)
+{
+
+}
+
+VideoContentScale::VideoContentScale (bool scale)
+       : _ratio (0)
+       , _scale (scale)
+{
+
+}
+
+VideoContentScale::VideoContentScale (shared_ptr<cxml::Node> node)
+       : _ratio (0)
+       , _scale (true)
+{
+       optional<string> r = node->optional_string_child ("Ratio");
+       if (r) {
+               _ratio = Ratio::from_id (r.get ());
+       } else {
+               _scale = node->bool_child ("Scale");
+       }
+}
+
+void
+VideoContentScale::as_xml (xmlpp::Node* node) const
+{
+       if (_ratio) {
+               node->add_child("Ratio")->add_child_text (_ratio->id ());
+       } else {
+               node->add_child("Scale")->add_child_text (_scale ? "1" : "0");
+       }
+}
+
+string
+VideoContentScale::id () const
+{
+       SafeStringStream s;
+       
+       if (_ratio) {
+               s << _ratio->id ();
+       } else {
+               s << (_scale ? "S1" : "S0");
+       }
+       
+       return s.str ();
+}
+
+string
+VideoContentScale::name () const
+{
+       if (_ratio) {
+               return _ratio->nickname ();
+       }
+
+       if (_scale) {
+               return _("No stretch");
+       }
+
+       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, int round) const
+{
+       if (_ratio) {
+               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, round);
+       }
+
+       /* 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
+VideoContentScale::setup_scales ()
+{
+       vector<Ratio const *> ratios = Ratio::all ();
+       for (vector<Ratio const *>::const_iterator i = ratios.begin(); i != ratios.end(); ++i) {
+               _scales.push_back (VideoContentScale (*i));
+       }
+
+       _scales.push_back (VideoContentScale (true));
+       _scales.push_back (VideoContentScale (false));
+}
+
+bool
+operator== (VideoContentScale const & a, VideoContentScale const & b)
+{
+       return (a.ratio() == b.ratio() && a.scale() == b.scale());
+}
+
+bool
+operator!= (VideoContentScale const & a, VideoContentScale const & b)
+{
+       return (a.ratio() != b.ratio() || a.scale() != b.scale());
+}
diff --git a/src/lib/video_content_scale.h b/src/lib/video_content_scale.h
new file mode 100644 (file)
index 0000000..6b718d5
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+    Copyright (C) 2013-2014 Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef DCPOMATIC_VIDEO_CONTENT_SCALE_H
+#define DCPOMATIC_VIDEO_CONTENT_SCALE_H
+
+#include <vector>
+#include <boost/shared_ptr.hpp>
+#include <dcp/util.h>
+
+namespace cxml {
+       class Node;
+}
+
+namespace xmlpp {
+       class Node;
+}
+
+class Ratio;
+class VideoContent;
+
+class VideoContentScale
+{
+public:
+       VideoContentScale ();
+       VideoContentScale (Ratio const *);
+       VideoContentScale (bool);
+       VideoContentScale (boost::shared_ptr<cxml::Node>);
+
+       dcp::Size size (boost::shared_ptr<const VideoContent>, dcp::Size, dcp::Size, int round) const;
+       std::string id () const;
+       std::string name () const;
+       void as_xml (xmlpp::Node *) const;
+
+       Ratio const * ratio () const {
+               return _ratio;
+       }
+
+       bool scale () const {
+               return _scale;
+       }
+
+       static void setup_scales ();
+       static std::vector<VideoContentScale> all () {
+               return _scales;
+       }
+       static VideoContentScale from_id (std::string id);
+
+private:
+       /** a ratio to stretch the content to, or 0 for no stretch */
+       Ratio const * _ratio;
+       /** true if we want to scale the content */
+       bool _scale;
+
+       static std::vector<VideoContentScale> _scales;
+};
+
+bool operator== (VideoContentScale const & a, VideoContentScale const & b);
+bool operator!= (VideoContentScale const & a, VideoContentScale const & b);
+
+#endif
index 2510ebe2a481b75d4d8b0c90f3916420f43350f7..3f77a5cebb9707b0575a8e8c29c30878d2f5d5e5 100644 (file)
@@ -88,6 +88,7 @@ sources = """
           upmixer_a.cc
           util.cc
           video_content.cc
+          video_content_scale.cc
           video_decoder.cc
           writer.cc
           """