Basics of allowing video parts of FFmpegContent to be disabled (#1355 and others).
authorCarl Hetherington <cth@carlh.net>
Fri, 31 May 2019 23:27:57 +0000 (00:27 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 31 May 2019 23:27:57 +0000 (00:27 +0100)
src/lib/ffmpeg_decoder.cc
src/lib/video_content.cc
src/lib/video_content.h
src/wx/timeline_text_content_view.cc
src/wx/timeline_video_content_view.cc
src/wx/timeline_video_content_view.h
src/wx/video_panel.cc
src/wx/video_panel.h

index c52723da3edb051ff09d042df9b80c500abce919..cbde534c30608e97cdd1c673754a95ae6c32bf8b 100644 (file)
@@ -80,7 +80,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr<const Film> film, shared_ptr<const FFmp
        , Decoder (film)
        , _have_current_subtitle (false)
 {
-       if (c->video) {
+       if (c->video && c->video->use()) {
                video.reset (new VideoDecoder (this, c));
                _pts_offset = pts_offset (c->ffmpeg_audio_streams(), c->first_video(), c->active_video_frame_rate(film));
                /* It doesn't matter what size or pixel format this is, it just needs to be black */
@@ -185,7 +185,7 @@ FFmpegDecoder::pass ()
        int const si = _packet.stream_index;
        shared_ptr<const FFmpegContent> fc = _ffmpeg_content;
 
-       if (_video_stream && si == _video_stream.get() && !video->ignore()) {
+       if (_video_stream && si == _video_stream.get() && video && !video->ignore()) {
                decode_video_packet ();
        } else if (fc->subtitle_stream() && fc->subtitle_stream()->uses_index(_format_context, si) && !only_text()->ignore()) {
                decode_subtitle_packet ();
index 4eda7d96763400f654b00ec24088405a51cb18eb..6853363678ff76173d6c1943038c3cb5da572359 100644 (file)
 
 #include "i18n.h"
 
-int const VideoContentProperty::SIZE     = 0;
-int const VideoContentProperty::FRAME_TYPE  = 1;
-int const VideoContentProperty::CROP     = 2;
-int const VideoContentProperty::SCALE    = 3;
-int const VideoContentProperty::COLOUR_CONVERSION = 4;
-int const VideoContentProperty::FADE_IN     = 5;
-int const VideoContentProperty::FADE_OUT    = 6;
-int const VideoContentProperty::RANGE       = 7;
+int const VideoContentProperty::USE               = 0;
+int const VideoContentProperty::SIZE              = 1;
+int const VideoContentProperty::FRAME_TYPE        = 2;
+int const VideoContentProperty::CROP              = 3;
+int const VideoContentProperty::SCALE            = 4;
+int const VideoContentProperty::COLOUR_CONVERSION = 5;
+int const VideoContentProperty::FADE_IN           = 6;
+int const VideoContentProperty::FADE_OUT          = 7;
+int const VideoContentProperty::RANGE             = 8;
 
 using std::string;
 using std::setprecision;
@@ -66,6 +67,7 @@ using namespace dcpomatic;
 
 VideoContent::VideoContent (Content* parent)
        : ContentPart (parent)
+       , _use (true)
        , _length (0)
        , _frame_type (VIDEO_FRAME_TYPE_2D)
        , _scale (VideoContentScale (Ratio::from_id ("178")))
@@ -99,6 +101,7 @@ VideoContent::VideoContent (Content* parent, cxml::ConstNodePtr node, int versio
                _parent->set_video_frame_rate (r.get ());
        }
 
+       _use = node->optional_bool_child("Use").get_value_or(true);
        _length = node->number_child<Frame> ("VideoLength");
 
        if (version <= 34) {
@@ -171,6 +174,10 @@ VideoContent::VideoContent (Content* parent, vector<shared_ptr<Content> > c)
 
        for (size_t i = 1; i < c.size(); ++i) {
 
+               if (c[i]->video->use() != ref->use()) {
+                       throw JoinError (_("Content to be joined must have all its video used or not used."));
+               }
+
                if (c[i]->video->size() != ref->size()) {
                        throw JoinError (_("Content to be joined must have the same picture size."));
                }
@@ -202,6 +209,7 @@ VideoContent::VideoContent (Content* parent, vector<shared_ptr<Content> > c)
                }
        }
 
+       _use = ref->use ();
        _size = ref->size ();
        _frame_type = ref->frame_type ();
        _crop = ref->crop ();
@@ -216,6 +224,7 @@ void
 VideoContent::as_xml (xmlpp::Node* node) const
 {
        boost::mutex::scoped_lock lm (_mutex);
+       node->add_child("Use")->add_child_text (_use ? "1" : "0");
        node->add_child("VideoLength")->add_child_text (raw_convert<string> (_length));
        node->add_child("VideoWidth")->add_child_text (raw_convert<string> (_size.width));
        node->add_child("VideoHeight")->add_child_text (raw_convert<string> (_size.height));
@@ -280,7 +289,8 @@ VideoContent::identifier () const
 {
        char buffer[256];
        snprintf (
-               buffer, sizeof(buffer), "%d_%d_%d_%d_%s_%" PRId64 "_%" PRId64 "_%d",
+               buffer, sizeof(buffer), "%d_%d_%d_%d_%d_%s_%" PRId64 "_%" PRId64 "_%d",
+               (_use ? 1 : 0),
                crop().left,
                crop().right,
                crop().top,
@@ -544,6 +554,12 @@ VideoContent::set_range (VideoRange r)
        maybe_set (_range, r, VideoContentProperty::RANGE);
 }
 
+void
+VideoContent::set_use (bool u)
+{
+       maybe_set (_use, u, VideoContentProperty::USE);
+}
+
 void
 VideoContent::take_settings_from (shared_ptr<const VideoContent> c)
 {
@@ -552,6 +568,7 @@ VideoContent::take_settings_from (shared_ptr<const VideoContent> c)
        } else {
                unset_colour_conversion ();
        }
+       set_use (c->_use);
        set_frame_type (c->_frame_type);
        set_left_crop (c->_crop.left);
        set_right_crop (c->_crop.right);
index f5fb6c9ac747320c03b610b4d76b2417c3a02069..6386754de86faa08601955e796e458a2a21f7267 100644 (file)
@@ -39,6 +39,7 @@ class Content;
 class VideoContentProperty
 {
 public:
+       static int const USE;
        static int const SIZE;
        static int const FRAME_TYPE;
        static int const CROP;
@@ -94,6 +95,7 @@ public:
        void set_fade_out (Frame);
 
        void set_range (VideoRange);
+       void set_use (bool);
 
        VideoFrameType frame_type () const {
                boost::mutex::scoped_lock lm (_mutex);
@@ -161,6 +163,11 @@ public:
                return _range;
        }
 
+       bool use () const {
+               boost::mutex::scoped_lock lm (_mutex);
+               return _use;
+       }
+
        dcp::Size size_after_3d_split () const;
        dcp::Size size_after_crop () const;
 
@@ -191,6 +198,7 @@ private:
        VideoContent (Content* parent, cxml::ConstNodePtr, int);
        void setup_default_colour_conversion ();
 
+       bool _use;
        Frame _length;
        boost::optional<ColourConversion> _colour_conversion;
        dcp::Size _size;
index 934bf1fc4be12eb812da60a0a9253d08bf99536d..1345ea5e49457950f4abea14fc9ef571285dfa7d 100644 (file)
@@ -54,7 +54,5 @@ TimelineTextContentView::foreground_colour () const
 bool
 TimelineTextContentView::active () const
 {
-       shared_ptr<Content> c = _content.lock ();
-       DCPOMATIC_ASSERT (c);
        return _caption->use();
 }
index 731108c93ac7e890414c838b41c48174c00caeef..db15201909091d620aa159c9e4d41d44a5c378b0 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2013-2015 Carl Hetherington <cth@carlh.net>
+    Copyright (C) 2013-2019 Carl Hetherington <cth@carlh.net>
 
     This file is part of DCP-o-matic.
 
@@ -18,8 +18,9 @@
 
 */
 
-#include "timeline_video_content_view.h"
 #include "lib/image_content.h"
+#include "lib/video_content.h"
+#include "timeline_video_content_view.h"
 
 using boost::dynamic_pointer_cast;
 using boost::shared_ptr;
@@ -33,12 +34,27 @@ TimelineVideoContentView::TimelineVideoContentView (Timeline& tl, shared_ptr<Con
 wxColour
 TimelineVideoContentView::background_colour () const
 {
+       if (!active()) {
+               return wxColour (210, 210, 210, 128);
+       }
+
        return wxColour (242, 92, 120, 255);
 }
 
 wxColour
 TimelineVideoContentView::foreground_colour () const
 {
+       if (!active()) {
+               return wxColour (180, 180, 180, 128);
+       }
+
        return wxColour (0, 0, 0, 255);
 }
 
+bool
+TimelineVideoContentView::active () const
+{
+       shared_ptr<Content> c = _content.lock ();
+       DCPOMATIC_ASSERT (c);
+       return c->video && c->video->use();
+}
index d53d43f35aba6f7c821f93a692fe423e666875e3..c32424d59bf22c106542af7673dd2b6386d9352f 100644 (file)
@@ -29,9 +29,7 @@ public:
        TimelineVideoContentView (Timeline& tl, boost::shared_ptr<Content> c);
 
 private:
-       bool active () const {
-               return true;
-       }
+       bool active () const;
        wxColour background_colour () const;
        wxColour foreground_colour () const;
 };
index 7594d98a5d36b4494f45a2afc5465242c696c1b1..685424b8c40a5064e8b930ad4f563551af7a2b71 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,
@@ -206,6 +208,7 @@ 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));
@@ -233,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;
@@ -385,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) {
@@ -528,6 +548,7 @@ VideoPanel::content_selection_changed ()
        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);
 
@@ -548,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);
@@ -613,6 +638,14 @@ VideoPanel::fade_out_changed ()
        }
 }
 
+void
+VideoPanel::use_clicked ()
+{
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_video()) {
+               i->video->set_use (_use->GetValue());
+       }
+}
+
 void
 VideoPanel::reference_clicked ()
 {
index b13228d2d6b602a79d79d7b4c447ced6679c924a..ad0ba402a763e4a23a9216dc1fc9a80acce45b5a 100644 (file)
@@ -46,6 +46,7 @@ public:
        void content_selection_changed ();
 
 private:
+       void use_clicked ();
        void reference_clicked ();
        void edit_filters_clicked ();
        void colour_conversion_changed ();
@@ -60,6 +61,7 @@ private:
 
        wxCheckBox* _reference;
        wxStaticText* _reference_note;
+       wxCheckBox* _use;
        wxStaticText* _type_label;
        ContentChoice<VideoContent, VideoFrameType>* _frame_type;
        wxStaticText* _left_crop_label;