void OP1AFile::UpdateTrackMetadata(GenericPackage *package, int64_t origin, int64_t duration) { vector<GenericTrack*> tracks = package->getTracks(); size_t i; for (i = 0; i < tracks.size(); i++) { Track *track = dynamic_cast<Track*>(tracks[i]); if (!track) continue; track->setOrigin(origin); Sequence *sequence = dynamic_cast<Sequence*>(track->getSequence()); BMX_ASSERT(sequence); vector<StructuralComponent*> components = sequence->getStructuralComponents(); if (sequence->getDuration() < 0) { sequence->setDuration(duration); BMX_ASSERT(components.size() == 1); components[0]->setDuration(duration); } if (components.size() == 1) { TimecodeComponent *timecode_component = dynamic_cast<TimecodeComponent*>(components[0]); if (timecode_component) { Timecode start_timecode = mStartTimecode; start_timecode.AddOffset(- origin, mFrameRate); timecode_component->setRoundedTimecodeBase(start_timecode.GetRoundedTCBase()); timecode_component->setDropFrame(start_timecode.IsDropFrame()); timecode_component->setStartTimecode(start_timecode.GetOffset()); } } } }
void AS02Track::UpdatePackageMetadata(GenericPackage *package) { SourcePackage *source_package = dynamic_cast<SourcePackage*>(package); FileDescriptor *file_descriptor = 0; if (source_package && source_package->haveDescriptor()) file_descriptor = dynamic_cast<FileDescriptor*>(source_package->getDescriptor()); vector<GenericTrack*> tracks = package->getTracks(); // update track origin in file source package tracks and // duration in sequences, timecode components and source clips size_t i; for (i = 0; i < tracks.size(); i++) { Track *track = dynamic_cast<Track*>(tracks[i]); BMX_ASSERT(track); if (source_package) track->setOrigin(mOutputStartOffset); Sequence *sequence = dynamic_cast<Sequence*>(track->getSequence()); BMX_ASSERT(sequence); vector<StructuralComponent*> components = sequence->getStructuralComponents(); if (sequence->getDuration() < 0) { if (source_package) sequence->setDuration(GetDuration()); else sequence->setDuration(GetOutputDuration(false)); BMX_ASSERT(components.size() == 1); if (source_package) components[0]->setDuration(GetDuration()); else components[0]->setDuration(GetOutputDuration(false)); } if (source_package && components.size() == 1) { TimecodeComponent *timecode_component = dynamic_cast<TimecodeComponent*>(components[0]); if (timecode_component) { 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()); } } } // update the container duration in the file descriptor if (file_descriptor) file_descriptor->setContainerDuration(mContainerDuration); }
void AvidClip::UpdateTrackDurations(AvidTrack *avid_track, Track *track, mxfRational edit_rate, int64_t duration) { int64_t track_duration = convert_duration(edit_rate, duration, track->getEditRate(), ROUND_AUTO); Sequence *sequence = dynamic_cast<Sequence*>(track->getSequence()); BMX_ASSERT(sequence); if (sequence->getDuration() >= 0) { if (sequence->getDuration() < track_duration) log_warn("Existing track duration is less than the essence duration\n"); return; } sequence->setDuration(track_duration); Preface *preface = avid_track->GetHeaderMetadata()->getPreface(); vector<StructuralComponent*> components = sequence->getStructuralComponents(); BMX_CHECK(components.size() == 1); components[0]->setDuration(track_duration); // update duration further down the reference chain SourceClip *source_clip = dynamic_cast<SourceClip*>(components[0]); if (source_clip) { mxfUMID source_package_id = source_clip->getSourcePackageID(); if (source_package_id != g_Null_UMID) { GenericPackage *ref_package = preface->findPackage(source_package_id); if (ref_package) { GenericTrack *ref_gen_track = ref_package->findTrack(source_clip->getSourceTrackID()); if (ref_gen_track) { Track *ref_track = dynamic_cast<Track*>(ref_gen_track); BMX_CHECK(ref_track); UpdateTrackDurations(avid_track, ref_track, track->getEditRate(), source_clip->getStartPosition() + track_duration); } } } } }