summaryrefslogtreecommitdiff
path: root/src/h__Writer.cpp
diff options
context:
space:
mode:
authorjhurst <jhurst@cinecert.com>2018-08-06 22:07:03 +0000
committerjhurst <>2018-08-06 22:07:03 +0000
commitf4061a21fffad4fdf8dbb2f193f0f0960b25421c (patch)
treec66e09ce3c57e263690bc0c0f37d37e9a3aa75f8 /src/h__Writer.cpp
parent38954bfe8dd72a817fb070c58327cd111b9bd282 (diff)
o Added support for SMPTE RDD 47 "ISXD Track File"
o Added generic support for SMPTE RP 2057 "Text-Based Metadata Carriage in MXF" o Re-factored AS-02 frame-wrap index write to use a common implementation o Re-factored support for SMPTE ST 410 to use a common implementation (affects o AS-DCP and AS-02 timed-text MXF (SMPTE 429-5) o Patched several ambiguous integer casts. o Added new essence type identifiers ESS_AS02_ISXD and ESS_AS02_ACES o Fixed a bug wherein the Generic Container data tarck clip was instead being o written as a DM track o Fixed UL values DCDataDescriptor and ContainerConstraintSubDescriptor to have o a byte 6 value of 0x53 (Tag Set) instead of 0x07 (coding sentinel) o Added UL values 492 - 511 to the dictionary o Added ApplicationSchemes and ConformsToSpecifications to the Preface set o Added default initializer to MXF::LineMapPair o Added sets DescriptiveFramework, DescriptiveObject, TextBasedDMFramework, o TextBasedObject, GenericStreamTextBasedSet and ISXDDataEssenceDescriptor o Added ISXD support and options '-G', '-u' to as-02-wrap o Added ISXD support and option '-g' to as-02-unwrap
Diffstat (limited to 'src/h__Writer.cpp')
-rwxr-xr-xsrc/h__Writer.cpp127
1 files changed, 124 insertions, 3 deletions
diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp
index 93388cd..4d11786 100755
--- a/src/h__Writer.cpp
+++ b/src/h__Writer.cpp
@@ -1,5 +1,5 @@
/*
-Copyright (c) 2004-2015, John Hurst
+Copyright (c) 2004-2018, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -39,13 +39,13 @@ using namespace ASDCP::MXF;
ui32_t
ASDCP::derive_timecode_rate_from_edit_rate(const ASDCP::Rational& edit_rate)
{
- return floor(0.5 + edit_rate.Quotient());
+ return (ui32_t)floor(0.5 + edit_rate.Quotient());
}
//
// add DMS CryptographicFramework entry to source package
void
-ASDCP::AddDMScrypt(Partition& HeaderPart, SourcePackage& Package,
+ASDCP::AddDmsCrypt(Partition& HeaderPart, SourcePackage& Package,
WriterInfo& Descr, const UL& WrappingUL, const Dictionary*& Dict)
{
assert(Dict);
@@ -65,6 +65,7 @@ ASDCP::AddDMScrypt(Partition& HeaderPart, SourcePackage& Package,
HeaderPart.AddChildObject(Segment);
Seq->StructuralComponents.push_back(Segment->InstanceUID);
Segment->EventComment = "AS-DCP KLV Encryption";
+ Segment->DataDefinition = UL(Dict->ul(MDD_DescriptiveMetaDataDef));
CryptographicFramework* CFW = new CryptographicFramework(Dict);
HeaderPart.AddChildObject(CFW);
@@ -81,7 +82,127 @@ ASDCP::AddDMScrypt(Partition& HeaderPart, SourcePackage& Package,
Context->CryptographicKeyID.Set(Descr.CryptographicKeyID);
}
+static std::string const rp2057_static_track_label = "SMPTE RP 2057 Generic Stream Text-Based Set";
+//
+static bool
+id_batch_contains(const Array<Kumu::UUID>& batch, const Kumu::UUID& value)
+{
+ Array<Kumu::UUID>::const_iterator i;
+ for ( i = batch.begin(); i != batch.end(); ++i )
+ {
+ if ( *i == value )
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+//
+Result_t
+ASDCP::AddDmsTrackGenericPartUtf8Text(Kumu::FileWriter& file_writer, MXF::OP1aHeader& header_part,
+ SourcePackage& source_package, MXF::RIP& rip, const Dictionary*& Dict)
+{
+ Sequence* Sequence_obj = 0;
+ InterchangeObject* tmp_iobj = 0;
+ std::list<InterchangeObject*> object_list;
+
+ // get the SourcePackage else die
+ header_part.GetMDObjectByType(Dict->ul(MDD_SourcePackage), &tmp_iobj);
+ SourcePackage *SourcePackage_obj = dynamic_cast<SourcePackage*>(tmp_iobj);
+ if ( SourcePackage_obj == 0 )
+ {
+ DefaultLogSink().Error("MXF Metadata contains no SourcePackage Set.\n");
+ return RESULT_FORMAT;
+ }
+
+ // find the first StaticTrack object, having the right label, that is ref'd by the source package
+ StaticTrack *StaticTrack_obj = 0;
+ header_part.GetMDObjectsByType(Dict->ul(MDD_StaticTrack), object_list);
+ std::list<InterchangeObject*>::iterator j;
+ for ( j = object_list.begin(); j != object_list.end(); ++j )
+ {
+ StaticTrack_obj = dynamic_cast<StaticTrack*>(*j);
+ assert(StaticTrack_obj);
+ if ( id_batch_contains(SourcePackage_obj->Tracks, StaticTrack_obj->InstanceUID)
+ && StaticTrack_obj->TrackName.get() == rp2057_static_track_label )
+ {
+ break;
+ }
+ StaticTrack_obj = 0;
+ }
+
+ if ( StaticTrack_obj )
+ {
+ object_list.clear();
+ header_part.GetMDObjectsByType(Dict->ul(MDD_Sequence), object_list);
+ for ( j = object_list.begin(); j != object_list.end(); ++j )
+ {
+ Sequence_obj = dynamic_cast<Sequence*>(*j);
+ assert(Sequence_obj);
+ if ( Sequence_obj->InstanceUID == StaticTrack_obj->Sequence )
+ {
+ break;
+ }
+ Sequence_obj = 0;
+ }
+ }
+
+ if ( Sequence_obj == 0 )
+ {
+ assert(Dict);
+ StaticTrack* static_track = new StaticTrack(Dict);
+ header_part.AddChildObject(static_track);
+ source_package.Tracks.push_back(static_track->InstanceUID);
+ static_track->TrackName = "Descriptive Track";
+ static_track->TrackID = 4;
+
+ Sequence_obj = new Sequence(Dict);
+ header_part.AddChildObject(Sequence_obj);
+ static_track->Sequence = Sequence_obj->InstanceUID;
+ Sequence_obj->DataDefinition = UL(Dict->ul(MDD_DescriptiveMetaDataDef));
+ header_part.m_Preface->DMSchemes.push_back(UL(Dict->ul(MDD_MXFTextBasedFramework)));
+ }
+
+ assert(Sequence_obj);
+ //
+ DMSegment* Segment = new DMSegment(Dict);
+ header_part.AddChildObject(Segment);
+ Sequence_obj->StructuralComponents.push_back(Segment->InstanceUID);
+ Segment->EventComment = rp2057_static_track_label;
+ Segment->DataDefinition = UL(Dict->ul(MDD_DescriptiveMetaDataDef));
+
+ //
+ TextBasedDMFramework *dmf_obj = new TextBasedDMFramework(Dict);
+ assert(dmf_obj);
+ header_part.AddChildObject(dmf_obj);
+ Segment->DMFramework = dmf_obj->InstanceUID;
+ GenRandomValue(dmf_obj->ObjectRef);
+
+
+ // Create new SID in DMF
+ ui32_t max_sid = 0;
+ ASDCP::MXF::RIP::pair_iterator i;
+ for ( i = rip.PairArray.begin(); i != rip.PairArray.end(); ++i )
+ {
+ if ( max_sid < i->BodySID )
+ {
+ max_sid = i->BodySID;
+ }
+ }
+
+ rip.PairArray.push_back(RIP::PartitionPair(max_sid + 1, file_writer.Tell()));
+
+ // Add new GSTBS linked to DMF
+ GenericStreamTextBasedSet *gst_obj = new GenericStreamTextBasedSet(Dict);
+ header_part.AddChildObject(gst_obj);
+ gst_obj->InstanceUID = dmf_obj->ObjectRef;
+ gst_obj->GenericStreamSID = max_sid + 1;
+ gst_obj->PayloadSchemeID = UL(Dict->ul(MDD_MXFTextBasedFramework));
+
+ return RESULT_OK;
+}
//
ASDCP::h__ASDCPWriter::h__ASDCPWriter(const Dictionary& d) :