Cope with DCPs that don't specify the picture as stereoscopic but are 3D and indicate...
authorCarl Hetherington <cth@carlh.net>
Wed, 19 Sep 2012 02:13:38 +0000 (03:13 +0100)
committerCarl Hetherington <cth@carlh.net>
Wed, 19 Sep 2012 02:13:38 +0000 (03:13 +0100)
src/dcp.cc
src/types.cc
src/types.h

index 8de1ddd9dbbeaf2fbe3278a74779a44c702be8f4..fb7fb2881e4412fc32f55cb805bcc909208b3c24 100644 (file)
@@ -342,12 +342,18 @@ CPL::CPL (string directory, string file, shared_ptr<const AssetMap> asset_map, b
                shared_ptr<SoundAsset> sound;
                shared_ptr<SubtitleAsset> subtitle;
 
-               if ((*i)->asset_list->main_picture) {
+               /* Some rather twisted logic to decide if we are 3D or not;
+                  some DCPs give a MainStereoscopicPicture to indicate 3D, others
+                  just have a FrameRate twice the EditRate and apparently
+                  expect you to divine the fact that they are hence 3D.
+               */
+
+               if (!(*i)->asset_list->main_stereoscopic_picture && p->edit_rate == p->frame_rate) {
 
                        try {
                                picture.reset (new MonoPictureAsset (
                                                       _directory,
-                                                      asset_map->asset_from_id ((*i)->asset_list->main_picture->id)->chunks.front()->path,
+                                                      asset_map->asset_from_id (p->id)->chunks.front()->path,
                                                       _fps,
                                                       (*i)->asset_list->main_picture->entry_point,
                                                       (*i)->asset_list->main_picture->duration
@@ -359,15 +365,15 @@ CPL::CPL (string directory, string file, shared_ptr<const AssetMap> asset_map, b
                                }
                        }
                        
-               } else if ((*i)->asset_list->main_stereoscopic_picture) {
-                       
+               } else {
+
                        try {
                                picture.reset (new StereoPictureAsset (
                                                       _directory,
-                                                      asset_map->asset_from_id ((*i)->asset_list->main_stereoscopic_picture->id)->chunks.front()->path,
+                                                      asset_map->asset_from_id (p->id)->chunks.front()->path,
                                                       _fps,
-                                                      (*i)->asset_list->main_stereoscopic_picture->entry_point,
-                                                      (*i)->asset_list->main_stereoscopic_picture->duration
+                                                      p->entry_point,
+                                                      p->duration
                                                       )
                                        );
                        } catch (MXFFileError) {
index 39d7fea5f560fd5f1003c106f776758e3f78dbfa..50aee2a294da8a0b05427343ceaae7196a60bf22 100644 (file)
@@ -20,6 +20,18 @@ Fraction::Fraction (string s)
        denominator = lexical_cast<int> (b[1]);
 }
 
+bool
+libdcp::operator== (Fraction const & a, Fraction const & b)
+{
+       return (a.numerator == b.numerator && a.denominator == b.denominator);
+}
+
+bool
+libdcp::operator!= (Fraction const & a, Fraction const & b)
+{
+       return (a.numerator != b.numerator || a.denominator != b.denominator);
+}
+
 Color::Color ()
        : r (0)
        , g (0)
index 98b7c33a49dbcbeaa9fe00067606b641ce93bf35..314b674b92af2f5b27cdd8dfc0bbd27ac0a04a86 100644 (file)
@@ -82,6 +82,9 @@ public:
        int denominator;
 };
 
+extern bool operator== (Fraction const & a, Fraction const & b);
+extern bool operator!= (Fraction const & a, Fraction const & b);
+       
 enum EqualityFlags {
        LIBDCP_METADATA = 0x1,
        MXF_BITWISE = 0x2,