void AS02Track::CreateHeaderMetadata() { // Preface Preface *preface = new Preface(mHeaderMetadata); preface->setLastModifiedDate(mClip->mCreationDate); preface->setVersion(MXF_PREFACE_VER(1, 3)); preface->setOperationalPattern(MXF_OP_L(1a, UniTrack_Stream_Internal)); preface->appendEssenceContainers(GetEssenceContainerUL()); preface->setDMSchemes(vector<mxfUL>()); // Preface - Identification Identification *ident = new Identification(mHeaderMetadata); preface->appendIdentifications(ident); ident->initialise(mClip->mCompanyName, mClip->mProductName, mClip->mVersionString, mClip->mProductUID); if (mClip->mProductVersion.major != 0 || mClip->mProductVersion.minor != 0 || mClip->mProductVersion.patch != 0 || mClip->mProductVersion.build != 0 || mClip->mProductVersion.release != 0) { ident->setProductVersion(mClip->mProductVersion); } ident->setModificationDate(mClip->mCreationDate); ident->setThisGenerationUID(mClip->mGenerationUID); // Preface - ContentStorage ContentStorage* content_storage = new ContentStorage(mHeaderMetadata); preface->setContentStorage(content_storage); // Preface - ContentStorage - EssenceContainerData EssenceContainerData *ess_container_data = new EssenceContainerData(mHeaderMetadata); content_storage->appendEssenceContainerData(ess_container_data); ess_container_data->setLinkedPackageUID(mFileSourcePackageUID); ess_container_data->setIndexSID(mIndexSID); ess_container_data->setBodySID(mBodySID); // Preface - ContentStorage - MaterialPackage mMaterialPackage = new MaterialPackage(mHeaderMetadata); content_storage->appendPackages(mMaterialPackage); mMaterialPackage->setPackageUID(mMaterialPackageUID); mMaterialPackage->setPackageCreationDate(mClip->mCreationDate); mMaterialPackage->setPackageModifiedDate(mClip->mCreationDate); if (!mClip->mClipName.empty()) mMaterialPackage->setName(get_track_clip_name(mClip->mClipName, mIsPicture, mOutputTrackNumber)); // Preface - ContentStorage - MaterialPackage - Timecode Track Track *timecode_track = new Track(mHeaderMetadata); mMaterialPackage->appendTracks(timecode_track); timecode_track->setTrackName(TIMECODE_TRACK_NAME); timecode_track->setTrackID(TIMECODE_TRACK_ID); timecode_track->setTrackNumber(0); timecode_track->setEditRate(GetSampleRate()); timecode_track->setOrigin(0); // Preface - ContentStorage - MaterialPackage - Timecode Track - Sequence Sequence *sequence = new Sequence(mHeaderMetadata); timecode_track->setSequence(sequence); sequence->setDataDefinition(MXF_DDEF_L(Timecode)); sequence->setDuration(-1); // updated when writing completed // Preface - ContentStorage - MaterialPackage - Timecode Track - TimecodeComponent TimecodeComponent *timecode_component = new TimecodeComponent(mHeaderMetadata); sequence->appendStructuralComponents(timecode_component); timecode_component->setDataDefinition(MXF_DDEF_L(Timecode)); timecode_component->setDuration(-1); // updated when writing completed timecode_component->setRoundedTimecodeBase(mClip->mStartTimecode.GetRoundedTCBase()); timecode_component->setDropFrame(mClip->mStartTimecode.IsDropFrame()); timecode_component->setStartTimecode(mClip->mStartTimecode.GetOffset()); // Preface - ContentStorage - MaterialPackage - Timeline Track Track *track = new Track(mHeaderMetadata); mMaterialPackage->appendTracks(track); track->setTrackName(mIsPicture ? VIDEO_TRACK_NAME : AUDIO_TRACK_NAME); track->setTrackID(mIsPicture ? VIDEO_TRACK_ID : AUDIO_TRACK_ID); track->setTrackNumber(0); track->setEditRate(GetSampleRate()); track->setOrigin(0); // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence sequence = new Sequence(mHeaderMetadata); track->setSequence(sequence); sequence->setDataDefinition(mIsPicture ? MXF_DDEF_L(Picture) : MXF_DDEF_L(Sound)); sequence->setDuration(-1); // updated when writing completed // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence - SourceClip SourceClip *source_clip = new SourceClip(mHeaderMetadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(mIsPicture ? MXF_DDEF_L(Picture) : MXF_DDEF_L(Sound)); source_clip->setDuration(-1); // updated when writing completed source_clip->setStartPosition(0); source_clip->setSourceTrackID(mIsPicture ? VIDEO_TRACK_ID : AUDIO_TRACK_ID); source_clip->setSourcePackageID(mFileSourcePackageUID); // Preface - ContentStorage - SourcePackage mFileSourcePackage = new SourcePackage(mHeaderMetadata); content_storage->appendPackages(mFileSourcePackage); mFileSourcePackage->setPackageUID(mFileSourcePackageUID); mFileSourcePackage->setPackageCreationDate(mClip->mCreationDate); mFileSourcePackage->setPackageModifiedDate(mClip->mCreationDate); preface->setPrimaryPackage(mFileSourcePackage); // Preface - ContentStorage - SourcePackage - Timecode Track timecode_track = new Track(mHeaderMetadata); mFileSourcePackage->appendTracks(timecode_track); timecode_track->setTrackName(TIMECODE_TRACK_NAME); timecode_track->setTrackID(TIMECODE_TRACK_ID); timecode_track->setTrackNumber(0); timecode_track->setEditRate(GetSampleRate()); timecode_track->setOrigin(0); // could be updated when writing completed // Preface - ContentStorage - SourcePackage - Timecode Track - Sequence sequence = new Sequence(mHeaderMetadata); timecode_track->setSequence(sequence); sequence->setDataDefinition(MXF_DDEF_L(Timecode)); sequence->setDuration(-1); // updated when writing completed // Preface - ContentStorage - SourcePackage - Timecode Track - TimecodeComponent timecode_component = new TimecodeComponent(mHeaderMetadata); sequence->appendStructuralComponents(timecode_component); timecode_component->setDataDefinition(MXF_DDEF_L(Timecode)); timecode_component->setDuration(-1); // updated when writing completed Timecode sp_start_timecode = mClip->mStartTimecode; sp_start_timecode.AddOffset(- mOutputStartOffset, GetSampleRate()); timecode_component->setRoundedTimecodeBase(sp_start_timecode.GetRoundedTCBase()); timecode_component->setDropFrame(sp_start_timecode.IsDropFrame()); timecode_component->setStartTimecode(sp_start_timecode.GetOffset()); // Preface - ContentStorage - SourcePackage - Timeline Track track = new Track(mHeaderMetadata); mFileSourcePackage->appendTracks(track); track->setTrackName(mIsPicture ? VIDEO_TRACK_NAME : AUDIO_TRACK_NAME); track->setTrackID(mIsPicture ? VIDEO_TRACK_ID : AUDIO_TRACK_ID); track->setTrackNumber(mTrackNumber); track->setEditRate(GetSampleRate()); track->setOrigin(0); // could be updated when writing completed // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence sequence = new Sequence(mHeaderMetadata); track->setSequence(sequence); sequence->setDataDefinition(mIsPicture ? MXF_DDEF_L(Picture) : MXF_DDEF_L(Sound)); sequence->setDuration(-1); // updated when writing completed // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence - SourceClip source_clip = new SourceClip(mHeaderMetadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(mIsPicture ? MXF_DDEF_L(Picture) : MXF_DDEF_L(Sound)); source_clip->setDuration(-1); // updated when writing completed source_clip->setStartPosition(0); if (mHaveLowerLevelSourcePackage) { source_clip->setSourcePackageID(mLowerLevelSourcePackageUID); source_clip->setSourceTrackID(mLowerLevelTrackId); } else { source_clip->setSourceTrackID(0); source_clip->setSourcePackageID(g_Null_UMID); } // Preface - ContentStorage - SourcePackage - FileDescriptor FileDescriptor *descriptor = mDescriptorHelper->CreateFileDescriptor(mHeaderMetadata); mFileSourcePackage->setDescriptor(descriptor); descriptor->setLinkedTrackID(mIsPicture ? VIDEO_TRACK_ID : AUDIO_TRACK_ID); // Preface - ContentStorage - (lower-level) SourcePackage if (mLowerLevelSourcePackage) { content_storage->appendPackages(mLowerLevelSourcePackage); if (!mLowerLevelURI.empty()) { NetworkLocator *network_locator = new NetworkLocator(mHeaderMetadata); mLowerLevelSourcePackage->getDescriptor()->appendLocators(network_locator); network_locator->setURLString(mLowerLevelURI); } } }
void OP1AFile::CreateHeaderMetadata() { BMX_ASSERT(!mHeaderMetadata); int64_t material_track_duration = -1; // unknown - could be updated if not writing in a single pass int64_t source_track_duration = -1; // unknown - could be updated if not writing in a single pass int64_t source_track_origin = 0; // could be updated if not writing in a single pass if (mSupportCompleteSinglePass) { // values are known and will not be updated material_track_duration = mInputDuration - mOutputStartOffset + mOutputEndOffset; if (material_track_duration < 0) material_track_duration = 0; source_track_duration = mInputDuration + mOutputEndOffset; source_track_origin = mOutputStartOffset; } // create the header metadata mDataModel = new DataModel(); mHeaderMetadata = new HeaderMetadata(mDataModel); // Preface Preface *preface = new Preface(mHeaderMetadata); preface->setLastModifiedDate(mCreationDate); preface->setVersion((mFlavour & OP1A_377_2004_FLAVOUR) ? MXF_PREFACE_VER(1, 2) : MXF_PREFACE_VER(1, 3)); if (mTracks.size() <= 1) preface->setOperationalPattern(MXF_OP_L(1a, UniTrack_Stream_Internal)); else preface->setOperationalPattern(MXF_OP_L(1a, MultiTrack_Stream_Internal)); set<mxfUL>::const_iterator iter; for (iter = mEssenceContainerULs.begin(); iter != mEssenceContainerULs.end(); iter++) preface->appendEssenceContainers(*iter); preface->setDMSchemes(vector<mxfUL>()); if ((mFlavour & OP1A_ARD_ZDF_HDF_PROFILE_FLAVOUR)) preface->setIsRIPPresent(true); // Preface - Identification Identification *ident = new Identification(mHeaderMetadata); preface->appendIdentifications(ident); ident->initialise(mCompanyName, mProductName, mVersionString, mProductUID); if (mProductVersion.major != 0 || mProductVersion.minor != 0 || mProductVersion.patch != 0 || mProductVersion.build != 0 || mProductVersion.release != 0) { ident->setProductVersion(mProductVersion); } ident->setModificationDate(mCreationDate); ident->setThisGenerationUID(mGenerationUID); // Preface - ContentStorage ContentStorage* content_storage = new ContentStorage(mHeaderMetadata); preface->setContentStorage(content_storage); // Preface - ContentStorage - EssenceContainerData EssenceContainerData *ess_container_data = new EssenceContainerData(mHeaderMetadata); content_storage->appendEssenceContainerData(ess_container_data); ess_container_data->setLinkedPackageUID(mFileSourcePackageUID); ess_container_data->setIndexSID(INDEX_SID); ess_container_data->setBodySID(BODY_SID); // Preface - ContentStorage - MaterialPackage mMaterialPackage = new MaterialPackage(mHeaderMetadata); content_storage->appendPackages(mMaterialPackage); mMaterialPackage->setPackageUID(mMaterialPackageUID); mMaterialPackage->setPackageCreationDate(mCreationDate); mMaterialPackage->setPackageModifiedDate(mCreationDate); if (!mClipName.empty()) mMaterialPackage->setName(mClipName); // Preface - ContentStorage - MaterialPackage - Timecode Track Track *timecode_track = new Track(mHeaderMetadata); mMaterialPackage->appendTracks(timecode_track); timecode_track->setTrackName(TIMECODE_TRACK_NAME); timecode_track->setTrackID(TIMECODE_TRACK_ID); timecode_track->setTrackNumber(0); timecode_track->setEditRate(mEditRate); timecode_track->setOrigin(0); // Preface - ContentStorage - MaterialPackage - Timecode Track - Sequence Sequence *sequence = new Sequence(mHeaderMetadata); timecode_track->setSequence(sequence); sequence->setDataDefinition(MXF_DDEF_L(Timecode)); sequence->setDuration(material_track_duration); // Preface - ContentStorage - MaterialPackage - Timecode Track - TimecodeComponent TimecodeComponent *timecode_component = new TimecodeComponent(mHeaderMetadata); sequence->appendStructuralComponents(timecode_component); timecode_component->setDataDefinition(MXF_DDEF_L(Timecode)); timecode_component->setDuration(material_track_duration); timecode_component->setRoundedTimecodeBase(mStartTimecode.GetRoundedTCBase()); timecode_component->setDropFrame(mStartTimecode.IsDropFrame()); timecode_component->setStartTimecode(mStartTimecode.GetOffset()); // Preface - ContentStorage - SourcePackage mFileSourcePackage = new SourcePackage(mHeaderMetadata); content_storage->appendPackages(mFileSourcePackage); mFileSourcePackage->setPackageUID(mFileSourcePackageUID); mFileSourcePackage->setPackageCreationDate(mCreationDate); mFileSourcePackage->setPackageModifiedDate(mCreationDate); // Preface - ContentStorage - SourcePackage - Timecode Track timecode_track = new Track(mHeaderMetadata); mFileSourcePackage->appendTracks(timecode_track); timecode_track->setTrackName(TIMECODE_TRACK_NAME); timecode_track->setTrackID(TIMECODE_TRACK_ID); timecode_track->setTrackNumber(0); timecode_track->setEditRate(mEditRate); timecode_track->setOrigin(source_track_origin); // Preface - ContentStorage - SourcePackage - Timecode Track - Sequence sequence = new Sequence(mHeaderMetadata); timecode_track->setSequence(sequence); sequence->setDataDefinition(MXF_DDEF_L(Timecode)); sequence->setDuration(source_track_duration); // Preface - ContentStorage - SourcePackage - Timecode Track - TimecodeComponent timecode_component = new TimecodeComponent(mHeaderMetadata); sequence->appendStructuralComponents(timecode_component); timecode_component->setDataDefinition(MXF_DDEF_L(Timecode)); timecode_component->setDuration(source_track_duration); Timecode sp_start_timecode = mStartTimecode; sp_start_timecode.AddOffset(- mOutputStartOffset, mFrameRate); timecode_component->setRoundedTimecodeBase(sp_start_timecode.GetRoundedTCBase()); timecode_component->setDropFrame(sp_start_timecode.IsDropFrame()); timecode_component->setStartTimecode(sp_start_timecode.GetOffset()); // Preface - ContentStorage - SourcePackage - (Multiple) File Descriptor if (mTracks.size() > 1) { MultipleDescriptor *mult_descriptor = new MultipleDescriptor(mHeaderMetadata); mFileSourcePackage->setDescriptor(mult_descriptor); mult_descriptor->setSampleRate(mEditRate); mult_descriptor->setEssenceContainer(MXF_EC_L(MultipleWrappings)); if (mSupportCompleteSinglePass) mult_descriptor->setContainerDuration(mInputDuration); } // MaterialPackage and file SourcePackage Tracks and FileDescriptor size_t i; for (i = 0; i < mTracks.size(); i++) mTracks[i]->AddHeaderMetadata(mHeaderMetadata, mMaterialPackage, mFileSourcePackage); }