summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-10-06 15:14:58 +0100
committerCarl Hetherington <cth@carlh.net>2015-10-06 15:14:58 +0100
commit4debca21936fd004fdcabe8d6178694f8cbf5f4d (patch)
tree50694eb7edee2800db77de3febe0532c666ab70a /src
parent4c2e6d70f15deb7e571af4a49c8643d3957f7b99 (diff)
Give SMPTESubtitleAsset an intrinsic duration since it is a MXF like Picture/Sound.
Diffstat (limited to 'src')
-rw-r--r--src/smpte_subtitle_asset.cc69
-rw-r--r--src/smpte_subtitle_asset.h9
-rw-r--r--src/subtitle_asset.h2
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;