Add FilmViewer::time_until_next_frame.
[dcpomatic.git] / src / wx / video_panel.cc
index 9c044e1889f51109517276899ef7350135a9aa26..e1d9fcb123c1ffc31da68cc1fe050ad8586eeae1 100644 (file)
@@ -86,6 +86,8 @@ VideoPanel::VideoPanel (ContentPanel* p)
        font.SetPointSize(font.GetPointSize() - 1);
        _reference_note->SetFont(font);
 
+       _use = new wxCheckBox (this, wxID_ANY, _("Use"));
+
        _type_label = create_label (this, _("Type"), true);
        _frame_type = new ContentChoice<VideoContent, VideoFrameType> (
                this,
@@ -175,6 +177,11 @@ VideoPanel::VideoPanel (ContentPanel* p)
        _colour_conversion->Append (S_("Colour|Custom"));
        _edit_colour_conversion_button = new Button (this, _("Edit..."));
 
+       _range_label = create_label (this, _("Range"), true);
+       _range = new wxChoice (this, wxID_ANY);
+       _range->Append (_("Full (JPEG, 0-255)"));
+       _range->Append (_("Video (MPEG, 16-235)"));
+
        _description = new StaticText (this, wxT ("\n \n \n \n \n"), wxDefaultPosition, wxDefaultSize);
        _description->SetFont(font);
 
@@ -201,9 +208,11 @@ VideoPanel::VideoPanel (ContentPanel* p)
        _fade_in->Changed.connect (boost::bind (&VideoPanel::fade_in_changed, this));
        _fade_out->Changed.connect (boost::bind (&VideoPanel::fade_out_changed, this));
 
+       _use->Bind                           (wxEVT_CHECKBOX, boost::bind (&VideoPanel::use_clicked, this));
        _reference->Bind                     (wxEVT_CHECKBOX, boost::bind (&VideoPanel::reference_clicked, this));
        _filters_button->Bind                (wxEVT_BUTTON,   boost::bind (&VideoPanel::edit_filters_clicked, this));
        _colour_conversion->Bind             (wxEVT_CHOICE,   boost::bind (&VideoPanel::colour_conversion_changed, this));
+       _range->Bind                         (wxEVT_CHOICE,   boost::bind (&VideoPanel::range_changed, this));
        _edit_colour_conversion_button->Bind (wxEVT_BUTTON,   boost::bind (&VideoPanel::edit_colour_conversion_clicked, this));
 
        add_to_grid ();
@@ -217,7 +226,7 @@ VideoPanel::add_to_grid ()
        int r = 0;
 
        _reference->Show (full);
-       _reference_note->Show (full);
+       _reference_note->Show (full && !_reference_note->GetLabel().IsEmpty());
 
        if (full) {
                wxBoxSizer* reference_sizer = new wxBoxSizer (wxVERTICAL);
@@ -227,6 +236,10 @@ VideoPanel::add_to_grid ()
                ++r;
        }
 
+       _use->Show (full);
+       _grid->Add (_use, wxGBPosition(r, 0), wxGBSpan(1, 2));
+       ++r;
+
        add_label_to_sizer (_grid, _type_label, true, wxGBPosition(r, 0));
        _frame_type->add (_grid, wxGBPosition(r, 1), wxGBSpan(1, 2));
        ++r;
@@ -253,6 +266,8 @@ VideoPanel::add_to_grid ()
        _colour_conversion_label->Show (full);
        _colour_conversion->Show (full);
        _edit_colour_conversion_button->Show (full);
+       _range_label->Show (full);
+       _range->Show (full);
 
        add_label_to_sizer (_grid, _fade_in_label, true, wxGBPosition (r, 0));
        _grid->Add (_fade_in, wxGBPosition (r, 1), wxGBSpan (1, 3));
@@ -284,12 +299,36 @@ VideoPanel::add_to_grid ()
                        _grid->Add (s, wxGBPosition (r, 1), wxDefaultSpan, wxALIGN_CENTER_VERTICAL);
                }
                ++r;
+
+               add_label_to_sizer (_grid, _range_label, true, wxGBPosition(r, 0));
+               _grid->Add (_range, wxGBPosition(r, 1), wxGBSpan(1, 2), wxALIGN_CENTER_VERTICAL);
+               ++r;
        }
 
        _grid->Add (_description, wxGBPosition (r, 0), wxGBSpan (1, 4), wxEXPAND | wxALIGN_CENTER_VERTICAL, 6);
        ++r;
 }
 
