Make jump-to-first-subtitle also work with DCP subs.
authorCarl Hetherington <cth@carlh.net>
Mon, 6 Jun 2022 19:00:50 +0000 (21:00 +0200)
committerCarl Hetherington <cth@carlh.net>
Mon, 6 Jun 2022 19:00:50 +0000 (21:00 +0200)
src/lib/dcp_subtitle_decoder.cc
src/lib/dcp_subtitle_decoder.h
src/wx/content_panel.cc

index 169a41751a6860929be63912d6356b040e42c695..d5cbabf1b51d5e65f652638a8518adbd3d2859de 100644 (file)
 */
 
 
-#include "dcp_subtitle_decoder.h"
 #include "dcp_subtitle_content.h"
+#include "dcp_subtitle_decoder.h"
 #include "font.h"
 #include "text_content.h"
 #include <dcp/interop_subtitle_asset.h>
 #include <dcp/load_font_node.h>
-#include <iostream>
 
 
-using std::cout;
+using std::dynamic_pointer_cast;
 using std::list;
+using std::make_shared;
+using std::shared_ptr;
 using std::string;
 using std::vector;
-using std::shared_ptr;
-using std::dynamic_pointer_cast;
-using std::make_shared;
+using boost::optional;
 using namespace dcpomatic;
 
 
@@ -42,7 +41,7 @@ DCPSubtitleDecoder::DCPSubtitleDecoder (shared_ptr<const Film> film, shared_ptr<
        : Decoder (film)
 {
        /* Load the XML or MXF file */
-       shared_ptr<dcp::SubtitleAsset> const c = load (content->path(0));
+       auto const c = load (content->path(0));
        c->fix_empty_font_ids ();
        _subtitles = c->subtitles ();
        _next = _subtitles.begin ();
@@ -162,3 +161,14 @@ DCPSubtitleDecoder::fonts () const
        return _fonts;
 }
 
+
+/** @return time of first subtitle, if there is one */
+optional<ContentTime>
+DCPSubtitleDecoder::first () const
+{
+       if (_subtitles.empty()) {
+               return {};
+       }
+
+       return ContentTime::from_seconds(_subtitles[0]->in().as_seconds());
+}
index 4a54aaf2ef09529ead0f04f29b57eda8423a6778..d1237b2761c337a9b629b3baad7383e6b3e4ce19 100644 (file)
@@ -37,6 +37,8 @@ public:
 
        std::vector<dcpomatic::FontData> fonts () const override;
 
+       boost::optional<dcpomatic::ContentTime> first () const;
+
 private:
        dcpomatic::ContentTimePeriod content_time_period (std::shared_ptr<const dcp::Subtitle> s) const;
 
index 8f09949199ceafce2ac1b532a951c03da099fb03..69dd724266abfc35a780f141833587c2853bd13a 100644 (file)
@@ -36,6 +36,8 @@
 #include "lib/content_factory.h"
 #include "lib/cross.h"
 #include "lib/dcp_content.h"
+#include "lib/dcp_subtitle_content.h"
+#include "lib/dcp_subtitle_decoder.h"
 #include "lib/dcpomatic_log.h"
 #include "lib/ffmpeg_content.h"
 #include "lib/image_content.h"
@@ -300,20 +302,27 @@ ContentPanel::check_selection ()
        }
 
        optional<DCPTime> go_to;
-       for (auto i: selected()) {
-               DCPTime p;
-               p = i->position();
-               if (dynamic_pointer_cast<StringTextFileContent>(i) && i->paths_valid()) {
-                       /* Rather special case; if we select a text subtitle file jump to its
-                          first subtitle.
-                       */
-                       StringTextFile ts (dynamic_pointer_cast<StringTextFileContent>(i));
-                       if (ts.first()) {
-                               p += DCPTime(ts.first().get(), _film->active_frame_rate_change(i->position()));
+       for (auto content: selected()) {
+               if (content->paths_valid()) {
+                       auto position = content->position();
+                       if (auto text_content = dynamic_pointer_cast<StringTextFileContent>(content)) {
+                               /* Rather special case; if we select a text subtitle file jump to its
+                                  first subtitle.
+                               */
+                               StringTextFile ts(text_content);
+                               if (auto first = ts.first()) {
+                                       position += DCPTime(first.get(), _film->active_frame_rate_change(content->position()));
+                               }
+                       } else if (auto dcp_content = dynamic_pointer_cast<DCPSubtitleContent>(content)) {
+                               /* Do the same for DCP subtitles */
+                               DCPSubtitleDecoder ts(_film, dcp_content);
+                               if (auto first = ts.first()) {
+                                       position += DCPTime(first.get(), _film->active_frame_rate_change(content->position()));
+                               }
+                       }
+                       if (!go_to || position < go_to.get()) {
+                               go_to = position;
                        }
-               }
-               if (!go_to || p < go_to.get()) {
-                       go_to = p;
                }
        }