void RDD9Track::AddHeaderMetadata(HeaderMetadata *header_metadata, MaterialPackage *material_package, SourcePackage *file_source_package) { mxfUL data_def = (mIsPicture ? MXF_DDEF_L(Picture) : MXF_DDEF_L(Sound)); 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 // Preface - ContentStorage - MaterialPackage - Timeline Track Track *track = new Track(header_metadata); material_package->appendTracks(track); track->setTrackName(get_track_name((mIsPicture ? MXF_PICTURE_DDEF : MXF_SOUND_DDEF), mOutputTrackNumber)); track->setTrackID(mTrackId); // TODO: not sure whether setting TrackNumber in the MaterialPackage is a good idea for this MXF flavour // track->setTrackNumber(mOutputTrackNumber); track->setTrackNumber(0); track->setEditRate(mEditRate); track->setOrigin(0); // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence Sequence *sequence = new Sequence(header_metadata); track->setSequence(sequence); sequence->setDataDefinition(data_def); sequence->setDuration(material_track_duration); // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence - SourceClip SourceClip *source_clip = new SourceClip(header_metadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(data_def); source_clip->setDuration(material_track_duration); source_clip->setStartPosition(0); source_clip->setSourcePackageID(file_source_package->getPackageUID()); source_clip->setSourceTrackID(mTrackId); // Preface - ContentStorage - SourcePackage - Timeline Track track = new Track(header_metadata); file_source_package->appendTracks(track); track->setTrackName(get_track_name((mIsPicture ? MXF_PICTURE_DDEF : MXF_SOUND_DDEF), mOutputTrackNumber)); track->setTrackID(mTrackId); track->setTrackNumber(mTrackNumber); track->setEditRate(mEditRate); track->setOrigin(source_track_origin); // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence sequence = new Sequence(header_metadata); track->setSequence(sequence); sequence->setDataDefinition(data_def); sequence->setDuration(source_track_duration); // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence - SourceClip source_clip = new SourceClip(header_metadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(data_def); source_clip->setDuration(source_track_duration); source_clip->setStartPosition(0); source_clip->setSourceTrackID(0); source_clip->setSourcePackageID(g_Null_UMID); // Preface - ContentStorage - SourcePackage - FileDescriptor FileDescriptor *descriptor = mDescriptorHelper->CreateFileDescriptor(header_metadata); BMX_ASSERT(file_source_package->haveDescriptor()); MultipleDescriptor *mult_descriptor = dynamic_cast<MultipleDescriptor*>(file_source_package->getDescriptor()); BMX_ASSERT(mult_descriptor); mult_descriptor->appendSubDescriptorUIDs(descriptor); descriptor->setLinkedTrackID(mTrackId); }
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 OP1ATrack::AddHeaderMetadata(HeaderMetadata *header_metadata, MaterialPackage *material_package, SourcePackage *file_source_package) { mxfUL data_def_ul; BMX_CHECK(mxf_get_ddef_label(mDataDef, &data_def_ul)); 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 (mOP1AFile->mSupportCompleteSinglePass) { material_track_duration = mOP1AFile->mInputDuration - mOP1AFile->mOutputStartOffset + mOP1AFile->mOutputEndOffset; if (material_track_duration < 0) material_track_duration = 0; source_track_duration = mOP1AFile->mInputDuration + mOP1AFile->mOutputEndOffset; source_track_origin = mOP1AFile->mOutputStartOffset; } // Preface - ContentStorage - MaterialPackage - Timeline Track Track *track = new Track(header_metadata); material_package->appendTracks(track); track->setTrackName(get_track_name(mDataDef, mOutputTrackNumber)); track->setTrackID(mTrackId); track->setTrackNumber(mOutputTrackNumber); track->setEditRate(mEditRate); track->setOrigin(0); // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence Sequence *sequence = new Sequence(header_metadata); track->setSequence(sequence); sequence->setDataDefinition(data_def_ul); sequence->setDuration(material_track_duration); // Preface - ContentStorage - MaterialPackage - Timeline Track - Sequence - SourceClip SourceClip *source_clip = new SourceClip(header_metadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(data_def_ul); source_clip->setDuration(material_track_duration); source_clip->setStartPosition(0); source_clip->setSourcePackageID(file_source_package->getPackageUID()); source_clip->setSourceTrackID(mTrackId); // Preface - ContentStorage - SourcePackage - Timeline Track track = new Track(header_metadata); file_source_package->appendTracks(track); track->setTrackName(get_track_name(mDataDef, mOutputTrackNumber)); track->setTrackID(mTrackId); track->setTrackNumber(mTrackNumber); track->setEditRate(mEditRate); track->setOrigin(source_track_origin); // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence sequence = new Sequence(header_metadata); track->setSequence(sequence); sequence->setDataDefinition(data_def_ul); sequence->setDuration(source_track_duration); // Preface - ContentStorage - SourcePackage - Timeline Track - Sequence - SourceClip source_clip = new SourceClip(header_metadata); sequence->appendStructuralComponents(source_clip); source_clip->setDataDefinition(data_def_ul); source_clip->setDuration(source_track_duration); 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(header_metadata); if (file_source_package->haveDescriptor()) { MultipleDescriptor *mult_descriptor = dynamic_cast<MultipleDescriptor*>(file_source_package->getDescriptor()); BMX_ASSERT(mult_descriptor); mult_descriptor->appendSubDescriptorUIDs(descriptor); } else { file_source_package->setDescriptor(descriptor); } descriptor->setLinkedTrackID(mTrackId); if (mOP1AFile->mSupportCompleteSinglePass) descriptor->setContainerDuration(mOP1AFile->mInputDuration); // Preface - ContentStorage - (lower-level) SourcePackage if (mLowerLevelSourcePackage) { header_metadata->getPreface()->getContentStorage()->appendPackages(mLowerLevelSourcePackage); if (!mLowerLevelURI.empty()) { NetworkLocator *network_locator = new NetworkLocator(header_metadata); mLowerLevelSourcePackage->getDescriptor()->appendLocators(network_locator); network_locator->setURLString(mLowerLevelURI); } } }