Changeset View
Changeset View
Standalone View
Standalone View
source/blender/sequencer/intern/strip_time.c
| Show All 37 Lines | |||||
| #include "SEQ_render.h" | #include "SEQ_render.h" | ||||
| #include "SEQ_sequencer.h" | #include "SEQ_sequencer.h" | ||||
| #include "SEQ_time.h" | #include "SEQ_time.h" | ||||
| #include "strip_time.h" | #include "strip_time.h" | ||||
| #include "utils.h" | #include "utils.h" | ||||
| float seq_give_frame_index(Sequence *seq, float timeline_frame) | static float seq_time_playback_rate_factor_get(const Scene *scene, const Sequence *seq) | ||||
| { | |||||
| float scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base; | |||||
| return seq->playback_rate / scene_playback_rate; | |||||
| } | |||||
| float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_frame) | |||||
| { | { | ||||
| float frame_index; | float frame_index; | ||||
| int sta = seq->start; | int sta = seq->start; | ||||
| int end = seq->start + seq->len - 1; | int end = seq->start + seq->len - 1; | ||||
| if (seq->type & SEQ_TYPE_EFFECT) { | if (seq->type & SEQ_TYPE_EFFECT) { | ||||
| end = seq->enddisp; | end = seq->enddisp; | ||||
| } | } | ||||
| if (end < sta) { | if (end < sta) { | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| if (seq->flag & SEQ_REVERSE_FRAMES) { | if (seq->flag & SEQ_REVERSE_FRAMES) { | ||||
| /*reverse frame in this sequence */ | |||||
| if (timeline_frame <= sta) { | |||||
| frame_index = end - sta; | |||||
| } | |||||
| else if (timeline_frame >= end) { | |||||
| frame_index = 0; | |||||
| } | |||||
| else { | |||||
| frame_index = end - timeline_frame; | frame_index = end - timeline_frame; | ||||
| } | } | ||||
| } | |||||
| else { | |||||
| if (timeline_frame <= sta) { | |||||
| frame_index = 0; | |||||
| } | |||||
| else if (timeline_frame >= end) { | |||||
| frame_index = end - sta; | |||||
| } | |||||
| else { | else { | ||||
| frame_index = timeline_frame - sta; | frame_index = timeline_frame - sta; | ||||
| } | } | ||||
| } | |||||
| frame_index *= seq_time_playback_rate_factor_get(scene, seq); | |||||
| /* Clamp frame index to strip frame range. */ | |||||
| frame_index = clamp_i(frame_index, 0, end - sta); | |||||
| if (seq->strobe < 1.0f) { | if (seq->strobe < 1.0f) { | ||||
| seq->strobe = 1.0f; | seq->strobe = 1.0f; | ||||
| } | } | ||||
| if (seq->strobe > 1.0f) { | if (seq->strobe > 1.0f) { | ||||
| frame_index -= fmodf((double)frame_index, (double)seq->strobe); | frame_index -= fmodf((double)frame_index, (double)seq->strobe); | ||||
| } | } | ||||
| return frame_index; | return frame_index; | ||||
| } | } | ||||
| /* Length of strip content in frames. This is number of original frames adjusted by playback rate | |||||
| * factor */ | |||||
| int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) | |||||
| { | |||||
| return seq->len / seq_time_playback_rate_factor_get(scene, seq); | |||||
| } | |||||
| static int metaseq_start(Sequence *metaseq) | static int metaseq_start(Sequence *metaseq) | ||||
| { | { | ||||
| return metaseq->start + metaseq->startofs; | return metaseq->start + metaseq->startofs; | ||||
| } | } | ||||
| static int metaseq_end(Sequence *metaseq) | static int metaseq_end(Sequence *metaseq) | ||||
| { | { | ||||
| return metaseq->start + metaseq->len - metaseq->endofs; | return metaseq->start + metaseq->len - metaseq->endofs; | ||||
| ▲ Show 20 Lines • Show All 46 Lines • ▼ Show 20 Lines | void SEQ_time_update_sequence_bounds(Scene *scene, Sequence *seq) | ||||
| if (seq->startofs && seq->startstill) { | if (seq->startofs && seq->startstill) { | ||||
| seq->startstill = 0; | seq->startstill = 0; | ||||
| } | } | ||||
| if (seq->endofs && seq->endstill) { | if (seq->endofs && seq->endstill) { | ||||
| seq->endstill = 0; | seq->endstill = 0; | ||||
| } | } | ||||
| seq->startdisp = seq->start + seq->startofs - seq->startstill; | seq->startdisp = seq->start + seq->startofs - seq->startstill; | ||||
| seq->enddisp = seq->start + seq->len - seq->endofs + seq->endstill; | seq->enddisp = seq->start + SEQ_time_strip_length_get(scene, seq) - seq->endofs + seq->endstill; | ||||
| if (seq->type == SEQ_TYPE_META) { | if (seq->type == SEQ_TYPE_META) { | ||||
| seq_update_sound_bounds_recursive(scene, seq); | seq_update_sound_bounds_recursive(scene, seq); | ||||
| } | } | ||||
| } | } | ||||
| void SEQ_time_update_sequence(Scene *scene, Sequence *seq) | void SEQ_time_update_sequence(Scene *scene, Sequence *seq) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 250 Lines • Show Last 20 Lines | |||||