X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fffmpeg_subtitle_stream.cc;h=3935e23a95d8b02e3d3cf596e1745c7a2fbcc43c;hb=67a68bd971ebe1b35daa3f75873b4ccb53c00ba0;hp=627b0fef1c8b61b6890397c97282f4d42f7700af;hpb=97d39f46795af78b84d5f7bc9118a188f2864781;p=dcpomatic.git diff --git a/src/lib/ffmpeg_subtitle_stream.cc b/src/lib/ffmpeg_subtitle_stream.cc index 627b0fef1..3935e23a9 100644 --- a/src/lib/ffmpeg_subtitle_stream.cc +++ b/src/lib/ffmpeg_subtitle_stream.cc @@ -32,8 +32,8 @@ using std::make_pair; 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) @@ -132,53 +132,34 @@ FFmpegSubtitleStream::add_text_subtitle (string id, ContentTimePeriod period) _text_subtitles[id] = period; } -list -FFmpegSubtitleStream::image_subtitles_during (ContentTimePeriod period, bool starting) const -{ - return subtitles_during (period, starting, _image_subtitles); -} - -list -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 -FFmpegSubtitleStream::subtitles_during (ContentTimePeriod period, bool starting, PeriodMap const & subs) const +ContentTime +FFmpegSubtitleStream::find_subtitle_to (string id) const { - list d; - - /* XXX: inefficient */ - for (map::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 */ @@ -219,3 +200,19 @@ FFmpegSubtitleStream::has_image () const { 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); + } + } +}