X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fsubtitle_content.cc;h=a622e7b09a2cce1b144c0e03763b0e5d7540fd6a;hb=2f0e6ee9d883abbbc31aca0d1cc80e89eb9b0af2;hp=f338517e407e35a4136eb1864d7db84b7f5bbd30;hpb=77b0ffe6c50796b8fb132f56394995e0df089713;p=libdcp.git diff --git a/src/subtitle_content.cc b/src/subtitle_content.cc index f338517e..a622e7b0 100644 --- a/src/subtitle_content.cc +++ b/src/subtitle_content.cc @@ -17,6 +17,7 @@ */ +#include "raw_convert.h" #include "subtitle_content.h" #include "util.h" #include "xml.h" @@ -24,8 +25,9 @@ #include "text.h" #include "load_font.h" #include "subtitle_string.h" +#include "AS_DCP.h" +#include "KM_util.h" #include -#include #include #include @@ -36,19 +38,45 @@ using std::ofstream; using std::stringstream; using std::cout; using boost::shared_ptr; -using boost::lexical_cast; using boost::optional; using namespace dcp; -SubtitleContent::SubtitleContent (boost::filesystem::path file) +SubtitleContent::SubtitleContent (boost::filesystem::path file, bool mxf) : Content (file) , _need_sort (false) { - shared_ptr xml (new cxml::Document ("DCSubtitle")); - xml->read_file (file); + shared_ptr xml; - _id = xml->string_child ("SubtitleID"); - _movie_title = xml->string_child ("MovieTitle"); + if (mxf) { + ASDCP::TimedText::MXFReader reader; + Kumu::Result_t r = reader.OpenRead (file.string().c_str ()); + if (ASDCP_FAILURE (r)) { + boost::throw_exception (MXFFileError ("could not open MXF file for reading", file, r)); + } + + string s; + reader.ReadTimedTextResource (s, 0, 0); + xml.reset (new cxml::Document ("SubtitleReel")); + stringstream t; + t << s; + xml->read_stream (t); + + ASDCP::WriterInfo info; + reader.FillWriterInfo (info); + + char buffer[64]; + Kumu::bin2UUIDhex (info.AssetUUID, ASDCP::UUIDlen, buffer, sizeof (buffer)); + _id = buffer; + + } else { + xml.reset (new cxml::Document ("DCSubtitle")); + xml->read_file (file); + _id = xml->string_child ("SubtitleID"); + } + + /* XXX: hacks aplenty in here; probably need separate parsers for DCSubtitle and SubtitleReel */ + + _movie_title = xml->optional_string_child ("MovieTitle"); _reel_number = xml->string_child ("ReelNumber"); _language = xml->string_child ("Language"); @@ -60,6 +88,12 @@ SubtitleContent::SubtitleContent (boost::filesystem::path file) /* Now make Subtitle objects to represent the raw XML nodes in a sane way. */ + + shared_ptr subtitle_list = xml->optional_node_child ("SubtitleList"); + if (subtitle_list) { + list > font = type_children (subtitle_list, "Font"); + copy (font.begin(), font.end(), back_inserter (font_nodes)); + } ParseState parse_state; examine_font_nodes (xml, font_nodes, parse_state); @@ -180,7 +214,7 @@ SubtitleContent::font_id_to_name (string id) const return ""; } - if ((*i)->uri == "arial.ttf") { + if ((*i)->uri && (*i)->uri.get() == "arial.ttf") { return "Arial"; } @@ -220,8 +254,10 @@ SubtitleContent::xml_as_string () const root->set_attribute ("Version", "1.0"); root->add_child("SubtitleID")->add_child_text (_id); - root->add_child("MovieTitle")->add_child_text (_movie_title); - root->add_child("ReelNumber")->add_child_text (lexical_cast (_reel_number)); + if (_movie_title) { + root->add_child("MovieTitle")->add_child_text (_movie_title.get ()); + } + root->add_child("ReelNumber")->add_child_text (raw_convert (_reel_number)); root->add_child("Language")->add_child_text (_language); if (_load_font_nodes.size() > 1) { @@ -230,8 +266,10 @@ SubtitleContent::xml_as_string () const if (!_load_font_nodes.empty ()) { xmlpp::Element* load_font = root->add_child("LoadFont"); - load_font->set_attribute("Id", _load_font_nodes.front()->id); - load_font->set_attribute("URI", _load_font_nodes.front()->uri); + load_font->set_attribute ("Id", _load_font_nodes.front()->id); + if (_load_font_nodes.front()->uri) { + load_font->set_attribute ("URI", _load_font_nodes.front()->uri.get ()); + } } list > sorted = _subtitles; @@ -287,7 +325,7 @@ SubtitleContent::xml_as_string () const font->set_attribute ("Id", id); font->set_attribute ("Italic", italic ? "yes" : "no"); font->set_attribute ("Color", color.to_argb_string()); - font->set_attribute ("Size", lexical_cast (size)); + font->set_attribute ("Size", raw_convert (size)); font->set_attribute ("Effect", effect_to_string (effect)); font->set_attribute ("EffectColor", effect_color.to_argb_string()); font->set_attribute ("Script", "normal"); @@ -303,11 +341,11 @@ SubtitleContent::xml_as_string () const )) { subtitle = font->add_child ("Subtitle"); - subtitle->set_attribute ("SpotNumber", lexical_cast (spot_number++)); + subtitle->set_attribute ("SpotNumber", raw_convert (spot_number++)); subtitle->set_attribute ("TimeIn", (*i)->in().to_string()); subtitle->set_attribute ("TimeOut", (*i)->out().to_string()); - subtitle->set_attribute ("FadeUpTime", lexical_cast ((*i)->fade_up_time().to_ticks())); - subtitle->set_attribute ("FadeDownTime", lexical_cast ((*i)->fade_down_time().to_ticks())); + subtitle->set_attribute ("FadeUpTime", raw_convert ((*i)->fade_up_time().to_ticks())); + subtitle->set_attribute ("FadeDownTime", raw_convert ((*i)->fade_down_time().to_ticks())); last_in = (*i)->in (); last_out = (*i)->out (); @@ -317,7 +355,7 @@ SubtitleContent::xml_as_string () const xmlpp::Element* text = subtitle->add_child ("Text"); text->set_attribute ("VAlign", valign_to_string ((*i)->v_align())); - text->set_attribute ("VPosition", lexical_cast ((*i)->v_position())); + text->set_attribute ("VPosition", raw_convert ((*i)->v_position())); text->add_child_text ((*i)->text()); }