summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2018-03-25 22:54:20 +0000
committerjhurst <>2018-03-25 22:54:20 +0000
commitffc88e36d1b15a863bad6577dee7d59254edfa22 (patch)
treef46ee12919d9eb6690815eb01f48e3fae73ddfbb
parent40ecb821a29d1049e0a69149b20e552c7fbb0ae0 (diff)
o Fixed MinorVersion error (was "2", is now "3") when writing BodyPartition packs preceding partitions in AS-02 files.
o Fixed AS-DCP timed text writer, was creating DM Segment instead of SourceClip in the source package. o Changed SourcePackage timecode track start to 00:00:00:00 (was 01:00:00:00) o Fixed reference counting errors in asdcp.MXFWriter and asdcp.TimedTextWriter that were causing asdcp.MXFReader and asdcp.TimedTextReader (respectively) to remain allocated after all references had been deleted, thus leaking file handles and memory. o Fixed broken arg parser (missing format token in format string for "EssenceType" argument) in TimedTextWriter
-rw-r--r--src/AS_02.h10
-rw-r--r--src/AS_02_internal.h2
-rw-r--r--src/AS_DCP_TimedText.cpp5
-rwxr-xr-xsrc/AS_DCP_internal.h24
-rw-r--r--src/ST2052_TextParser.cpp27
-rwxr-xr-xsrc/as-02-wrap.cpp10
6 files changed, 45 insertions, 33 deletions
diff --git a/src/AS_02.h b/src/AS_02.h
index c768507..33163c3 100644
--- a/src/AS_02.h
+++ b/src/AS_02.h
@@ -367,12 +367,16 @@ namespace AS_02
// Opens an XML file for reading, parses data to provide a complete
// set of stream metadata for the MXFWriter below.
- Result_t OpenRead(const std::string& filename, const std::string& profile_name) const;
+ Result_t OpenRead(const std::string& filename) const;
// Parse an XML string
- Result_t OpenRead(const std::string& xml_doc, const std::string& filename,
- const std::string& profile_name) const;
+ Result_t OpenRead(const std::string& xml_doc, const std::string& filename) const;
+ // The "profile_name" parameter was removed from OpenRead() because it made the API
+ // awkward WRT lexical compatibility with TimedText_Parser. The value can still be
+ // modified by changing the descriptor's NamespaceName property after the call to
+ // FillTimedTextDescriptor() has set it.
+
// Fill a TimedTextDescriptor struct with the values from the file's contents.
// Returns RESULT_INIT if the file is not open.
Result_t FillTimedTextDescriptor(ASDCP::TimedText::TimedTextDescriptor&) const;
diff --git a/src/AS_02_internal.h b/src/AS_02_internal.h
index 9153ac9..560fb6c 100644
--- a/src/AS_02_internal.h
+++ b/src/AS_02_internal.h
@@ -179,6 +179,8 @@ namespace AS_02
this->m_IndexWriter.SetPrimerLookup(&this->m_HeaderPart.m_Primer);
this->m_RIP.PairArray.push_back(RIP::PartitionPair(0, 0)); // Header partition RIP entry
+ this->m_IndexWriter.MajorVersion = m_HeaderPart.MajorVersion;
+ this->m_IndexWriter.MinorVersion = m_HeaderPart.MinorVersion;
this->m_IndexWriter.OperationalPattern = this->m_HeaderPart.OperationalPattern;
this->m_IndexWriter.EssenceContainers = this->m_HeaderPart.EssenceContainers;
diff --git a/src/AS_DCP_TimedText.cpp b/src/AS_DCP_TimedText.cpp
index ab8dab9..6e34a5d 100644
--- a/src/AS_DCP_TimedText.cpp
+++ b/src/AS_DCP_TimedText.cpp
@@ -594,11 +594,10 @@ ASDCP::TimedText::MXFWriter::h__Writer::SetSourceStream(ASDCP::TimedText::TimedT
}
// timecode rate and essence rate are the same
- AddDMSegment(m_TDesc.EditRate, m_TDesc.EditRate, derive_timecode_rate_from_edit_rate(m_TDesc.EditRate), TIMED_TEXT_DEF_LABEL,
- UL(m_Dict->ul(MDD_DataDataDef)), TIMED_TEXT_PACKAGE_LABEL);
+ AddSourceClip(m_TDesc.EditRate, m_TDesc.EditRate, derive_timecode_rate_from_edit_rate(m_TDesc.EditRate),
+ TIMED_TEXT_DEF_LABEL, m_EssenceUL, UL(m_Dict->ul(MDD_DataDataDef)), TIMED_TEXT_PACKAGE_LABEL);
AddEssenceDescriptor(UL(m_Dict->ul(MDD_TimedTextWrappingClip)));
-
result = m_HeaderPart.WriteToFile(m_File, m_HeaderSize);
if ( KM_SUCCESS(result) )
diff --git a/src/AS_DCP_internal.h b/src/AS_DCP_internal.h
index aaa9e60..aad500e 100755
--- a/src/AS_DCP_internal.h
+++ b/src/AS_DCP_internal.h
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2004-2016, John Hurst
+Copyright (c) 2004-2018, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -130,6 +130,13 @@ namespace ASDCP
MXFVersion_MAX
};
+ // version numbers from the MXF spec, to be written into files
+
+ ui8_t const MXF_ObjectModelVersion = 1;
+ ui8_t const MXF_2004_MinorVersion = 2;
+ ui8_t const MXF_2011_MinorVersion = 3;
+
+
//------------------------------------------------------------------------------------------
//
@@ -552,16 +559,16 @@ namespace ASDCP
if ( mxf_ver == MXFVersion_2004 )
{
- m_HeaderPart.MinorVersion = 2;
- m_HeaderPart.m_Preface->Version = 258;
- m_HeaderPart.m_Preface->ObjectModelVersion = 1;
+ m_HeaderPart.MinorVersion = MXF_2004_MinorVersion;
+ m_HeaderPart.m_Preface->Version = ((MXF_ObjectModelVersion < 8) | MXF_2004_MinorVersion);
+ m_HeaderPart.m_Preface->ObjectModelVersion = MXF_ObjectModelVersion;
}
else
{
assert(mxf_ver == MXFVersion_2011);
- m_HeaderPart.MinorVersion = 3;
- m_HeaderPart.m_Preface->Version = 259;
- m_HeaderPart.m_Preface->ObjectModelVersion = 1;
+ m_HeaderPart.MinorVersion = MXF_2011_MinorVersion;
+ m_HeaderPart.m_Preface->Version = ((MXF_ObjectModelVersion < 8) | MXF_2011_MinorVersion);
+ m_HeaderPart.m_Preface->ObjectModelVersion = MXF_ObjectModelVersion;
}
// Identification
@@ -658,8 +665,7 @@ namespace ASDCP
TrackSet<TimecodeComponent> FPTCTrack =
CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
- tc_edit_rate, TCFrameRate,
- ui64_C(3600) * TCFrameRate, m_Dict);
+ tc_edit_rate, TCFrameRate, 0, m_Dict);
FPTCTrack.Sequence->Duration.set_has_value();
m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration.get()));
diff --git a/src/ST2052_TextParser.cpp b/src/ST2052_TextParser.cpp
index a98b4ca..305f46f 100644
--- a/src/ST2052_TextParser.cpp
+++ b/src/ST2052_TextParser.cpp
@@ -230,7 +230,7 @@ class AS_02::TimedText::ST2052_TextParser::h__TextParser
{
XMLElement m_Root;
ResourceTypeMap_t m_ResourceTypes;
- Result_t OpenRead(const std::string& profile_name);
+ Result_t OpenRead();
ASDCP_NO_COPY_CONSTRUCT(h__TextParser);
@@ -259,22 +259,22 @@ public:
return m_DefaultResolver;
}
- Result_t OpenRead(const std::string& filename, const std::string& profile_name);
- Result_t OpenRead(const std::string& xml_doc, const std::string& filename, const std::string& profile_name);
+ Result_t OpenRead(const std::string& filename);
+ Result_t OpenRead(const std::string& xml_doc, const std::string& filename);
Result_t ReadAncillaryResource(const byte_t *uuid, ASDCP::TimedText::FrameBuffer& FrameBuf,
const ASDCP::TimedText::IResourceResolver& Resolver) const;
};
//
Result_t
-AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string& filename, const std::string& profile_name)
+AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string& filename)
{
Result_t result = ReadFileIntoString(filename, m_XMLDoc);
if ( KM_SUCCESS(result) )
{
m_Filename = filename;
- result = OpenRead(profile_name);
+ result = OpenRead();
}
return result;
@@ -282,12 +282,11 @@ AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string&
//
Result_t
-AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string& xml_doc, const std::string& filename,
- const std::string& profile_name)
+AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string& xml_doc, const std::string& filename)
{
m_XMLDoc = xml_doc;
m_Filename = filename;
- return OpenRead(profile_name);
+ return OpenRead();
}
@@ -297,7 +296,7 @@ std::string const IMSC1_textProfile = "http://www.w3.org/ns/ttml/profile/imsc1/t
//
Result_t
-AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string& profile_name)
+AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead()
{
setup_default_font_family_list();
@@ -310,7 +309,6 @@ AS_02::TimedText::ST2052_TextParser::h__TextParser::OpenRead(const std::string&
m_TDesc.EncodingName = "UTF-8"; // the XML parser demands UTF-8
m_TDesc.ResourceList.clear();
m_TDesc.ContainerDuration = 0;
- m_TDesc.NamespaceName = profile_name; // set the profile explicitly
std::set<std::string>::const_iterator i;
// Attempt to set the profile from <conformsToStandard>
@@ -466,11 +464,11 @@ AS_02::TimedText::ST2052_TextParser::~ST2052_TextParser()
// Opens the stream for reading, parses enough data to provide a complete
// set of stream metadata for the MXFWriter below.
ASDCP::Result_t
-AS_02::TimedText::ST2052_TextParser::OpenRead(const std::string& filename, const std::string& profile_name) const
+AS_02::TimedText::ST2052_TextParser::OpenRead(const std::string& filename) const
{
const_cast<AS_02::TimedText::ST2052_TextParser*>(this)->m_Parser = new h__TextParser;
- Result_t result = m_Parser->OpenRead(filename, profile_name);
+ Result_t result = m_Parser->OpenRead(filename);
if ( ASDCP_FAILURE(result) )
const_cast<AS_02::TimedText::ST2052_TextParser*>(this)->m_Parser = 0;
@@ -480,12 +478,11 @@ AS_02::TimedText::ST2052_TextParser::OpenRead(const std::string& filename, const
// Parses an XML document to provide a complete set of stream metadata for the MXFWriter below.
Result_t
-AS_02::TimedText::ST2052_TextParser::OpenRead(const std::string& xml_doc, const std::string& filename,
- const std::string& profile_name) const
+AS_02::TimedText::ST2052_TextParser::OpenRead(const std::string& xml_doc, const std::string& filename) const
{
const_cast<AS_02::TimedText::ST2052_TextParser*>(this)->m_Parser = new h__TextParser;
- Result_t result = m_Parser->OpenRead(xml_doc, filename, profile_name);
+ Result_t result = m_Parser->OpenRead(xml_doc, filename);
if ( ASDCP_FAILURE(result) )
const_cast<AS_02::TimedText::ST2052_TextParser*>(this)->m_Parser = 0;
diff --git a/src/as-02-wrap.cpp b/src/as-02-wrap.cpp
index 8a32d71..49b552f 100755
--- a/src/as-02-wrap.cpp
+++ b/src/as-02-wrap.cpp
@@ -707,7 +707,7 @@ public:
}
}
- if ( help_flag || version_flag )
+ if ( help_flag || version_flag || show_ul_values_flag )
return;
if ( filenames.size() < 2 )
@@ -1110,8 +1110,7 @@ write_timed_text_file(CommandOptions& Options)
Kumu::FortunaRNG RNG;
// set up essence parser
- Result_t result = Parser.OpenRead(Options.filenames.front().c_str(),
- Options.profile_name);
+ Result_t result = Parser.OpenRead(Options.filenames.front());
// set up MXF writer
if ( ASDCP_SUCCESS(result) )
@@ -1121,6 +1120,11 @@ write_timed_text_file(CommandOptions& Options)
TDesc.ContainerDuration = Options.duration;
FrameBuffer.Capacity(Options.fb_size);
+ if ( ! Options.profile_name.empty() )
+ {
+ TDesc.NamespaceName = Options.profile_name;
+ }
+
if ( Options.verbose_flag )
{
fputs("IMF Timed-Text Descriptor:\n", stderr);