Merge master; fix crash on new film.
[dcpomatic.git] / src / lib / util.cc
index 859aa6de7ddda8efa646ee695247023d40169a7a..ec1fd47bd7f03bdca133d791b6201d824f252cab 100644 (file)
@@ -27,7 +27,7 @@
 #include <iostream>
 #include <fstream>
 #include <climits>
-#ifdef DVDOMATIC_POSIX
+#ifdef DCPOMATIC_POSIX
 #include <execinfo.h>
 #include <cxxabi.h>
 #endif
@@ -63,19 +63,25 @@ extern "C" {
 
 #include "i18n.h"
 
-using std::cout;
 using std::string;
 using std::stringstream;
-using std::list;
+using std::setfill;
 using std::ostream;
+using std::endl;
 using std::vector;
+using std::hex;
+using std::setw;
 using std::ifstream;
-using std::istream;
+using std::ios;
 using std::min;
 using std::max;
+using std::list;
 using std::multimap;
+using std::istream;
+using std::numeric_limits;
 using std::pair;
 using boost::shared_ptr;
+using boost::thread;
 using boost::lexical_cast;
 using boost::optional;
 using libdcp::Size;
@@ -143,7 +149,7 @@ seconds_to_approximate_hms (int s)
        return ap.str ();
 }
 
-#ifdef DVDOMATIC_POSIX
+#ifdef DCPOMATIC_POSIX
 /** @param l Mangled C++ identifier.
  *  @return Demangled version.
  */
@@ -242,11 +248,11 @@ seconds (struct timeval t)
        return t.tv_sec + (double (t.tv_usec) / 1e6);
 }
 
-/** Call the required functions to set up DVD-o-matic's static arrays, etc.
+/** Call the required functions to set up DCP-o-matic's static arrays, etc.
  *  Must be called from the UI thread, if there is one.
  */
 void
-dvdomatic_setup ()
+dcpomatic_setup ()
 {
        avfilter_register_all ();
        
@@ -259,7 +265,7 @@ dvdomatic_setup ()
        ui_thread = boost::this_thread::get_id ();
 }
 
-#ifdef DVDOMATIC_WINDOWS
+#ifdef DCPOMATIC_WINDOWS
 boost::filesystem::path
 mo_path ()
 {
@@ -274,9 +280,9 @@ mo_path ()
 #endif
 
 void
-dvdomatic_setup_i18n (string lang)
+dcpomatic_setup_i18n (string lang)
 {
-#ifdef DVDOMATIC_POSIX
+#ifdef DCPOMATIC_POSIX
        lang += ".UTF8";
 #endif
 
@@ -292,15 +298,15 @@ dvdomatic_setup_i18n (string lang)
        }
 
        setlocale (LC_ALL, "");
-       textdomain ("libdvdomatic");
+       textdomain ("libdcpomatic");
 
-#ifdef DVDOMATIC_WINDOWS
-       bindtextdomain ("libdvdomatic", mo_path().string().c_str());
-       bind_textdomain_codeset ("libdvdomatic", "UTF8");
+#ifdef DCPOMATIC_WINDOWS
+       bindtextdomain ("libdcpomatic", mo_path().string().c_str());
+       bind_textdomain_codeset ("libdcpomatic", "UTF8");
 #endif 
 
-#ifdef DVDOMATIC_POSIX
-       bindtextdomain ("libdvdomatic", POSIX_LOCALE_PREFIX);
+#ifdef DCPOMATIC_POSIX
+       bindtextdomain ("libdcpomatic", POSIX_LOCALE_PREFIX);
 #endif
 }
 
@@ -361,11 +367,11 @@ md5_digest (void const * data, int size)
  *  @return MD5 digest of file's contents.
  */
 string
-md5_digest (string file)
+md5_digest (boost::filesystem::path file)
 {
-       ifstream f (file.c_str(), std::ios::binary);
+       ifstream f (file.string().c_str(), std::ios::binary);
        if (!f.good ()) {
-               throw OpenFileError (file);
+               throw OpenFileError (file.string());
        }
        
        f.seekg (0, std::ios::end);
@@ -490,16 +496,6 @@ dcp_audio_sample_rate (int fs)
        return 96000;
 }
 
