Basics of selecting 'tracks' for CCAPs.
authorCarl Hetherington <cth@carlh.net>
Thu, 23 Aug 2018 00:31:20 +0000 (01:31 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 23 Aug 2018 00:31:20 +0000 (01:31 +0100)
12 files changed:
src/lib/dcp_text_track.cc [new file with mode: 0644]
src/lib/dcp_text_track.h [new file with mode: 0644]
src/lib/film.cc
src/lib/film.h
src/lib/text_content.cc
src/lib/text_content.h
src/lib/wscript
src/wx/dcp_text_track_dialog.cc [new file with mode: 0644]
src/wx/dcp_text_track_dialog.h [new file with mode: 0644]
src/wx/text_panel.cc
src/wx/text_panel.h
src/wx/wscript

diff --git a/src/lib/dcp_text_track.cc b/src/lib/dcp_text_track.cc
new file mode 100644 (file)
index 0000000..2d3d9fe
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "dcp_text_track.h"
+#include "compose.hpp"
+#include <string>
+
+using std::string;
+
+DCPTextTrack::DCPTextTrack (cxml::ConstNodePtr node)
+{
+       name = node->string_child("Name");
+       language = node->string_child("Language");
+}
+
+DCPTextTrack::DCPTextTrack (string name_, string language_)
+       : name (name_)
+       , language (language_)
+{
+
+}
+
+string
+DCPTextTrack::summary () const
+{
+       return String::compose("%1 (%2)", name, language);
+}
+
+void
+DCPTextTrack::as_xml (xmlpp::Element* parent) const
+{
+       parent->add_child("Name")->add_child_text(name);
+       parent->add_child("Language")->add_child_text(language);
+}
+
+bool
+operator== (DCPTextTrack const & a, DCPTextTrack const & b)
+{
+       return a.name == b.name && a.language == b.language;
+}
+
+bool
+operator!= (DCPTextTrack const & a, DCPTextTrack const & b)
+{
+       return !(a == b);
+}
diff --git a/src/lib/dcp_text_track.h b/src/lib/dcp_text_track.h
new file mode 100644 (file)
index 0000000..d69e6da
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_DCP_TEXT_TRACK_H
+#define DCPOMATIC_DCP_TEXT_TRACK_H
+
+#include <libcxml/cxml.h>
+#include <libxml++/libxml++.h>
+
+class DCPTextTrack
+{
+public:
+       DCPTextTrack (cxml::ConstNodePtr node);
+       DCPTextTrack (std::string name_, std::string language_);
+
+       std::string name;
+       std::string language;
+
+       std::string summary () const;
+       void as_xml (xmlpp::Element* parent) const;
+};
+
+bool operator== (DCPTextTrack const & a, DCPTextTrack const & b);
+bool operator!= (DCPTextTrack const & a, DCPTextTrack const & b);
+
+#endif
index 274cb8d2dbd958575d64f41d198760db33341eef..086d12e634188138590807aa9fab6c13f70f9b50 100644 (file)
@@ -1637,3 +1637,18 @@ Film::references_dcp_audio () const
 
        return false;
 }
 
        return false;
 }
+
+list<DCPTextTrack>
+Film::closed_caption_tracks () const
+{
+       list<DCPTextTrack> tt;
+       BOOST_FOREACH (shared_ptr<Content> i, content()) {
+               BOOST_FOREACH (shared_ptr<TextContent> j, i->text) {
+                       if (j->type() == TEXT_CLOSED_CAPTION && j->dcp_track() && find(tt.begin(), tt.end(), j->dcp_track().get()) == tt.end()) {
+                               tt.push_back (j->dcp_track().get());
+                       }
+               }
+       }
+
+       return tt;
+}
index 26700323a43ba8d6167a3ef9e250cfb5761b53cd..44e84dc274f34922d92b549c439586636c40c812 100644 (file)
@@ -31,6 +31,7 @@
 #include "isdcf_metadata.h"
 #include "frame_rate_change.h"
 #include "signaller.h"
 #include "isdcf_metadata.h"
 #include "frame_rate_change.h"
 #include "signaller.h"
+#include "dcp_text_track.h"
 #include <dcp/key.h>
 #include <dcp/encrypted_kdm.h>
 #include <boost/signals2.hpp>
 #include <dcp/key.h>
 #include <dcp/encrypted_kdm.h>
 #include <boost/signals2.hpp>
@@ -113,6 +114,8 @@ public:
 
        int audio_frame_rate () const;
 
 
        int audio_frame_rate () const;
 
