Add 'starting' option to subtitles_during().
authorCarl Hetherington <cth@carlh.net>
Fri, 4 Jul 2014 10:43:55 +0000 (11:43 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 4 Jul 2014 10:43:55 +0000 (11:43 +0100)
14 files changed:
src/lib/dcpomatic_time.cc
src/lib/dcpomatic_time.h
src/lib/ffmpeg_content.cc
src/lib/ffmpeg_content.h
src/lib/ffmpeg_decoder.cc
src/lib/ffmpeg_decoder.h
src/lib/player.cc
src/lib/player.h
src/lib/subrip_decoder.cc
src/lib/subrip_decoder.h
src/lib/subtitle_decoder.cc
src/lib/subtitle_decoder.h
src/wx/subtitle_view.cc
test/subrip_test.cc

index dcdfd97daf4a2d54b63210092de4220b217ed18a..fa6271354bdd4013ded09ae3ff365160c4b0b04b 100644 (file)
@@ -55,3 +55,9 @@ ContentTimePeriod::overlaps (ContentTimePeriod const & other) const
 {
        return (from < other.to && to >= other.from);
 }
+
+bool
+ContentTimePeriod::contains (ContentTime const & other) const
+{
+       return (from >= other && to < other);
+}
index 7f5379595ac211c9da77982f86a6b92f980bad64..a0bbad06aeaeeed6530d214551fcbd82ab3a4d4d 100644 (file)
@@ -203,6 +203,7 @@ public:
        }
 
        bool overlaps (ContentTimePeriod const & o) const;
+       bool contains (ContentTime const & o) const;
 };
 
 class DCPTime : public Time
index f97e324bb4bb5d521467c0fcdd8a837e73299f7b..a1992102c9e55e8e539f3757ba55208153ef86b6 100644 (file)
@@ -397,7 +397,7 @@ FFmpegContent::audio_analysis_path () const
 }
 
 list<ContentTimePeriod>
-FFmpegContent::subtitles_during (ContentTimePeriod period) const
+FFmpegContent::subtitles_during (ContentTimePeriod period, bool starting) const
 {
        list<ContentTimePeriod> d;
        
@@ -408,7 +408,7 @@ FFmpegContent::subtitles_during (ContentTimePeriod period) const
 
        /* XXX: inefficient */
        for (vector<ContentTimePeriod>::const_iterator i = stream->periods.begin(); i != stream->periods.end(); ++i) {
-               if (period.overlaps (*i)) {
+               if ((starting && period.contains (i->from)) || (!starting && period.overlaps (*i))) {
                        d.push_back (*i);
                }
        }
index dbb207959ffa2dc21e89e9977414e3cd9abc0d3b..6bf6c0f502c6562e7fd5ba7b3b19bd0c96315cab 100644 (file)
@@ -108,7 +108,7 @@ public:
                return _first_video;
        }
 
-       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod, bool starting) const;
 
 private:
        friend class ffmpeg_pts_offset_test;
index 668cab88530d1b385821056aeb837d4b2a011ff0..4ae9dc3132f80eaf2c7f238e2618f15e7e8fcfe6 100644 (file)
@@ -482,7 +482,7 @@ FFmpegDecoder::decode_subtitle_packet ()
 }
 
 list<ContentTimePeriod>
-FFmpegDecoder::subtitles_during (ContentTimePeriod p) const
+FFmpegDecoder::subtitles_during (ContentTimePeriod p, bool starting) const
 {
-       return _ffmpeg_content->subtitles_during (p);
+       return _ffmpeg_content->subtitles_during (p, starting);
 }
index 15811d5b92c9174798ba5bec1f08ecdd35e69704..b553cc42ea2cc15627f99f5ee9cd35cdfffb6f39 100644 (file)
@@ -66,7 +66,7 @@ private:
        void maybe_add_subtitle ();
        boost::shared_ptr<AudioBuffers> deinterleave_audio (uint8_t** data, int size);
 
-       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod, bool starting) const;
        
        boost::shared_ptr<Log> _log;
        
index ccc1ab2367e3e0fed2832790c4d97ccc9b9ce2db..ebec19b2dc40f2d86da3c51865e05eb1d9105a6e 100644 (file)
@@ -350,7 +350,7 @@ Player::get_video (DCPTime time, bool accurate)
 
        /* Add subtitles (for possible burn-in) to whatever PlayerVideos we got */
 