-bool operator== (Crop const & a, Crop const & b)
-{
-       return (a.left == b.left && a.right == b.right && a.top == b.top && a.bottom == b.bottom);
-}
-
-bool operator!= (Crop const & a, Crop const & b)
-{
-       return !(a == b);
-}
-
 /** @param index Colour LUT index.
  *  @return Human-readable name.
  */
@@ -889,6 +885,21 @@ AudioBuffers::move (int from, int to, int frames)
        }
 }
 
+/** Add data from from `from', `from_channel' to our channel `to_channel' */
+void
+AudioBuffers::accumulate (shared_ptr<const AudioBuffers> from, int from_channel, int to_channel)
+{
+       int const N = frames ();
+       assert (from->frames() == N);
+
+       float* s = from->data (from_channel);
+       float* d = _data[to_channel];
+
+       for (int i = 0; i < N; ++i) {
+               *d++ += *s++;
+       }
+}
+
 /** Trip an assert if the caller is not in the UI thread */
 void
 ensure_ui_thread ()
@@ -896,30 +907,17 @@ ensure_ui_thread ()
        assert (boost::this_thread::get_id() == ui_thread);
 }
 
-/** @param v Source video frame.
+/** @param v Content video frame.
  *  @param audio_sample_rate Source audio sample rate.
  *  @param frames_per_second Number of video frames per second.
  *  @return Equivalent number of audio frames for `v'.
  */
 int64_t
-video_frames_to_audio_frames (SourceFrame v, float audio_sample_rate, float frames_per_second)
+video_frames_to_audio_frames (ContentVideoFrame v, float audio_sample_rate, float frames_per_second)
 {
        return ((int64_t) v * audio_sample_rate / frames_per_second);
 }
 
-/** @param f Filename.
- *  @return true if this file is a still image, false if it is something else.
- */
-bool
-still_image_file (string f)
-{
-       string ext = boost::filesystem::path(f).extension().string();
-
-       transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
-       
-       return (ext == N_(".tif") || ext == N_(".tiff") || ext == N_(".jpg") || ext == N_(".jpeg") || ext == N_(".png") || ext == N_(".bmp"));
-}
-
 /** @return A pair containing CPU model name and the number of processors */
 pair<string, int>
 cpu_info ()
@@ -927,7 +925,7 @@ cpu_info ()
        pair<string, int> info;
        info.second = 0;
        
-#ifdef DVDOMATIC_POSIX
+#ifdef DCPOMATIC_POSIX
        ifstream f (N_("/proc/cpuinfo"));
        while (f.good ()) {
                string l;
@@ -966,58 +964,6 @@ audio_channel_name (int c)
        return channels[c];
 }
 
-AudioMapping::AudioMapping (int c)
-       : _source_channels (c)
-{
-
-}
-
-optional<libdcp::Channel>
-AudioMapping::source_to_dcp (int c) const
-{
-       if (c >= _source_channels) {
-               return optional<libdcp::Channel> ();
-       }
-
-       if (_source_channels == 1) {
-               /* mono sources to centre */
-               return libdcp::CENTRE;
-       }
-       
-       return static_cast<libdcp::Channel> (c);
-}
-
-optional<int>
-AudioMapping::dcp_to_source (libdcp::Channel c) const
-{
-       if (_source_channels == 1) {
-               if (c == libdcp::CENTRE) {
-                       return 0;
-               } else {
-                       return optional<int> ();
-               }
-       }
-
-       if (static_cast<int> (c) >= _source_channels) {
-               return optional<int> ();
-       }
-       
-       return static_cast<int> (c);
-}
-
-int
-AudioMapping::dcp_channels () const
-{
-       if (_source_channels == 1) {
-               /* The source is mono, so to put the mono channel into
-                  the centre we need to generate a 5.1 soundtrack.
-               */
-               return 6;
-       }
-
-       return _source_channels;
-}
-
 FrameRateConversion::FrameRateConversion (float source, int dcp)
        : skip (false)
        , repeat (false)