Save decoding resolution reduction between launches (#1195).
authorCarl Hetherington <cth@carlh.net>
Sat, 10 Feb 2018 22:43:09 +0000 (22:43 +0000)
committerCarl Hetherington <cth@carlh.net>
Sat, 10 Feb 2018 23:00:15 +0000 (23:00 +0000)
src/lib/config.cc
src/lib/config.h
src/tools/dcpomatic_player.cc

index a54858cdb53662113c4e2fb510c2872077b8da0a..16df3779f1f11b36fd11b0af4ec5ba2dbe2fef73 100644 (file)
@@ -144,6 +144,7 @@ Config::set_defaults ()
           use about 240Mb with 72 encoding threads.
        */
        _frames_in_memory_multiplier = 3;
+       _decode_reduction = optional<int>();
 
        _allowed_dcp_frame_rates.clear ();
        _allowed_dcp_frame_rates.push_back (24);
@@ -392,6 +393,7 @@ try
                }
        }
        _frames_in_memory_multiplier = f.optional_number_child<int>("FramesInMemoryMultiplier").get_value_or(3);
+       _decode_reduction = f.optional_number_child<int>("DecodeReduction");
 
        /* Replace any cinemas from config.xml with those from the configured file */
        if (boost::filesystem::exists (_cinemas_file)) {
@@ -714,6 +716,11 @@ Config::write_config () const
        */
        root->add_child("FramesInMemoryMultiplier")->add_child_text(raw_convert<string>(_frames_in_memory_multiplier));
 
+       /* [XML] DecodeReduction power of 2 to reduce DCP images by before decoding in the player */
+       if (_decode_reduction) {
+               root->add_child("DecodeReduction")->add_child_text(raw_convert<string>(_decode_reduction.get()));
+       }
+
        try {
                doc.write_to_file_formatted(config_file().string());
        } catch (xmlpp::exception& e) {
index db32c58a0fdfb94da163b1a29667a96083fcf789..d50e585e315ebee2c6e92abaceaac18bc2f99438 100644 (file)
@@ -376,6 +376,12 @@ public:
                return _frames_in_memory_multiplier;
        }
 
+       boost::optional<int> decode_reduction () const {
+               return _decode_reduction;
+       }
+
+       /* SET (mostly) */
+
        void set_master_encoding_threads (int n) {
                maybe_set (_master_encoding_threads, n);
        }
@@ -651,6 +657,10 @@ public:
                maybe_set (_frames_in_memory_multiplier, m);
        }
 
+       void set_decode_reduction (boost::optional<int> r) {
+               maybe_set (_decode_reduction, r);
+       }
+
        void clear_history () {
                _history.clear ();
                changed ();
@@ -832,6 +842,7 @@ private:
        boost::optional<KDMWriteType> _last_kdm_write_type;
        boost::optional<DKDMWriteType> _last_dkdm_write_type;
        int _frames_in_memory_multiplier;
+       boost::optional<int> _decode_reduction;
 
        /** Singleton instance, or 0 */
        static Config* _instance;
index 0f77e3bc3f63848412a2b6ca1094099ab9f73df3..bbfdc4ae4572000b540c430440d7cc95a22a1a81 100644 (file)
@@ -149,6 +149,7 @@ public:
        {
                _viewer->set_dcp_decode_reduction (reduction);
                _info->triggered_update ();
+               Config::instance()->set_decode_reduction (reduction);
        }
 
        void load_dcp (boost::filesystem::path dir)
@@ -230,10 +231,11 @@ private:
 #endif
 
                wxMenu* view = new wxMenu;
-               view->AppendRadioItem (ID_view_scale_appropriate, _("Set decode resolution to match display"));
-               view->AppendRadioItem (ID_view_scale_full, _("Decode at full resolution"));
-               view->AppendRadioItem (ID_view_scale_half, _("Decode at half resolution"));
-               view->AppendRadioItem (ID_view_scale_quarter, _("Decode at quarter resolution"));
+               optional<int> c = Config::instance()->decode_reduction();
+               view->AppendRadioItem(ID_view_scale_appropriate, _("Set decode resolution to match display"))->Check(!static_cast<bool>(c));
+               view->AppendRadioItem(ID_view_scale_full, _("Decode at full resolution"))->Check(c && c.get() == 0);
+               view->AppendRadioItem(ID_view_scale_half, _("Decode at half resolution"))->Check(c && c.get() == 1);
+               view->AppendRadioItem(ID_view_scale_quarter, _("Decode at quarter resolution"))->Check(c && c.get() == 2);
 
                wxMenu* tools = new wxMenu;
                tools->Append (ID_tools_check_for_updates, _("Check for updates"));