Use enum class for VideoRange.
[dcpomatic.git] / src / lib / util.cc
index c7b3281dac4284dc00df042962b2e257b0b36b90..67b6599ea44459dd78d32ecd0dbdd7fe427fb415 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2012-2020 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2012-2021 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -104,6 +104,7 @@ using std::bad_alloc;
 using std::set_terminate;
 using std::make_pair;
 using std::shared_ptr;
+using std::make_shared;
 using boost::thread;
 using boost::optional;
 using boost::lexical_cast;
@@ -241,7 +242,7 @@ DCPOMATIC_DISABLE_WARNINGS
 LONG WINAPI
 exception_handler(struct _EXCEPTION_POINTERS * info)
 {
-       FILE* f = fopen_boost (backtrace_file, "w");
+       auto f = fopen_boost (backtrace_file, "w");
        fprintf (f, "C-style exception %d\n", info->ExceptionRecord->ExceptionCode);
        fclose(f);
 
@@ -370,7 +371,7 @@ DCPOMATIC_ENABLE_WARNINGS
        /* Add our library directory to the libltdl search path so that
           xmlsec can find xmlsec1-openssl.
        */
-       boost::filesystem::path lib = directory_containing_executable().parent_path();
+       auto lib = directory_containing_executable().parent_path();
        lib /= "Frameworks";
        setenv ("LTDL_LIBRARY_PATH", lib.c_str (), 1);
 #endif
@@ -394,11 +395,11 @@ DCPOMATIC_ENABLE_WARNINGS
        /* Render something to fontconfig to create its cache */
        list<StringText> subs;
        dcp::SubtitleString ss(
-               optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HALIGN_CENTER, 0, dcp::VALIGN_CENTER, dcp::DIRECTION_LTR,
-               "Hello dolly", dcp::NONE, dcp::Colour(), dcp::Time(), dcp::Time()
+               optional<string>(), false, false, false, dcp::Colour(), 42, 1, dcp::Time(), dcp::Time(), 0, dcp::HAlign::CENTER, 0, dcp::VAlign::CENTER, dcp::Direction::LTR,
+               "Hello dolly", dcp::Effect::NONE, dcp::Colour(), dcp::Time(), dcp::Time()
                );
        subs.push_back (StringText(ss, 0));
-       render_text (subs, list<shared_ptr<Font> >(), dcp::Size(640, 480), DCPTime(), 24);
+       render_text (subs, list<shared_ptr<Font>>(), dcp::Size(640, 480), DCPTime(), 24);
 #endif
 
        Ratio::setup_ratios ();
@@ -479,7 +480,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
        char* p = buffer.get ();
        int i = 0;
        while (i < int64_t (files.size()) && to_do > 0) {
-               FILE* f = fopen_boost (files[i], "rb");
+               auto f = fopen_boost (files[i], "rb");
                if (!f) {
                        throw OpenFileError (files[i].string(), errno, OpenFileError::READ);
                }
@@ -499,7 +500,7 @@ digest_head_tail (vector<boost::filesystem::path> files, boost::uintmax_t size)
        p = buffer.get ();
        i = files.size() - 1;
        while (i >= 0 && to_do > 0) {
-               FILE* f = fopen_boost (files[i], "rb");
+               auto f = fopen_boost (files[i], "rb");
                if (!f) {
                        throw OpenFileError (files[i].string(), errno, OpenFileError::READ);
                }
@@ -606,7 +607,7 @@ valid_image_file (boost::filesystem::path f)
                return false;
        }
 
-       string ext = f.extension().string();
+       auto ext = f.extension().string();
        transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
        return (
                ext == ".tif" || ext == ".tiff" || ext == ".jpg" || ext == ".jpeg" ||
@@ -623,7 +624,7 @@ valid_sound_file (boost::filesystem::path f)
                return false;
        }
 
-       string ext = f.extension().string();
+       auto ext = f.extension().string();
        transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
        return (ext == ".wav" || ext == ".mp3" || ext == ".aif" || ext == ".aiff");
 }
@@ -631,7 +632,7 @@ valid_sound_file (boost::filesystem::path f)
 bool
 valid_j2k_file (boost::filesystem::path f)
 {
-       string ext = f.extension().string();
+       auto ext = f.extension().string();
        transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
        return (ext == ".j2k" || ext == ".j2c" || ext == ".jp2");
 }
@@ -656,7 +657,7 @@ fit_ratio_within (float ratio, dcp::Size full_frame)
 void *
 wrapped_av_malloc (size_t s)
 {
-       void* p = av_malloc (s);
+       auto p = av_malloc (s);
        if (!p) {
                throw bad_alloc ();
        }
@@ -817,24 +818,24 @@ audio_channel_types (list<int> mapped, int channels)
                }
 
                switch (static_cast<dcp::Channel>(i)) {
-               case dcp::LFE:
+               case dcp::Channel::LFE:
                        ++lfe;
                        break;
-               case dcp::LEFT:
-               case dcp::RIGHT:
-               case dcp::CENTRE:
-               case dcp::LS:
-               case dcp::RS:
-               case dcp::BSL:
-               case dcp::BSR:
+               case dcp::Channel::LEFT:
+               case dcp::Channel::RIGHT:
+               case dcp::Channel::CENTRE:
+               case dcp::Channel::LS:
+               case dcp::Channel::RS:
+               case dcp::Channel::BSL:
+               case dcp::Channel::BSR:
                        ++non_lfe;
                        break;
-               case dcp::HI:
-               case dcp::VI:
-               case dcp::MOTION_DATA:
-               case dcp::SYNC_SIGNAL:
-               case dcp::SIGN_LANGUAGE:
-               case dcp::CHANNEL_COUNT:
+               case dcp::Channel::HI:
+               case dcp::Channel::VI:
+               case dcp::Channel::MOTION_DATA:
+               case dcp::Channel::SYNC_SIGNAL:
+               case dcp::Channel::SIGN_LANGUAGE:
+               case dcp::Channel::CHANNEL_COUNT:
                        break;
                }
        }
