summaryrefslogtreecommitdiff
path: root/src/lib/ffmpeg_subtitle_stream.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-05-13 00:41:50 +0100
committerCarl Hetherington <cth@carlh.net>2015-05-13 00:41:50 +0100
commit83e5567530d0be24490abdda46d196e4279c5030 (patch)
treeae1b8f679fa448d7fc48b7a0521e52c256611cd6 /src/lib/ffmpeg_subtitle_stream.cc
parent2bfd531137f1a4874493186015046e33c5a07c1e (diff)
Look up unknown subtitle end times from the data prepared by the examiner.
Diffstat (limited to 'src/lib/ffmpeg_subtitle_stream.cc')
-rw-r--r--src/lib/ffmpeg_subtitle_stream.cc42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/lib/ffmpeg_subtitle_stream.cc b/src/lib/ffmpeg_subtitle_stream.cc
index 66b587209..77a56e330 100644
--- a/src/lib/ffmpeg_subtitle_stream.cc
+++ b/src/lib/ffmpeg_subtitle_stream.cc
@@ -23,6 +23,8 @@
#include <boost/foreach.hpp>
using std::string;
+using std::map;
+using std::list;
/** Construct a SubtitleStream from a value returned from to_string().
* @param t String returned from to_string().
@@ -32,7 +34,7 @@ FFmpegSubtitleStream::FFmpegSubtitleStream (cxml::ConstNodePtr node)
: FFmpegStream (node)
{
BOOST_FOREACH (cxml::NodePtr i, node->node_children ("Period")) {
- periods.push_back (
+ add_subtitle (
ContentTimePeriod (
ContentTime (node->number_child<ContentTime::Type> ("From")),
ContentTime (node->number_child<ContentTime::Type> ("To"))
@@ -46,9 +48,39 @@ FFmpegSubtitleStream::as_xml (xmlpp::Node* root) const
{
FFmpegStream::as_xml (root);
- BOOST_FOREACH (ContentTimePeriod const & i, periods) {
- xmlpp::Node* node = root->add_child ("Period");
- node->add_child("From")->add_child_text (raw_convert<string> (i.from.get ()));
- node->add_child("To")->add_child_text (raw_convert<string> (i.to.get ()));
+ for (map<ContentTime, ContentTime>::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
+ xmlpp::Node* node = root->add_child ("Subtitle");
+ node->add_child("From")->add_child_text (raw_convert<string> (i->first.get ()));
+ node->add_child("To")->add_child_text (raw_convert<string> (i->second.get ()));
}
}
+
+void
+FFmpegSubtitleStream::add_subtitle (ContentTimePeriod period)
+{
+ DCPOMATIC_ASSERT (_subtitles.find (period.from) == _subtitles.end ());
+ _subtitles[period.from] = period.to;
+}
+
+list<ContentTimePeriod>
+FFmpegSubtitleStream::subtitles_during (ContentTimePeriod period, bool starting) const
+{
+ list<ContentTimePeriod> d;
+
+ /* XXX: inefficient */
+ for (map<ContentTime, ContentTime>::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) {
+ if ((starting && period.contains (i->first)) || (!starting && period.overlaps (ContentTimePeriod (i->first, i->second)))) {
+ d.push_back (ContentTimePeriod (i->first, i->second));
+ }
+ }
+
+ return d;
+}
+
+ContentTime
+FFmpegSubtitleStream::find_subtitle_to (ContentTime from) const
+{
+ map<ContentTime, ContentTime>::const_iterator i = _subtitles.find (from);
+ DCPOMATIC_ASSERT (i != _subtitles.end ());
+ return i->second;
+}