+void
+VideoPanel::range_changed ()
+{
+       ContentList vc = _parent->selected_video ();
+       if (vc.size() != 1) {
+               return;
+       }
+
+       switch (_range->GetSelection()) {
+       case 0:
+               vc.front()->video->set_range (VIDEO_RANGE_FULL);
+               break;
+       case 1:
+               vc.front()->video->set_range (VIDEO_RANGE_VIDEO);
+               break;
+       default:
+               DCPOMATIC_ASSERT (false);
+       }
+}
+
 
 void
 VideoPanel::film_changed (Film::Property property)
@@ -353,6 +392,19 @@ VideoPanel::film_content_changed (int property)
                                checked_set (_filters, p);
                        }
                }
+       } else if (property == VideoContentProperty::USE) {
+               set<bool> check;
+               BOOST_FOREACH (shared_ptr<const Content> i, vc) {
+                       check.insert (i->video->use());
+               }
+
+               if (check.size() == 1) {
+                       checked_set (_use, vc.front()->video->use());
+               } else {
+                       checked_set (_use, false);
+               }
+
+               setup_sensitivity ();
        } else if (property == VideoContentProperty::FADE_IN) {
                set<Frame> check;
                BOOST_FOREACH (shared_ptr<const Content> i, vc) {
@@ -389,6 +441,14 @@ VideoPanel::film_content_changed (int property)
                        checked_set (_reference, false);
                }
 
+               setup_sensitivity ();
+       } else if (property == VideoContentProperty::RANGE) {
+               if (vcs) {
+                       checked_set (_range, vcs->video->range() == VIDEO_RANGE_FULL ? 0 : 1);
+               } else {
+                       checked_set (_range, 0);
+               }
+
                setup_sensitivity ();
        }
 }
@@ -487,6 +547,8 @@ VideoPanel::content_selection_changed ()
        film_content_changed (VideoContentProperty::COLOUR_CONVERSION);
        film_content_changed (VideoContentProperty::FADE_IN);
        film_content_changed (VideoContentProperty::FADE_OUT);
+       film_content_changed (VideoContentProperty::RANGE);
+       film_content_changed (VideoContentProperty::USE);
        film_content_changed (FFmpegContentProperty::FILTERS);
        film_content_changed (DCPContentProperty::REFERENCE_VIDEO);
 
@@ -507,7 +569,11 @@ VideoPanel::setup_sensitivity ()
        bool const can_reference = dcp && dcp->can_reference_video (_parent->film(), why_not);
        setup_refer_button (_reference, _reference_note, dcp, can_reference, why_not);
 
-       if (_reference->GetValue ()) {
+       bool const enable = !_reference->GetValue() && _use->GetValue();
+
+       _use->Enable (!_reference->GetValue());
+
+       if (!enable) {
                _frame_type->wrapped()->Enable (false);
                _left_crop->wrapped()->Enable (false);
                _right_crop->wrapped()->Enable (false);
@@ -520,6 +586,7 @@ VideoPanel::setup_sensitivity ()
                _filters->Enable (false);
                _filters_button->Enable (false);
                _colour_conversion->Enable (false);
+               _range->Enable (false);
        } else {
                ContentList video_sel = _parent->selected_video ();
                FFmpegContentList ffmpeg_sel = _parent->selected_ffmpeg ();
@@ -537,6 +604,7 @@ VideoPanel::setup_sensitivity ()
                _filters->Enable (true);
                _filters_button->Enable (single && !ffmpeg_sel.empty ());
                _colour_conversion->Enable (single && !video_sel.empty ());
+               _range->Enable (single && !video_sel.empty());
        }
 
        ContentList vc = _parent->selected_video ();
@@ -556,7 +624,7 @@ void
 VideoPanel::fade_in_changed ()
 {
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_video ()) {
-               int const vfr = _parent->film()->video_frame_rate ();
+               int const vfr = i->active_video_frame_rate (_parent->film());
                i->video->set_fade_in (_fade_in->get (vfr).frames_round (vfr));
        }
 }
@@ -565,11 +633,19 @@ void
 VideoPanel::fade_out_changed ()
 {
        BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_video ()) {
-               int const vfr = _parent->film()->video_frame_rate ();
+               int const vfr = i->active_video_frame_rate (_parent->film());
                i->video->set_fade_out (_fade_out->get (vfr).frames_round (vfr));
        }
 }
 
+void
+VideoPanel::use_clicked ()
+{
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_video()) {
+               i->video->set_use (_use->GetValue());
+       }
+}
+
 void
 VideoPanel::reference_clicked ()
 {