From 2eb7847c4ce31d33642e9c7e4ce24e66a197de41 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Mon, 6 Mar 2023 22:26:32 +0100 Subject: [PATCH 1/9] VSE: Use seconds to define strip length and position --- .../editors/space_sequencer/sequencer_draw.c | 12 +-- .../editors/space_sequencer/sequencer_edit.c | 11 +-- .../space_sequencer/sequencer_thumbnails.c | 2 +- .../transform/transform_convert_sequencer.c | 5 +- .../transform/transform_snap_sequencer.c | 3 +- source/blender/makesdna/DNA_sequence_types.h | 6 +- .../blender/makesrna/intern/rna_sequencer.c | 8 +- .../makesrna/intern/rna_sequencer_api.c | 4 +- source/blender/sequencer/SEQ_time.h | 9 +- source/blender/sequencer/SEQ_utils.h | 3 +- source/blender/sequencer/intern/disk_cache.c | 2 +- source/blender/sequencer/intern/image_cache.c | 6 +- source/blender/sequencer/intern/image_cache.h | 4 +- source/blender/sequencer/intern/render.c | 4 +- source/blender/sequencer/intern/strip_add.c | 89 ++++++++++--------- source/blender/sequencer/intern/strip_edit.c | 4 +- .../sequencer/intern/strip_retiming.cc | 4 +- source/blender/sequencer/intern/strip_time.c | 44 ++++++--- .../sequencer/intern/strip_transform.c | 2 +- source/blender/sequencer/intern/utils.c | 7 +- 20 files changed, 137 insertions(+), 92 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 5276914346d..c5b8b9da6d2 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -542,7 +542,7 @@ static void drawmeta_contents(Scene *scene, ListBase *meta_channels; int offset; - meta_seqbase = SEQ_get_seqbase_from_sequence(seqm, &meta_channels, &offset); + meta_seqbase = SEQ_get_seqbase_from_sequence(scene, seqm, &meta_channels, &offset); if (!meta_seqbase || BLI_listbase_is_empty(meta_seqbase)) { return; @@ -961,7 +961,7 @@ static void draw_sequence_extensions_overlay( col[3] = SEQ_render_is_muted(channels, seq) ? MUTE_ALPHA : 200; UI_GetColorPtrShade3ubv(col, blend_col, 10); - const float strip_content_start = SEQ_time_start_frame_get(seq); + const float strip_content_start = SEQ_time_start_frame_get(scene, seq); const float strip_content_end = SEQ_time_content_end_frame_get(scene, seq); float right_handle_frame = SEQ_time_right_handle_frame_get(scene, seq); float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq); @@ -1089,7 +1089,7 @@ static void draw_seq_background(Scene *scene, if (SEQ_time_has_left_still_frames(scene, seq)) { float left_handle_frame = SEQ_time_left_handle_frame_get(scene, seq); - const float content_start = SEQ_time_start_frame_get(seq); + const float content_start = SEQ_time_start_frame_get(scene, seq); immRectf(pos, left_handle_frame, y1, content_start, y2); } if (SEQ_time_has_right_still_frames(scene, seq)) { @@ -1312,7 +1312,7 @@ static void draw_seq_strip(const bContext *C, SEQ_TIMELINE_SHOW_STRIP_COLOR_TAG); /* Draw strip body. */ - x1 = SEQ_time_has_left_still_frames(scene, seq) ? SEQ_time_start_frame_get(seq) : + x1 = SEQ_time_has_left_still_frames(scene, seq) ? SEQ_time_start_frame_get(scene, seq) : SEQ_time_left_handle_frame_get(scene, seq); y1 = seq->machine + SEQ_STRIP_OFSBOTTOM; x2 = SEQ_time_has_right_still_frames(scene, seq) ? SEQ_time_content_end_frame_get(scene, seq) : @@ -2282,8 +2282,8 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *region) if (seq == last_seq && (last_seq->flag & SELECT)) { continue; } - if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), SEQ_time_start_frame_get(seq)) > - v2d->cur.xmax) { + if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), + SEQ_time_start_frame_get(scene, seq)) > v2d->cur.xmax) { continue; } if (max_ii(SEQ_time_right_handle_frame_get(scene, seq), diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 1c5063b8aac..457229b70e9 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -77,11 +77,12 @@ * \{ */ typedef struct TransSeq { - int start, machine; - int startofs, endofs; + double start; + int machine; + double startofs, endofs; int anim_startofs, anim_endofs; /* int final_left, final_right; */ /* UNUSED */ - int len; + double len; float content_start; } TransSeq; @@ -475,7 +476,7 @@ typedef struct SlipData { static void transseq_backup(TransSeq *ts, Sequence *seq) { - ts->content_start = SEQ_time_start_frame_get(seq); + // ts->content_start = SEQ_time_start_frame_get(seq); //XXX ts->start = seq->start; ts->machine = seq->machine; ts->startofs = seq->startofs; @@ -3592,7 +3593,7 @@ static int sequencer_scene_frame_range_update_exec(bContext *C, wmOperator *UNUS Scene *target_scene = seq->scene; - seq->len = target_scene->r.efra - target_scene->r.sfra + 1; + SEQ_time_strip_length_set(scene, seq, target_scene->r.efra - target_scene->r.sfra + 1); SEQ_time_left_handle_frame_set(scene, seq, old_start); SEQ_time_right_handle_frame_set(scene, seq, old_end); diff --git a/source/blender/editors/space_sequencer/sequencer_thumbnails.c b/source/blender/editors/space_sequencer/sequencer_thumbnails.c index d1606b14152..ef8cb9063de 100644 --- a/source/blender/editors/space_sequencer/sequencer_thumbnails.c +++ b/source/blender/editors/space_sequencer/sequencer_thumbnails.c @@ -74,7 +74,7 @@ static bool check_seq_need_thumbnails(const Scene *scene, Sequence *seq, rctf *v if (!ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_IMAGE)) { return false; } - if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), SEQ_time_start_frame_get(seq)) > + if (min_ii(SEQ_time_left_handle_frame_get(scene, seq), SEQ_time_start_frame_get(scene, seq)) > view_area->xmax) { return false; } diff --git a/source/blender/editors/transform/transform_convert_sequencer.c b/source/blender/editors/transform/transform_convert_sequencer.c index 8a42ac8a73d..168d4896be2 100644 --- a/source/blender/editors/transform/transform_convert_sequencer.c +++ b/source/blender/editors/transform/transform_convert_sequencer.c @@ -180,7 +180,8 @@ static TransData *SeqToTransData(Scene *scene, * tdsq->start_offset is used when flushing the tx data back */ start_left = SEQ_time_left_handle_frame_get(scene, seq); td2d->loc[0] = start_left; - tdsq->start_offset = start_left - seq->start; /* use to apply the original location */ + tdsq->start_offset = start_left - SEQ_time_start_frame_get( + scene, seq); /* use to apply the original location */ break; case SEQ_LEFTSEL: start_left = SEQ_time_left_handle_frame_get(scene, seq); @@ -602,7 +603,7 @@ static void flushTransSeq(TransInfo *t) switch (tdsq->sel_flag) { case SELECT: { if (SEQ_transform_sequence_can_be_translated(seq)) { - offset = new_frame - tdsq->start_offset - seq->start; + offset = new_frame - tdsq->start_offset - SEQ_time_start_frame_get(scene, seq); SEQ_transform_translate_sequence(scene, seq, offset); if (abs(offset) > abs(max_offset)) { max_offset = offset; diff --git a/source/blender/editors/transform/transform_snap_sequencer.c b/source/blender/editors/transform/transform_snap_sequencer.c index 0fda2c64867..36806c64966 100644 --- a/source/blender/editors/transform/transform_snap_sequencer.c +++ b/source/blender/editors/transform/transform_snap_sequencer.c @@ -208,7 +208,8 @@ static void seq_snap_target_points_build(Scene *scene, int content_end = max_ii(SEQ_time_right_handle_frame_get(scene, seq), SEQ_time_content_end_frame_get(scene, seq)); /* Effects and single image strips produce incorrect content length. Skip these strips. */ - if ((seq->type & SEQ_TYPE_EFFECT) != 0 || seq->len == 1) { + if ((seq->type & SEQ_TYPE_EFFECT) != 0 || + seq->len == 1) { // XXX - this has to have some flag. it can't rely on precise length. content_start = SEQ_time_left_handle_frame_get(scene, seq); content_end = SEQ_time_right_handle_frame_get(scene, seq); } diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index e64f3f1ab24..b216e258ebf 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -152,17 +152,17 @@ typedef struct Sequence { /** Flags bitmap (see below) and the type of sequence. */ int flag, type; /** The length of the contents of this strip - before handles are applied. */ - int len; + double len; /** * Start frame of contents of strip in absolute frame coordinates. * For metastrips start of first strip startdisp. */ - float start; + double start; /** * Frames after the first frame where display starts, * frames before the last frame where display ends. */ - float startofs, endofs; + double startofs, endofs; /** * Frames that use the first frame before data begins, * frames that use the last frame after data ends. diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 369cde9cc89..28b2e49513d 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -345,7 +345,7 @@ static int rna_Sequence_retiming_handle_frame_get(PointerRNA *ptr) return 0; } - return SEQ_time_start_frame_get(seq) + handle->strip_frame_index; + return SEQ_time_start_frame_get(scene, seq) + handle->strip_frame_index; } static void rna_Sequence_retiming_handle_frame_set(PointerRNA *ptr, int value) @@ -358,7 +358,7 @@ static void rna_Sequence_retiming_handle_frame_set(PointerRNA *ptr, int value) return; } - const int offset = value - SEQ_time_start_frame_get(seq) + handle->strip_frame_index; + const int offset = value - SEQ_time_start_frame_get(scene, seq) + handle->strip_frame_index; SEQ_retiming_offset_handle(scene, seq, handle, offset); SEQ_relations_invalidate_cache_raw(scene, seq); } @@ -2095,6 +2095,7 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Lock", "Lock strip so that it cannot be transformed"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, NULL); +# if 0 /* strip positioning */ /* Cache has to be invalidated before and after transformation. */ prop = RNA_def_property(srna, "frame_final_duration", PROP_INT, PROP_TIME); @@ -2120,7 +2121,7 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Start Frame", "X position where the strip begins"); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 3, 0); - RNA_def_property_float_funcs( + /* RNA_def_property_float_funcs( prop, NULL, "rna_Sequence_start_frame_set", NULL); /* overlap tests and calc_seq_disp */ RNA_def_property_editable_func(prop, "rna_Sequence_frame_editable"); RNA_def_property_update( @@ -2170,6 +2171,7 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_float_funcs( prop, NULL, "rna_Sequence_frame_offset_end_set", "rna_Sequence_frame_offset_end_range"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update"); +# endif prop = RNA_def_property(srna, "channel", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "machine"); diff --git a/source/blender/makesrna/intern/rna_sequencer_api.c b/source/blender/makesrna/intern/rna_sequencer_api.c index 8175416eda4..4e9b0d1bedd 100644 --- a/source/blender/makesrna/intern/rna_sequencer_api.c +++ b/source/blender/makesrna/intern/rna_sequencer_api.c @@ -576,9 +576,9 @@ static StripElem *rna_SequenceElements_append(ID *id, Sequence *seq, const char seq->strip->stripdata = se = MEM_reallocN(seq->strip->stripdata, sizeof(StripElem) * (seq->len + 1)); - se += seq->len; + /* se += seq->len; // XXX get size of se before realloc... BLI_strncpy(se->name, filename, sizeof(se->name)); - seq->len++; + seq->len++;*/ WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, scene); diff --git a/source/blender/sequencer/SEQ_time.h b/source/blender/sequencer/SEQ_time.h index 45ec3bbc8ae..a9dffc5de91 100644 --- a/source/blender/sequencer/SEQ_time.h +++ b/source/blender/sequencer/SEQ_time.h @@ -111,6 +111,10 @@ void SEQ_time_right_handle_frame_set(const struct Scene *scene, * This can change depending on scene FPS or strip speed factor. */ int SEQ_time_strip_length_get(const struct Scene *scene, const struct Sequence *seq); +void SEQ_time_strip_length_set(const struct Scene *scene, + struct Sequence *seq, + const double length_in_frames); + /** * Set strip playback speed. * Strip length is affected by changing speed factor. @@ -121,7 +125,7 @@ void SEQ_time_speed_factor_set(const struct Scene *scene, /** * Get timeline frame where strip content starts. */ -float SEQ_time_start_frame_get(const struct Sequence *seq); +float SEQ_time_start_frame_get(const struct Scene *scene, const struct Sequence *seq); /** * Get timeline frame where strip content ends. */ @@ -136,6 +140,9 @@ void SEQ_time_start_frame_set(const struct Scene *scene, struct Sequence *seq, i * \note this function is currently only used internally and in versioning code. */ void SEQ_time_update_meta_strip_range(const struct Scene *scene, struct Sequence *seq_meta); +double SEQ_time_frames_to_seconds(const struct Scene *scene, const double frames); +int SEQ_time_seconds_to_frames(const struct Scene *scene, const double seconds); + #ifdef __cplusplus } #endif diff --git a/source/blender/sequencer/SEQ_utils.h b/source/blender/sequencer/SEQ_utils.h index f1679012ef3..a93b14e8df8 100644 --- a/source/blender/sequencer/SEQ_utils.h +++ b/source/blender/sequencer/SEQ_utils.h @@ -23,7 +23,8 @@ void SEQ_sequence_base_unique_name_recursive(struct Scene *scene, struct ListBase *seqbasep, struct Sequence *seq); const char *SEQ_sequence_give_name(struct Sequence *seq); -struct ListBase *SEQ_get_seqbase_from_sequence(struct Sequence *seq, +struct ListBase *SEQ_get_seqbase_from_sequence(const struct Scene *scene, + struct Sequence *seq, struct ListBase **channels, int *r_offset); const struct Sequence *SEQ_get_topmost_sequence(const struct Scene *scene, int frame); diff --git a/source/blender/sequencer/intern/disk_cache.c b/source/blender/sequencer/intern/disk_cache.c index beb2c77b003..585afd41d59 100644 --- a/source/blender/sequencer/intern/disk_cache.c +++ b/source/blender/sequencer/intern/disk_cache.c @@ -391,7 +391,7 @@ static void seq_disk_cache_delete_invalid_files(SeqDiskCache *disk_cache, if (cache_file->cache_type & invalidate_types) { if (STREQ(cache_dir, cache_file->dir)) { int timeline_frame_start = seq_cache_frame_index_to_timeline_frame( - seq, cache_file->start_frame); + scene, seq, cache_file->start_frame); if (timeline_frame_start > range_start && timeline_frame_start <= range_end) { seq_disk_cache_delete_file(disk_cache, cache_file); } diff --git a/source/blender/sequencer/intern/image_cache.c b/source/blender/sequencer/intern/image_cache.c index 21ce2cbdf9a..cc63bbb4079 100644 --- a/source/blender/sequencer/intern/image_cache.c +++ b/source/blender/sequencer/intern/image_cache.c @@ -145,12 +145,12 @@ static float seq_cache_timeline_frame_to_frame_index(Scene *scene, return seq_give_frame_index(scene, seq, timeline_frame); } - return timeline_frame - SEQ_time_start_frame_get(seq); + return timeline_frame - SEQ_time_start_frame_get(scene, seq); } -float seq_cache_frame_index_to_timeline_frame(Sequence *seq, float frame_index) +float seq_cache_frame_index_to_timeline_frame(const Scene *scene, Sequence *seq, float frame_index) { - return frame_index + SEQ_time_start_frame_get(seq); + return frame_index + SEQ_time_start_frame_get(scene, seq); } static SeqCache *seq_cache_get_from_scene(Scene *scene) diff --git a/source/blender/sequencer/intern/image_cache.h b/source/blender/sequencer/intern/image_cache.h index 7b7e020c926..ac83223ee6d 100644 --- a/source/blender/sequencer/intern/image_cache.h +++ b/source/blender/sequencer/intern/image_cache.h @@ -69,7 +69,9 @@ void seq_cache_cleanup_sequence(struct Scene *scene, bool force_seq_changed_range); void seq_cache_thumbnail_cleanup(Scene *scene, rctf *view_area); bool seq_cache_is_full(void); -float seq_cache_frame_index_to_timeline_frame(struct Sequence *seq, float frame_index); +float seq_cache_frame_index_to_timeline_frame(const struct Scene *scene, + struct Sequence *seq, + float frame_index); #ifdef __cplusplus } diff --git a/source/blender/sequencer/intern/render.c b/source/blender/sequencer/intern/render.c index 65ba8bf48fe..9593657ffb5 100644 --- a/source/blender/sequencer/intern/render.c +++ b/source/blender/sequencer/intern/render.c @@ -1625,7 +1625,7 @@ static ImBuf *do_render_strip_seqbase(const SeqRenderData *context, ListBase *channels = NULL; int offset; - seqbase = SEQ_get_seqbase_from_sequence(seq, &channels, &offset); + seqbase = SEQ_get_seqbase_from_sequence(context->scene, seq, &channels, &offset); if (seqbase && !BLI_listbase_is_empty(seqbase)) { @@ -2168,7 +2168,7 @@ void SEQ_render_thumbnails(const SeqRenderData *context, int SEQ_render_thumbnails_guaranteed_set_frame_step_get(const Scene *scene, const Sequence *seq) { const int content_start = max_ii(SEQ_time_left_handle_frame_get(scene, seq), - SEQ_time_start_frame_get(seq)); + SEQ_time_start_frame_get(scene, seq)); const int content_end = min_ii(SEQ_time_right_handle_frame_get(scene, seq), SEQ_time_content_end_frame_get(scene, seq)); const int content_len = content_end - content_start; diff --git a/source/blender/sequencer/intern/strip_add.c b/source/blender/sequencer/intern/strip_add.c index 89da6bb1769..5870d89815e 100644 --- a/source/blender/sequencer/intern/strip_add.c +++ b/source/blender/sequencer/intern/strip_add.c @@ -127,7 +127,7 @@ Sequence *SEQ_add_scene_strip(Scene *scene, ListBase *seqbase, struct SeqLoadDat Sequence *seq = SEQ_sequence_alloc( seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_SCENE); seq->scene = load_data->scene; - seq->len = load_data->scene->r.efra - load_data->scene->r.sfra + 1; + SEQ_time_strip_length_set(scene, seq, load_data->scene->r.efra - load_data->scene->r.sfra + 1); id_us_ensure_real((ID *)load_data->scene); seq_add_set_name(scene, seq, load_data); seq_add_generic_update(scene, seq); @@ -139,7 +139,7 @@ Sequence *SEQ_add_movieclip_strip(Scene *scene, ListBase *seqbase, struct SeqLoa Sequence *seq = SEQ_sequence_alloc( seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_MOVIECLIP); seq->clip = load_data->clip; - seq->len = BKE_movieclip_get_duration(load_data->clip); + SEQ_time_strip_length_set(scene, seq, BKE_movieclip_get_duration(load_data->clip)); id_us_ensure_real((ID *)load_data->clip); seq_add_set_name(scene, seq, load_data); seq_add_generic_update(scene, seq); @@ -151,7 +151,7 @@ Sequence *SEQ_add_mask_strip(Scene *scene, ListBase *seqbase, struct SeqLoadData Sequence *seq = SEQ_sequence_alloc( seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_MASK); seq->mask = load_data->mask; - seq->len = BKE_mask_get_duration(load_data->mask); + SEQ_time_strip_length_set(scene, seq, BKE_mask_get_duration(load_data->mask)); id_us_ensure_real((ID *)load_data->mask); seq_add_set_name(scene, seq, load_data); seq_add_generic_update(scene, seq); @@ -175,7 +175,7 @@ Sequence *SEQ_add_effect_strip(Scene *scene, ListBase *seqbase, struct SeqLoadDa } if (!load_data->effect.seq1) { - seq->len = 1; /* Effect is generator, set non zero length. */ + SEQ_time_strip_length_set(scene, seq, 0); /* XXX Effect is generator, set non zero length. */ SEQ_time_right_handle_frame_set(scene, seq, load_data->effect.end_frame); } @@ -194,7 +194,7 @@ void SEQ_add_image_set_directory(Sequence *seq, char *path) void SEQ_add_image_load_file(Scene *scene, Sequence *seq, size_t strip_frame, char *filename) { StripElem *se = SEQ_render_give_stripelem( - scene, seq, SEQ_time_start_frame_get(seq) + strip_frame); + scene, seq, SEQ_time_start_frame_get(scene, seq) + strip_frame); BLI_strncpy(se->name, filename, sizeof(se->name)); } @@ -231,7 +231,7 @@ Sequence *SEQ_add_image_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL { Sequence *seq = SEQ_sequence_alloc( seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_IMAGE); - seq->len = load_data->image.len; + SEQ_time_strip_length_set(scene, seq, load_data->image.len); Strip *strip = seq->strip; strip->stripdata = MEM_callocN(load_data->image.len * sizeof(StripElem), "stripelem"); @@ -315,7 +315,7 @@ Sequence *SEQ_add_sound_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL * nearest frame as the audio track usually overshoots or undershoots the * end frame of the video by a little bit. * See #47135 for under shoot example. */ - seq->len = MAX2(1, round((info.length - sound->offset_time) * FPS)); + SEQ_time_strip_length_set(scene, seq, MAX2(1, round((info.length - sound->offset_time) * FPS))); Strip *strip = seq->strip; /* We only need 1 element to store the filename. */ @@ -438,8 +438,10 @@ Sequence *SEQ_add_movie_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL load_data->r_video_stream_start = IMD_anim_get_offset(anim_arr[0]); } - Sequence *seq = SEQ_sequence_alloc( - seqbase, load_data->start_frame, load_data->channel, SEQ_TYPE_MOVIE); + Sequence *seq = SEQ_sequence_alloc(seqbase, + SEQ_time_frames_to_seconds(scene, load_data->start_frame), + load_data->channel, + SEQ_TYPE_MOVIE); /* Multiview settings. */ if (load_data->use_multiview) { @@ -462,7 +464,7 @@ Sequence *SEQ_add_movie_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL } if (anim_arr[0] != NULL) { - seq->len = IMB_anim_get_duration(anim_arr[0], IMB_TC_RECORD_RUN); + SEQ_time_strip_length_set(scene, seq, IMB_anim_get_duration(anim_arr[0], IMB_TC_RECORD_RUN)); IMB_anim_load_metadata(anim_arr[0]); @@ -479,7 +481,7 @@ Sequence *SEQ_add_movie_strip(Main *bmain, Scene *scene, ListBase *seqbase, SeqL } } - seq->len = MAX2(1, seq->len); + seq->len = MAX2(SEQ_time_frames_to_seconds(scene, 1), seq->len); // XXX if (load_data->adjust_playback_rate) { seq->flag |= SEQ_AUTO_PLAYBACK_RATE; } @@ -528,17 +530,17 @@ void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const boo prev_enddisp = SEQ_time_right_handle_frame_get(scene, seq); } + int length; switch (seq->type) { case SEQ_TYPE_IMAGE: { /* Hack? */ size_t olen = MEM_allocN_len(seq->strip->stripdata) / sizeof(StripElem); - seq->len = olen; - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length = olen - seq->anim_startofs - seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); break; } case SEQ_TYPE_MOVIE: { @@ -604,14 +606,15 @@ void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const boo IMB_anim_load_metadata(sanim->anim); - seq->len = IMB_anim_get_duration( + length = IMB_anim_get_duration( sanim->anim, seq->strip->proxy ? seq->strip->proxy->tc : IMB_TC_RECORD_RUN); - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length -= seq->anim_startofs; + length -= seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); break; } case SEQ_TYPE_MOVIECLIP: @@ -619,48 +622,52 @@ void SEQ_add_reload_new_file(Main *bmain, Scene *scene, Sequence *seq, const boo return; } - seq->len = BKE_movieclip_get_duration(seq->clip); + length = BKE_movieclip_get_duration(seq->clip); - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length -= seq->anim_startofs; + length -= seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); break; case SEQ_TYPE_MASK: if (seq->mask == NULL) { return; } - seq->len = BKE_mask_get_duration(seq->mask); - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length = BKE_mask_get_duration(seq->mask); + length -= seq->anim_startofs; + length -= seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); break; case SEQ_TYPE_SOUND_RAM: #ifdef WITH_AUDASPACE if (!seq->sound) { return; } - seq->len = ceil((double)BKE_sound_get_length(bmain, seq->sound) * FPS); - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length = ceil((double)BKE_sound_get_length(bmain, seq->sound) * FPS); + length -= seq->anim_startofs; + length -= seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); #else UNUSED_VARS(bmain); return; #endif break; case SEQ_TYPE_SCENE: { - seq->len = (seq->scene) ? seq->scene->r.efra - seq->scene->r.sfra + 1 : 0; - seq->len -= seq->anim_startofs; - seq->len -= seq->anim_endofs; - if (seq->len < 0) { - seq->len = 0; + length = (seq->scene) ? seq->scene->r.efra - seq->scene->r.sfra + 1 : 0; + length -= seq->anim_startofs; + length -= seq->anim_endofs; + if (length < 0) { + length = 0; } + SEQ_time_strip_length_set(scene, seq, length); break; } } diff --git a/source/blender/sequencer/intern/strip_edit.c b/source/blender/sequencer/intern/strip_edit.c index b5d4f44cb39..de856e8ab28 100644 --- a/source/blender/sequencer/intern/strip_edit.c +++ b/source/blender/sequencer/intern/strip_edit.c @@ -263,7 +263,7 @@ static void seq_split_set_right_hold_offset(Main *bmain, Sequence *seq, int timeline_frame) { - const float content_start = SEQ_time_start_frame_get(seq); + const float content_start = SEQ_time_start_frame_get(scene, seq); const float content_end = SEQ_time_content_end_frame_get(scene, seq); /* Adjust within range of extended still-frames before strip. */ @@ -289,7 +289,7 @@ static void seq_split_set_left_hold_offset(Main *bmain, Sequence *seq, int timeline_frame) { - const float content_start = SEQ_time_start_frame_get(seq); + const float content_start = SEQ_time_start_frame_get(scene, seq); const float content_end = SEQ_time_content_end_frame_get(scene, seq); /* Adjust within range of strip contents. */ diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index 288054d8fba..f42e0f99270 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -149,7 +149,7 @@ float seq_retiming_evaluate(const Scene *scene, const Sequence *seq, const int f SeqRetimingHandle *SEQ_retiming_add_handle(Scene *scene, Sequence *seq, const int timeline_frame) { - float frame_index = (timeline_frame - SEQ_time_start_frame_get(seq)) * + float frame_index = (timeline_frame - SEQ_time_start_frame_get(scene, seq)) * seq_time_media_playback_rate_factor_get(scene, seq); float value = seq_retiming_evaluate(scene, seq, frame_index); @@ -251,6 +251,6 @@ float SEQ_retiming_handle_timeline_frame_get(const Scene *scene, const Sequence *seq, const SeqRetimingHandle *handle) { - return SEQ_time_start_frame_get(seq) + + return SEQ_time_start_frame_get(scene, seq) + handle->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq); } diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index f8afab9cc00..a635db6fcac 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -65,7 +65,7 @@ int seq_time_strip_original_content_length_get(const Scene *scene, const Sequenc float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_frame) { float frame_index; - float sta = SEQ_time_start_frame_get(seq); + float sta = SEQ_time_start_frame_get(scene, seq); float end = SEQ_time_content_end_frame_get(scene, seq) - 1; const float length = seq_time_strip_original_content_length_get(scene, seq); @@ -490,7 +490,7 @@ void SEQ_time_speed_factor_set(const Scene *scene, Sequence *seq, const float sp bool SEQ_time_has_left_still_frames(const Scene *scene, const Sequence *seq) { - return SEQ_time_left_handle_frame_get(scene, seq) < SEQ_time_start_frame_get(seq); + return SEQ_time_left_handle_frame_get(scene, seq) < SEQ_time_start_frame_get(scene, seq); } bool SEQ_time_has_right_still_frames(const Scene *scene, const Sequence *seq) @@ -503,10 +503,15 @@ bool SEQ_time_has_still_frames(const Scene *scene, const Sequence *seq) return SEQ_time_has_right_still_frames(scene, seq) || SEQ_time_has_left_still_frames(scene, seq); } +void SEQ_time_strip_length_set(const Scene *scene, Sequence *seq, double length_in_frames) +{ + seq->len = SEQ_time_frames_to_seconds(scene, length_in_frames); +} + int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) { if (seq->type == SEQ_TYPE_SOUND_RAM) { - return seq->len; + return SEQ_time_seconds_to_frames(scene, seq->len); } if (SEQ_retiming_is_active(seq)) { @@ -517,33 +522,35 @@ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) seq_time_media_playback_rate_factor_get(scene, seq); } - return seq->len / seq_time_media_playback_rate_factor_get(scene, seq); + /* XXX it was seq->len / seq_time_media_playback_rate_factor_get(scene, seq) but now it doesn't + * make sense, because playback rate factor does not influence length. */ + return SEQ_time_seconds_to_frames(scene, seq->len); } -float SEQ_time_start_frame_get(const Sequence *seq) +float SEQ_time_start_frame_get(const Scene *scene, const Sequence *seq) { - return seq->start; + return SEQ_time_seconds_to_frames(scene, seq->start); } void SEQ_time_start_frame_set(const Scene *scene, Sequence *seq, int timeline_frame) { - seq->start = timeline_frame; + seq->start = SEQ_time_frames_to_seconds(scene, timeline_frame); SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); } float SEQ_time_content_end_frame_get(const Scene *scene, const Sequence *seq) { - return SEQ_time_start_frame_get(seq) + SEQ_time_strip_length_get(scene, seq); + return SEQ_time_start_frame_get(scene, seq) + SEQ_time_strip_length_get(scene, seq); } -int SEQ_time_left_handle_frame_get(const Scene *UNUSED(scene), const Sequence *seq) +int SEQ_time_left_handle_frame_get(const Scene *scene, const Sequence *seq) { if (seq->seq1 || seq->seq2) { return seq->startdisp; } - return seq->start + seq->startofs; + return SEQ_time_start_frame_get(scene, seq) + SEQ_time_seconds_to_frames(scene, seq->startofs); } int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq) @@ -552,7 +559,8 @@ int SEQ_time_right_handle_frame_get(const Scene *scene, const Sequence *seq) return seq->enddisp; } - return SEQ_time_content_end_frame_get(scene, seq) - seq->endofs; + return SEQ_time_content_end_frame_get(scene, seq) - + SEQ_time_seconds_to_frames(scene, seq->endofs); } void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timeline_frame) @@ -563,7 +571,7 @@ void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timel timeline_frame = right_handle_orig_frame - 1; } - float offset = timeline_frame - SEQ_time_start_frame_get(seq); + float offset = timeline_frame - SEQ_time_start_frame_get(scene, seq); if (SEQ_transform_single_image_check(seq)) { /* This strip has only 1 frame of content, that is always stretched to whole strip length. @@ -606,3 +614,15 @@ void seq_time_translate_handles(const Scene *scene, Sequence *seq, const int off SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); seq_time_update_effects_strip_range(scene, seq_sequence_lookup_effects_by_seq(scene, seq)); } + +double SEQ_time_frames_to_seconds(const Scene *scene, double frames) +{ + double scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base; + return frames / scene_playback_rate; +} + +int SEQ_time_seconds_to_frames(const Scene *scene, double seconds) +{ + double scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base; + return round_db_to_int(seconds * scene_playback_rate); +} diff --git a/source/blender/sequencer/intern/strip_transform.c b/source/blender/sequencer/intern/strip_transform.c index c81482c878c..b7c1733f476 100644 --- a/source/blender/sequencer/intern/strip_transform.c +++ b/source/blender/sequencer/intern/strip_transform.c @@ -129,7 +129,7 @@ void SEQ_transform_translate_sequence(Scene *evil_scene, Sequence *seq, int delt seq_time_translate_handles(evil_scene, seq, delta); } else if (seq->seq1 == NULL && seq->seq2 == NULL) { /* All other strip types. */ - seq->start += delta; + seq->start += SEQ_time_frames_to_seconds(evil_scene, delta); /* Only to make files usable in older versions. */ seq->startdisp = SEQ_time_left_handle_frame_get(evil_scene, seq); seq->enddisp = SEQ_time_right_handle_frame_get(evil_scene, seq); diff --git a/source/blender/sequencer/intern/utils.c b/source/blender/sequencer/intern/utils.c index 5b70bc33e88..b5593a62f9b 100644 --- a/source/blender/sequencer/intern/utils.c +++ b/source/blender/sequencer/intern/utils.c @@ -179,7 +179,10 @@ const char *SEQ_sequence_give_name(Sequence *seq) return name; } -ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, ListBase **r_channels, int *r_offset) +ListBase *SEQ_get_seqbase_from_sequence(const Scene *scene, + Sequence *seq, + ListBase **r_channels, + int *r_offset) { ListBase *seqbase = NULL; @@ -187,7 +190,7 @@ ListBase *SEQ_get_seqbase_from_sequence(Sequence *seq, ListBase **r_channels, in case SEQ_TYPE_META: { seqbase = &seq->seqbase; *r_channels = &seq->channels; - *r_offset = SEQ_time_start_frame_get(seq); + *r_offset = SEQ_time_start_frame_get(scene, seq); break; } case SEQ_TYPE_SCENE: { -- 2.30.2 From 3b27d69f574770bd4950c4daf513261b9ac7eed3 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Tue, 7 Mar 2023 20:42:21 +0100 Subject: [PATCH 2/9] Fix build error --- source/blender/editors/transform/transform_snap_sequencer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/blender/editors/transform/transform_snap_sequencer.c b/source/blender/editors/transform/transform_snap_sequencer.c index 36806c64966..6fd6ff57e8f 100644 --- a/source/blender/editors/transform/transform_snap_sequencer.c +++ b/source/blender/editors/transform/transform_snap_sequencer.c @@ -204,7 +204,7 @@ static void seq_snap_target_points_build(Scene *scene, if (snap_mode & SEQ_SNAP_TO_STRIP_HOLD) { int content_start = min_ii(SEQ_time_left_handle_frame_get(scene, seq), - SEQ_time_start_frame_get(seq)); + SEQ_time_start_frame_get(scene, seq)); int content_end = max_ii(SEQ_time_right_handle_frame_get(scene, seq), SEQ_time_content_end_frame_get(scene, seq)); /* Effects and single image strips produce incorrect content length. Skip these strips. */ -- 2.30.2 From 8ba6379033723b50514829684616c01fa9d24270 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Tue, 7 Mar 2023 21:48:57 +0100 Subject: [PATCH 3/9] Bunch of stuff to make this work --- source/blender/sequencer/SEQ_sequencer.h | 2 +- source/blender/sequencer/intern/sequencer.c | 4 ++-- source/blender/sequencer/intern/strip_add.c | 8 +++++--- source/blender/sequencer/intern/strip_time.c | 14 +++++++++++--- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/source/blender/sequencer/SEQ_sequencer.h b/source/blender/sequencer/SEQ_sequencer.h index c795e6a684e..c295407956f 100644 --- a/source/blender/sequencer/SEQ_sequencer.h +++ b/source/blender/sequencer/SEQ_sequencer.h @@ -66,7 +66,7 @@ struct ListBase *SEQ_active_seqbase_get(const struct Editing *ed); * \param seqbase: ListBase with strips */ void SEQ_seqbase_active_set(struct Editing *ed, struct ListBase *seqbase); -struct Sequence *SEQ_sequence_alloc(ListBase *lb, int timeline_frame, int machine, int type); +struct Sequence *SEQ_sequence_alloc(ListBase *lb, double start_time, int machine, int type); void SEQ_sequence_free(struct Scene *scene, struct Sequence *seq); /** * Get #MetaStack that corresponds to current level that is being viewed diff --git a/source/blender/sequencer/intern/sequencer.c b/source/blender/sequencer/intern/sequencer.c index 478b3acda6a..48df73325c3 100644 --- a/source/blender/sequencer/intern/sequencer.c +++ b/source/blender/sequencer/intern/sequencer.c @@ -112,7 +112,7 @@ static void seq_free_strip(Strip *strip) MEM_freeN(strip); } -Sequence *SEQ_sequence_alloc(ListBase *lb, int timeline_frame, int machine, int type) +Sequence *SEQ_sequence_alloc(ListBase *lb, double start_time, int machine, int type) { Sequence *seq; @@ -123,7 +123,7 @@ Sequence *SEQ_sequence_alloc(ListBase *lb, int timeline_frame, int machine, int seq->name[2] = 0; seq->flag = SELECT; - seq->start = timeline_frame; + seq->start = start_time; seq->machine = machine; seq->sat = 1.0; seq->mul = 1.0; diff --git a/source/blender/sequencer/intern/strip_add.c b/source/blender/sequencer/intern/strip_add.c index 655a4f92fdf..19f8d5c80cf 100644 --- a/source/blender/sequencer/intern/strip_add.c +++ b/source/blender/sequencer/intern/strip_add.c @@ -160,8 +160,10 @@ Sequence *SEQ_add_mask_strip(Scene *scene, ListBase *seqbase, struct SeqLoadData Sequence *SEQ_add_effect_strip(Scene *scene, ListBase *seqbase, struct SeqLoadData *load_data) { - Sequence *seq = SEQ_sequence_alloc( - seqbase, load_data->start_frame, load_data->channel, load_data->effect.type); + Sequence *seq = SEQ_sequence_alloc(seqbase, + SEQ_time_frames_to_seconds(scene, load_data->start_frame), + load_data->channel, + load_data->effect.type); seq->flag |= SEQ_USE_EFFECT_DEFAULT_FADE; struct SeqEffectHandle sh = SEQ_effect_handle_get(seq); @@ -175,7 +177,7 @@ Sequence *SEQ_add_effect_strip(Scene *scene, ListBase *seqbase, struct SeqLoadDa } if (!load_data->effect.seq1) { - SEQ_time_strip_length_set(scene, seq, 0); /* XXX Effect is generator, set non zero length. */ + SEQ_time_strip_length_set(scene, seq, 0); seq->flag |= SEQ_SINGLE_FRAME_CONTENT; SEQ_time_right_handle_frame_set(scene, seq, load_data->effect.end_frame); } diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 30f181531d6..f59f5accb9d 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -571,13 +571,13 @@ void SEQ_time_left_handle_frame_set(const Scene *scene, Sequence *seq, int timel timeline_frame = right_handle_orig_frame - 1; } - float offset = timeline_frame - SEQ_time_start_frame_get(scene, seq); + float offset = SEQ_time_frames_to_seconds(scene, timeline_frame) - seq->start; if (SEQ_transform_single_image_check(seq)) { /* This strip has only 1 frame of content, that is always stretched to whole strip length. * Therefore, strip start should be moved instead of adjusting offset. */ SEQ_time_start_frame_set(scene, seq, timeline_frame); - seq->endofs += offset; + seq->len -= offset; } else { seq->startofs = offset; @@ -597,7 +597,15 @@ void SEQ_time_right_handle_frame_set(const Scene *scene, Sequence *seq, int time timeline_frame = left_handle_orig_frame + 1; } - seq->endofs = SEQ_time_content_end_frame_get(scene, seq) - timeline_frame; + if (SEQ_transform_single_image_check(seq)) { + double strip_end_time = seq->start + seq->len; + double time = SEQ_time_frames_to_seconds(scene, timeline_frame); + seq->len += time - strip_end_time; + } + else { + seq->endofs = seq->start + seq->len - SEQ_time_frames_to_seconds(scene, timeline_frame); + } + seq->enddisp = timeline_frame; /* Only to make files usable in older versions. */ SEQ_time_update_meta_strip_range(scene, seq_sequence_lookup_meta_by_seq(scene, seq)); -- 2.30.2 From 7a981825f8289bf5f970413518d2dc27d10ecbfd Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 8 Mar 2023 20:21:13 +0100 Subject: [PATCH 4/9] Add versioning code --- .../blenloader/intern/versioning_300.cc | 23 ++++++++++++++++++- .../sequencer_gizmo_retime_type.cc | 8 +++---- source/blender/sequencer/SEQ_retiming.h | 5 ++-- .../sequencer/intern/strip_retiming.cc | 10 ++++---- source/blender/sequencer/intern/strip_time.c | 3 ++- 5 files changed, 37 insertions(+), 12 deletions(-) diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 7d6eb591923..35ed2d9f37b 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -697,7 +697,7 @@ static bool do_versions_sequencer_init_retiming_tool_data(Sequence *seq, void *u const int content_length = SEQ_time_strip_length_get(scene, seq); - SEQ_retiming_data_ensure(seq); + SEQ_retiming_data_ensure(scene, seq); SeqRetimingHandle *handle = &seq->retiming_handles[seq->retiming_handle_num - 1]; handle->strip_frame_index = round_fl_to_int(content_length / seq->speed_factor); @@ -1648,6 +1648,19 @@ static bool version_set_seq_single_frame_content(Sequence *seq, void * /*user_da return true; } +static bool version_seq_convert_frames_to_seconds(Sequence *seq, void *user_data) +{ + const Scene *scene = static_cast(user_data); + double scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base; + + seq->start /= scene_playback_rate; + seq->len /= scene_playback_rate; + seq->startofs /= scene_playback_rate; + seq->endofs /= scene_playback_rate; + // XXX anim offsets + return true; +} + /* Those `version_liboverride_rnacollections_*` functions mimic the old, pre-3.0 code to find * anchor and source items in the given list of modifiers, constraints etc., using only the * `subitem_local` data of the override property operation. @@ -4046,6 +4059,14 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) SEQ_for_each_callback(&ed->seqbase, version_set_seq_single_frame_content, nullptr); } } + + /* Convert strip length and position to seconds. */ + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + Editing *ed = SEQ_editing_get(scene); + if (ed != nullptr) { + SEQ_for_each_callback(&ed->seqbase, version_seq_convert_frames_to_seconds, scene); + } + } /* Keep this block, even when empty. */ } } diff --git a/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc index a984ec10002..f42a0820910 100644 --- a/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc +++ b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc @@ -377,7 +377,7 @@ static void retime_speed_text_draw(const bContext *C, return; /* Label out of strip bounds. */ } - const float speed = SEQ_retiming_handle_speed_get(seq, next_handle); + const float speed = SEQ_retiming_handle_speed_get(scene, seq, next_handle); char label_str[20]; const size_t label_len = BLI_snprintf_rlen( @@ -412,7 +412,7 @@ static void gizmo_retime_handle_draw(const bContext *C, wmGizmo *gz) immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR); Sequence *seq = active_seq_from_context(C); - SEQ_retiming_data_ensure(seq); + SEQ_retiming_data_ensure(CTX_data_scene(C), seq); MutableSpan handles = SEQ_retiming_handles_get(seq); for (const SeqRetimingHandle &handle : handles) { @@ -439,7 +439,7 @@ static int gizmo_retime_handle_test_select(bContext *C, wmGizmo *gz, const int m gizmo->mouse_over_seq = nullptr; Sequence *seq = active_seq_from_context(C); - SEQ_retiming_data_ensure(seq); + SEQ_retiming_data_ensure(CTX_data_scene(C), seq); const SeqRetimingHandle *handle = mouse_over_handle_get( scene, seq, UI_view2d_fromcontext(C), mval); const int handle_index = SEQ_retiming_handle_index_get(seq, handle); @@ -514,7 +514,7 @@ static int gizmo_retime_remove_test_select(bContext *C, wmGizmo *gz, const int m Scene *scene = CTX_data_scene(C); Sequence *seq = active_seq_from_context(C); - SEQ_retiming_data_ensure(seq); + SEQ_retiming_data_ensure(scene, seq); const SeqRetimingHandle *handle = mouse_over_handle_get( scene, seq, UI_view2d_fromcontext(C), mval); const int handle_index = SEQ_retiming_handle_index_get(seq, handle); diff --git a/source/blender/sequencer/SEQ_retiming.h b/source/blender/sequencer/SEQ_retiming.h index 6f3f051c568..f9e28ff3998 100644 --- a/source/blender/sequencer/SEQ_retiming.h +++ b/source/blender/sequencer/SEQ_retiming.h @@ -17,7 +17,7 @@ struct SeqRetimingHandle; int SEQ_retiming_handles_count(const struct Sequence *seq); bool SEQ_retiming_is_active(const struct Sequence *seq); -void SEQ_retiming_data_ensure(struct Sequence *seq); +void SEQ_retiming_data_ensure(const struct Scene *scene, struct Sequence *seq); void SEQ_retiming_data_clear(struct Sequence *seq); bool SEQ_retiming_is_allowed(const struct Sequence *seq); @@ -35,7 +35,8 @@ void SEQ_retiming_offset_handle(const struct Scene *scene, struct Sequence *seq, struct SeqRetimingHandle *handle, const int offset); -float SEQ_retiming_handle_speed_get(const struct Sequence *seq, +float SEQ_retiming_handle_speed_get(const struct Scene *scene, + const struct Sequence *seq, const struct SeqRetimingHandle *handle); int SEQ_retiming_handle_index_get(const struct Sequence *seq, const struct SeqRetimingHandle *handle); diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index 191407903b4..1aa1562b7cb 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -86,7 +86,7 @@ int SEQ_retiming_handles_count(const Sequence *seq) return seq->retiming_handle_num; } -void SEQ_retiming_data_ensure(Sequence *seq) +void SEQ_retiming_data_ensure(const Scene *scene, Sequence *seq) { if (!SEQ_retiming_is_allowed(seq)) { return; @@ -99,7 +99,7 @@ void SEQ_retiming_data_ensure(Sequence *seq) seq->retiming_handles = (SeqRetimingHandle *)MEM_calloc_arrayN( 2, sizeof(SeqRetimingHandle), __func__); SeqRetimingHandle *handle = seq->retiming_handles + 1; - handle->strip_frame_index = seq->len; + handle->strip_frame_index = SEQ_time_seconds_to_frames(scene, seq->len); handle->retiming_factor = 1.0f; seq->retiming_handle_num = 2; } @@ -224,7 +224,9 @@ void SEQ_retiming_remove_handle(Sequence *seq, SeqRetimingHandle *handle) seq->retiming_handle_num--; } -float SEQ_retiming_handle_speed_get(const Sequence *seq, const SeqRetimingHandle *handle) +float SEQ_retiming_handle_speed_get(const Scene *scene, + const Sequence *seq, + const SeqRetimingHandle *handle) { if (handle->strip_frame_index == 0) { return 1.0f; @@ -232,7 +234,7 @@ float SEQ_retiming_handle_speed_get(const Sequence *seq, const SeqRetimingHandle const SeqRetimingHandle *handle_prev = handle - 1; - const int frame_index_max = seq->len - 1; + const int frame_index_max = SEQ_time_seconds_to_frames(scene, seq->len - 1); const int frame_retimed_prev = round_fl_to_int(handle_prev->retiming_factor * frame_index_max); const int frame_index_prev = handle_prev->strip_frame_index; const int frame_retimed = round_fl_to_int(handle->retiming_factor * frame_index_max); diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 618f21f2f67..16d3b377341 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -58,7 +58,8 @@ float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_fra float frame_index; float sta = SEQ_time_start_frame_get(scene, seq); float end = SEQ_time_content_end_frame_get(scene, seq) - 1; - const float length = seq->len; + const float length = SEQ_time_seconds_to_frames(scene, seq->len) * + seq_time_media_playback_rate_factor_get(scene, seq); if (seq->type & SEQ_TYPE_EFFECT) { end = SEQ_time_right_handle_frame_get(scene, seq); -- 2.30.2 From 56a3c21e94fc79b6e92b1b940143b6b4329f244c Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 8 Mar 2023 22:54:57 +0100 Subject: [PATCH 5/9] Fix incorrect sound start position --- .../blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenkernel/intern/sound.c | 15 ++++--- .../blenloader/intern/versioning_300.cc | 27 ++++++++----- source/blender/sequencer/intern/sound.c | 6 ++- source/blender/sequencer/intern/strip_time.c | 40 +++++++++---------- 5 files changed, 49 insertions(+), 41 deletions(-) diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index 6f33219c7f6..9aba12948ae 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -19,7 +19,7 @@ extern "C" { /* Blender major and minor version. */ #define BLENDER_VERSION 306 /* Blender patch version for bugfix releases. */ -#define BLENDER_VERSION_PATCH 0 +#define BLENDER_VERSION_PATCH 1 /** Blender release cycle stage: alpha/beta/rc/release. */ #define BLENDER_VERSION_CYCLE alpha diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 96e4fb941af..3f88941ea0a 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -777,12 +777,15 @@ void BKE_sound_move_scene_sound_defaults(Scene *scene, Sequence *sequence) { sound_verify_evaluated_id(&scene->id); if (sequence->scene_sound) { - BKE_sound_move_scene_sound(scene, - sequence->scene_sound, - SEQ_time_left_handle_frame_get(scene, sequence), - SEQ_time_right_handle_frame_get(scene, sequence), - sequence->startofs + sequence->anim_startofs, - 0.0); + BKE_sound_move_scene_sound( + scene, + sequence->scene_sound, + SEQ_time_left_handle_frame_get(scene, sequence), + SEQ_time_right_handle_frame_get(scene, sequence), + SEQ_time_seconds_to_frames( + scene, + sequence->startofs + sequence->anim_startofs), // XXX don't use the function here! + 0.0); } } diff --git a/source/blender/blenloader/intern/versioning_300.cc b/source/blender/blenloader/intern/versioning_300.cc index 35ed2d9f37b..dcc01828b28 100644 --- a/source/blender/blenloader/intern/versioning_300.cc +++ b/source/blender/blenloader/intern/versioning_300.cc @@ -1650,6 +1650,10 @@ static bool version_set_seq_single_frame_content(Sequence *seq, void * /*user_da static bool version_seq_convert_frames_to_seconds(Sequence *seq, void *user_data) { + if (seq->seq1 != nullptr || seq->seq2 != nullptr) { + return true; + } + const Scene *scene = static_cast(user_data); double scene_playback_rate = (float)scene->r.frs_sec / scene->r.frs_sec_base; @@ -4027,16 +4031,7 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) } } - /** - * Versioning code until next subversion bump goes here. - * - * \note Be sure to check when bumping the version: - * - "versioning_userdef.c", #blo_do_versions_userdef - * - "versioning_userdef.c", #do_versions_theme - * - * \note Keep this message at the bottom of the function. - */ - { + if (!MAIN_VERSION_ATLEAST(bmain, 306, 1)) { /* Z bias for retopology overlay. */ if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "retopology_offset")) { LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) { @@ -4067,6 +4062,18 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain) SEQ_for_each_callback(&ed->seqbase, version_seq_convert_frames_to_seconds, scene); } } + } + + /** + * Versioning code until next subversion bump goes here. + * + * \note Be sure to check when bumping the version: + * - "versioning_userdef.c", #blo_do_versions_userdef + * - "versioning_userdef.c", #do_versions_theme + * + * \note Keep this message at the bottom of the function. + */ + { /* Keep this block, even when empty. */ } } diff --git a/source/blender/sequencer/intern/sound.c b/source/blender/sequencer/intern/sound.c index 69ccbdcb54e..8b841434021 100644 --- a/source/blender/sequencer/intern/sound.c +++ b/source/blender/sequencer/intern/sound.c @@ -49,7 +49,8 @@ static bool sequencer_refresh_sound_length_recursive(Main *bmain, Scene *scene, int old = seq->len; float fac; - seq->len = MAX2(1, round((info.length - seq->sound->offset_time) * FPS)); + SEQ_time_strip_length_set( + scene, seq, MAX2(1, round((info.length - seq->sound->offset_time) * FPS))); fac = (float)seq->len / (float)old; old = seq->startofs; seq->startofs *= fac; @@ -97,7 +98,8 @@ void SEQ_sound_update_bounds(Scene *scene, Sequence *seq) if (seq->type == SEQ_TYPE_SCENE) { if (seq->scene && seq->scene_sound) { /* We have to take into account start frame of the sequence's scene! */ - int startofs = seq->startofs + seq->anim_startofs + seq->scene->r.sfra; + int startofs = SEQ_time_seconds_to_frames(scene, seq->startofs + seq->anim_startofs) + + seq->scene->r.sfra; BKE_sound_move_scene_sound(scene, seq->scene_sound, diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 16d3b377341..64c784dd2d6 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -101,17 +101,6 @@ float seq_give_frame_index(const Scene *scene, Sequence *seq, float timeline_fra return frame_index; } - -static int metaseq_start(Sequence *metaseq) -{ - return metaseq->start + metaseq->startofs; -} - -static int metaseq_end(Sequence *metaseq) -{ - return metaseq->start + metaseq->len - metaseq->endofs; -} - static void seq_update_sound_bounds_recursive_impl(const Scene *scene, Sequence *metaseq, int start, @@ -124,18 +113,23 @@ static void seq_update_sound_bounds_recursive_impl(const Scene *scene, for (seq = metaseq->seqbase.first; seq; seq = seq->next) { if (seq->type == SEQ_TYPE_META) { seq_update_sound_bounds_recursive_impl( - scene, seq, max_ii(start, metaseq_start(seq)), min_ii(end, metaseq_end(seq))); + scene, + seq, + max_ii(start, SEQ_time_left_handle_frame_get(scene, seq)), + min_ii(end, SEQ_time_right_handle_frame_get(scene, seq))); } else if (ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SCENE)) { if (seq->scene_sound) { - int startofs = seq->startofs; - int endofs = seq->endofs; - if (seq->startofs + seq->start < start) { - startofs = start - seq->start; + int start_frame = SEQ_time_start_frame_get(scene, seq); + int length = SEQ_time_strip_length_get(scene, seq); + int startofs = SEQ_time_seconds_to_frames(scene, seq->startofs); + int endofs = SEQ_time_seconds_to_frames(scene, seq->endofs); + if (startofs + start_frame < start) { + startofs = start - start_frame; } - if (seq->start + seq->len - seq->endofs > end) { - endofs = seq->start + seq->len - end; + if (start_frame + length - endofs > end) { + endofs = start_frame + length - end; } double offset_time = 0.0f; @@ -145,8 +139,8 @@ static void seq_update_sound_bounds_recursive_impl(const Scene *scene, BKE_sound_move_scene_sound(scene, seq->scene_sound, - seq->start + startofs, - seq->start + seq->len - endofs, + start_frame + startofs, + start_frame + length - endofs, startofs + seq->anim_startofs, offset_time); } @@ -156,8 +150,10 @@ static void seq_update_sound_bounds_recursive_impl(const Scene *scene, void seq_update_sound_bounds_recursive(const Scene *scene, Sequence *metaseq) { - seq_update_sound_bounds_recursive_impl( - scene, metaseq, metaseq_start(metaseq), metaseq_end(metaseq)); + seq_update_sound_bounds_recursive_impl(scene, + metaseq, + SEQ_time_left_handle_frame_get(scene, metaseq), + SEQ_time_right_handle_frame_get(scene, metaseq)); } /* Update meta strip content start and end, update sound playback range. */ -- 2.30.2 From 12a953d53a063640080c3ccc81dbbae0a8ddafad Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 8 Mar 2023 23:10:30 +0100 Subject: [PATCH 6/9] Fix effect lengths --- source/blender/sequencer/intern/strip_time.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index 64c784dd2d6..821c3fd7fd8 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -221,8 +221,8 @@ void seq_time_effect_range_set(const Scene *scene, Sequence *seq) /* Values unusable for effects, these should be always 0. */ seq->startofs = seq->endofs = seq->anim_startofs = seq->anim_endofs = 0; - seq->start = seq->startdisp; - seq->len = seq->enddisp - seq->startdisp; + seq->start = SEQ_time_frames_to_seconds(scene, seq->startdisp); + seq->len = SEQ_time_frames_to_seconds(scene, seq->enddisp - seq->startdisp); } /* Update strip startdisp and enddisp (n-input effects have no len to calculate these). */ -- 2.30.2 From 2eef653538834046a7e615c7b6151055feae3285 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 12 Apr 2023 03:06:22 +0200 Subject: [PATCH 7/9] Update operators and RNA Rna is still buggy - needs to calculate frames to seconds? --- .../editors/space_sequencer/sequencer_edit.c | 83 +++++++++---------- .../blender/makesrna/intern/rna_sequencer.c | 39 +++++---- source/blender/sequencer/intern/sound.c | 10 +-- 3 files changed, 68 insertions(+), 64 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index b6cad24ddc8..3a875cf647a 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -72,22 +72,6 @@ /* Own include. */ #include "sequencer_intern.h" -/* -------------------------------------------------------------------- */ -/** \name Structs & Enums - * \{ */ - -typedef struct TransSeq { - double start; - int machine; - double startofs, endofs; - int anim_startofs, anim_endofs; - /* int final_left, final_right; */ /* UNUSED */ - double len; - float content_start; -} TransSeq; - -/** \} */ - /* -------------------------------------------------------------------- */ /** \name Public Context Checks * \{ */ @@ -363,7 +347,8 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op) if (seq->flag & SELECT && !SEQ_transform_is_locked(channels, seq) && SEQ_transform_sequence_can_be_translated(seq)) { if ((seq->flag & (SEQ_LEFTSEL + SEQ_RIGHTSEL)) == 0) { - SEQ_transform_translate_sequence(scene, seq, (snap_frame - seq->startofs) - seq->start); + const int offset = snap_frame - SEQ_time_left_handle_frame_get(scene, seq); + SEQ_transform_translate_sequence(scene, seq, offset); } else { if (seq->flag & SEQ_LEFTSEL) { @@ -462,6 +447,13 @@ void SEQUENCER_OT_snap(struct wmOperatorType *ot) /** \name Trim Strips Operator * \{ */ +typedef struct TransSeq { + int start; + int left_handle, right_handle; + int anim_startofs, anim_endofs; + int machine; +} TransSeq; + typedef struct SlipData { int init_mouse[2]; float init_mouseloc[2]; @@ -474,27 +466,24 @@ typedef struct SlipData { NumInput num_input; } SlipData; -static void transseq_backup(TransSeq *ts, Sequence *seq) +static void transseq_backup(TransSeq *ts, const Scene *scene, Sequence *seq) { - // ts->content_start = SEQ_time_start_frame_get(seq); //XXX - ts->start = seq->start; - ts->machine = seq->machine; - ts->startofs = seq->startofs; - ts->endofs = seq->endofs; + ts->start = SEQ_time_start_frame_get(scene, seq); + ts->left_handle = SEQ_time_left_handle_frame_get(scene, seq); + ts->right_handle = SEQ_time_right_handle_frame_get(scene, seq); ts->anim_startofs = seq->anim_startofs; ts->anim_endofs = seq->anim_endofs; - ts->len = seq->len; + ts->machine = seq->machine; } -static void transseq_restore(TransSeq *ts, Sequence *seq) +static void transseq_restore(Scene *scene, TransSeq *ts, Sequence *seq) { - seq->start = ts->start; - seq->machine = ts->machine; - seq->startofs = ts->startofs; - seq->endofs = ts->endofs; + SEQ_time_start_frame_set(scene, seq, ts->start); + SEQ_time_left_handle_frame_set(scene, seq, ts->left_handle); + SEQ_time_right_handle_frame_set(scene, seq, ts->right_handle); seq->anim_startofs = ts->anim_startofs; seq->anim_endofs = ts->anim_endofs; - seq->len = ts->len; + seq->machine = ts->machine; } static int slip_add_sequences_recursive( @@ -570,7 +559,7 @@ static int sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *eve slip_add_sequences_recursive(ed->seqbasep, data->seq_array, data->trim, 0, true); for (int i = 0; i < num_seq; i++) { - transseq_backup(data->ts + i, data->seq_array[i]); + transseq_backup(data->ts + i, scene, data->seq_array[i]); } UI_view2d_region_to_view(v2d, event->mval[0], event->mval[1], &mouseloc[0], &mouseloc[1]); @@ -591,13 +580,14 @@ static int sequencer_slip_invoke(bContext *C, wmOperator *op, const wmEvent *eve static void sequencer_slip_recursively(Scene *scene, SlipData *data, int offset) { for (int i = data->num_seq - 1; i >= 0; i--) { - Sequence *seq = data->seq_array[i]; - - seq->start = data->ts[i].start + offset; - if (data->trim[i]) { - seq->startofs = data->ts[i].startofs - offset; - seq->endofs = data->ts[i].endofs + offset; + if (!data->trim[i]) { + continue; } + + Sequence *seq = data->seq_array[i]; + SEQ_time_start_frame_set(scene, seq, data->ts[i].start + offset); + SEQ_time_left_handle_frame_set(scene, seq, data->ts[i].left_handle); + SEQ_time_right_handle_frame_set(scene, seq, data->ts[i].right_handle); } for (int i = data->num_seq - 1; i >= 0; i--) { @@ -613,7 +603,8 @@ static void sequencer_slip_apply_limits(const Scene *scene, SlipData *data, int if (data->trim[i]) { Sequence *seq = data->seq_array[i]; int seq_content_start = data->ts[i].start + *offset; - int seq_content_end = seq_content_start + seq->len + seq->anim_startofs + seq->anim_endofs; + int seq_content_end = seq_content_start + SEQ_time_strip_length_get(scene, seq) + + seq->anim_startofs + seq->anim_endofs; int diff = 0; if (seq_content_start >= SEQ_time_right_handle_frame_get(scene, seq)) { @@ -650,7 +641,7 @@ static int sequencer_slip_exec(bContext *C, wmOperator *op) slip_add_sequences_recursive(ed->seqbasep, data->seq_array, data->trim, 0, true); for (int i = 0; i < num_seq; i++) { - transseq_backup(data->ts + i, data->seq_array[i]); + transseq_backup(data->ts + i, scene, data->seq_array[i]); } sequencer_slip_apply_limits(scene, data, &offset); @@ -761,7 +752,7 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even case EVT_ESCKEY: case RIGHTMOUSE: { for (int i = 0; i < data->num_seq; i++) { - transseq_restore(data->ts + i, data->seq_array[i]); + transseq_restore(scene, data->ts + i, data->seq_array[i]); } for (int i = 0; i < data->num_seq; i++) { @@ -1261,7 +1252,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) last_seq->seq2 = seq2; last_seq->seq3 = seq3; - int old_start = last_seq->start; + int old_start = SEQ_time_start_frame_get(scene, last_seq); /* Force time position update for reassigned effects. * TODO(Richard): This is because internally startdisp is still used, due to poor performance of @@ -1270,7 +1261,7 @@ static int sequencer_reassign_inputs_exec(bContext *C, wmOperator *op) SEQ_time_left_handle_frame_set(scene, seq1, SEQ_time_left_handle_frame_get(scene, seq1)); SEQ_relations_invalidate_cache_preprocessed(scene, last_seq); - SEQ_offset_animdata(scene, last_seq, (last_seq->start - old_start)); + SEQ_offset_animdata(scene, last_seq, (SEQ_time_start_frame_get(scene, last_seq) - old_start)); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); @@ -1768,7 +1759,10 @@ static int sequencer_offset_clear_exec(bContext *C, wmOperator *UNUSED(op)) /* For effects, try to find a replacement input. */ for (seq = ed->seqbasep->first; seq; seq = seq->next) { if ((seq->type & SEQ_TYPE_EFFECT) == 0 && (seq->flag & SELECT)) { - seq->startofs = seq->endofs = 0; + const int start = SEQ_time_start_frame_get(scene, seq); + const int end = start + SEQ_time_strip_length_get(scene, seq); + SEQ_time_left_handle_frame_set(scene, seq, start); + SEQ_time_right_handle_frame_set(scene, seq, end); } } @@ -1831,7 +1825,8 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op) SEQ_prefetch_stop(scene); while (seq) { - if ((seq->flag & SELECT) && (seq->type == SEQ_TYPE_IMAGE) && (seq->len > 1)) { + if ((seq->flag & SELECT) && (seq->type == SEQ_TYPE_IMAGE) && + SEQ_transform_single_image_check(seq)) { Sequence *seq_next; /* Remove seq so overlap tests don't conflict, diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 28b2e49513d..b45d4d8d999 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -434,6 +434,13 @@ static void rna_Sequence_start_frame_set(PointerRNA *ptr, float value) SEQ_relations_invalidate_cache_composite(scene, seq); } +static float rna_Sequence_start_frame_get(PointerRNA *ptr) +{ + Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; + return SEQ_time_start_frame_get(scene, seq); +} + static void rna_Sequence_frame_offset_start_set(PointerRNA *ptr, float value) { Sequence *seq = (Sequence *)ptr->data; @@ -508,7 +515,7 @@ static void rna_Sequence_frame_offset_end_range( *max = seq->len - seq->startofs - 1; } -static void rna_Sequence_frame_length_set(PointerRNA *ptr, int value) +static void rna_Sequence_frame_final_duration_set(PointerRNA *ptr, int value) { Sequence *seq = (Sequence *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; @@ -518,13 +525,20 @@ static void rna_Sequence_frame_length_set(PointerRNA *ptr, int value) SEQ_relations_invalidate_cache_composite(scene, seq); } -static int rna_Sequence_frame_length_get(PointerRNA *ptr) +static int rna_Sequence_frame_final_duration_get(PointerRNA *ptr) { Sequence *seq = (Sequence *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; return SEQ_time_right_handle_frame_get(scene, seq) - SEQ_time_left_handle_frame_get(scene, seq); } +static int rna_Sequence_frame_duration_get(PointerRNA *ptr) +{ + Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; + return SEQ_time_strip_length_get(scene, seq); +} + static int rna_Sequence_frame_editable(PointerRNA *ptr, const char **UNUSED(r_info)) { Sequence *seq = (Sequence *)ptr->data; @@ -2095,7 +2109,6 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Lock", "Lock strip so that it cannot be transformed"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, NULL); -# if 0 /* strip positioning */ /* Cache has to be invalidated before and after transformation. */ prop = RNA_def_property(srna, "frame_final_duration", PROP_INT, PROP_TIME); @@ -2103,32 +2116,34 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text( prop, "Length", "The length of the contents of this strip after the handles are applied"); - RNA_def_property_int_funcs( - prop, "rna_Sequence_frame_length_get", "rna_Sequence_frame_length_set", NULL); + RNA_def_property_int_funcs(prop, + "rna_Sequence_frame_final_duration_get", + "rna_Sequence_frame_final_duration_set", + NULL); RNA_def_property_editable_func(prop, "rna_Sequence_frame_editable"); RNA_def_property_update( prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_invalidate_preprocessed_update"); prop = RNA_def_property(srna, "frame_duration", PROP_INT, PROP_TIME); - RNA_def_property_int_sdna(prop, NULL, "len"); RNA_def_property_clear_flag(prop, PROP_EDITABLE | PROP_ANIMATABLE); RNA_def_property_range(prop, 1, MAXFRAME); RNA_def_property_ui_text( prop, "Length", "The length of the contents of this strip before the handles are applied"); + RNA_def_property_int_funcs(prop, "rna_Sequence_frame_duration_get", NULL, NULL); prop = RNA_def_property(srna, "frame_start", PROP_FLOAT, PROP_TIME); - RNA_def_property_float_sdna(prop, NULL, "start"); RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); RNA_def_property_ui_text(prop, "Start Frame", "X position where the strip begins"); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 3, 0); - /* RNA_def_property_float_funcs( - prop, NULL, "rna_Sequence_start_frame_set", NULL); /* overlap tests and calc_seq_disp */ + RNA_def_property_float_funcs(prop, + "rna_Sequence_start_frame_get", + "rna_Sequence_start_frame_set", + NULL); /* overlap tests and calc_seq_disp */ RNA_def_property_editable_func(prop, "rna_Sequence_frame_editable"); RNA_def_property_update( prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_invalidate_preprocessed_update"); prop = RNA_def_property(srna, "frame_final_start", PROP_INT, PROP_TIME); - RNA_def_property_int_sdna(prop, NULL, "startdisp"); RNA_def_property_int_funcs( prop, "rna_Sequence_frame_final_start_get", "rna_Sequence_start_frame_final_set", NULL); RNA_def_property_editable_func(prop, "rna_Sequence_frame_editable"); @@ -2143,7 +2158,6 @@ static void rna_def_sequence(BlenderRNA *brna) prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_invalidate_preprocessed_update"); prop = RNA_def_property(srna, "frame_final_end", PROP_INT, PROP_TIME); - RNA_def_property_int_sdna(prop, NULL, "enddisp"); RNA_def_property_int_funcs( prop, "rna_Sequence_frame_final_end_get", "rna_Sequence_end_frame_final_set", NULL); RNA_def_property_editable_func(prop, "rna_Sequence_frame_editable"); @@ -2156,7 +2170,6 @@ static void rna_def_sequence(BlenderRNA *brna) prop = RNA_def_property(srna, "frame_offset_start", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "startofs"); - // RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* overlap tests */ RNA_def_property_ui_text(prop, "Start Offset", ""); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 3, 0); RNA_def_property_float_funcs( @@ -2165,13 +2178,11 @@ static void rna_def_sequence(BlenderRNA *brna) prop = RNA_def_property(srna, "frame_offset_end", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "endofs"); - // RNA_def_property_clear_flag(prop, PROP_EDITABLE); /* overlap tests */ RNA_def_property_ui_text(prop, "End Offset", ""); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 3, 0); RNA_def_property_float_funcs( prop, NULL, "rna_Sequence_frame_offset_end_set", "rna_Sequence_frame_offset_end_range"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update"); -# endif prop = RNA_def_property(srna, "channel", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "machine"); diff --git a/source/blender/sequencer/intern/sound.c b/source/blender/sequencer/intern/sound.c index 8b841434021..94060d0986e 100644 --- a/source/blender/sequencer/intern/sound.c +++ b/source/blender/sequencer/intern/sound.c @@ -46,16 +46,14 @@ static bool sequencer_refresh_sound_length_recursive(Main *bmain, Scene *scene, continue; } - int old = seq->len; float fac; + const int left_handle = SEQ_time_left_handle_frame_get(scene, seq); + const int right_handle = SEQ_time_right_handle_frame_get(scene, seq); SEQ_time_strip_length_set( scene, seq, MAX2(1, round((info.length - seq->sound->offset_time) * FPS))); - fac = (float)seq->len / (float)old; - old = seq->startofs; - seq->startofs *= fac; - seq->endofs *= fac; - seq->start += (old - seq->startofs); /* So that visual/"real" start frame does not change! */ + SEQ_time_left_handle_frame_set(scene, seq, left_handle); + SEQ_time_right_handle_frame_set(scene, seq, right_handle); changed = true; } -- 2.30.2 From fb4523d6d413564632f239d828a8718187505687 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Fri, 23 Jun 2023 17:09:53 +0200 Subject: [PATCH 8/9] Fix RNA functionality --- .../blender/makesrna/intern/rna_sequencer.c | 38 ++++++++++++++----- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 045a215ae11..26d732491e0 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -431,7 +431,7 @@ static void rna_Sequence_start_frame_set(PointerRNA *ptr, float value) Sequence *seq = (Sequence *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; - SEQ_transform_translate_sequence(scene, seq, value - seq->start); + SEQ_transform_translate_sequence(scene, seq, value - SEQ_time_start_frame_get(scene, seq)); do_sequence_frame_change_update(scene, seq); SEQ_relations_invalidate_cache_composite(scene, seq); } @@ -443,13 +443,27 @@ static float rna_Sequence_start_frame_get(PointerRNA *ptr) return SEQ_time_start_frame_get(scene, seq); } +static float rna_Sequence_frame_offset_start_get(PointerRNA *ptr) +{ + Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; + return SEQ_time_seconds_to_frames(scene, seq->startofs); +} + +static float rna_Sequence_frame_offset_end_get(PointerRNA *ptr) +{ + Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; + return SEQ_time_seconds_to_frames(scene, seq->endofs); +} + static void rna_Sequence_frame_offset_start_set(PointerRNA *ptr, float value) { Sequence *seq = (Sequence *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; SEQ_relations_invalidate_cache_composite(scene, seq); - seq->startofs = value; + seq->startofs = SEQ_time_frames_to_seconds(scene, value); } static void rna_Sequence_frame_offset_end_set(PointerRNA *ptr, float value) @@ -458,7 +472,7 @@ static void rna_Sequence_frame_offset_end_set(PointerRNA *ptr, float value) Scene *scene = (Scene *)ptr->owner_id; SEQ_relations_invalidate_cache_composite(scene, seq); - seq->endofs = value; + seq->endofs = SEQ_time_frames_to_seconds(scene, value); } static void rna_Sequence_anim_startofs_final_set(PointerRNA *ptr, int value) @@ -505,16 +519,18 @@ static void rna_Sequence_frame_offset_start_range( PointerRNA *ptr, float *min, float *max, float *UNUSED(softmin), float *UNUSED(softmax)) { Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; *min = ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD) ? 0 : INT_MIN; - *max = seq->len - seq->endofs - 1; + *max = SEQ_time_seconds_to_frames(scene, seq->len - seq->endofs) - 1; } static void rna_Sequence_frame_offset_end_range( PointerRNA *ptr, float *min, float *max, float *UNUSED(softmin), float *UNUSED(softmax)) { Sequence *seq = (Sequence *)ptr->data; + Scene *scene = (Scene *)ptr->owner_id; *min = ELEM(seq->type, SEQ_TYPE_SOUND_RAM, SEQ_TYPE_SOUND_HD) ? 0 : INT_MIN; - *max = seq->len - seq->startofs - 1; + *max = SEQ_time_seconds_to_frames(scene, seq->len - seq->startofs) - 1; } static void rna_Sequence_frame_final_duration_set(PointerRNA *ptr, int value) @@ -2181,16 +2197,20 @@ static void rna_def_sequence(BlenderRNA *brna) RNA_def_property_float_sdna(prop, NULL, "startofs"); RNA_def_property_ui_text(prop, "Start Offset", ""); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100.0f, 0); - RNA_def_property_float_funcs( - prop, NULL, "rna_Sequence_frame_offset_start_set", "rna_Sequence_frame_offset_start_range"); + RNA_def_property_float_funcs(prop, + "rna_Sequence_frame_offset_start_get", + "rna_Sequence_frame_offset_start_set", + "rna_Sequence_frame_offset_start_range"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update"); prop = RNA_def_property(srna, "frame_offset_end", PROP_FLOAT, PROP_TIME); RNA_def_property_float_sdna(prop, NULL, "endofs"); RNA_def_property_ui_text(prop, "End Offset", ""); RNA_def_property_ui_range(prop, MINFRAME, MAXFRAME, 100.0f, 0); - RNA_def_property_float_funcs( - prop, NULL, "rna_Sequence_frame_offset_end_set", "rna_Sequence_frame_offset_end_range"); + RNA_def_property_float_funcs(prop, + "rna_Sequence_frame_offset_end_get", + "rna_Sequence_frame_offset_end_set", + "rna_Sequence_frame_offset_end_range"); RNA_def_property_update(prop, NC_SCENE | ND_SEQUENCER, "rna_Sequence_frame_change_update"); prop = RNA_def_property(srna, "channel", PROP_INT, PROP_UNSIGNED); -- 2.30.2 From fce4040537e289a89e1618176cb715359397b0c5 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Mon, 26 Jun 2023 17:02:04 +0200 Subject: [PATCH 9/9] Start work on retiming --- .../sequencer_gizmo_retime_type.cc | 3 +- .../space_sequencer/sequencer_retiming.cc | 3 +- source/blender/makesdna/DNA_sequence_types.h | 10 +-- .../blender/makesrna/intern/rna_sequencer.c | 16 ++-- source/blender/sequencer/SEQ_retiming.h | 3 +- source/blender/sequencer/intern/sound.c | 2 - .../sequencer/intern/strip_retiming.cc | 89 +++++++++++-------- source/blender/sequencer/intern/strip_time.c | 4 +- 8 files changed, 74 insertions(+), 56 deletions(-) diff --git a/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc index f3c7c5a8d3b..d6e8e938aa2 100644 --- a/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc +++ b/source/blender/editors/space_sequencer/sequencer_gizmo_retime_type.cc @@ -223,7 +223,8 @@ static void gizmo_retime_handle_add_draw(const bContext *C, wmGizmo *gz) const Scene *scene = CTX_data_scene(C); const Sequence *seq = active_seq_from_context(C); const int frame_index = BKE_scene_frame_get(scene) - SEQ_time_start_frame_get(scene, seq); - const SeqRetimingHandle *handle = SEQ_retiming_find_segment_start_handle(seq, frame_index); + const SeqRetimingHandle *handle = SEQ_retiming_find_segment_start_handle( + scene, seq, frame_index); if (handle != nullptr && (SEQ_retiming_handle_is_transition_type(handle) || SEQ_retiming_handle_is_freeze_frame(handle))) diff --git a/source/blender/editors/space_sequencer/sequencer_retiming.cc b/source/blender/editors/space_sequencer/sequencer_retiming.cc index 3d6ba9a3f9a..027c3a6f3bb 100644 --- a/source/blender/editors/space_sequencer/sequencer_retiming.cc +++ b/source/blender/editors/space_sequencer/sequencer_retiming.cc @@ -336,7 +336,8 @@ static int sequesequencer_retiming_handle_add_exec(bContext *C, wmOperator *op) } const int frame_index = BKE_scene_frame_get(scene) - SEQ_time_start_frame_get(scene, seq); - const SeqRetimingHandle *handle = SEQ_retiming_find_segment_start_handle(seq, frame_index); + const SeqRetimingHandle *handle = SEQ_retiming_find_segment_start_handle( + scene, seq, frame_index); if (SEQ_retiming_handle_is_transition_type(handle)) { BKE_report(op->reports, RPT_ERROR, "Can not create handle inside of speed transition"); diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h index 9bcc00ffbbc..20665fa14b9 100644 --- a/source/blender/makesdna/DNA_sequence_types.h +++ b/source/blender/makesdna/DNA_sequence_types.h @@ -128,13 +128,13 @@ typedef enum eSeqRetimingHandleFlag { } eSeqRetimingHandleFlag; typedef struct SeqRetimingHandle { - int strip_frame_index; - int flag; /* eSeqRetimingHandleFlag */ - int _pad0; + double strip_frame_index; /* -> strip_position in seconds. */ + int flag; /* eSeqRetimingHandleFlag */ + int _pad0[2]; float retiming_factor; /* Value between 0-1 mapped to original content range. */ - int original_strip_frame_index; /* Used for transition handles only. */ - float original_retiming_factor; /* Used for transition handles only. */ + double original_strip_frame_index; /* Used for transition handles only. */ + double original_retiming_factor; /* Used for transition handles only. */ } SeqRetimingHandle; typedef struct SequenceRuntime { diff --git a/source/blender/makesrna/intern/rna_sequencer.c b/source/blender/makesrna/intern/rna_sequencer.c index 26d732491e0..10f9e33f4ef 100644 --- a/source/blender/makesrna/intern/rna_sequencer.c +++ b/source/blender/makesrna/intern/rna_sequencer.c @@ -337,7 +337,7 @@ static void rna_Sequence_retiming_handle_remove(ID *id, SeqRetimingHandle *handl WM_main_add_notifier(NC_SCENE | ND_SEQUENCER, NULL); } -static int rna_Sequence_retiming_handle_frame_get(PointerRNA *ptr) +static float rna_Sequence_retiming_handle_frame_get(PointerRNA *ptr) { SeqRetimingHandle *handle = (SeqRetimingHandle *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; @@ -350,7 +350,7 @@ static int rna_Sequence_retiming_handle_frame_get(PointerRNA *ptr) return SEQ_time_start_frame_get(scene, seq) + handle->strip_frame_index; } -static void rna_Sequence_retiming_handle_frame_set(PointerRNA *ptr, int value) +static void rna_Sequence_retiming_handle_frame_set(PointerRNA *ptr, float value) { SeqRetimingHandle *handle = (SeqRetimingHandle *)ptr->data; Scene *scene = (Scene *)ptr->owner_id; @@ -1624,12 +1624,12 @@ static void rna_def_retiming_handle(BlenderRNA *brna) "Handle mapped to particular frame that can be moved to change playback speed"); RNA_def_struct_sdna(srna, "SeqRetimingHandle"); - prop = RNA_def_property(srna, "timeline_frame", PROP_INT, PROP_NONE); - RNA_def_property_int_sdna(prop, NULL, "strip_frame_index"); - RNA_def_property_int_funcs(prop, - "rna_Sequence_retiming_handle_frame_get", - "rna_Sequence_retiming_handle_frame_set", - NULL); + prop = RNA_def_property(srna, "timeline_frame", PROP_FLOAT, PROP_NONE); + RNA_def_property_float_sdna(prop, NULL, "strip_frame_index"); + RNA_def_property_float_funcs(prop, + "rna_Sequence_retiming_handle_frame_get", + "rna_Sequence_retiming_handle_frame_set", + NULL); RNA_def_property_ui_text(prop, "Timeline Frame", "Position of retiming handle in timeline"); FunctionRNA *func = RNA_def_function(srna, "remove", "rna_Sequence_retiming_handle_remove"); diff --git a/source/blender/sequencer/SEQ_retiming.h b/source/blender/sequencer/SEQ_retiming.h index c051e182431..74324a85fb7 100644 --- a/source/blender/sequencer/SEQ_retiming.h +++ b/source/blender/sequencer/SEQ_retiming.h @@ -59,7 +59,8 @@ void SEQ_retiming_sound_animation_data_set(const struct Scene *scene, const stru float SEQ_retiming_handle_timeline_frame_get(const struct Scene *scene, const struct Sequence *seq, const struct SeqRetimingHandle *handle); -const SeqRetimingHandle *SEQ_retiming_find_segment_start_handle(const struct Sequence *seq, +const SeqRetimingHandle *SEQ_retiming_find_segment_start_handle(const struct Scene *scene, + const struct Sequence *seq, const int frame_index); bool SEQ_retiming_handle_is_transition_type(const struct SeqRetimingHandle *handle); bool SEQ_retiming_handle_is_freeze_frame(const struct SeqRetimingHandle *handle); diff --git a/source/blender/sequencer/intern/sound.c b/source/blender/sequencer/intern/sound.c index 51680d4ce3f..d4b5217f2bd 100644 --- a/source/blender/sequencer/intern/sound.c +++ b/source/blender/sequencer/intern/sound.c @@ -47,8 +47,6 @@ static bool sequencer_refresh_sound_length_recursive(Main *bmain, Scene *scene, continue; } - float fac; - const int left_handle = SEQ_time_left_handle_frame_get(scene, seq); const int right_handle = SEQ_time_right_handle_frame_get(scene, seq); SEQ_time_strip_length_set( diff --git a/source/blender/sequencer/intern/strip_retiming.cc b/source/blender/sequencer/intern/strip_retiming.cc index cdb8685a1e5..56727102b0c 100644 --- a/source/blender/sequencer/intern/strip_retiming.cc +++ b/source/blender/sequencer/intern/strip_retiming.cc @@ -65,7 +65,8 @@ static bool seq_retiming_is_last_handle(const Sequence *seq, const SeqRetimingHa return SEQ_retiming_handle_index_get(seq, handle) == seq->retiming_handle_num - 1; } -const SeqRetimingHandle *SEQ_retiming_find_segment_start_handle(const Sequence *seq, +const SeqRetimingHandle *SEQ_retiming_find_segment_start_handle(const Scene *scene, + const Sequence *seq, const int frame_index) { const SeqRetimingHandle *start_handle = nullptr; @@ -73,7 +74,7 @@ const SeqRetimingHandle *SEQ_retiming_find_segment_start_handle(const Sequence * if (seq_retiming_is_last_handle(seq, &handle)) { break; } - if (handle.strip_frame_index > frame_index) { + if (handle.strip_frame_index > SEQ_time_frames_to_seconds(scene, frame_index)) { break; } @@ -101,7 +102,7 @@ void SEQ_retiming_data_ensure(const Scene *scene, Sequence *seq) seq->retiming_handles = (SeqRetimingHandle *)MEM_calloc_arrayN( 2, sizeof(SeqRetimingHandle), __func__); SeqRetimingHandle *handle = seq->retiming_handles + 1; - handle->strip_frame_index = SEQ_time_seconds_to_frames(scene, seq->len); + handle->strip_frame_index = seq->len; handle->retiming_factor = 1.0f; seq->retiming_handle_num = 2; } @@ -129,16 +130,19 @@ bool SEQ_retiming_is_allowed(const Sequence *seq) SEQ_TYPE_MASK); } -static int seq_retiming_segment_length_get(const SeqRetimingHandle *start_handle) +static int seq_retiming_segment_length_get(const Scene *scene, + const SeqRetimingHandle *start_handle) { const SeqRetimingHandle *end_handle = start_handle + 1; - return end_handle->strip_frame_index - start_handle->strip_frame_index; + return SEQ_time_seconds_to_frames( + scene, end_handle->strip_frame_index - start_handle->strip_frame_index); } -static float seq_retiming_segment_step_get(const SeqRetimingHandle *start_handle) +static float seq_retiming_segment_step_get(const Scene *scene, + const SeqRetimingHandle *start_handle) { const SeqRetimingHandle *end_handle = start_handle + 1; - const int segment_length = seq_retiming_segment_length_get(start_handle); + const int segment_length = seq_retiming_segment_length_get(scene, start_handle); const float segment_fac_diff = end_handle->retiming_factor - start_handle->retiming_factor; return segment_fac_diff / segment_length; } @@ -199,7 +203,9 @@ bool SEQ_retiming_handle_is_freeze_frame(const SeqRetimingHandle *handle) /* Check colinearity of 2 segments allowing for some imprecision. * `isect_seg_seg_v2_lambda_mu_db()` return value does not work well in this case. */ -static bool seq_retiming_transition_is_linear(const Scene *scene, const Sequence *seq, const SeqRetimingHandle *handle) +static bool seq_retiming_transition_is_linear(const Scene *scene, + const Sequence *seq, + const SeqRetimingHandle *handle) { const float prev_speed = SEQ_retiming_handle_speed_get(scene, seq, handle - 1); const float next_speed = SEQ_retiming_handle_speed_get(scene, seq, handle + 1); @@ -208,32 +214,34 @@ static bool seq_retiming_transition_is_linear(const Scene *scene, const Sequence } static float seq_retiming_evaluate_arc_segment(const SeqRetimingHandle *handle, - const float frame_index) + const float eval_time) { double c[2], r; seq_retiming_line_segments_tangent_circle(handle, c, &r); const int side = c[1] > handle->retiming_factor ? -1 : 1; - const float y = c[1] + side * sqrt(pow(r, 2) - pow((frame_index - c[0]), 2)); + const float y = c[1] + side * sqrt(pow(r, 2) - pow((eval_time - c[0]), 2)); return y; } float seq_retiming_evaluate(const Scene *scene, const Sequence *seq, const float frame_index) { - const SeqRetimingHandle *start_handle = SEQ_retiming_find_segment_start_handle(seq, frame_index); + const SeqRetimingHandle *start_handle = SEQ_retiming_find_segment_start_handle( + scene, seq, frame_index); + const double eval_time = SEQ_time_frames_to_seconds(scene, frame_index); const int start_handle_index = start_handle - seq->retiming_handles; BLI_assert(start_handle_index < seq->retiming_handle_num); - const float segment_frame_index = frame_index - start_handle->strip_frame_index; + const float segment_eval_time = eval_time - start_handle->strip_frame_index; if (!SEQ_retiming_handle_is_transition_type(start_handle)) { - const float segment_step = seq_retiming_segment_step_get(start_handle); - return start_handle->retiming_factor + segment_step * segment_frame_index; + const float segment_step = seq_retiming_segment_step_get(scene, start_handle); + return start_handle->retiming_factor + segment_step * segment_eval_time; } if (seq_retiming_transition_is_linear(scene, seq, start_handle)) { - const float segment_step = seq_retiming_segment_step_get(start_handle - 1); - return start_handle->retiming_factor + segment_step * segment_frame_index; + const float segment_step = seq_retiming_segment_step_get(scene, start_handle - 1); + return start_handle->retiming_factor + segment_step * segment_eval_time; } /* Sanity check for transition type. */ @@ -241,7 +249,7 @@ float seq_retiming_evaluate(const Scene *scene, const Sequence *seq, const float BLI_assert(start_handle_index < seq->retiming_handle_num - 1); UNUSED_VARS_NDEBUG(start_handle_index); - return seq_retiming_evaluate_arc_segment(start_handle, frame_index); + return seq_retiming_evaluate_arc_segment(start_handle, eval_time); } SeqRetimingHandle *SEQ_retiming_add_handle(const Scene *scene, @@ -252,7 +260,8 @@ SeqRetimingHandle *SEQ_retiming_add_handle(const Scene *scene, seq_time_media_playback_rate_factor_get(scene, seq); float value = seq_retiming_evaluate(scene, seq, frame_index); - const SeqRetimingHandle *start_handle = SEQ_retiming_find_segment_start_handle(seq, frame_index); + const SeqRetimingHandle *start_handle = SEQ_retiming_find_segment_start_handle( + scene, seq, frame_index); if (start_handle->strip_frame_index == frame_index) { return nullptr; /* Retiming handle already exists. */ } @@ -284,7 +293,7 @@ SeqRetimingHandle *SEQ_retiming_add_handle(const Scene *scene, seq->retiming_handle_num++; SeqRetimingHandle *added_handle = (new_handles + new_handle_index); - added_handle->strip_frame_index = frame_index; + added_handle->strip_frame_index = SEQ_time_frames_to_seconds(scene, frame_index); added_handle->retiming_factor = value; return added_handle; @@ -298,7 +307,7 @@ static void seq_retiming_offset_linear_handle(const Scene *scene, MutableSpan handles = SEQ_retiming_handles_get(seq); for (SeqRetimingHandle *next_handle = handle; next_handle < handles.end(); next_handle++) { - next_handle->strip_frame_index += offset * seq_time_media_playback_rate_factor_get(scene, seq); + next_handle->strip_frame_index += SEQ_time_frames_to_seconds(scene, offset); } /* Handle affected transitions: remove and re-create transition. This way transition won't change @@ -310,8 +319,9 @@ static void seq_retiming_offset_linear_handle(const Scene *scene, { SeqRetimingHandle *transition_handle = handle - 2; - const int transition_offset = transition_handle->strip_frame_index - - transition_handle->original_strip_frame_index; + const int transition_offset = SEQ_time_seconds_to_frames( + scene, + transition_handle->strip_frame_index - transition_handle->original_strip_frame_index); const int transition_handle_index = SEQ_retiming_handle_index_get(seq, transition_handle); @@ -358,13 +368,15 @@ static void seq_retiming_offset_transition_handle(const Scene *scene, end_frame - SEQ_retiming_handle_timeline_frame_get(scene, seq, next_segment_start) - 1; corrected_offset = max_iii(corrected_offset, offset_min_left, offset_min_right); - const float prev_segment_step = seq_retiming_segment_step_get(handle_start - 1); - const float next_segment_step = seq_retiming_segment_step_get(handle_end); + const float prev_segment_step = seq_retiming_segment_step_get(scene, handle_start - 1); + const float next_segment_step = seq_retiming_segment_step_get(scene, handle_end); - handle_start->strip_frame_index += corrected_offset; - handle_start->retiming_factor += corrected_offset * prev_segment_step; - handle_end->strip_frame_index -= corrected_offset; - handle_end->retiming_factor -= corrected_offset * next_segment_step; + handle_start->strip_frame_index += SEQ_time_frames_to_seconds(scene, corrected_offset); + handle_start->retiming_factor += SEQ_time_frames_to_seconds(scene, corrected_offset) * + prev_segment_step; + handle_end->strip_frame_index -= SEQ_time_frames_to_seconds(scene, corrected_offset); + handle_end->retiming_factor -= SEQ_time_frames_to_seconds(scene, corrected_offset) * + next_segment_step; } void SEQ_retiming_offset_handle(const Scene *scene, @@ -441,7 +453,9 @@ static void seq_retiming_remove_transition(const Scene *scene, /* Create original linear handle. */ SeqRetimingHandle *orig_handle = SEQ_retiming_add_handle( - scene, seq, SEQ_time_start_frame_get(scene, seq) + orig_frame_index); + scene, + seq, + SEQ_time_start_frame_get(scene, seq) + SEQ_time_seconds_to_frames(scene, orig_frame_index)); orig_handle->retiming_factor = orig_retiming_factor; } @@ -516,7 +530,9 @@ SeqRetimingHandle *SEQ_retiming_add_transition(const Scene *scene, return seq->retiming_handles + orig_handle_index; } -float SEQ_retiming_handle_speed_get(const Scene *scene, const Sequence *seq, const SeqRetimingHandle *handle) +float SEQ_retiming_handle_speed_get(const Scene *scene, + const Sequence *seq, + const SeqRetimingHandle *handle) { if (handle->strip_frame_index == 0) { return 1.0f; @@ -524,7 +540,7 @@ float SEQ_retiming_handle_speed_get(const Scene *scene, const Sequence *seq, con const SeqRetimingHandle *handle_prev = handle - 1; - const int frame_index_max = SEQ_time_seconds_to_frames(scene, seq->len - 1); + const int frame_index_max = SEQ_time_seconds_to_frames(scene, seq->len); const int frame_retimed_prev = round_fl_to_int(handle_prev->retiming_factor * frame_index_max); const int frame_index_prev = handle_prev->strip_frame_index; const int frame_retimed = round_fl_to_int(handle->retiming_factor * frame_index_max); @@ -580,7 +596,8 @@ class RetimingRange { blender::Vector speed_table; eRangeType type; - RetimingRange(const Scene *scene, const Sequence *seq, + RetimingRange(const Scene *scene, + const Sequence *seq, int start_frame, int end_frame, float speed, @@ -589,7 +606,7 @@ class RetimingRange { { if (type == TRANSITION) { speed = 1.0f; - claculate_speed_table_from_seq(scene ,seq); + claculate_speed_table_from_seq(scene, seq); } } @@ -713,8 +730,8 @@ class RetimingRangeData { } const SeqRetimingHandle *handle_prev = &handle - 1; float speed = SEQ_retiming_handle_speed_get(scene, seq, &handle); - int frame_start = SEQ_time_start_frame_get(scene, seq) + handle_prev->strip_frame_index; - int frame_end = SEQ_time_start_frame_get(scene, seq) + handle.strip_frame_index; + int frame_start = SEQ_retiming_handle_timeline_frame_get(scene, seq, handle_prev); + int frame_end = SEQ_retiming_handle_timeline_frame_get(scene, seq, &handle); eRangeType type = SEQ_retiming_handle_is_transition_type(handle_prev) ? TRANSITION : LINEAR; RetimingRange range = RetimingRange(scene, seq, frame_start, frame_end, speed, type); @@ -807,5 +824,5 @@ float SEQ_retiming_handle_timeline_frame_get(const Scene *scene, const SeqRetimingHandle *handle) { return SEQ_time_start_frame_get(scene, seq) + - handle->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq); + SEQ_time_seconds_to_frames(scene, handle->strip_frame_index); } diff --git a/source/blender/sequencer/intern/strip_time.c b/source/blender/sequencer/intern/strip_time.c index da1978471f7..fa5e6a1a5b7 100644 --- a/source/blender/sequencer/intern/strip_time.c +++ b/source/blender/sequencer/intern/strip_time.c @@ -509,8 +509,8 @@ int SEQ_time_strip_length_get(const Scene *scene, const Sequence *seq) if (SEQ_retiming_is_active(seq)) { SeqRetimingHandle *handle_start = seq->retiming_handles; SeqRetimingHandle *handle_end = seq->retiming_handles + (SEQ_retiming_handles_count(seq) - 1); - return handle_end->strip_frame_index / seq_time_media_playback_rate_factor_get(scene, seq) - - (handle_start->strip_frame_index) / seq_time_media_playback_rate_factor_get(scene, seq); + return SEQ_time_seconds_to_frames( + scene, handle_end->strip_frame_index - handle_start->strip_frame_index); } /* XXX it was seq->len / seq_time_media_playback_rate_factor_get(scene, seq) but now it doesn't -- 2.30.2