Add option to use any DCP frame rate, rather than just the
authorCarl Hetherington <cth@carlh.net>
Mon, 12 May 2014 22:29:21 +0000 (23:29 +0100)
committerCarl Hetherington <cth@carlh.net>
Mon, 12 May 2014 22:29:21 +0000 (23:29 +0100)
"allowed" set.

Requested-by: Noah Orozco
ChangeLog
src/lib/config.cc
src/lib/config.h
src/wx/config_dialog.cc
src/wx/film_editor.cc
src/wx/film_editor.h

index 3160aafa1d07105afcf93784be727825cc099a2a..4a4c13202fb69e5a44c1d6aad7505545fc2b5fc9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2014-05-12  Carl Hetherington  <cth@carlh.net>
 
+       * Add option to use any DCP frame rate, rather than just
+       the "allowed" set.
+
        * Version 1.69.4 released.
 
 2014-05-12  Carl Hetherington  <cth@carlh.net>
index d7503b848c75dad058e00cde6afaaf6fedffae10..40ae3971be9bd0ba5781bb9496bb7f9bf2f7b257 100644 (file)
@@ -61,6 +61,7 @@ Config::Config ()
        , _use_any_servers (true)
        , _tms_path (".")
        , _sound_processor (SoundProcessor::from_id (N_("dolby_cp750")))
+       , _allow_any_dcp_frame_rate (false)
        , _default_still_length (10)
        , _default_container (Ratio::from_id ("185"))
        , _default_dcp_content_type (DCPContentType::from_dci_name ("TST"))
@@ -187,6 +188,7 @@ Config::read ()
        _check_for_test_updates = f.optional_bool_child("CheckForTestUpdates").get_value_or (false);
 
        _maximum_j2k_bandwidth = f.optional_number_child<int> ("MaximumJ2KBandwidth").get_value_or (250000000);
+       _allow_any_dcp_frame_rate = f.optional_bool_child ("AllowAnyDCPFrameRate");
 }
 
 void
@@ -363,7 +365,8 @@ Config::write () const
        root->add_child("CheckForTestUpdates")->add_child_text (_check_for_test_updates ? "1" : "0");
 
        root->add_child("MaximumJ2KBandwidth")->add_child_text (raw_convert<string> (_maximum_j2k_bandwidth));
-
+       root->add_child("AllowAnyDCPFrameRate")->add_child_text (_allow_any_dcp_frame_rate ? "1" : "0");
+       
        doc.write_to_file_formatted (file(false).string ());
 }
 
index a40e3680aace969bcf3fcfaa00d8dc206bbdc18a..87b7038def5844843db76892d76ae6c20a2d8969 100644 (file)
@@ -116,6 +116,10 @@ public:
        std::list<int> allowed_dcp_frame_rates () const {
                return _allowed_dcp_frame_rates;
        }
+
+       bool allow_any_dcp_frame_rate () const {
+               return _allow_any_dcp_frame_rate;
+       }
        
        DCIMetadata default_dci_metadata () const {
                return _default_dci_metadata;
@@ -241,6 +245,11 @@ public:
                changed ();
        }
 
+       void set_allow_any_dcp_frame_rate (bool a) {
+               _allow_any_dcp_frame_rate = a;
+               changed ();
+       }
+
        void set_default_dci_metadata (DCIMetadata d) {
                _default_dci_metadata = d;
                changed ();
@@ -369,6 +378,8 @@ private:
        /** Our sound processor */
        SoundProcessor const * _sound_processor;
        std::list<int> _allowed_dcp_frame_rates;
+       /** Allow any video frame rate for the DCP; if true, overrides _allowed_dcp_frame_rates */
+       bool _allow_any_dcp_frame_rate;
        /** Default DCI metadata for newly-created Films */
        DCIMetadata _default_dci_metadata;
        boost::optional<std::string> _language;
index e7133a534a7dc5cc808066ebce4dbaba5eb5dcf0..e27b79172ea0ab8d9ca7dde851b4ae251b3feb83 100644 (file)
@@ -109,6 +109,10 @@ public:
                add_label_to_sizer (table, panel, _("Maximum JPEG2000 bandwidth"), true);
                _maximum_j2k_bandwidth = new wxSpinCtrl (panel);
                table->Add (_maximum_j2k_bandwidth, 1);
+
+               _allow_any_dcp_frame_rate = new wxCheckBox (panel, wxID_ANY, _("Allow any DCP frame rate"));
+               table->Add (_allow_any_dcp_frame_rate, 1, wxEXPAND | wxALL);
+               table->AddSpacer (0);
                
                add_label_to_sizer (table, panel, _("Outgoing mail server"), true);
                _mail_server = new wxTextCtrl (panel, wxID_ANY);
@@ -183,6 +187,8 @@ public:
                _check_for_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_updates_changed, this));
                _check_for_test_updates->SetValue (config->check_for_test_updates ());
                _check_for_test_updates->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::check_for_test_updates_changed, this));
