diff options
| -rw-r--r-- | src/smpte_subtitle_asset.cc | 69 | ||||
| -rw-r--r-- | src/smpte_subtitle_asset.h | 9 | ||||
| -rw-r--r-- | src/subtitle_asset.h | 2 |
3 files changed, 50 insertions, 30 deletions
diff --git a/src/smpte_subtitle_asset.cc b/src/smpte_subtitle_asset.cc index 57caf927..43fa3026 100644 --- a/src/smpte_subtitle_asset.cc +++ b/src/smpte_subtitle_asset.cc @@ -50,7 +50,8 @@ using boost::dynamic_pointer_cast; using namespace dcp; SMPTESubtitleAsset::SMPTESubtitleAsset () - : _edit_rate (24, 1) + : _intrinsic_duration (0) + , _edit_rate (24, 1) , _time_code_rate (24) { @@ -126,40 +127,43 @@ SMPTESubtitleAsset::SMPTESubtitleAsset (boost::filesystem::path file) parse_subtitles (xml, font_nodes); if (reader) { - read_fonts (reader); - } -} + ASDCP::TimedText::TimedTextDescriptor descriptor; + reader->FillTimedTextDescriptor (descriptor); -void -SMPTESubtitleAsset::read_fonts (shared_ptr<ASDCP::TimedText::MXFReader> reader) -{ - ASDCP::TimedText::TimedTextDescriptor text_descriptor; - reader->FillTimedTextDescriptor (text_descriptor); - for ( - ASDCP::TimedText::ResourceList_t::const_iterator i = text_descriptor.ResourceList.begin(); - i != text_descriptor.ResourceList.end(); - ++i) { - - if (i->Type == ASDCP::TimedText::MT_OPENTYPE) { - ASDCP::TimedText::FrameBuffer buffer; - buffer.Capacity (10 * 1024 * 1024); - reader->ReadAncillaryResource (i->ResourceID, buffer); + /* Load fonts */ - char id[64]; - Kumu::bin2UUIDhex (i->ResourceID, ASDCP::UUIDlen, id, sizeof (id)); + for ( + ASDCP::TimedText::ResourceList_t::const_iterator i = descriptor.ResourceList.begin(); + i != descriptor.ResourceList.end(); + ++i) { - shared_array<uint8_t> data (new uint8_t[buffer.Size()]); - memcpy (data.get(), buffer.RoData(), buffer.Size()); + if (i->Type == ASDCP::TimedText::MT_OPENTYPE) { + ASDCP::TimedText::FrameBuffer buffer; + buffer.Capacity (10 * 1024 * 1024); + reader->ReadAncillaryResource (i->ResourceID, buffer); - list<shared_ptr<SMPTELoadFontNode> >::const_iterator j = _load_font_nodes.begin (); - while (j != _load_font_nodes.end() && (*j)->urn != id) { - ++j; - } + char id[64]; + Kumu::bin2UUIDhex (i->ResourceID, ASDCP::UUIDlen, id, sizeof (id)); + + shared_array<uint8_t> data (new uint8_t[buffer.Size()]); + memcpy (data.get(), buffer.RoData(), buffer.Size()); - if (j != _load_font_nodes.end ()) { - _fonts.push_back (Font ((*j)->id, (*j)->urn, Data (data, buffer.Size ()))); + list<shared_ptr<SMPTELoadFontNode> >::const_iterator j = _load_font_nodes.begin (); + while (j != _load_font_nodes.end() && (*j)->urn != id) { + ++j; + } + + if (j != _load_font_nodes.end ()) { + _fonts.push_back (Font ((*j)->id, (*j)->urn, Data (data, buffer.Size ()))); + } } } + + /* Get intrinsic duration */ + _intrinsic_duration = descriptor.ContainerDuration; + } else { + /* Guess intrinsic duration */ + _intrinsic_duration = latest_subtitle_out().as_editable_units (_edit_rate.numerator / _edit_rate.denominator); } } @@ -244,7 +248,7 @@ SMPTESubtitleAsset::write (boost::filesystem::path p) const descriptor.NamespaceName = "dcst"; memcpy (descriptor.AssetID, writer_info.AssetUUID, ASDCP::UUIDlen); - descriptor.ContainerDuration = latest_subtitle_out().as_editable_units (_edit_rate.numerator / _edit_rate.denominator); + descriptor.ContainerDuration = _intrinsic_duration; ASDCP::TimedText::MXFWriter writer; ASDCP::Result_t r = writer.OpenWrite (p.string().c_str(), writer_info, descriptor); @@ -364,3 +368,10 @@ SMPTESubtitleAsset::add_font (string load_id, boost::filesystem::path file) _fonts.push_back (Font (load_id, uuid, file)); _load_font_nodes.push_back (shared_ptr<SMPTELoadFontNode> (new SMPTELoadFontNode (load_id, uuid))); } + +void +SMPTESubtitleAsset::add (dcp::SubtitleString s) +{ + SubtitleAsset::add (s); + _intrinsic_duration = latest_subtitle_out().as_editable_units (_edit_rate.numerator / _edit_rate.denominator); +} diff --git a/src/smpte_subtitle_asset.h b/src/smpte_subtitle_asset.h index 6862ed11..23c0e948 100644 --- a/src/smpte_subtitle_asset.h +++ b/src/smpte_subtitle_asset.h @@ -58,6 +58,7 @@ public: Glib::ustring xml_as_string () const; void write (boost::filesystem::path path) const; + void add (SubtitleString); void add_font (std::string id, boost::filesystem::path file); void set_content_title_text (std::string t) { @@ -84,6 +85,10 @@ public: _start_time = t; } + void set_intrinsic_duration (int64_t d) { + _intrinsic_duration = d; + } + /** @return title of the film that these subtitles are for, * to be presented to the user. */ @@ -137,6 +142,10 @@ protected: private: void read_fonts (boost::shared_ptr<ASDCP::TimedText::MXFReader>); + /** The total length of this content in video frames. The amount of + * content presented may be less than this. + */ + int64_t _intrinsic_duration; std::string _content_title_text; boost::optional<std::string> _language; boost::optional<std::string> _annotation_text; diff --git a/src/subtitle_asset.h b/src/subtitle_asset.h index 88dc427b..27b1bb32 100644 --- a/src/subtitle_asset.h +++ b/src/subtitle_asset.h @@ -68,7 +68,7 @@ public: return _subtitles; } - void add (SubtitleString); + virtual void add (SubtitleString); virtual void add_font (std::string id, boost::filesystem::path file) = 0; std::map<std::string, Data> fonts_with_load_ids () const; |
