-//
-void
-ASDCP::h__Writer::InitHeader()
-{
- assert(m_EssenceDescriptor);
-
- m_HeaderPart.m_Primer.ClearTagList();
- m_HeaderPart.m_Preface = new Preface;
- 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.OperationalPattern = m_HeaderPart.m_Preface->OperationalPattern;
-
- // First RIP Entry
- if ( m_Info.LabelSetType == LS_MXF_SMPTE )
- m_HeaderPart.m_RIP.PairArray.push_back(RIP::Pair(0, 0)); // 3-part, no essence in header
- else
- m_HeaderPart.m_RIP.PairArray.push_back(RIP::Pair(1, 0)); // 2-part, essence in header
-
- //
- // Identification
- //
- Identification* Ident = new Identification;
- m_HeaderPart.AddChildObject(Ident);
- m_HeaderPart.m_Preface->Identifications.push_back(Ident->InstanceUID);
-
- Kumu::GenRandomValue(Ident->ThisGenerationUID);
- Ident->CompanyName = m_Info.CompanyName.c_str();
- Ident->ProductName = m_Info.ProductName.c_str();
- 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;
- Ident->ToolkitVersion.Build = ASDCP_BUILD_NUMBER;
- Ident->ToolkitVersion.Release = VersionType::RL_RELEASE;
-}
-
-//
-template <class ClipT>
-struct TrackSet
-{
- MXF::Track* Track;
- MXF::Sequence* Sequence;
- ClipT* Clip;
-
- TrackSet() : Track(0), Sequence(0), Clip(0) {}
-};
-
-//
-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)
-{
- TrackSet<ClipT> NewTrack;
-
- NewTrack.Track = new Track;
- 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;
- Header.AddChildObject(NewTrack.Sequence);
- NewTrack.Track->Sequence = NewTrack.Sequence->InstanceUID;
- NewTrack.Sequence->DataDefinition = Definition;
-
- return NewTrack;
-}
-
-//
-template <class PackageT>
-TrackSet<TimecodeComponent>
-CreateTimecodeTrack(OPAtomHeader& Header, PackageT& Package,
- const MXF::Rational& EditRate, ui32_t TCFrameRate, ui64_t TCStart)
-{
- UL TCUL(Dict::ul(MDD_TimecodeDataDef));
-
- TrackSet<TimecodeComponent> NewTrack = CreateTrackAndSequence<PackageT, TimecodeComponent>(Header, Package, "Timecode Track", EditRate, TCUL, 1);
-
- NewTrack.Clip = new TimecodeComponent;
- Header.AddChildObject(NewTrack.Clip);
- NewTrack.Sequence->StructuralComponents.push_back(NewTrack.Clip->InstanceUID);
- NewTrack.Clip->RoundedTimecodeBase = TCFrameRate;
- NewTrack.Clip->StartTimecode = TCStart;
- NewTrack.Clip->DataDefinition = TCUL;
-
- return NewTrack;
-}
-
-
-//
-void
-ASDCP::h__Writer::AddSourceClip(const MXF::Rational& EditRate, ui32_t TCFrameRate,
- const std::string& TrackName, const UL& DataDefinition,
- const std::string& PackageLabel)
-{
- //
- ContentStorage* Storage = new ContentStorage;
- m_HeaderPart.AddChildObject(Storage);
- m_HeaderPart.m_Preface->ContentStorage = Storage->InstanceUID;
-
- EssenceContainerData* ECD = new EssenceContainerData;
- m_HeaderPart.AddChildObject(ECD);
- Storage->EssenceContainerData.push_back(ECD->InstanceUID);
- ECD->IndexSID = 129;
- ECD->BodySID = 1;
-
- UUID assetUUID(m_Info.AssetUUID);
- UMID SourcePackageUMID, MaterialPackageUMID;
- SourcePackageUMID.MakeUMID(0x0f, assetUUID);
- MaterialPackageUMID.MakeUMID(0x0f); // unidentified essence
-
- //
- // Material Package
- //
- m_MaterialPackage = new MaterialPackage;
- 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);
- 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);
- m_DurationUpdateList.push_back(&(MPTrack.Sequence->Duration));
-
- MPTrack.Clip = new SourceClip;
- m_HeaderPart.AddChildObject(MPTrack.Clip);
- MPTrack.Sequence->StructuralComponents.push_back(MPTrack.Clip->InstanceUID);
- MPTrack.Clip->DataDefinition = DataDefinition;
- MPTrack.Clip->SourcePackageID = SourcePackageUMID;
- MPTrack.Clip->SourceTrackID = 2;
- m_DurationUpdateList.push_back(&(MPTrack.Clip->Duration));
-
-
- //
- // File (Source) Package
- //
- m_FilePackage = new SourcePackage;
- m_FilePackage->Name = PackageLabel.c_str();
- m_FilePackage->PackageUID = SourcePackageUMID;
- ECD->LinkedPackageUID = SourcePackageUMID;
-
- m_HeaderPart.AddChildObject(m_FilePackage);
- Storage->Packages.push_back(m_FilePackage->InstanceUID);
-
- TrackSet<TimecodeComponent> FPTCTrack = CreateTimecodeTrack<SourcePackage>(m_HeaderPart, *m_FilePackage,
- EditRate, TCFrameRate, ui64_C(3600) * TCFrameRate);
- 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);
- m_DurationUpdateList.push_back(&(FPTrack.Sequence->Duration));
-
- FPTrack.Clip = new SourceClip;
- m_HeaderPart.AddChildObject(FPTrack.Clip);
- FPTrack.Sequence->StructuralComponents.push_back(FPTrack.Clip->InstanceUID);
- FPTrack.Clip->DataDefinition = DataDefinition;
-
- // for now we do not allow setting this value, so all files will be 'original'
- FPTrack.Clip->SourceTrackID = 0;
- FPTrack.Clip->SourcePackageID = NilUMID;
- m_DurationUpdateList.push_back(&(FPTrack.Clip->Duration));
-
- m_EssenceDescriptor->LinkedTrackID = FPTrack.Track->TrackID;
-}