/*
-Copyright (c) 2004-2006, John Hurst
+Copyright (c) 2004-2009, John Hurst
All rights reserved.
Redistribution and use in source and binary forms, with or without
#endif
+static std::vector<int>
+version_split(const char* str)
+{
+ std::vector<int> result;
+
+ const char* pstr = str;
+ const char* r = strchr(pstr, '.');
+
+ while ( r != 0 )
+ {
+ assert(r >= pstr);
+ if ( r > pstr )
+ result.push_back(atoi(pstr));
+
+ pstr = r + 1;
+ r = strchr(pstr, '.');
+ }
+
+ if( strlen(pstr) > 0 )
+ result.push_back(atoi(pstr));
+
+ assert(result.size() == 3);
+ return result;
+}
+
//
-ASDCP::h__Writer::h__Writer() :
+ASDCP::h__Writer::h__Writer(const Dictionary& d) :
+ m_HeaderPart(m_Dict), m_BodyPart(m_Dict), m_FooterPart(m_Dict), m_Dict(&d),
m_HeaderSize(0), m_EssenceStart(0),
- // m_MaterialPackage(0), m_MPTCSequence(0), m_MPTimecode(0), m_MPClSequence(0), m_MPClip(0),
- // m_FilePackage(0), m_FPTCSequence(0), m_FPTimecode(0), m_FPClSequence(0), m_FPClip(0),
m_EssenceDescriptor(0), m_FramesWritten(0), m_StreamOffset(0)
{
}
//
// add DMS CryptographicFramework entry to source package
void
-AddDMScrypt(Partition& HeaderPart, SourcePackage& Package, WriterInfo& Descr, const UL& WrappingUL)
+AddDMScrypt(Partition& HeaderPart, SourcePackage& Package,
+ WriterInfo& Descr, const UL& WrappingUL, const Dictionary*& Dict)
{
// Essence Track
- StaticTrack* NewTrack = new StaticTrack;
+ StaticTrack* NewTrack = new StaticTrack(Dict);
HeaderPart.AddChildObject(NewTrack);
Package.Tracks.push_back(NewTrack->InstanceUID);
NewTrack->TrackName = "Descriptive Track";
NewTrack->TrackID = 3;
- Sequence* Seq = new Sequence;
+ Sequence* Seq = new Sequence(Dict);
HeaderPart.AddChildObject(Seq);
NewTrack->Sequence = Seq->InstanceUID;
- Seq->DataDefinition = UL(Dict::ul(MDD_DescriptiveMetaDataDef));
+ Seq->DataDefinition = UL(Dict->ul(MDD_DescriptiveMetaDataDef));
- DMSegment* Segment = new DMSegment;
+ DMSegment* Segment = new DMSegment(Dict);
HeaderPart.AddChildObject(Segment);
Seq->StructuralComponents.push_back(Segment->InstanceUID);
Segment->EventComment = "AS-DCP KLV Encryption";
- CryptographicFramework* CFW = new CryptographicFramework;
+ CryptographicFramework* CFW = new CryptographicFramework(Dict);
HeaderPart.AddChildObject(CFW);
Segment->DMFramework = CFW->InstanceUID;
- CryptographicContext* Context = new CryptographicContext;
+ CryptographicContext* Context = new CryptographicContext(Dict);
HeaderPart.AddChildObject(Context);
CFW->ContextSR = Context->InstanceUID;
Context->ContextID.Set(Descr.ContextID);
Context->SourceEssenceContainer = WrappingUL; // ??????
- Context->CipherAlgorithm.Set(Dict::ul(MDD_CipherAlgorithm_AES));
- Context->MICAlgorithm.Set( Descr.UsesHMAC ? Dict::ul(MDD_MICAlgorithm_HMAC_SHA1) : Dict::ul(MDD_MICAlgorithm_NONE) );
+ Context->CipherAlgorithm.Set(Dict->ul(MDD_CipherAlgorithm_AES));
+ Context->MICAlgorithm.Set( Descr.UsesHMAC ? Dict->ul(MDD_MICAlgorithm_HMAC_SHA1) : Dict->ul(MDD_MICAlgorithm_NONE) );
Context->CryptographicKeyID.Set(Descr.CryptographicKeyID);
}
assert(m_EssenceDescriptor);
m_HeaderPart.m_Primer.ClearTagList();
- m_HeaderPart.m_Preface = new Preface;
+ m_HeaderPart.m_Preface = new Preface(m_Dict);
m_HeaderPart.AddChildObject(m_HeaderPart.m_Preface);
// Set the Operational Pattern label -- we're just starting and have no RIP or index,
// so we tell the world by using OP1a
- m_HeaderPart.m_Preface->OperationalPattern = UL(Dict::ul(MDD_OP1a));
+ m_HeaderPart.m_Preface->OperationalPattern = UL(m_Dict->ul(MDD_OP1a));
m_HeaderPart.OperationalPattern = m_HeaderPart.m_Preface->OperationalPattern;
// First RIP Entry
//
// Identification
//
- Identification* Ident = new Identification;
+ Identification* Ident = new Identification(m_Dict);
m_HeaderPart.AddChildObject(Ident);
m_HeaderPart.m_Preface->Identifications.push_back(Ident->InstanceUID);
Ident->VersionString = m_Info.ProductVersion.c_str();
Ident->ProductUID.Set(m_Info.ProductUUID);
Ident->Platform = ASDCP_PLATFORM;
- Ident->ToolkitVersion.Major = VERSION_MAJOR;
- Ident->ToolkitVersion.Minor = VERSION_APIMINOR;
- Ident->ToolkitVersion.Patch = VERSION_IMPMINOR;
+
+ std::vector<int> version = version_split(Version());
+
+ Ident->ToolkitVersion.Major = version[0];
+ Ident->ToolkitVersion.Minor = version[1];
+ Ident->ToolkitVersion.Patch = version[2];
Ident->ToolkitVersion.Build = ASDCP_BUILD_NUMBER;
Ident->ToolkitVersion.Release = VersionType::RL_RELEASE;
}
template <class PackageT, class ClipT>
TrackSet<ClipT>
CreateTrackAndSequence(OPAtomHeader& Header, PackageT& Package, const std::string TrackName,
- const MXF::Rational& EditRate, const UL& Definition, ui32_t TrackID)
+ const MXF::Rational& EditRate, const UL& Definition, ui32_t TrackID, const Dictionary*& Dict)
{
TrackSet<ClipT> NewTrack;
- NewTrack.Track = new Track;
+ NewTrack.Track = new Track(Dict);
Header.AddChildObject(NewTrack.Track);
NewTrack.Track->EditRate = EditRate;
Package.Tracks.push_back(NewTrack.Track->InstanceUID);
NewTrack.Track->TrackID = TrackID;
NewTrack.Track->TrackName = TrackName.c_str();
- NewTrack.Sequence = new Sequence;
+ NewTrack.Sequence = new Sequence(Dict);
Header.AddChildObject(NewTrack.Sequence);
NewTrack.Track->Sequence = NewTrack.Sequence->InstanceUID;
NewTrack.Sequence->DataDefinition = Definition;
template <class PackageT>
TrackSet<TimecodeComponent>
CreateTimecodeTrack(OPAtomHeader& Header, PackageT& Package,
- const MXF::Rational& EditRate, ui32_t TCFrameRate, ui64_t TCStart)
+ const MXF::Rational& EditRate, ui32_t TCFrameRate, ui64_t TCStart, const Dictionary*& Dict)
{
- UL TCUL(Dict::ul(MDD_TimecodeDataDef));
+ UL TCUL(Dict->ul(MDD_TimecodeDataDef));
- TrackSet<TimecodeComponent> NewTrack = CreateTrackAndSequence<PackageT, TimecodeComponent>(Header, Package, "Timecode Track", EditRate, TCUL, 1);
+ TrackSet<TimecodeComponent> NewTrack = CreateTrackAndSequence<PackageT, TimecodeComponent>(Header, Package, "Timecode Track", EditRate, TCUL, 1, Dict);
- NewTrack.Clip = new TimecodeComponent;
+ NewTrack.Clip = new TimecodeComponent(Dict);
Header.AddChildObject(NewTrack.Clip);
NewTrack.Sequence->StructuralComponents.push_back(NewTrack.Clip->InstanceUID);
NewTrack.Clip->RoundedTimecodeBase = TCFrameRate;
const std::string& PackageLabel)
{
//
- ContentStorage* Storage = new ContentStorage;
+ ContentStorage* Storage = new ContentStorage(m_Dict);
m_HeaderPart.AddChildObject(Storage);
m_HeaderPart.m_Preface->ContentStorage = Storage->InstanceUID;
- EssenceContainerData* ECD = new EssenceContainerData;
+ EssenceContainerData* ECD = new EssenceContainerData(m_Dict);
m_HeaderPart.AddChildObject(ECD);
Storage->EssenceContainerData.push_back(ECD->InstanceUID);
ECD->IndexSID = 129;
//
// Material Package
//
- m_MaterialPackage = new MaterialPackage;
+ m_MaterialPackage = new MaterialPackage(m_Dict);
m_MaterialPackage->Name = "AS-DCP Material Package";
m_MaterialPackage->PackageUID = MaterialPackageUMID;
m_HeaderPart.AddChildObject(m_MaterialPackage);
Storage->Packages.push_back(m_MaterialPackage->InstanceUID);
TrackSet<TimecodeComponent> MPTCTrack = CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
- EditRate, TCFrameRate, 0);
+ EditRate, TCFrameRate, 0, m_Dict);
m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration));
m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration));
TrackSet<SourceClip> MPTrack = CreateTrackAndSequence<MaterialPackage, SourceClip>(m_HeaderPart, *m_MaterialPackage,
- TrackName, EditRate, DataDefinition, 2);
+ TrackName, EditRate, DataDefinition,
+ 2, m_Dict);
m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration));
- MPTrack.Clip = new SourceClip;
+ MPTrack.Clip = new SourceClip(m_Dict);
m_HeaderPart.AddChildObject(MPTrack.Clip);
MPTrack.Sequence->StructuralComponents.push_back(MPTrack.Clip->InstanceUID);
MPTrack.Clip->DataDefinition = DataDefinition;
//
// File (Source) Package
//
- m_FilePackage = new SourcePackage;
+ m_FilePackage = new SourcePackage(m_Dict);
m_FilePackage->Name = PackageLabel.c_str();
m_FilePackage->PackageUID = SourcePackageUMID;
ECD->LinkedPackageUID = SourcePackageUMID;
Storage->Packages.push_back(m_FilePackage->InstanceUID);
TrackSet<TimecodeComponent> FPTCTrack = CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
- EditRate, TCFrameRate, ui64_C(3600) * TCFrameRate);
+ EditRate, TCFrameRate,
+ ui64_C(3600) * TCFrameRate, m_Dict);
m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration));
m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration));
TrackSet<SourceClip> FPTrack = CreateTrackAndSequence<SourcePackage, SourceClip>(m_HeaderPart, *m_FilePackage,
- TrackName, EditRate, DataDefinition, 2);
+ TrackName, EditRate, DataDefinition,
+ 2, m_Dict);
m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration));
- FPTrack.Clip = new SourceClip;
+ FPTrack.Clip = new SourceClip(m_Dict);
m_HeaderPart.AddChildObject(FPTrack.Clip);
FPTrack.Sequence->StructuralComponents.push_back(FPTrack.Clip->InstanceUID);
FPTrack.Clip->DataDefinition = DataDefinition;
void
ASDCP::h__Writer::AddDMSegment(const MXF::Rational& EditRate, ui32_t TCFrameRate,
const std::string& TrackName, const UL& DataDefinition,
- const std::string& PackageLabel)
+ const std::string& PackageLabel)
{
//
- ContentStorage* Storage = new ContentStorage;
+ ContentStorage* Storage = new ContentStorage(m_Dict);
m_HeaderPart.AddChildObject(Storage);
m_HeaderPart.m_Preface->ContentStorage = Storage->InstanceUID;
- EssenceContainerData* ECD = new EssenceContainerData;
+ EssenceContainerData* ECD = new EssenceContainerData(m_Dict);
m_HeaderPart.AddChildObject(ECD);
Storage->EssenceContainerData.push_back(ECD->InstanceUID);
ECD->IndexSID = 129;
//
// Material Package
//
- m_MaterialPackage = new MaterialPackage;
+ m_MaterialPackage = new MaterialPackage(m_Dict);
m_MaterialPackage->Name = "AS-DCP Material Package";
m_MaterialPackage->PackageUID = MaterialPackageUMID;
m_HeaderPart.AddChildObject(m_MaterialPackage);
Storage->Packages.push_back(m_MaterialPackage->InstanceUID);
TrackSet<TimecodeComponent> MPTCTrack = CreateTimecodeTrack<MaterialPackage>(m_HeaderPart, *m_MaterialPackage,
- EditRate, TCFrameRate, 0);
+ EditRate, TCFrameRate, 0, m_Dict);
m_DurationUpdateList.push_back(&(MPTCTrack.Sequence->Duration));
m_DurationUpdateList.push_back(&(MPTCTrack.Clip->Duration));
TrackSet<DMSegment> MPTrack = CreateTrackAndSequence<MaterialPackage, DMSegment>(m_HeaderPart, *m_MaterialPackage,
- TrackName, EditRate, DataDefinition, 2);
+ TrackName, EditRate, DataDefinition,
+ 2, m_Dict);
m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration));
- MPTrack.Clip = new DMSegment;
+ MPTrack.Clip = new DMSegment(m_Dict);
m_HeaderPart.AddChildObject(MPTrack.Clip);
MPTrack.Sequence->StructuralComponents.push_back(MPTrack.Clip->InstanceUID);
MPTrack.Clip->DataDefinition = DataDefinition;
//
// File (Source) Package
//
- m_FilePackage = new SourcePackage;
+ m_FilePackage = new SourcePackage(m_Dict);
m_FilePackage->Name = PackageLabel.c_str();
m_FilePackage->PackageUID = SourcePackageUMID;
ECD->LinkedPackageUID = SourcePackageUMID;
Storage->Packages.push_back(m_FilePackage->InstanceUID);
TrackSet<TimecodeComponent> FPTCTrack = CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
- EditRate, TCFrameRate, ui64_C(3600) * TCFrameRate);
+ EditRate, TCFrameRate,
+ ui64_C(3600) * TCFrameRate, m_Dict);
m_DurationUpdateList.push_back(&(FPTCTrack.Sequence->Duration));
m_DurationUpdateList.push_back(&(FPTCTrack.Clip->Duration));
TrackSet<DMSegment> FPTrack = CreateTrackAndSequence<SourcePackage, DMSegment>(m_HeaderPart, *m_FilePackage,
- TrackName, EditRate, DataDefinition, 2);
+ TrackName, EditRate, DataDefinition,
+ 2, m_Dict);
m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration));
- FPTrack.Clip = new DMSegment;
+ FPTrack.Clip = new DMSegment(m_Dict);
m_HeaderPart.AddChildObject(FPTrack.Clip);
FPTrack.Sequence->StructuralComponents.push_back(FPTrack.Clip->InstanceUID);
FPTrack.Clip->DataDefinition = DataDefinition;
m_HeaderPart.m_Preface->PrimaryPackage = m_FilePackage->InstanceUID;
//
- // Encryption Descriptor
+ // Essence Descriptors
//
+ UL GenericContainerUL(m_Dict->ul(MDD_GCMulti));
+ m_HeaderPart.EssenceContainers.push_back(GenericContainerUL);
+
if ( m_Info.EncryptedEssence )
{
- UL CryptEssenceUL(Dict::ul(MDD_EncryptedContainerLabel));
+ UL CryptEssenceUL(m_Dict->ul(MDD_EncryptedContainerLabel));
m_HeaderPart.EssenceContainers.push_back(CryptEssenceUL);
- m_HeaderPart.m_Preface->DMSchemes.push_back(UL(Dict::ul(MDD_CryptographicFrameworkLabel)));
- AddDMScrypt(m_HeaderPart, *m_FilePackage, m_Info, WrappingUL);
+ m_HeaderPart.m_Preface->DMSchemes.push_back(UL(m_Dict->ul(MDD_CryptographicFrameworkLabel)));
+ AddDMScrypt(m_HeaderPart, *m_FilePackage, m_Info, WrappingUL, m_Dict);
}
else
{
- m_HeaderPart.EssenceContainers.push_back(UL(Dict::ul(MDD_GCMulti)));
m_HeaderPart.EssenceContainers.push_back(WrappingUL);
}
m_HeaderPart.m_Preface->EssenceContainers = m_HeaderPart.EssenceContainers;
m_HeaderPart.AddChildObject(m_EssenceDescriptor);
- std::list<FileDescriptor*>::iterator sdli = m_EssenceSubDescriptorList.begin();
+ std::list<InterchangeObject*>::iterator sdli = m_EssenceSubDescriptorList.begin();
for ( ; sdli != m_EssenceSubDescriptorList.end(); sdli++ )
m_HeaderPart.AddChildObject(*sdli);
m_BodyPart.EssenceContainers = m_HeaderPart.EssenceContainers;
m_BodyPart.ThisPartition = m_File.Tell();
m_BodyPart.BodySID = 1;
- UL OPAtomUL(Dict::ul(MDD_OPAtom));
+ UL OPAtomUL(m_Dict->ul(MDD_OPAtom));
m_BodyPart.OperationalPattern = OPAtomUL;
m_HeaderPart.m_RIP.PairArray.push_back(RIP::Pair(1, m_BodyPart.ThisPartition)); // Second RIP Entry
- UL BodyUL(Dict::ul(MDD_ClosedCompleteBodyPartition));
+ UL BodyUL(m_Dict->ul(MDD_ClosedCompleteBodyPartition));
result = m_BodyPart.WriteToFile(m_File, BodyUL);
}
else
if ( ASDCP_SUCCESS(result) )
{ // write UL
if ( m_Info.LabelSetType == LS_MXF_INTEROP )
- Overhead.WriteRaw(Dict::ul(MDD_MXFInterop_CryptEssence), SMPTE_UL_LENGTH);
+ Overhead.WriteRaw(m_Dict->ul(MDD_MXFInterop_CryptEssence), SMPTE_UL_LENGTH);
else
- Overhead.WriteRaw(Dict::ul(MDD_CryptEssence), SMPTE_UL_LENGTH);
+ Overhead.WriteRaw(m_Dict->ul(MDD_CryptEssence), SMPTE_UL_LENGTH);
// construct encrypted triplet header
ui32_t ETLength = klv_cryptinfo_size + m_CtFrameBuf.Size();
m_HeaderPart.FooterPartition = here;
// re-label the partition
- UL OPAtomUL(Dict::ul(MDD_OPAtom));
+ UL OPAtomUL(m_Dict->ul(MDD_OPAtom));
if ( m_Info.LabelSetType == LS_MXF_INTEROP )
- OPAtomUL.Set(Dict::ul(MDD_MXFInterop_OPAtom));
+ OPAtomUL.Set(m_Dict->ul(MDD_MXFInterop_OPAtom));
m_HeaderPart.OperationalPattern = OPAtomUL;
m_HeaderPart.m_Preface->OperationalPattern = m_HeaderPart.OperationalPattern;