{
return (from < other.to && to >= other.from);
}
+
+bool
+ContentTimePeriod::contains (ContentTime const & other) const
+{
+ return (from >= other && to < other);
+}
}
bool overlaps (ContentTimePeriod const & o) const;
+ bool contains (ContentTime const & o) const;
};
class DCPTime : public Time
}
list<ContentTimePeriod>
-FFmpegContent::subtitles_during (ContentTimePeriod period) const
+FFmpegContent::subtitles_during (ContentTimePeriod period, bool starting) const
{
list<ContentTimePeriod> d;
/* 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);
}
}
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;
}
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);
}
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;
/* 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;
}
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);
/* 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 */
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));
}
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 ();
}
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);
}
}
bool pass ();
private:
- std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod) const;
+ std::list<ContentTimePeriod> subtitles_during (ContentTimePeriod, bool starting) const;
size_t _next;
};
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> ();
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);
}
}
}
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
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);
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;
};
}
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) {
list<ContentTextSubtitle> cts = decoder->get_text_subtitles (
ContentTimePeriod (
ContentTime::from_seconds (109), ContentTime::from_seconds (110)
- )
+ ), false
);
BOOST_CHECK_EQUAL (cts.size(), 1);