summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2014-07-04 11:43:55 +0100
committerCarl Hetherington <cth@carlh.net>2014-07-04 11:43:55 +0100
commit9655db97eae5a6137a45ad809dbf42528dc74408 (patch)
tree178ecd2e313ceb6aa7d11fbadb950c53381f1280 /src/lib
parentc88a8a6ec6b396dc90d40a4843160d616a45db76 (diff)
Add 'starting' option to subtitles_during().
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/dcpomatic_time.cc6
-rw-r--r--src/lib/dcpomatic_time.h1
-rw-r--r--src/lib/ffmpeg_content.cc4
-rw-r--r--src/lib/ffmpeg_content.h2
-rw-r--r--src/lib/ffmpeg_decoder.cc4
-rw-r--r--src/lib/ffmpeg_decoder.h2
-rw-r--r--src/lib/player.cc8
-rw-r--r--src/lib/player.h2
-rw-r--r--src/lib/subrip_decoder.cc4
-rw-r--r--src/lib/subrip_decoder.h2
-rw-r--r--src/lib/subtitle_decoder.cc16
-rw-r--r--src/lib/subtitle_decoder.h8
12 files changed, 33 insertions, 26 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<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);
}
}
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<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+ std::list<ContentTimePeriod> 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<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);
}
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<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;
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<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));
}
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<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 ();
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<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);
}
}
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<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+ std::list<ContentTimePeriod> 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<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
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<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;
};