Tidy up image/text subtitle distinction with FFmpeg sources.
authorCarl Hetherington <cth@carlh.net>
Thu, 26 May 2016 09:41:51 +0000 (10:41 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 26 May 2016 09:41:51 +0000 (10:41 +0100)
src/lib/ffmpeg_subtitle_stream.cc
src/lib/ffmpeg_subtitle_stream.h
src/lib/subtitle_content.h
src/wx/subtitle_panel.cc

index f00254ae25ffb357da7e5b06f63fde2ce53e5550..6028d10a9bd8c7db6efc30e52291fdea329ee0e3 100644 (file)
@@ -197,3 +197,15 @@ FFmpegSubtitleStream::set_colour (RGBA from, RGBA to)
 {
        _colours[from] = to;
 }
+
+bool
+FFmpegSubtitleStream::has_text () const
+{
+       return !_text_subtitles.empty ();
+}
+
+bool
+FFmpegSubtitleStream::has_image () const
+{
+       return !_image_subtitles.empty ();
+}
index c03004b3259d374cc0beebf3132f056e503155d1..f79e7aca7429b92f830939f37562331991bc96a4 100644 (file)
@@ -42,6 +42,9 @@ public:
        void set_colour (RGBA from, RGBA to);
        std::map<RGBA, RGBA> colours () const;
 
+       bool has_text () const;
+       bool has_image () const;
+
 private:
 
        typedef std::map<std::string, ContentTimePeriod> PeriodMap;
index 502fad4278d863c90c22e8c6b6cd7cafeeffabeb..2aa33f1727f9ec47c24bee577d34b7c544c1c873 100644 (file)
@@ -44,6 +44,12 @@ public:
        static int const OUTLINE_COLOUR;
 };
 
+/** @class SubtitleContent
+ *  @brief Description of how some subtitle content should be presented.
+ *
+ *  There are `image' subtitles (bitmaps) and `text' subtitles (plain text),
+ *  and not all of the settings in this class correspond to both types.
+ */
 class SubtitleContent : public ContentPart
 {
 public:
@@ -53,11 +59,6 @@ public:
        void as_xml (xmlpp::Node *) const;
        std::string identifier () const;
 
-       bool has_image_subtitles () const {
-               /* XXX */
-               return true;
-       }
-
        void add_font (boost::shared_ptr<Font> font);
 
        void set_use (bool);
index 31b4e96ac3cf8083809d0a41af5d9ec6a8b75362..52b23f5a20069eab46138bbd436be696f45ef319 100644 (file)
@@ -235,35 +235,40 @@ SubtitlePanel::setup_sensitivity ()
        int any_subs = 0;
        int ffmpeg_subs = 0;
        int text_subs = 0;
-       int dcp_subs = 0;
        int image_subs = 0;
        ContentList sel = _parent->selected_subtitle ();
        BOOST_FOREACH (shared_ptr<Content> i, sel) {
+               /* These are the content types that could include subtitles */
                shared_ptr<const FFmpegContent> fc = boost::dynamic_pointer_cast<const FFmpegContent> (i);
                shared_ptr<const TextSubtitleContent> sc = boost::dynamic_pointer_cast<const TextSubtitleContent> (i);
                shared_ptr<const DCPSubtitleContent> dsc = boost::dynamic_pointer_cast<const DCPSubtitleContent> (i);
                if (fc) {
                        if (fc->subtitle) {
+                               /* This content has some subtitles; check the selected stream to decide what type */
+                               if (fc->subtitle_stream()->has_text()) {
+                                       ++text_subs;
+                               } else if (fc->subtitle_stream()->has_image()) {
+                                       ++image_subs;
+                               }
                                ++ffmpeg_subs;
                                ++any_subs;
                        }
-               } else if (sc) {
+               } else if (sc || dsc) {
+                       /* XXX: in the future there could be bitmap subs from DCPs */
                        ++text_subs;
                        ++any_subs;
-               } else if (dsc) {
-                       ++dcp_subs;
-                       ++any_subs;
-               } else {
-                       ++any_subs;
                }
+       }
 
-               if (i->subtitle->has_image_subtitles ()) {
-                       ++image_subs;
+       if (image_subs) {
+               BOOST_FOREACH (shared_ptr<Content> i, sel) {
                        /* We must burn image subtitles at the moment */
                        i->subtitle->set_burn (true);
                }
        }
 
+       /* Decide whether we can reference these subs */
+
        shared_ptr<DCPContent> dcp;
        if (sel.size() == 1) {
                dcp = dynamic_pointer_cast<DCPContent> (sel.front ());
@@ -275,6 +280,7 @@ SubtitlePanel::setup_sensitivity ()
 
        bool const reference = _reference->GetValue ();
 
+       /* Set up sensitivity */
        _use->Enable (!reference && any_subs > 0);
        bool const use = _use->GetValue ();
        _burn->Enable (!reference && any_subs > 0 && use && image_subs == 0);
@@ -284,9 +290,9 @@ SubtitlePanel::setup_sensitivity ()
        _y_scale->Enable (!reference && any_subs > 0 && use);
        _language->Enable (!reference && any_subs > 0 && use);
        _stream->Enable (!reference && ffmpeg_subs == 1);
-       _subtitle_view_button->Enable (!reference && (text_subs == 1 || dcp_subs == 1));
-       _fonts_dialog_button->Enable (!reference && (text_subs == 1 || dcp_subs == 1));
-       _appearance_dialog_button->Enable (!reference && (ffmpeg_subs == 1 || text_subs == 1));
+       _subtitle_view_button->Enable (!reference && text_subs == 1);
+       _fonts_dialog_button->Enable (!reference && text_subs == 1);
+       _appearance_dialog_button->Enable (!reference);
 }
 
 void