+               _allow_any_dcp_frame_rate->SetValue (config->allow_any_dcp_frame_rate ());
+               _allow_any_dcp_frame_rate->Bind (wxEVT_COMMAND_CHECKBOX_CLICKED, boost::bind (&GeneralPage::allow_any_dcp_frame_rate_changed, this));
                
                return panel;
        }
@@ -269,11 +275,17 @@ private:
        {
                Config::instance()->set_maximum_j2k_bandwidth (_maximum_j2k_bandwidth->GetValue() * 1000000);
        }
+
+       void allow_any_dcp_frame_rate_changed ()
+       {
+               Config::instance()->set_allow_any_dcp_frame_rate (_allow_any_dcp_frame_rate->GetValue ());
+       }
        
        wxCheckBox* _set_language;
        wxChoice* _language;
        wxSpinCtrl* _num_local_encoding_threads;
        wxSpinCtrl* _maximum_j2k_bandwidth;
+       wxCheckBox* _allow_any_dcp_frame_rate;
        wxTextCtrl* _mail_server;
        wxTextCtrl* _mail_user;
        wxTextCtrl* _mail_password;
index 17198e8b330a113426677d56b191a0756294e533..51bb1f5343bdaabf04d231b8d6f40235b1432e4f 100644 (file)
@@ -143,12 +143,15 @@ FilmEditor::make_dcp_panel ()
 
        {
                add_label_to_grid_bag_sizer (grid, _dcp_panel, _("Frame Rate"), true, wxGBPosition (r, 0));
-               wxBoxSizer* s = new wxBoxSizer (wxHORIZONTAL);
-               _frame_rate = new wxChoice (_dcp_panel, wxID_ANY);
-               s->Add (_frame_rate, 1, wxALIGN_CENTER_VERTICAL);
+               _frame_rate_sizer = new wxBoxSizer (wxHORIZONTAL);
+               _frame_rate_choice = new wxChoice (_dcp_panel, wxID_ANY);
+               _frame_rate_sizer->Add (_frame_rate_choice, 1, wxALIGN_CENTER_VERTICAL);
+               _frame_rate_spin = new wxSpinCtrl (_dcp_panel, wxID_ANY);
+               _frame_rate_sizer->Add (_frame_rate_spin, 1, wxALIGN_CENTER_VERTICAL);
+               setup_frame_rate_widget ();
                _best_frame_rate = new wxButton (_dcp_panel, wxID_ANY, _("Use best"));
-               s->Add (_best_frame_rate, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND);
-               grid->Add (s, wxGBPosition (r, 1));
+               _frame_rate_sizer->Add (_best_frame_rate, 1, wxALIGN_CENTER_VERTICAL | wxEXPAND);
+               grid->Add (_frame_rate_sizer, wxGBPosition (r, 1));
        }
        ++r;
 
@@ -211,7 +214,7 @@ FilmEditor::make_dcp_panel ()
 
        list<int> const dfr = Config::instance()->allowed_dcp_frame_rates ();
        for (list<int>::const_iterator i = dfr.begin(); i != dfr.end(); ++i) {
-               _frame_rate->Append (std_to_wx (boost::lexical_cast<string> (*i)));
+               _frame_rate_choice->Append (std_to_wx (boost::lexical_cast<string> (*i)));
        }
 
        _audio_channels->SetRange (0, MAX_DCP_AUDIO_CHANNELS);
@@ -242,7 +245,8 @@ FilmEditor::connect_to_widgets ()
        _content_timeline->Bind (wxEVT_COMMAND_BUTTON_CLICKED,        boost::bind (&FilmEditor::content_timeline_clicked, this));
        _scaler->Bind           (wxEVT_COMMAND_CHOICE_SELECTED,       boost::bind (&FilmEditor::scaler_changed, this));
        _dcp_content_type->Bind (wxEVT_COMMAND_CHOICE_SELECTED,       boost::bind (&FilmEditor::dcp_content_type_changed, this));
-       _frame_rate->Bind       (wxEVT_COMMAND_CHOICE_SELECTED,       boost::bind (&FilmEditor::frame_rate_changed, this));
+       _frame_rate_choice->Bind(wxEVT_COMMAND_CHOICE_SELECTED,       boost::bind (&FilmEditor::frame_rate_choice_changed, this));
+       _frame_rate_spin->Bind  (wxEVT_COMMAND_SPINCTRL_UPDATED,      boost::bind (&FilmEditor::frame_rate_spin_changed, this));
        _best_frame_rate->Bind  (wxEVT_COMMAND_BUTTON_CLICKED,        boost::bind (&FilmEditor::best_frame_rate_clicked, this));
        _signed->Bind           (wxEVT_COMMAND_CHECKBOX_CLICKED,      boost::bind (&FilmEditor::signed_toggled, this));
        _encrypted->Bind        (wxEVT_COMMAND_CHECKBOX_CLICKED,      boost::bind (&FilmEditor::encrypted_toggled, this));
