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)
1  2 
ChangeLog
src/lib/video_content.cc
src/lib/video_content.h
src/lib/video_content_scale.cc
src/lib/video_content_scale.h
src/lib/wscript

diff --cc ChangeLog
Simple merge
index 9822d77634c659a583de5314a4904032da104ec4,13f2cf51676a9d10bb3b6acce245457d1dd2db66..b5097b35546ecd95d5dc75031911f206b5ac844f
@@@ -54,10 -51,8 +54,8 @@@ using std::max
  using boost::shared_ptr;
  using boost::optional;
  using boost::dynamic_pointer_cast;
 -using libdcp::raw_convert;
 +using dcp::raw_convert;
  
- vector<VideoContentScale> VideoContentScale::_scales;
  VideoContent::VideoContent (shared_ptr<const Film> f)
        : Content (f)
        , _video_length (0)
Simple merge
index 0000000000000000000000000000000000000000,e603582b89e7c5faef2d7690160786e8855b03c4..418c46eecd121fbf1d4019f27ae1f752758d5105
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,171 +1,171 @@@
 -libdcp::Size
 -VideoContentScale::size (shared_ptr<const VideoContent> c, libdcp::Size display_container, libdcp::Size film_container) const
+ /*
+     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.
+  */
 -              return fit_ratio_within (_ratio->ratio (), display_container);
++dcp::Size
++VideoContentScale::size (shared_ptr<const VideoContent> c, dcp::Size display_container, dcp::Size film_container, int round) const
+ {
+       if (_ratio) {
 -      libdcp::Size const ac = c->video_size_after_crop ();
++              return fit_ratio_within (_ratio->ratio (), display_container, round);
+       }
 -              return fit_ratio_within (ac.ratio (), display_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 libdcp::Size (
++              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());
+ }
index 0000000000000000000000000000000000000000,87dd2f1fafec05b49706c71f226d58cabadc495e..6b718d5741e09380d47abaff3e42268937178471
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,77 +1,77 @@@
 -#include <libdcp/util.h>
+ /*
+     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>
 -      libdcp::Size size (boost::shared_ptr<const VideoContent>, libdcp::Size, libdcp::Size) const;
++#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
diff --cc src/lib/wscript
index 2510ebe2a481b75d4d8b0c90f3916420f43350f7,6c1da1772e696276161de2d0f9d7385bd68bf50d..3f77a5cebb9707b0575a8e8c29c30878d2f5d5e5
@@@ -85,9 -66,9 +85,10 @@@ sources = ""
            types.cc
            ui_signaller.cc
            update.cc
 +          upmixer_a.cc
            util.cc
            video_content.cc
+           video_content_scale.cc
            video_decoder.cc
            writer.cc
            """