Exemplo n.º 1
0
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());
            }
        }
    }
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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);
                }
            }
        }
    }
}