diff options
| author | jhurst <jhurst@cinecert.com> | 2018-08-06 22:07:03 +0000 |
|---|---|---|
| committer | jhurst <> | 2018-08-06 22:07:03 +0000 |
| commit | f4061a21fffad4fdf8dbb2f193f0f0960b25421c (patch) | |
| tree | c66e09ce3c57e263690bc0c0f37d37e9a3aa75f8 /src/h__Writer.cpp | |
| parent | 38954bfe8dd72a817fb070c58327cd111b9bd282 (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-x | src/h__Writer.cpp | 127 |
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) : |
