Basics of DCP subtitle import.
[dcpomatic.git] / src / lib / subrip_decoder.cc
index aecee4e3e7aaceb4290dccf75aaa7a79674f2bc8..e2bdc347b93b202183d483f6a606dfc665324a13 100644 (file)
 
 */
 
+#include <dcp/subtitle_string.h>
 #include "subrip_decoder.h"
+#include "subrip_content.h"
 
 using std::list;
+using std::vector;
 using boost::shared_ptr;
 
-SubRipDecoder::SubRipDecoder (shared_ptr<const Film> film, shared_ptr<const SubRipContent> content)
-       : Decoder (film)
-       , SubtitleDecoder (film)
+SubRipDecoder::SubRipDecoder (shared_ptr<const SubRipContent> content)
+       : SubtitleDecoder (content)
        , SubRip (content)
        , _next (0)
 {
 
 }
 
+void
+SubRipDecoder::seek (ContentTime time, bool accurate)
+{
+       SubtitleDecoder::seek (time, accurate);
+       
+       _next = 0;
+       list<SubRipSubtitlePiece>::const_iterator i = _subtitles[_next].pieces.begin();
+       while (i != _subtitles[_next].pieces.end() && _subtitles[_next].period.from < time) {
+               ++i;
+       }
+       
+}
+
 bool
 SubRipDecoder::pass ()
 {
@@ -38,21 +53,21 @@ SubRipDecoder::pass ()
                return true;
        }
        
-       list<libdcp::Subtitle> out;
+       list<dcp::SubtitleString> out;
        for (list<SubRipSubtitlePiece>::const_iterator i = _subtitles[_next].pieces.begin(); i != _subtitles[_next].pieces.end(); ++i) {
                out.push_back (
-                       libdcp::Subtitle (
+                       dcp::SubtitleString (
                                "Arial",
                                i->italic,
-                               libdcp::Color (255, 255, 255),
+                               dcp::Color (255, 255, 255),
                                72,
-                               _subtitles[_next].from,
-                               _subtitles[_next].to,
+                               dcp::Time (rint (_subtitles[_next].period.from.seconds() * 250)),
+                               dcp::Time (rint (_subtitles[_next].period.to.seconds() * 250)),
                                0.9,
-                               libdcp::BOTTOM,
+                               dcp::BOTTOM,
                                i->text,
-                               libdcp::NONE,
-                               libdcp::Color (255, 255, 255),
+                               dcp::NONE,
+                               dcp::Color (255, 255, 255),
                                0,
                                0
                                )
@@ -60,6 +75,22 @@ SubRipDecoder::pass ()
        }
 
        text_subtitle (out);
-       _next++;
+       ++_next;
        return false;
 }
+
+list<ContentTimePeriod>
+SubRipDecoder::subtitles_during (ContentTimePeriod p, bool starting) const
+{
+       /* XXX: inefficient */
+
+       list<ContentTimePeriod> d;
+
+       for (vector<SubRipSubtitle>::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
+               if ((starting && p.contains (i->period.from)) || (!starting && p.overlaps (i->period))) {
+                       d.push_back (i->period);
+               }
+       }
+
+       return d;
+}