Merge master.
[dcpomatic.git] / src / lib / video_content.cc
index 743e6eb18661f3ed88b0c4939bf36e725ff064fe..0a19ffd692463ac4f2923cd106ea54ddfccd4de1 100644 (file)
@@ -28,6 +28,7 @@
 #include "colour_conversion.h"
 #include "util.h"
 #include "film.h"
+#include "exceptions.h"
 
 #include "i18n.h"
 
@@ -42,9 +43,11 @@ using std::string;
 using std::stringstream;
 using std::setprecision;
 using std::cout;
+using std::vector;
 using boost::shared_ptr;
 using boost::lexical_cast;
 using boost::optional;
+using boost::dynamic_pointer_cast;
 
 VideoContent::VideoContent (shared_ptr<const Film> f)
        : Content (f)
@@ -96,6 +99,51 @@ VideoContent::VideoContent (shared_ptr<const Film> f, shared_ptr<const cxml::Nod
        _colour_conversion = ColourConversion (node->node_child ("ColourConversion"));
 }
 
+VideoContent::VideoContent (shared_ptr<const Film> f, vector<shared_ptr<Content> > c)
+       : Content (f, c)
+       , _video_length (0)
+{
+       shared_ptr<VideoContent> ref = dynamic_pointer_cast<VideoContent> (c[0]);
+       assert (ref);
+
+       for (size_t i = 0; i < c.size(); ++i) {
+               shared_ptr<VideoContent> vc = dynamic_pointer_cast<VideoContent> (c[i]);
+
+               if (vc->video_size() != ref->video_size()) {
+                       throw JoinError (_("Content to be joined must have the same picture size."));
+               }
+
+               if (vc->video_frame_rate() != ref->video_frame_rate()) {
+                       throw JoinError (_("Content to be joined must have the same video frame rate."));
+               }
+
+               if (vc->video_frame_type() != ref->video_frame_type()) {
+                       throw JoinError (_("Content to be joined must have the same video frame type."));
+               }
+
+               if (vc->crop() != ref->crop()) {
+                       throw JoinError (_("Content to be joined must have the same crop."));
+               }
+
+               if (vc->ratio() != ref->ratio()) {
+                       throw JoinError (_("Content to be joined must have the same ratio."));
+               }
+
+               if (vc->colour_conversion() != ref->colour_conversion()) {
+                       throw JoinError (_("Content to be joined must have the same colour conversion."));
+               }
+
+               _video_length += vc->video_length ();
+       }
+
+       _video_size = ref->video_size ();
+       _video_frame_rate = ref->video_frame_rate ();
+       _video_frame_type = ref->video_frame_type ();
+       _crop = ref->crop ();
+       _ratio = ref->ratio ();
+       _colour_conversion = ref->colour_conversion ();
+}
+
 void
 VideoContent::as_xml (xmlpp::Node* node) const
 {