+       std::list<DCPTextTrack> closed_caption_tracks () const;
+
        uint64_t required_disk_space () const;
        bool should_be_enough_disk_space (double& required, double& available, bool& can_hard_link) const;
 
        uint64_t required_disk_space () const;
        bool should_be_enough_disk_space (double& required, double& available, bool& can_hard_link) const;
 
index a077b2c463353556aad1e05f953b516f66420fb4..9869974c5bf7a7a61452b5402f90ec799d0c0a98 100644 (file)
@@ -56,6 +56,7 @@ int const TextContentProperty::FADE_IN = 512;
 int const TextContentProperty::FADE_OUT = 513;
 int const TextContentProperty::OUTLINE_WIDTH = 514;
 int const TextContentProperty::TYPE = 515;
 int const TextContentProperty::FADE_OUT = 513;
 int const TextContentProperty::OUTLINE_WIDTH = 514;
 int const TextContentProperty::TYPE = 515;
+int const TextContentProperty::DCP_TRACK = 516;
 
 TextContent::TextContent (Content* parent, TextType type, TextType original_type)
        : ContentPart (parent)
 
 TextContent::TextContent (Content* parent, TextType type, TextType original_type)
        : ContentPart (parent)
@@ -107,6 +108,7 @@ TextContent::from_xml (Content* parent, cxml::ConstNodePtr node, int version)
        BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children("Text")) {
                c.push_back (shared_ptr<TextContent> (new TextContent (parent, i, version)));
        }
        BOOST_FOREACH (cxml::ConstNodePtr i, node->node_children("Text")) {
                c.push_back (shared_ptr<TextContent> (new TextContent (parent, i, version)));
        }
+
        return c;
 }
 
        return c;
 }
 
@@ -231,6 +233,11 @@ TextContent::TextContent (Content* parent, cxml::ConstNodePtr node, int version)
                        _original_type = string_to_text_type (node->optional_string_child("OriginalType").get());
                }
        }
                        _original_type = string_to_text_type (node->optional_string_child("OriginalType").get());
                }
        }
+
+       cxml::ConstNodePtr dt = node->optional_node_child("DCPTrack");
+       if (dt) {
+               _dcp_track = DCPTextTrack (dt);
+       }
 }
 
 TextContent::TextContent (Content* parent, vector<shared_ptr<Content> > c)
 }
 
 TextContent::TextContent (Content* parent, vector<shared_ptr<Content> > c)
@@ -286,6 +293,10 @@ TextContent::TextContent (Content* parent, vector<shared_ptr<Content> > c)
                        throw JoinError (_("Content to be joined must use the same fonts."));
                }
 
                        throw JoinError (_("Content to be joined must use the same fonts."));
                }
 
+               if (c[i]->only_text()->dcp_track() != ref->dcp_track()) {
+                       throw JoinError (_("Content to be joined must use the same DCP track."));
+               }
+
                list<shared_ptr<Font> >::const_iterator j = ref_fonts.begin ();
                list<shared_ptr<Font> >::const_iterator k = fonts.begin ();
 
                list<shared_ptr<Font> >::const_iterator j = ref_fonts.begin ();
                list<shared_ptr<Font> >::const_iterator k = fonts.begin ();
 
@@ -312,6 +323,7 @@ TextContent::TextContent (Content* parent, vector<shared_ptr<Content> > c)
        _outline_width = ref->outline_width ();
        _type = ref->type ();
        _original_type = ref->original_type ();
        _outline_width = ref->outline_width ();
        _type = ref->type ();
        _original_type = ref->original_type ();
+       _dcp_track = ref->dcp_track ();
 
        connect_to_fonts ();
 }
 
        connect_to_fonts ();
 }
@@ -369,6 +381,9 @@ TextContent::as_xml (xmlpp::Node* root) const
 
        text->add_child("Type")->add_child_text (text_type_to_string(_type));
        text->add_child("OriginalType")->add_child_text (text_type_to_string(_original_type));
 
        text->add_child("Type")->add_child_text (text_type_to_string(_type));
        text->add_child("OriginalType")->add_child_text (text_type_to_string(_original_type));
+       if (_dcp_track) {
+               _dcp_track->as_xml(text->add_child("DCPTrack"));
+       }
 }
 
 string
 }
 
 string
@@ -395,7 +410,7 @@ TextContent::identifier () const
                }
        }
 
                }
        }
 
