/* Copyright (C) 2013-2014 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "ffmpeg_subtitle_stream.h" #include "raw_convert.h" #include #include #include using std::string; using std::map; using std::list; using std::cout; /** Construct a SubtitleStream from a value returned from to_string(). * @param t String returned from to_string(). * @param v State file version. */ FFmpegSubtitleStream::FFmpegSubtitleStream (cxml::ConstNodePtr node) : FFmpegStream (node) { BOOST_FOREACH (cxml::NodePtr i, node->node_children ("Period")) { add_subtitle ( ContentTimePeriod ( ContentTime (i->number_child ("From")), ContentTime (i->number_child ("To")) ) ); } } void FFmpegSubtitleStream::as_xml (xmlpp::Node* root) const { FFmpegStream::as_xml (root); for (map::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { xmlpp::Node* node = root->add_child ("Period"); node->add_child("From")->add_child_text (raw_convert (i->first.get ())); node->add_child("To")->add_child_text (raw_convert (i->second.get ())); } } void FFmpegSubtitleStream::add_subtitle (ContentTimePeriod period) { DCPOMATIC_ASSERT (_subtitles.find (period.from) == _subtitles.end ()); _subtitles[period.from] = period.to; } list FFmpegSubtitleStream::subtitles_during (ContentTimePeriod period, bool starting) const { list d; /* XXX: inefficient */ for (map::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::const_iterator i = _subtitles.find (from); DCPOMATIC_ASSERT (i != _subtitles.end ()); return i->second; } /** Add some offset to all the times in the stream */ void FFmpegSubtitleStream::add_offset (ContentTime offset) { map fixed; for (map::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { fixed[i->first + offset] = i->second + offset; } _subtitles = fixed; }