summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib/ffmpeg_decoder.cc4
-rw-r--r--src/lib/video_content.cc35
-rw-r--r--src/lib/video_content.h8
-rw-r--r--src/wx/timeline_text_content_view.cc2
-rw-r--r--src/wx/timeline_video_content_view.cc20
-rw-r--r--src/wx/timeline_video_content_view.h4
-rw-r--r--src/wx/video_panel.cc35
-rw-r--r--src/wx/video_panel.h2
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<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 ();
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<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,
@@ -545,6 +555,12 @@ VideoContent::set_range (VideoRange r)
}
void
+VideoContent::set_use (bool u)
+{
+ maybe_set (_use, u, VideoContentProperty::USE);
+}
+
+void
VideoContent::take_settings_from (shared_ptr<const VideoContent> c)
{
if (c->_colour_conversion) {
@@ -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);
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<ColourConversion> _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<Content> 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 <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();
+}
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<Content> 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<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);
@@ -614,6 +639,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 ()
{
ContentList c = _parent->selected ();
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<VideoContent, VideoFrameType>* _frame_type;
wxStaticText* _left_crop_label;