using dcp::raw_convert;
/** Construct a SubtitleStream from a value returned from to_string().
- * @param t String returned from to_string().
- * @param v State file version.
+ * @param node String returned from to_string().
+ * @param version State file version.
*/
FFmpegSubtitleStream::FFmpegSubtitleStream (cxml::ConstNodePtr node, int version)
: FFmpegStream (node)
_text_subtitles[id] = period;
}
-list<ContentTimePeriod>
-FFmpegSubtitleStream::image_subtitles_during (ContentTimePeriod period, bool starting) const
-{
- return subtitles_during (period, starting, _image_subtitles);
-}
-
-list<ContentTimePeriod>
-FFmpegSubtitleStream::text_subtitles_during (ContentTimePeriod period, bool starting) const
-{
- return subtitles_during (period, starting, _text_subtitles);
-}
-
-struct PeriodSorter
-{
- bool operator() (ContentTimePeriod const & a, ContentTimePeriod const & b) {
- return a.from < b.from;
- }
-};
-
-list<ContentTimePeriod>
-FFmpegSubtitleStream::subtitles_during (ContentTimePeriod period, bool starting, PeriodMap const & subs) const
+ContentTime
+FFmpegSubtitleStream::find_subtitle_to (string id) const
{
- list<ContentTimePeriod> d;
-
- /* XXX: inefficient */
- for (map<string, ContentTimePeriod>::const_iterator i = subs.begin(); i != subs.end(); ++i) {
- if ((starting && period.contains(i->second.from)) || (!starting && period.overlap(i->second))) {
- d.push_back (i->second);
- }
+ PeriodMap::const_iterator i = _image_subtitles.find (id);
+ if (i != _image_subtitles.end ()) {
+ return i->second.to;
}
- d.sort (PeriodSorter ());
-
- return d;
+ i = _text_subtitles.find (id);
+ DCPOMATIC_ASSERT (i != _text_subtitles.end ());
+ return i->second.to;
}
-ContentTime
-FFmpegSubtitleStream::find_subtitle_to (string id) const
+/** @param id Subtitle id.
+ * @return true if the `from' and `to' times for this id are equal, which indicates
+ * that the `to' time is unknown.
+ */
+bool
+FFmpegSubtitleStream::unknown_to (string id) const
{
PeriodMap::const_iterator i = _image_subtitles.find (id);
if (i != _image_subtitles.end ()) {
- return i->second.to;
+ return i->second.from == i->second.to;
}
i = _text_subtitles.find (id);
DCPOMATIC_ASSERT (i != _text_subtitles.end ());
- return i->second.to;
+ return i->second.from == i->second.to;
}
/** Add some offset to all the times in the stream */
{
return !_image_subtitles.empty ();
}
+
+void
+FFmpegSubtitleStream::set_subtitle_to (string id, ContentTime to)
+{
+ PeriodMap::iterator i = _image_subtitles.find (id);
+ if (i != _image_subtitles.end ()) {
+ i->second.to = to;
+ } else {
+ i = _text_subtitles.find (id);
+ if (i != _text_subtitles.end ()) {
+ i->second.to = to;
+ } else {
+ DCPOMATIC_ASSERT (false);
+ }
+ }
+}