X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fh__Writer.cpp;h=69873b65fb59611eff9b62c702e4be0bc20b0044;hb=a5b15f66c30093efe376f0462e43ac4ac10e2e14;hp=c088059449a2d1fb560fdc17d4fc4572c8ec441a;hpb=a48b3a939a031ec369c58b054c126d7dec963a18;p=asdcplib.git diff --git a/src/h__Writer.cpp b/src/h__Writer.cpp index c088059..69873b6 100755 --- a/src/h__Writer.cpp +++ b/src/h__Writer.cpp @@ -68,7 +68,8 @@ version_split(const char* str) // -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_EssenceDescriptor(0), m_FramesWritten(0), m_StreamOffset(0) { @@ -81,37 +82,39 @@ ASDCP::h__Writer::~h__Writer() // // 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) { + assert(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); } @@ -119,15 +122,16 @@ AddDMScrypt(Partition& HeaderPart, SourcePackage& Package, WriterInfo& Descr, co void ASDCP::h__Writer::InitHeader() { + assert(m_Dict); 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 @@ -139,7 +143,7 @@ ASDCP::h__Writer::InitHeader() // // Identification // - Identification* Ident = new Identification; + Identification* Ident = new Identification(m_Dict); m_HeaderPart.AddChildObject(Ident); m_HeaderPart.m_Preface->Identifications.push_back(Ident->InstanceUID); @@ -174,18 +178,18 @@ struct TrackSet template TrackSet 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 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; @@ -197,13 +201,14 @@ CreateTrackAndSequence(OPAtomHeader& Header, PackageT& Package, const std::strin template TrackSet 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)); + assert(Dict); + UL TCUL(Dict->ul(MDD_TimecodeDataDef)); - TrackSet NewTrack = CreateTrackAndSequence(Header, Package, "Timecode Track", EditRate, TCUL, 1); + TrackSet NewTrack = CreateTrackAndSequence(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; @@ -221,11 +226,11 @@ ASDCP::h__Writer::AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRat 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; @@ -239,22 +244,23 @@ ASDCP::h__Writer::AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRat // // 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 MPTCTrack = CreateTimecodeTrack(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 MPTrack = CreateTrackAndSequence(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; @@ -266,7 +272,7 @@ ASDCP::h__Writer::AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRat // // 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; @@ -275,15 +281,17 @@ ASDCP::h__Writer::AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRat Storage->Packages.push_back(m_FilePackage->InstanceUID); TrackSet FPTCTrack = CreateTimecodeTrack(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 FPTrack = CreateTrackAndSequence(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; @@ -303,11 +311,11 @@ ASDCP::h__Writer::AddDMSegment(const MXF::Rational& EditRate, ui32_t 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; @@ -321,22 +329,23 @@ ASDCP::h__Writer::AddDMSegment(const MXF::Rational& EditRate, ui32_t TCFrameRate // // 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 MPTCTrack = CreateTimecodeTrack(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 MPTrack = CreateTrackAndSequence(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; @@ -348,7 +357,7 @@ ASDCP::h__Writer::AddDMSegment(const MXF::Rational& EditRate, ui32_t TCFrameRate // // 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; @@ -357,15 +366,17 @@ ASDCP::h__Writer::AddDMSegment(const MXF::Rational& EditRate, ui32_t TCFrameRate Storage->Packages.push_back(m_FilePackage->InstanceUID); TrackSet FPTCTrack = CreateTimecodeTrack(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 FPTrack = CreateTrackAndSequence(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; @@ -388,15 +399,16 @@ ASDCP::h__Writer::AddEssenceDescriptor(const UL& WrappingUL) // // Essence Descriptors // - UL GenericContainerUL(Dict::ul(MDD_GCMulti)); + assert(m_Dict); + 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 { @@ -417,6 +429,7 @@ ASDCP::h__Writer::AddEssenceDescriptor(const UL& WrappingUL) Result_t ASDCP::h__Writer::CreateBodyPart(const MXF::Rational& EditRate, ui32_t BytesPerEditUnit) { + assert(m_Dict); Result_t result = RESULT_OK; // create a body partition if we're writing proper 429-3/OP-Atom @@ -426,11 +439,11 @@ ASDCP::h__Writer::CreateBodyPart(const MXF::Rational& EditRate, ui32_t BytesPerE 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 @@ -482,6 +495,7 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte byte_t overhead[128]; Kumu::MemIOWriter Overhead(overhead, 128); + assert(m_Dict); if ( FrameBuf.Size() == 0 ) { @@ -509,10 +523,7 @@ ASDCP::h__Writer::WriteEKLVPacket(const ASDCP::FrameBuffer& FrameBuf, const byte if ( ASDCP_SUCCESS(result) ) { // write UL - if ( m_Info.LabelSetType == LS_MXF_INTEROP ) - Overhead.WriteRaw(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(); @@ -608,12 +619,9 @@ ASDCP::h__Writer::WriteMXFFooter() m_HeaderPart.m_RIP.PairArray.push_back(RIP::Pair(0, here)); // Last RIP Entry m_HeaderPart.FooterPartition = here; + assert(m_Dict); // re-label the partition - UL OPAtomUL(Dict::ul(MDD_OPAtom)); - - if ( m_Info.LabelSetType == LS_MXF_INTEROP ) - OPAtomUL.Set(Dict::ul(MDD_MXFInterop_OPAtom)); - + UL OPAtomUL(m_Dict->ul(MDD_OPAtom)); m_HeaderPart.OperationalPattern = OPAtomUL; m_HeaderPart.m_Preface->OperationalPattern = m_HeaderPart.OperationalPattern;