-       PlayerSubtitles ps = get_subtitles (time, DCPTime::from_frames (1, _film->video_frame_rate ()));
+       PlayerSubtitles ps = get_subtitles (time, DCPTime::from_frames (1, _film->video_frame_rate ()), false);
 
        list<PositionImage> sub_images;
 
@@ -514,7 +514,7 @@ Player::statistics () const
 }
 
 PlayerSubtitles
-Player::get_subtitles (DCPTime time, DCPTime length)
+Player::get_subtitles (DCPTime time, DCPTime length, bool starting)
 {
        list<shared_ptr<Piece> > subs = overlaps<SubtitleContent> (time, time + length);
 
@@ -531,7 +531,7 @@ Player::get_subtitles (DCPTime time, DCPTime length)
                /* XXX: this video_frame_rate() should be the rate that the subtitle content has been prepared for */
                ContentTime const to = from + ContentTime::from_frames (1, _film->video_frame_rate ());
 
-               list<ContentImageSubtitle> image = subtitle_decoder->get_image_subtitles (ContentTimePeriod (from, to));
+               list<ContentImageSubtitle> image = subtitle_decoder->get_image_subtitles (ContentTimePeriod (from, to), starting);
                for (list<ContentImageSubtitle>::iterator i = image.begin(); i != image.end(); ++i) {
                        
                        /* Apply content's subtitle offsets */
@@ -549,7 +549,7 @@ Player::get_subtitles (DCPTime time, DCPTime length)
                        ps.image.push_back (i->sub);
                }
 
-               list<ContentTextSubtitle> text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to));
+               list<ContentTextSubtitle> text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to), starting);
                for (list<ContentTextSubtitle>::const_iterator i = text.begin(); i != text.end(); ++i) {
                        copy (i->subs.begin(), i->subs.end(), back_inserter (ps.text));
                }
index 0c58af44503c7588e20db0eeab0c62418f88f705..7fbeebc8c2f4432c85bd101fc3c2bea18ae0fc12 100644 (file)
@@ -88,7 +88,7 @@ public:
 
        std::list<boost::shared_ptr<PlayerVideo> > get_video (DCPTime time, bool accurate);
        boost::shared_ptr<AudioBuffers> get_audio (DCPTime time, DCPTime length, bool accurate);
-       PlayerSubtitles get_subtitles (DCPTime time, DCPTime length);
+       PlayerSubtitles get_subtitles (DCPTime time, DCPTime length, bool starting);
 
        void set_video_container_size (dcp::Size);
        void set_approximate_size ();
index 370118d3065debae3aee18dfae4bcf33cc00fa06..4bdf06e7c331f050463a60873c19b5f0f7725dac 100644 (file)
@@ -80,14 +80,14 @@ SubRipDecoder::pass ()
 }
 
 list<ContentTimePeriod>
-SubRipDecoder::subtitles_during (ContentTimePeriod p) const
+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 (p.overlaps (i->period)) {
+               if ((starting && p.contains (i->period.from)) || (!starting && p.overlaps (i->period))) {
                        d.push_back (i->period);
                }
        }
index 927ccc728e347141de9384b274163f2ca6ad402f..ad9d04e4003029f6a9b99b62714b4fbdd0a13a6f 100644 (file)
@@ -35,7 +35,7 @@ protected:
        bool pass ();
 
 private:
-       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+       std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod, bool starting) const;
        
        size_t _next;
 };
index b8cb3e5c86c8fc2d49733c131077d1327b330fcd..e1485e221d70807109e3803b0493c9d8524fe974 100644 (file)
@@ -49,10 +49,10 @@ SubtitleDecoder::text_subtitle (list<dcp::SubtitleString> s)
 
 template <class T>
 list<T>
