From b68fb4c103b5580509070c7733d3ae7deb46c3ce Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 1 Jun 2019 00:27:57 +0100 Subject: [PATCH] Basics of allowing video parts of FFmpegContent to be disabled (#1355 and others). --- src/lib/ffmpeg_decoder.cc | 4 +-- src/lib/video_content.cc | 35 ++++++++++++++++++++------- src/lib/video_content.h | 8 ++++++ src/wx/timeline_text_content_view.cc | 2 -- src/wx/timeline_video_content_view.cc | 20 +++++++++++++-- src/wx/timeline_video_content_view.h | 4 +-- src/wx/video_panel.cc | 35 ++++++++++++++++++++++++++- src/wx/video_panel.h | 2 ++ 8 files changed, 91 insertions(+), 19 deletions(-) diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index c52723da3..cbde534c3 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -80,7 +80,7 @@ FFmpegDecoder::FFmpegDecoder (shared_ptr film, shared_ptrvideo) { + 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 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 (); diff --git a/src/lib/video_content.cc b/src/lib/video_content.cc index 4eda7d967..685336367 100644 --- a/src/lib/video_content.cc +++ b/src/lib/video_content.cc @@ -39,14 +39,15 @@ #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 ("VideoLength"); if (version <= 34) { @@ -171,6 +174,10 @@ VideoContent::VideoContent (Content* parent, vector > 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 > 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 (_length)); node->add_child("VideoWidth")->add_child_text (raw_convert (_size.width)); node->add_child("VideoHeight")->add_child_text (raw_convert (_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 c) { @@ -552,6 +568,7 @@ VideoContent::take_settings_from (shared_ptr 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); diff --git a/src/lib/video_content.h b/src/lib/video_content.h index f5fb6c9ac..6386754de 100644 --- a/src/lib/video_content.h +++ b/src/lib/video_content.h @@ -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 _colour_conversion; dcp::Size _size; diff --git a/src/wx/timeline_text_content_view.cc b/src/wx/timeline_text_content_view.cc index 934bf1fc4..1345ea5e4 100644 --- a/src/wx/timeline_text_content_view.cc +++ b/src/wx/timeline_text_content_view.cc @@ -54,7 +54,5 @@ TimelineTextContentView::foreground_colour () const bool TimelineTextContentView::active () const { - shared_ptr c = _content.lock (); - DCPOMATIC_ASSERT (c); return _caption->use(); } diff --git a/src/wx/timeline_video_content_view.cc b/src/wx/timeline_video_content_view.cc index 731108c93..db1520190 100644 --- a/src/wx/timeline_video_content_view.cc +++ b/src/wx/timeline_video_content_view.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2013-2015 Carl Hetherington + Copyright (C) 2013-2019 Carl Hetherington 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 c = _content.lock (); + DCPOMATIC_ASSERT (c); + return c->video && c->video->use(); +} diff --git a/src/wx/timeline_video_content_view.h b/src/wx/timeline_video_content_view.h index d53d43f35..c32424d59 100644 --- a/src/wx/timeline_video_content_view.h +++ b/src/wx/timeline_video_content_view.h @@ -29,9 +29,7 @@ public: TimelineVideoContentView (Timeline& tl, boost::shared_ptr c); private: - bool active () const { - return true; - } + bool active () const; wxColour background_colour () const; wxColour foreground_colour () const; }; diff --git a/src/wx/video_panel.cc b/src/wx/video_panel.cc index 7594d98a5..685424b8c 100644 --- a/src/wx/video_panel.cc +++ b/src/wx/video_panel.cc @@ -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 ( 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 check; + BOOST_FOREACH (shared_ptr 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 check; BOOST_FOREACH (shared_ptr 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 i, _parent->selected_video()) { + i->video->set_use (_use->GetValue()); + } +} + void VideoPanel::reference_clicked () { diff --git a/src/wx/video_panel.h b/src/wx/video_panel.h index b13228d2d..ad0ba402a 100644 --- a/src/wx/video_panel.h +++ b/src/wx/video_panel.h @@ -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* _frame_type; wxStaticText* _left_crop_label; -- 2.30.2