-       /* The language is for metadata only, and doesn't affect
+       /* The DCP track and language are for metadata only, and don't affect
           how this content looks.
        */
 
           how this content looks.
        */
 
@@ -550,6 +565,18 @@ TextContent::set_outline_width (int w)
        maybe_set (_outline_width, w, TextContentProperty::OUTLINE_WIDTH);
 }
 
        maybe_set (_outline_width, w, TextContentProperty::OUTLINE_WIDTH);
 }
 
+void
+TextContent::set_dcp_track (DCPTextTrack t)
+{
+       maybe_set (_dcp_track, t, TextContentProperty::DCP_TRACK);
+}
+
+void
+TextContent::unset_dcp_track ()
+{
+       maybe_set (_dcp_track, optional<DCPTextTrack>(), TextContentProperty::DCP_TRACK);
+}
+
 void
 TextContent::take_settings_from (shared_ptr<const TextContent> c)
 {
 void
 TextContent::take_settings_from (shared_ptr<const TextContent> c)
 {
@@ -581,4 +608,9 @@ TextContent::take_settings_from (shared_ptr<const TextContent> c)
                set_fade_out (*c->_fade_out);
        }
        set_outline_width (c->_outline_width);
                set_fade_out (*c->_fade_out);
        }
        set_outline_width (c->_outline_width);
+       if (c->_dcp_track) {
+               set_dcp_track (c->_dcp_track.get());
+       } else {
+               unset_dcp_track ();
+       }
 }
 }
index e5981acafe90edda62f7aa389dbc1fd6f16efc13..83860dff54fb6f733356a30de07833b282a7d336 100644 (file)
@@ -22,6 +22,7 @@
 #define DCPOMATIC_CAPTION_CONTENT_H
 
 #include "content_part.h"
 #define DCPOMATIC_CAPTION_CONTENT_H
 
 #include "content_part.h"
+#include "dcp_text_track.h"
 #include <libcxml/cxml.h>
 #include <dcp/types.h>
 #include <boost/signals2.hpp>
 #include <libcxml/cxml.h>
 #include <dcp/types.h>
 #include <boost/signals2.hpp>
@@ -47,6 +48,7 @@ public:
        static int const FADE_OUT;
        static int const OUTLINE_WIDTH;
        static int const TYPE;
        static int const FADE_OUT;
        static int const OUTLINE_WIDTH;
        static int const TYPE;
+       static int const DCP_TRACK;
 };
 
 /** @class TextContent
 };
 
 /** @class TextContent
@@ -87,6 +89,8 @@ public:
        void set_outline_width (int);
        void unset_fade_out ();
        void set_type (TextType type);
        void set_outline_width (int);
        void unset_fade_out ();
        void set_type (TextType type);
+       void set_dcp_track (DCPTextTrack track);
+       void unset_dcp_track ();
 
        bool use () const {
                boost::mutex::scoped_lock lm (_mutex);
 
        bool use () const {
                boost::mutex::scoped_lock lm (_mutex);
@@ -173,6 +177,11 @@ public:
                return _original_type;
        }
 
                return _original_type;
        }
 
+       boost::optional<DCPTextTrack> dcp_track () const {
+               boost::mutex::scoped_lock lm (_mutex);
+               return _dcp_track;
+       }
+
        static std::list<boost::shared_ptr<TextContent> > from_xml (Content* parent, cxml::ConstNodePtr, int version);
 
 protected:
        static std::list<boost::shared_ptr<TextContent> > from_xml (Content* parent, cxml::ConstNodePtr, int version);
 
 protected:
@@ -217,6 +226,8 @@ private:
        TextType _type;
        /** the original type of these captions in their content */
        TextType _original_type;
        TextType _type;
        /** the original type of these captions in their content */
        TextType _original_type;
+       /** the track of closed captions that this content should be put in, or empty to put in the default (only) track */
+       boost::optional<DCPTextTrack> _dcp_track;
 };
 
 #endif
 };
 
 #endif