-SubtitleDecoder::get (list<T> const & subs, ContentTimePeriod period)
+SubtitleDecoder::get (list<T> const & subs, ContentTimePeriod period, bool starting)
 {
-       /* Get the full periods of the subtitles that are showing during the specified period */
-       list<ContentTimePeriod> sp = subtitles_during (period);
+       /* Get the full periods of the subtitles that are showing or starting during the specified period */
+       list<ContentTimePeriod> sp = subtitles_during (period, starting);
        if (sp.empty ()) {
                /* Nothing in this period */
                return list<T> ();
@@ -74,7 +74,7 @@ SubtitleDecoder::get (list<T> const & subs, ContentTimePeriod period)
        
        list<T> out;
        for (typename list<T>::const_iterator i = subs.begin(); i != subs.end(); ++i) {
-               if (i->period().overlaps (period)) {
+               if ((starting && period.contains (i->period().from)) || (!starting && period.overlaps (i->period ()))) {
                        out.push_back (*i);
                }
        }
@@ -83,15 +83,15 @@ SubtitleDecoder::get (list<T> const & subs, ContentTimePeriod period)
 }
 
 list<ContentTextSubtitle>
-SubtitleDecoder::get_text_subtitles (ContentTimePeriod period)
+SubtitleDecoder::get_text_subtitles (ContentTimePeriod period, bool starting)
 {
-       return get<ContentTextSubtitle> (_decoded_text_subtitles, period);
+       return get<ContentTextSubtitle> (_decoded_text_subtitles, period, starting);
 }
 
 list<ContentImageSubtitle>
-SubtitleDecoder::get_image_subtitles (ContentTimePeriod period)
+SubtitleDecoder::get_image_subtitles (ContentTimePeriod period, bool starting)
 {
-       return get<ContentImageSubtitle> (_decoded_image_subtitles, period);
+       return get<ContentImageSubtitle> (_decoded_image_subtitles, period, starting);
 }
 
 void
index 51faca97ff50355e04f0d831f1b4ca33ab9c205d..142cfa42b766b0813fb1570d530268d886beee2c 100644 (file)
@@ -35,8 +35,8 @@ class SubtitleDecoder : public virtual Decoder
 public:
        SubtitleDecoder (boost::shared_ptr<const SubtitleContent>);
 
-       std::list<ContentImageSubtitle> get_image_subtitles (ContentTimePeriod period);
-       std::list<ContentTextSubtitle> get_text_subtitles (ContentTimePeriod period);
+       std::list<ContentImageSubtitle> get_image_subtitles (ContentTimePeriod period, bool starting);
+       std::list<ContentTextSubtitle> get_text_subtitles (ContentTimePeriod period, bool starting);
 
 protected:
        void seek (ContentTime, bool);
@@ -49,9 +49,9 @@ protected:
 
 private:
        template <class T>
-       std::list<T> get (std::list<T> const & subs, ContentTimePeriod period);
+       std::list<T> get (std::list<T> const & subs, ContentTimePeriod period, bool starting);
 
-       virtual std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod) const = 0;
+       virtual std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod, bool starting) const = 0;
        
        boost::shared_ptr<const SubtitleContent> _subtitle_content;
 };
index e65d9abc0c753703bab9e68dbb7633ebacbe4e93..25392c81ad3e8092e278a58198fde5b20a3ad806 100644 (file)
@@ -66,7 +66,7 @@ SubtitleView::SubtitleView (wxWindow* parent, shared_ptr<Film> film, shared_ptr<
        }
 
        shared_ptr<SubRipDecoder> decoder (new SubRipDecoder (content));
-       list<ContentTextSubtitle> subs = decoder->get_text_subtitles (ContentTimePeriod (ContentTime(), ContentTime::max ()));
+       list<ContentTextSubtitle> subs = decoder->get_text_subtitles (ContentTimePeriod (ContentTime(), ContentTime::max ()), true);
        FrameRateChange const frc = film->active_frame_rate_change (content->position ());
        int n = 0;
        for (list<ContentTextSubtitle>::const_iterator i = subs.begin(); i != subs.end(); ++i) {
index 1b207c3c632a730f1440c0cd0b72845a68e99514..84ad7f25d4148b87e4ae5471e06263769ef2e3a5 100644 (file)
@@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE (subrip_render_test)
        list<ContentTextSubtitle> cts = decoder->get_text_subtitles (
                ContentTimePeriod (
                        ContentTime::from_seconds (109), ContentTime::from_seconds (110)
-                       )
+                       ), false
                );
        BOOST_CHECK_EQUAL (cts.size(), 1);