@@ -845,19 +846,19 @@ audio_channel_types (list<int> mapped, int channels)
 shared_ptr<AudioBuffers>
 remap (shared_ptr<const AudioBuffers> input, int output_channels, AudioMapping map)
 {
-       shared_ptr<AudioBuffers> mapped (new AudioBuffers (output_channels, input->frames()));
+       auto mapped = make_shared<AudioBuffers>(output_channels, input->frames());
        mapped->make_silent ();
 
        int to_do = min (map.input_channels(), input->channels());
 
        for (int i = 0; i < to_do; ++i) {
                for (int j = 0; j < mapped->channels(); ++j) {
-                       if (map.get (i, static_cast<dcp::Channel> (j)) > 0) {
-                               mapped->accumulate_channel (
+                       if (map.get(i, j) > 0) {
+                               mapped->accumulate_channel(
                                        input.get(),
                                        i,
-                                       static_cast<dcp::Channel> (j),
-                                       map.get (i, static_cast<dcp::Channel> (j))
+                                       j,
+                                       map.get(i, j)
                                        );
                        }
                }
@@ -953,33 +954,33 @@ void
 emit_subtitle_image (ContentTimePeriod period, dcp::SubtitleImage sub, dcp::Size size, shared_ptr<TextDecoder> decoder)
 {
        /* XXX: this is rather inefficient; decoding the image just to get its size */
-       FFmpegImageProxy proxy (sub.png_image(), VIDEO_RANGE_FULL);
-       shared_ptr<Image> image = proxy.image().image;
+       FFmpegImageProxy proxy (sub.png_image(), VideoRange::FULL);
+       auto image = proxy.image().image;
        /* set up rect with height and width */
        dcpomatic::Rect<double> rect(0, 0, image->size().width / double(size.width), image->size().height / double(size.height));
 
        /* add in position */
 
        switch (sub.h_align()) {
-       case dcp::HALIGN_LEFT:
+       case dcp::HAlign::LEFT:
                rect.x += sub.h_position();
                break;
-       case dcp::HALIGN_CENTER:
+       case dcp::HAlign::CENTER:
                rect.x += 0.5 + sub.h_position() - rect.width / 2;
                break;
-       case dcp::HALIGN_RIGHT:
+       case dcp::HAlign::RIGHT:
                rect.x += 1 - sub.h_position() - rect.width;
                break;
        }
 
        switch (sub.v_align()) {
-       case dcp::VALIGN_TOP:
+       case dcp::VAlign::TOP:
                rect.y += sub.v_position();
                break;
-       case dcp::VALIGN_CENTER:
+       case dcp::VAlign::CENTER:
                rect.y += 0.5 + sub.v_position() - rect.height / 2;
                break;
-       case dcp::VALIGN_BOTTOM:
+       case dcp::VAlign::BOTTOM:
                rect.y += 1 - sub.v_position() - rect.height;
                break;
        }
@@ -996,7 +997,7 @@ show_jobs_on_console (bool progress)
 
                dcpomatic_sleep_seconds (5);
 
-               list<shared_ptr<Job> > jobs = JobManager::instance()->get();
+               auto jobs = JobManager::instance()->get();
 
                if (!first && progress) {
                        for (size_t i = 0; i < jobs.size(); ++i) {
@@ -1046,11 +1047,11 @@ show_jobs_on_console (bool progress)
 void
 copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, boost::function<void (float)> progress)
 {
-       FILE* f = fopen_boost (from, "rb");
+       auto f = fopen_boost (from, "rb");
        if (!f) {
                throw OpenFileError (from, errno, OpenFileError::READ);
        }
-       FILE* t = fopen_boost (to, "wb");
+       auto t = fopen_boost (to, "wb");
        if (!t) {
                fclose (f);
                throw OpenFileError (to, errno, OpenFileError::WRITE);
@@ -1059,7 +1060,7 @@ copy_in_bits (boost::filesystem::path from, boost::filesystem::path to, boost::f
        /* on the order of a second's worth of copying */
        boost::uintmax_t const chunk = 20 * 1024 * 1024;
 
-       uint8_t* buffer = static_cast<uint8_t*> (malloc(chunk));
+       auto buffer = static_cast<uint8_t*> (malloc(chunk));
        if (!buffer) {
                throw std::bad_alloc ();
        }
@@ -1132,9 +1133,9 @@ decrypt_kdm_with_helpful_error (dcp::EncryptedKDM kdm)
                return dcp::DecryptedKDM (kdm, Config::instance()->decryption_chain()->key().get());
        } catch (dcp::KDMDecryptionError& e) {
                /* Try to flesh out the error a bit */
-               string const kdm_subject_name = kdm.recipient_x509_subject_name();
+               auto const kdm_subject_name = kdm.recipient_x509_subject_name();
                bool on_chain = false;
-               shared_ptr<const dcp::CertificateChain> dc = Config::instance()->decryption_chain();
+               auto dc = Config::instance()->decryption_chain();
                for (auto i: dc->root_to_leaf()) {
                        if (i.subject() == kdm_subject_name) {
                                on_chain = true;