index a85ce1f261337aafccd2a18567d55a793d655ff1..5c1da8a5fd2099dc78e169938bf5205576a9635c 100644 (file)
@@ -60,6 +60,7 @@ sources = """
           dcp_subtitle.cc
           dcp_subtitle_content.cc
           dcp_subtitle_decoder.cc
           dcp_subtitle.cc
           dcp_subtitle_content.cc
           dcp_subtitle_decoder.cc
+          dcp_text_track.cc
           dcp_video.cc
           dcpomatic_socket.cc
           dcpomatic_time.cc
           dcp_video.cc
           dcpomatic_socket.cc
           dcpomatic_time.cc
diff --git a/src/wx/dcp_text_track_dialog.cc b/src/wx/dcp_text_track_dialog.cc
new file mode 100644 (file)
index 0000000..d48b3be
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#include "dcp_text_track_dialog.h"
+#include <boost/algorithm/string.hpp>
+
+using std::string;
+
+DCPTextTrackDialog::DCPTextTrackDialog (wxWindow* parent)
+       : TableDialog (parent, _("DCP Text Track"), 2, 1, true)
+{
+       add (_("Name"), true);
+       add (_name = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(300, -1)));
+       add (_("Language"), true);
+       add (_language = new wxTextCtrl (this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(150, -1)));
+
+       layout ();
+}
+
+DCPTextTrack
+DCPTextTrackDialog::get () const
+{
+       return DCPTextTrack(wx_to_std(_name->GetValue()), wx_to_std(_language->GetValue()));
+}
diff --git a/src/wx/dcp_text_track_dialog.h b/src/wx/dcp_text_track_dialog.h
new file mode 100644 (file)
index 0000000..dd4894a
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+    Copyright (C) 2018 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+#ifndef DCPOMATIC_DCP_TEXT_TRACK_DIALOG_H
+#define DCPOMATIC_DCP_TEXT_TRACK_DIALOG_H
+
+#include "table_dialog.h"
+#include "wx_util.h"
+#include "lib/dcp_text_track.h"
+
+class DCPTextTrackDialog : public TableDialog
+{
+public:
+       DCPTextTrackDialog (wxWindow* parent);
+
+       DCPTextTrack get () const;
+
+private:
+       wxTextCtrl* _name;
+       wxTextCtrl* _language;
+};
+
+#endif
index 8c9ac7d6423d9c1b13c223160709751e928a5c1e..ef604f787579671e6a5853c40197b1ed7b1d636f 100644 (file)
@@ -24,6 +24,7 @@
 #include "text_view.h"
 #include "content_panel.h"
 #include "fonts_dialog.h"
 #include "text_view.h"
 #include "content_panel.h"
 #include "fonts_dialog.h"
+#include "dcp_text_track_dialog.h"
 #include "subtitle_appearance_dialog.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/string_text_file_content.h"
 #include "subtitle_appearance_dialog.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/string_text_file_content.h"
@@ -128,6 +129,11 @@ TextPanel::TextPanel (ContentPanel* p, TextType t)
                ++r;
        }
 
                ++r;
        }
 
+       add_label_to_sizer (grid, this, _("DCP track"), true, wxGBPosition(r, 0));
+       _dcp_track = new wxChoice (this, wxID_ANY);
+       grid->Add (_dcp_track, wxGBPosition(r, 1), wxDefaultSpan, wxEXPAND);
+       ++r;
+
        add_label_to_sizer (grid, this, _("Language"), true, wxGBPosition (r, 0));
        _language = new wxTextCtrl (this, wxID_ANY);
        grid->Add (_language, wxGBPosition (r, 1));
        add_label_to_sizer (grid, this, _("Language"), true, wxGBPosition (r, 0));
        _language = new wxTextCtrl (this, wxID_ANY);
        grid->Add (_language, wxGBPosition (r, 1));
@@ -158,6 +164,8 @@ TextPanel::TextPanel (ContentPanel* p, TextType t)
        _y_scale->SetRange (10, 1000);
        _line_spacing->SetRange (10, 1000);
 
        _y_scale->SetRange (10, 1000);
        _line_spacing->SetRange (10, 1000);
 
+       update_dcp_tracks ();
+
        content_selection_changed ();
 
        _reference->Bind                (wxEVT_CHECKBOX, boost::bind (&TextPanel::reference_clicked, this));
        content_selection_changed ();
 
        _reference->Bind                (wxEVT_CHECKBOX, boost::bind (&TextPanel::reference_clicked, this));
@@ -169,6 +177,7 @@ TextPanel::TextPanel (ContentPanel* p, TextType t)
        _x_scale->Bind                  (wxEVT_SPINCTRL, boost::bind (&TextPanel::x_scale_changed, this));
        _y_scale->Bind                  (wxEVT_SPINCTRL, boost::bind (&TextPanel::y_scale_changed, this));
        _line_spacing->Bind             (wxEVT_SPINCTRL, boost::bind (&TextPanel::line_spacing_changed, this));
        _x_scale->Bind                  (wxEVT_SPINCTRL, boost::bind (&TextPanel::x_scale_changed, this));
        _y_scale->Bind                  (wxEVT_SPINCTRL, boost::bind (&TextPanel::y_scale_changed, this));
        _line_spacing->Bind             (wxEVT_SPINCTRL, boost::bind (&TextPanel::line_spacing_changed, this));
+       _dcp_track->Bind                (wxEVT_CHOICE,   boost::bind (&TextPanel::dcp_track_changed, this));
        _language->Bind                 (wxEVT_TEXT,     boost::bind (&TextPanel::language_changed, this));
        _stream->Bind                   (wxEVT_CHOICE,   boost::bind (&TextPanel::stream_changed, this));
        _text_view_button->Bind         (wxEVT_BUTTON,   boost::bind (&TextPanel::text_view_clicked, this));
        _language->Bind                 (wxEVT_TEXT,     boost::bind (&TextPanel::language_changed, this));
        _stream->Bind                   (wxEVT_CHOICE,   boost::bind (&TextPanel::stream_changed, this));
        _text_view_button->Bind         (wxEVT_BUTTON,   boost::bind (&TextPanel::text_view_clicked, this));
@@ -176,6 +185,83 @@ TextPanel::TextPanel (ContentPanel* p, TextType t)
        _appearance_dialog_button->Bind (wxEVT_BUTTON,   boost::bind (&TextPanel::appearance_dialog_clicked, this));
 }
 
        _appearance_dialog_button->Bind (wxEVT_BUTTON,   boost::bind (&TextPanel::appearance_dialog_clicked, this));
 }
 
+void
+TextPanel::update_dcp_track_selection ()
+{
+       optional<DCPTextTrack> selected;
+       bool many = false;
+       BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+               shared_ptr<TextContent> t = i->text_of_original_type(_original_type);
+               if (t) {
+                       optional<DCPTextTrack> dt = t->dcp_track();
+                       if (dt && selected && *dt != *selected) {
+                               many = true;
+                       } else if (!selected) {
+                               selected = dt;
+                       }
+               }
+       }
+
+       int n = 0;
+       BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+               if (!many && selected && *selected == i) {
+                       _dcp_track->SetSelection (n);
+               }
+               ++n;
+       }
+
+       if (many) {
+               _dcp_track->SetSelection (wxNOT_FOUND);
+       }
+}
+
+void
+TextPanel::update_dcp_tracks ()
+{
+       _dcp_track->Clear ();
+       BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+               _dcp_track->Append (std_to_wx(i.summary()));
+       }
+
+       if (_parent->film()->closed_caption_tracks().size() < 6) {
+               _dcp_track->Append (_("Add new..."));
+       }
+
+       update_dcp_track_selection ();
+}
+
+void
+TextPanel::dcp_track_changed ()
+{
+       optional<DCPTextTrack> track;
+
+       if (_dcp_track->GetSelection() == int(_dcp_track->GetCount()) - 1) {
+               DCPTextTrackDialog* d = new DCPTextTrackDialog (this);
+               if (d->ShowModal() == wxID_OK) {
+                       track = d->get();
+               }
+               d->Destroy ();
+       } else {
+               /* Find the DCPTextTrack that was selected */
+               BOOST_FOREACH (DCPTextTrack i, _parent->film()->closed_caption_tracks()) {
+                       if (i.summary() == wx_to_std(_dcp_track->GetStringSelection())) {
+                               track = i;
+                       }
+               }
+       }
+
+       if (track) {
+               BOOST_FOREACH (shared_ptr<Content> i, _parent->selected_text()) {
+                       shared_ptr<TextContent> t = i->text_of_original_type(_original_type);
+                       if (t && t->type() == TEXT_CLOSED_CAPTION) {
+                               t->set_dcp_track(*track);
+                       }
+               }
+       }
+
+       update_dcp_tracks ();
+}
+
 void
 TextPanel::film_changed (Film::Property property)
 {
 void
 TextPanel::film_changed (Film::Property property)
 {
@@ -253,6 +339,8 @@ TextPanel::film_content_changed (int property)
                checked_set (_line_spacing, text ? lrint (text->line_spacing() * 100) : 100);
        } else if (property == TextContentProperty::LANGUAGE) {
                checked_set (_language, text ? text->language() : "");
                checked_set (_line_spacing, text ? lrint (text->line_spacing() * 100) : 100);
        } else if (property == TextContentProperty::LANGUAGE) {
                checked_set (_language, text ? text->language() : "");
+       } else if (property == TextContentProperty::DCP_TRACK) {
+               update_dcp_track_selection ();
        } else if (property == DCPContentProperty::REFERENCE_TEXT) {
                if (scs) {
                        shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent> (scs);
        } else if (property == DCPContentProperty::REFERENCE_TEXT) {
                if (scs) {
                        shared_ptr<DCPContent> dcp = dynamic_pointer_cast<DCPContent> (scs);
@@ -353,6 +441,7 @@ TextPanel::setup_sensitivity ()
        _x_scale->Enable (!reference && any_subs > 0 && use && type == TEXT_OPEN_SUBTITLE);
        _y_scale->Enable (!reference && any_subs > 0 && use && type == TEXT_OPEN_SUBTITLE);
        _line_spacing->Enable (!reference && use && type == TEXT_OPEN_SUBTITLE);
        _x_scale->Enable (!reference && any_subs > 0 && use && type == TEXT_OPEN_SUBTITLE);
        _y_scale->Enable (!reference && any_subs > 0 && use && type == TEXT_OPEN_SUBTITLE);
        _line_spacing->Enable (!reference && use && type == TEXT_OPEN_SUBTITLE);
+       _dcp_track->Enable (!reference && any_subs > 0 && use && type == TEXT_CLOSED_CAPTION);
        _language->Enable (!reference && any_subs > 0 && use);
        _stream->Enable (!reference && ffmpeg_subs == 1);
        _text_view_button->Enable (!reference);
        _language->Enable (!reference && any_subs > 0 && use);
        _stream->Enable (!reference && ffmpeg_subs == 1);
        _text_view_button->Enable (!reference);
@@ -445,6 +534,7 @@ TextPanel::content_selection_changed ()
        film_content_changed (TextContentProperty::LANGUAGE);
        film_content_changed (TextContentProperty::FONTS);
        film_content_changed (TextContentProperty::TYPE);
        film_content_changed (TextContentProperty::LANGUAGE);
        film_content_changed (TextContentProperty::FONTS);
        film_content_changed (TextContentProperty::TYPE);
+       film_content_changed (TextContentProperty::DCP_TRACK);
        film_content_changed (DCPContentProperty::REFERENCE_TEXT);
 }
 
        film_content_changed (DCPContentProperty::REFERENCE_TEXT);
 }
 
index 3d3483a465d36dfbc4fddc55058ea802f7fb6273..349960f8e7ad6d925d06eff9ade2b6fafb2dec93 100644 (file)
@@ -43,6 +43,7 @@ private:
        void x_scale_changed ();
        void y_scale_changed ();
        void line_spacing_changed ();
        void x_scale_changed ();
        void y_scale_changed ();
        void line_spacing_changed ();
+       void dcp_track_changed ();
        void language_changed ();
        void stream_changed ();
        void text_view_clicked ();
        void language_changed ();
        void stream_changed ();
        void text_view_clicked ();
@@ -50,6 +51,8 @@ private:
        void reference_clicked ();
        void appearance_dialog_clicked ();
        TextType current_type () const;
        void reference_clicked ();
        void appearance_dialog_clicked ();
        TextType current_type () const;
+       void update_dcp_tracks ();
+       void update_dcp_track_selection ();
 
        void setup_sensitivity ();
 
 
        void setup_sensitivity ();
 
@@ -63,6 +66,7 @@ private:
        wxSpinCtrl* _x_scale;
        wxSpinCtrl* _y_scale;
        wxSpinCtrl* _line_spacing;
        wxSpinCtrl* _x_scale;
        wxSpinCtrl* _y_scale;
        wxSpinCtrl* _line_spacing;
+       wxChoice* _dcp_track;
        wxTextCtrl* _language;
        wxChoice* _stream;
        wxButton* _text_view_button;
        wxTextCtrl* _language;
        wxChoice* _stream;
        wxButton* _text_view_button;
index 9400b63e29c6976378207751df5823eb4348b25b..91dc4ba87144c9dfd3958b9dd6e986372966584b 100644 (file)
@@ -52,6 +52,7 @@ sources = """
           email_dialog.cc
           image_sequence_dialog.cc
           isdcf_metadata_dialog.cc
           email_dialog.cc
           image_sequence_dialog.cc
           isdcf_metadata_dialog.cc
+          dcp_text_track_dialog.cc
           dir_picker_ctrl.cc
           dolby_doremi_certificate_panel.cc
           download_certificate_dialog.cc
           dir_picker_ctrl.cc
           dolby_doremi_certificate_panel.cc
           download_certificate_dialog.cc