[Bf-blender-cvs] [302b04a5a3f] master: VSE: Improved Retiming system

Richard Antalik noreply at git.blender.org
Wed Jun 29 12:49:55 CEST 2022


Commit: 302b04a5a3fc0e767ac784424f78ce2edf5d2844
Author: Richard Antalik
Date:   Wed Jun 29 12:45:59 2022 +0200
Branches: master
https://developer.blender.org/rB302b04a5a3fc0e767ac784424f78ce2edf5d2844

VSE: Improved Retiming system

Patch implements better way to control playback speed than it is
possible to do with speed effect. Speed factor property can be set in
Time panel.

There are 2 layers of control:

Option to retime movie to match scene FPS rate.
Custom speed factor to control playback rate.
Since playback rate is strip property, it is now possible to manipulate
strip as normal one even if it is retimed.

To facilitate manipulation, some functions need to consider speed factor
and apply necessary corrections to strip offset or strip start. These
corrections may need to be float numbers, so start and offsets must be
float as well.

Sound strips now use speed factor instead of pitch. This means, that
strips will change length to match usable length. In addition, it is
possible to group movie and sound strip and change speed of meta strip.

===================================================================

M	release/scripts/startup/bl_ui/space_sequencer.py
M	source/blender/blenkernel/BKE_blender_version.h
M	source/blender/blenkernel/intern/sound.c
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/blenloader/intern/versioning_300.c
M	source/blender/editors/animation/anim_ops.c
M	source/blender/editors/space_sequencer/sequencer_add.c
M	source/blender/editors/space_sequencer/sequencer_channels_draw.c
M	source/blender/editors/space_sequencer/sequencer_drag_drop.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/editors/space_sequencer/sequencer_intern.h
M	source/blender/editors/space_sequencer/sequencer_select.c
M	source/blender/editors/space_sequencer/sequencer_thumbnails.c
M	source/blender/editors/space_sequencer/sequencer_view.c
M	source/blender/editors/space_sequencer/space_sequencer.c
M	source/blender/editors/transform/transform_convert_sequencer.c
M	source/blender/editors/transform/transform_convert_sequencer_image.c
M	source/blender/editors/transform/transform_gizmo_2d.c
M	source/blender/editors/transform/transform_snap_sequencer.c
M	source/blender/makesdna/DNA_sequence_types.h
M	source/blender/makesrna/intern/rna_sequencer.c
M	source/blender/makesrna/intern/rna_sequencer_api.c
M	source/blender/sequencer/SEQ_add.h
M	source/blender/sequencer/SEQ_edit.h
M	source/blender/sequencer/SEQ_effects.h
M	source/blender/sequencer/SEQ_iterator.h
M	source/blender/sequencer/SEQ_render.h
M	source/blender/sequencer/SEQ_sound.h
M	source/blender/sequencer/SEQ_time.h
M	source/blender/sequencer/SEQ_transform.h
M	source/blender/sequencer/intern/disk_cache.c
M	source/blender/sequencer/intern/effects.c
M	source/blender/sequencer/intern/image_cache.c
M	source/blender/sequencer/intern/iterator.c
M	source/blender/sequencer/intern/prefetch.c
M	source/blender/sequencer/intern/proxy.c
M	source/blender/sequencer/intern/render.c
M	source/blender/sequencer/intern/render.h
M	source/blender/sequencer/intern/sequencer.c
M	source/blender/sequencer/intern/sound.c
M	source/blender/sequencer/intern/strip_add.c
M	source/blender/sequencer/intern/strip_edit.c
M	source/blender/sequencer/intern/strip_relations.c
M	source/blender/sequencer/intern/strip_time.c
M	source/blender/sequencer/intern/strip_time.h
M	source/blender/sequencer/intern/strip_transform.c
M	source/blender/sequencer/intern/utils.c

===================================================================

diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index 2db30ac1450..060c00c0443 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -1870,6 +1870,12 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
         split.label(text="Channel")
         split.prop(strip, "channel", text="")
 
+        if not is_effect:
+            split = layout.split(factor=0.5 + max_factor)
+            split.alignment = 'RIGHT'
+            split.label(text="Speed Factor")
+            split.prop(strip, "speed_factor", text="")
+
         sub = layout.column(align=True)
         split = sub.split(factor=0.5 + max_factor, align=True)
         split.alignment = 'RIGHT'
