Merge branch '1.0' of ssh://carlh.dyndns.org/home/carl/git/dvdomatic into 1.0
[dcpomatic.git] / src / lib / util.cc
index badbda4ab685c775f9633eb5ce4b7ebae661f9ad..96b834fcc88fe70d3f1be8429b25920a8322318f 100644 (file)
@@ -279,6 +279,15 @@ dcpomatic_setup ()
        
        avfilter_register_all ();
 
+#ifdef DCPOMATIC_OSX
+       /* Add our lib directory to the libltdl search path so that
+          xmlsec can find xmlsec1-openssl.
+       */
+       boost::filesystem::path lib = app_contents ();
+       lib /= "lib";
+       setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1);
+#endif 
+
        libdcp::init ();
        
        Ratio::setup_ratios ();
@@ -735,7 +744,7 @@ audio_channel_name (int c)
        assert (MAX_AUDIO_CHANNELS == 6);
 
        /* TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency
-          enhancement channel (sub-woofer)./
+          enhancement channel (sub-woofer).
        */
        string const channels[] = {
                _("Left"),
@@ -751,24 +760,33 @@ audio_channel_name (int c)
 
 FrameRateConversion::FrameRateConversion (float source, int dcp)
        : skip (false)
-       , repeat (false)
+       , repeat (1)
        , change_speed (false)
 {
-       if (fabs (source / 2.0 - dcp) < (fabs (source - dcp))) {
+       if (fabs (source / 2.0 - dcp) < fabs (source - dcp)) {
+               /* The difference between source and DCP frame rate will be lower
+                  (i.e. better) if we skip.
+               */
                skip = true;
        } else if (fabs (source * 2 - dcp) < fabs (source - dcp)) {
-               repeat = true;
+               /* The difference between source and DCP frame rate would be better
+                  if we repeated each frame once; it may be better still if we
+                  repeated more than once.  Work out the required repeat.
+               */
+               repeat = round (dcp / source);
        }
 
        change_speed = !about_equal (source * factor(), dcp);
 
-       if (!skip && !repeat && !change_speed) {
+       if (!skip && repeat == 1 && !change_speed) {
                description = _("Content and DCP have the same rate.\n");
        } else {
                if (skip) {
                        description = _("DCP will use every other frame of the content.\n");
-               } else if (repeat) {
+               } else if (repeat == 2) {
                        description = _("Each content frame will be doubled in the DCP.\n");
+               } else if (repeat > 2) {
+                       description = String::compose (_("Each content frame will be repeated %1 more times in the DCP.\n"), repeat - 1);
                }
 
                if (change_speed) {
@@ -836,9 +854,10 @@ make_signer ()
        list<boost::filesystem::path>::const_iterator i = files.begin();
        while (i != files.end()) {
                boost::filesystem::path p (sd);
-               sd /= *i;
-               if (!boost::filesystem::exists (sd)) {
+               p /= *i;
+               if (!boost::filesystem::exists (p)) {
                        boost::filesystem::remove_all (sd);
+                       boost::filesystem::create_directories (sd);
                        libdcp::make_signer_chain (sd, openssl_path ());
                        break;
                }
@@ -872,3 +891,12 @@ make_signer ()
        return shared_ptr<const libdcp::Signer> (new libdcp::Signer (chain, signer_key));
 }
 
+libdcp::Size
+fit_ratio_within (float ratio, libdcp::Size full_frame)
+{
+       if (ratio < full_frame.ratio ()) {
+               return libdcp::Size (full_frame.height * ratio, full_frame.height);
+       }
+       
+       return libdcp::Size (full_frame.width, full_frame.width / ratio);
+}