From 9655db97eae5a6137a45ad809dbf42528dc74408 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 4 Jul 2014 11:43:55 +0100 Subject: [PATCH] Add 'starting' option to subtitles_during(). --- src/lib/dcpomatic_time.cc | 6 ++++++ src/lib/dcpomatic_time.h | 1 + src/lib/ffmpeg_content.cc | 4 ++-- src/lib/ffmpeg_content.h | 2 +- src/lib/ffmpeg_decoder.cc | 4 ++-- src/lib/ffmpeg_decoder.h | 2 +- src/lib/player.cc | 8 ++++---- src/lib/player.h | 2 +- src/lib/subrip_decoder.cc | 4 ++-- src/lib/subrip_decoder.h | 2 +- src/lib/subtitle_decoder.cc | 16 ++++++++-------- src/lib/subtitle_decoder.h | 8 ++++---- src/wx/subtitle_view.cc | 2 +- test/subrip_test.cc | 2 +- 14 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/lib/dcpomatic_time.cc b/src/lib/dcpomatic_time.cc index dcdfd97da..fa6271354 100644 --- a/src/lib/dcpomatic_time.cc +++ b/src/lib/dcpomatic_time.cc @@ -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); +} diff --git a/src/lib/dcpomatic_time.h b/src/lib/dcpomatic_time.h index 7f5379595..a0bbad06a 100644 --- a/src/lib/dcpomatic_time.h +++ b/src/lib/dcpomatic_time.h @@ -203,6 +203,7 @@ public: } bool overlaps (ContentTimePeriod const & o) const; + bool contains (ContentTime const & o) const; }; class DCPTime : public Time diff --git a/src/lib/ffmpeg_content.cc b/src/lib/ffmpeg_content.cc index f97e324bb..a1992102c 100644 --- a/src/lib/ffmpeg_content.cc +++ b/src/lib/ffmpeg_content.cc @@ -397,7 +397,7 @@ FFmpegContent::audio_analysis_path () const } list -FFmpegContent::subtitles_during (ContentTimePeriod period) const +FFmpegContent::subtitles_during (ContentTimePeriod period, bool starting) const { list d; @@ -408,7 +408,7 @@ FFmpegContent::subtitles_during (ContentTimePeriod period) const /* XXX: inefficient */ for (vector::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); } } diff --git a/src/lib/ffmpeg_content.h b/src/lib/ffmpeg_content.h index dbb207959..6bf6c0f50 100644 --- a/src/lib/ffmpeg_content.h +++ b/src/lib/ffmpeg_content.h @@ -108,7 +108,7 @@ public: return _first_video; } - std::list subtitles_during (ContentTimePeriod) const; + std::list subtitles_during (ContentTimePeriod, bool starting) const; private: friend class ffmpeg_pts_offset_test; diff --git a/src/lib/ffmpeg_decoder.cc b/src/lib/ffmpeg_decoder.cc index 668cab885..4ae9dc313 100644 --- a/src/lib/ffmpeg_decoder.cc +++ b/src/lib/ffmpeg_decoder.cc @@ -482,7 +482,7 @@ FFmpegDecoder::decode_subtitle_packet () } list -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); } diff --git a/src/lib/ffmpeg_decoder.h b/src/lib/ffmpeg_decoder.h index 15811d5b9..b553cc42e 100644 --- a/src/lib/ffmpeg_decoder.h +++ b/src/lib/ffmpeg_decoder.h @@ -66,7 +66,7 @@ private: void maybe_add_subtitle (); boost::shared_ptr deinterleave_audio (uint8_t** data, int size); - std::list subtitles_during (ContentTimePeriod) const; + std::list subtitles_during (ContentTimePeriod, bool starting) const; boost::shared_ptr _log; diff --git a/src/lib/player.cc b/src/lib/player.cc index ccc1ab236..ebec19b2d 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -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 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 > subs = overlaps (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 image = subtitle_decoder->get_image_subtitles (ContentTimePeriod (from, to)); + list image = subtitle_decoder->get_image_subtitles (ContentTimePeriod (from, to), starting); for (list::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 text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to)); + list text = subtitle_decoder->get_text_subtitles (ContentTimePeriod (from, to), starting); for (list::const_iterator i = text.begin(); i != text.end(); ++i) { copy (i->subs.begin(), i->subs.end(), back_inserter (ps.text)); } diff --git a/src/lib/player.h b/src/lib/player.h index 0c58af445..7fbeebc8c 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -88,7 +88,7 @@ public: std::list > get_video (DCPTime time, bool accurate); boost::shared_ptr 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 (); diff --git a/src/lib/subrip_decoder.cc b/src/lib/subrip_decoder.cc index 370118d30..4bdf06e7c 100644 --- a/src/lib/subrip_decoder.cc +++ b/src/lib/subrip_decoder.cc @@ -80,14 +80,14 @@ SubRipDecoder::pass () } list -SubRipDecoder::subtitles_during (ContentTimePeriod p) const +SubRipDecoder::subtitles_during (ContentTimePeriod p, bool starting) const { /* XXX: inefficient */ list d; for (vector::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); } } diff --git a/src/lib/subrip_decoder.h b/src/lib/subrip_decoder.h index 927ccc728..ad9d04e40 100644 --- a/src/lib/subrip_decoder.h +++ b/src/lib/subrip_decoder.h @@ -35,7 +35,7 @@ protected: bool pass (); private: - std::list subtitles_during (ContentTimePeriod) const; + std::list subtitles_during (ContentTimePeriod, bool starting) const; size_t _next; }; diff --git a/src/lib/subtitle_decoder.cc b/src/lib/subtitle_decoder.cc index b8cb3e5c8..e1485e221 100644 --- a/src/lib/subtitle_decoder.cc +++ b/src/lib/subtitle_decoder.cc @@ -49,10 +49,10 @@ SubtitleDecoder::text_subtitle (list s) template list -SubtitleDecoder::get (list const & subs, ContentTimePeriod period) +SubtitleDecoder::get (list const & subs, ContentTimePeriod period, bool starting) { - /* Get the full periods of the subtitles that are showing during the specified period */ - list sp = subtitles_during (period); + /* Get the full periods of the subtitles that are showing or starting during the specified period */ + list sp = subtitles_during (period, starting); if (sp.empty ()) { /* Nothing in this period */ return list (); @@ -74,7 +74,7 @@ SubtitleDecoder::get (list const & subs, ContentTimePeriod period) list out; for (typename list::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 const & subs, ContentTimePeriod period) } list -SubtitleDecoder::get_text_subtitles (ContentTimePeriod period) +SubtitleDecoder::get_text_subtitles (ContentTimePeriod period, bool starting) { - return get (_decoded_text_subtitles, period); + return get (_decoded_text_subtitles, period, starting); } list -SubtitleDecoder::get_image_subtitles (ContentTimePeriod period) +SubtitleDecoder::get_image_subtitles (ContentTimePeriod period, bool starting) { - return get (_decoded_image_subtitles, period); + return get (_decoded_image_subtitles, period, starting); } void diff --git a/src/lib/subtitle_decoder.h b/src/lib/subtitle_decoder.h index 51faca97f..142cfa42b 100644 --- a/src/lib/subtitle_decoder.h +++ b/src/lib/subtitle_decoder.h @@ -35,8 +35,8 @@ class SubtitleDecoder : public virtual Decoder public: SubtitleDecoder (boost::shared_ptr); - std::list get_image_subtitles (ContentTimePeriod period); - std::list get_text_subtitles (ContentTimePeriod period); + std::list get_image_subtitles (ContentTimePeriod period, bool starting); + std::list get_text_subtitles (ContentTimePeriod period, bool starting); protected: void seek (ContentTime, bool); @@ -49,9 +49,9 @@ protected: private: template - std::list get (std::list const & subs, ContentTimePeriod period); + std::list get (std::list const & subs, ContentTimePeriod period, bool starting); - virtual std::list subtitles_during (ContentTimePeriod) const = 0; + virtual std::list subtitles_during (ContentTimePeriod, bool starting) const = 0; boost::shared_ptr _subtitle_content; }; diff --git a/src/wx/subtitle_view.cc b/src/wx/subtitle_view.cc index e65d9abc0..25392c81a 100644 --- a/src/wx/subtitle_view.cc +++ b/src/wx/subtitle_view.cc @@ -66,7 +66,7 @@ SubtitleView::SubtitleView (wxWindow* parent, shared_ptr film, shared_ptr< } shared_ptr decoder (new SubRipDecoder (content)); - list subs = decoder->get_text_subtitles (ContentTimePeriod (ContentTime(), ContentTime::max ())); + list 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::const_iterator i = subs.begin(); i != subs.end(); ++i) { diff --git a/test/subrip_test.cc b/test/subrip_test.cc index 1b207c3c6..84ad7f25d 100644 --- a/test/subrip_test.cc +++ b/test/subrip_test.cc @@ -193,7 +193,7 @@ BOOST_AUTO_TEST_CASE (subrip_render_test) list cts = decoder->get_text_subtitles ( ContentTimePeriod ( ContentTime::from_seconds (109), ContentTime::from_seconds (110) - ) + ), false ); BOOST_CHECK_EQUAL (cts.size(), 1); -- 2.30.2