@@ -352,9 +356,9 @@ FilmEditor::encrypted_toggled ()
        _film->set_encrypted (_encrypted->GetValue ());
 }
                               
-/** Called when the name widget has been changed */
+/** Called when the frame rate choice widget has been changed */
 void
-FilmEditor::frame_rate_changed ()
+FilmEditor::frame_rate_choice_changed ()
 {
        if (!_film) {
                return;
@@ -362,11 +366,22 @@ FilmEditor::frame_rate_changed ()
 
        _film->set_video_frame_rate (
                boost::lexical_cast<int> (
-                       wx_to_std (_frame_rate->GetString (_frame_rate->GetSelection ()))
+                       wx_to_std (_frame_rate_choice->GetString (_frame_rate_choice->GetSelection ()))
                        )
                );
 }
 
+/** Called when the frame rate spin widget has been changed */
+void
+FilmEditor::frame_rate_spin_changed ()
+{
+       if (!_film) {
+               return;
+       }
+
+       _film->set_video_frame_rate (_frame_rate_spin->GetValue ());
+}
+
 void
 FilmEditor::audio_channels_changed ()
 {
@@ -468,18 +483,20 @@ FilmEditor::film_changed (Film::Property p)
        case Film::VIDEO_FRAME_RATE:
        {
                bool done = false;
-               for (unsigned int i = 0; i < _frame_rate->GetCount(); ++i) {
-                       if (wx_to_std (_frame_rate->GetString(i)) == boost::lexical_cast<string> (_film->video_frame_rate())) {
-                               checked_set (_frame_rate, i);
+               for (unsigned int i = 0; i < _frame_rate_choice->GetCount(); ++i) {
+                       if (wx_to_std (_frame_rate_choice->GetString(i)) == boost::lexical_cast<string> (_film->video_frame_rate())) {
+                               checked_set (_frame_rate_choice, i);
                                done = true;
                                break;
                        }
                }
 
                if (!done) {
-                       checked_set (_frame_rate, -1);
+                       checked_set (_frame_rate_choice, -1);
                }
 
+               _frame_rate_spin->SetValue (_film->video_frame_rate ());
+
                _best_frame_rate->Enable (_film->best_video_frame_rate () != _film->video_frame_rate ());
                break;
        }
@@ -646,7 +663,8 @@ FilmEditor::set_general_sensitivity (bool s)
        _signed->Enable (si);
        
        _encrypted->Enable (s);
-       _frame_rate->Enable (s);
+       _frame_rate_choice->Enable (s);
+       _frame_rate_spin->Enable (s);
        _audio_channels->Enable (s);
        _j2k_bandwidth->Enable (s);
        _container->Enable (s);
@@ -1016,4 +1034,19 @@ void
 FilmEditor::config_changed ()
 {
        _j2k_bandwidth->SetRange (1, Config::instance()->maximum_j2k_bandwidth() / 1000000);
+       setup_frame_rate_widget ();
+}
+
+void
+FilmEditor::setup_frame_rate_widget ()
+{
+       if (Config::instance()->allow_any_dcp_frame_rate ()) {
+               _frame_rate_choice->Hide ();
+               _frame_rate_spin->Show ();
+       } else {
+               _frame_rate_choice->Show ();
+               _frame_rate_spin->Hide ();
+       }
+
+       _frame_rate_sizer->Layout ();
 }
index a1336ec900a6434b540ebd210a7c00a6f0bf742c..56e54734b7dcac54e0a3ebad1317be4f6febdf13 100644 (file)
@@ -87,7 +87,8 @@ private:
        void dcp_content_type_changed ();
        void scaler_changed ();
        void j2k_bandwidth_changed ();
-       void frame_rate_changed ();
+       void frame_rate_choice_changed ();
+       void frame_rate_spin_changed ();
        void best_frame_rate_clicked ();
        void content_timeline_clicked ();
        void audio_channels_changed ();
@@ -108,6 +109,7 @@ private:
        void setup_content ();
        void setup_container ();
        void setup_content_sensitivity ();
+       void setup_frame_rate_widget ();
        
        void active_jobs_changed (bool);
        void config_changed ();
@@ -143,7 +145,9 @@ private:
        wxChoice* _scaler;
        wxSpinCtrl* _j2k_bandwidth;
        wxChoice* _dcp_content_type;
-       wxChoice* _frame_rate;
+       wxChoice* _frame_rate_choice;
+       wxSpinCtrl* _frame_rate_spin;
+       wxSizer* _frame_rate_sizer;
        wxSpinCtrl* _audio_channels;
        wxButton* _best_frame_rate;
        wxCheckBox* _three_d;