@@ -1982,11 +1988,6 @@ class SEQUENCER_PT_adjust_sound(SequencerButtonsPanel, Panel):
             split.label(text="Volume")
             split.prop(strip, "volume", text="")
 
-            split = col.split(factor=0.4)
-            split.alignment = 'RIGHT'
-            split.label(text="Pitch")
-            split.prop(strip, "pitch", text="")
-
             audio_channels = context.scene.render.ffmpeg.audio_channels
             pan_enabled = sound.use_mono and audio_channels != 'MONO'
             pan_text = "%.2f°" % (strip.pan * 90)
diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h
index 04767a742ce..efe44ec657b 100644
--- a/source/blender/blenkernel/BKE_blender_version.h
+++ b/source/blender/blenkernel/BKE_blender_version.h
@@ -25,7 +25,7 @@ extern "C" {
 
 /* Blender file format version. */
 #define BLENDER_FILE_VERSION BLENDER_VERSION
-#define BLENDER_FILE_SUBVERSION 3
+#define BLENDER_FILE_SUBVERSION 5
 
 /* Minimum Blender version that supports reading file written with the current
  * version. Older Blender versions will test this and show a warning if the file
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 5bafce15b34..343a829cf76 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -720,8 +720,8 @@ void *BKE_sound_scene_add_scene_sound_defaults(Scene *scene, Sequence *sequence)
 {
   return BKE_sound_scene_add_scene_sound(scene,
                                          sequence,
-                                         SEQ_time_left_handle_frame_get(sequence),
-                                         SEQ_time_right_handle_frame_get(sequence),
+                                         SEQ_time_left_handle_frame_get(scene, sequence),
+                                         SEQ_time_right_handle_frame_get(scene, sequence),
                                          sequence->startofs + sequence->anim_startofs);
 }
 
@@ -746,8 +746,8 @@ void *BKE_sound_add_scene_sound_defaults(Scene *scene, Sequence *sequence)
 {
   return BKE_sound_add_scene_sound(scene,
                                    sequence,
-                                   SEQ_time_left_handle_frame_get(sequence),
-                                   SEQ_time_right_handle_frame_get(sequence),
+                                   SEQ_time_left_handle_frame_get(scene, sequence),
+                                   SEQ_time_right_handle_frame_get(scene, sequence),
                                    sequence->startofs + sequence->anim_startofs);
 }
 
@@ -779,8 +779,8 @@ void BKE_sound_move_scene_sound_defaults(Scene *scene, Sequence *sequence)
   if (sequence->scene_sound) {
     BKE_sound_move_scene_sound(scene,
                                sequence->scene_sound,
-                               SEQ_time_left_handle_frame_get(sequence),
-                               SEQ_time_right_handle_frame_get(sequence),
+                               SEQ_time_left_handle_frame_get(scene, sequence),
+                               SEQ_time_right_handle_frame_get(scene, sequence),
                                sequence->startofs + sequence->anim_startofs,
                                0.0);
   }
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index a15ddc75aa2..47786f55871 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -160,7 +160,7 @@ static void seq_convert_transform_crop(const Scene *scene,
   const uint32_t use_transform_flag = (1 << 16);
   const uint32_t use_crop_flag = (1 << 17);
 
-  const StripElem *s_elem = SEQ_render_give_stripelem(seq, seq->start);
+  const StripElem *s_elem = SEQ_render_give_stripelem(scene, seq, seq->start);
   if (s_elem != NULL) {
     image_size_x = s_elem->orig_width;
     image_size_y = s_elem->orig_height;
@@ -285,7 +285,7 @@ static void seq_convert_transform_crop_2(const Scene *scene,
                                          Sequence *seq,
                                          const eSpaceSeq_Proxy_RenderSize render_size)
 {
-  const StripElem *s_elem = SEQ_render_give_stripelem(seq, seq->start);
+  const StripElem *s_elem = SEQ_render_give_stripelem(scene, seq, seq->start);
   if (s_elem == NULL) {
     return;
   }
@@ -350,6 +350,7 @@ static void seq_convert_transform_crop_lb_2(const Scene *scene,
 static void seq_update_meta_disp_range(Scene *scene)
 {
   Editing *ed = SEQ_editing_get(scene);
+
   if (ed == NULL) {
     return;
   }
@@ -357,8 +358,8 @@ static void seq_update_meta_disp_range(Scene *scene)
   LISTBASE_FOREACH_BACKWARD (MetaStack *, ms, &ed->metastack) {
     /* Update ms->disp_range from meta. */
     if (ms->disp_range[0] == ms->disp_range[1]) {
-      ms->disp_range[0] = SEQ_time_left_handle_frame_get(ms->parseq);
-      ms->disp_range[1] = SEQ_time_right_handle_frame_get(ms->parseq);
+      ms->disp_range[0] = SEQ_time_left_handle_frame_get(scene, ms->parseq);
+      ms->disp_range[1] = SEQ_time_right_handle_frame_get(scene, ms->parseq);
     }
 
     /* Update meta strip endpoints. */
@@ -366,6 +367,14 @@ static void seq_update_meta_disp_range(Scene *scene)
     SEQ_time_right_handle_frame_set(scene, ms->parseq, ms->disp_range[1]);
     SEQ_transform_fix_single_image_seq_offsets(scene, ms->parseq);
 
+    /* Recalculate effects using meta strip. */
+    LISTBASE_FOREACH (Sequence *, seq, ms->oldbasep) {
+      if (seq->seq2) {
+        seq->start = seq->startdisp = max_ii(seq->seq1->startdisp, seq->seq2->startdisp);
+        seq->enddisp = min_ii(seq->seq1->enddisp, seq->seq2->enddisp);
+      }
+    }
+
     /* Ensure that active seqbase points to active meta strip seqbase. */
     MetaStack *active_ms = SEQ_meta_stack_active_get(ed);
     SEQ_seqbase_active_set(ed, &active_ms->parseq->seqbase);
diff --git a/source/blender/blenloader/intern/versioning_300.c b/source/blender/blenloader/intern/versioning_300.c
index 57fd71f8933..9514f1667b1 100644
--- a/source/blender/blenloader/intern/versioning_300.c
+++ b/source/blender/blenloader/intern/versioning_300.c
@@ -408,7 +408,7 @@ static void do_versions_sequencer_speed_effect_recursive(Scene *scene, const Lis
           v->speed_control_type = SEQ_SPEED_MULTIPLY;
           v->speed_fader = globalSpeed *
                            ((float)seq->seq1->len /
-                            max_ff((float)(SEQ_time_right_handle_frame_get(seq->seq1) -
+                            max_ff((float)(SEQ_time_right_handle_frame_get(scene, seq->seq1) -
                                            seq->seq1->start),
                                    1.0f));
         }
@@ -1235,6 +1235,17 @@ static bool version_merge_still_offsets(Sequence *seq, void *UNUSED(user_data))
   return true;
 }
 
+static bool seq_speed_factor_set(Sequence *seq, void *UNUSED(user_data))
+{
+  if (seq->type == SEQ_TYPE_SOUND_RAM) {
+    seq->speed_factor = seq->pitch;
+  }
+  else {
+    seq->speed_factor = 1.0f;
+  }
+  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.
@@ -3171,18 +3182,7 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(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.
-   */
-  {
-    /* Keep this block, even when empty. */
-
+  if (!MAIN_VERSION_ATLEAST(bmain, 303, 5)) {
     /* Fix for T98925 - remove channels region, that was initialized in incorrect editor types. */
     for (bScreen *screen = bmain->screens.first; screen; screen = screen->id.next) {
       LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
@@ -3201,5 +3201,25 @@ void blo_do_versions_300(FileData *fd, Library *UNUSED(lib), Main *bmain)
         }
       }
     }
+
+    LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
+      Editing *ed = SEQ_editing_get(scene);
+      if (ed == NULL) {
+        continue;
+      }
+      SEQ_for_each_callback(&ed->seqbase, seq_speed_factor_set, NULL);
+    }
+  }
+  /**
+   * 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/editors/animation/anim_ops.c b/source/blender/editors/animation/anim_ops.c
index 84f99ec0ac0..f3972cb45df 100644
--- a/source/blender/editors/animation/anim_ops.c
+++ b/source/blender/editors/animation/anim_ops.c
@@ -111,9 +111,9 @@ static int seq_frame_apply_snap(bContext *C, Scene *scene, const int timeline_fr
   Sequence *seq;
   SEQ_ITERATOR_FOREACH (seq, strips) {
     seq_frame_snap_update_best(
-        SEQ_time_left_handle_frame_get(seq), timeline_frame, &best_frame, &best_distance);
+        SEQ_time_left_handle_frame_get(scene, seq), t

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list