[Bf-blender-cvs] [dc450a9dfe3] temp-vse-multi-framerates: [WIP]VSE: Allow playback of multiple framerates

Richard Antalik noreply at git.blender.org
Mon Mar 29 09:00:11 CEST 2021


Commit: dc450a9dfe39fbe8bae06c463f8f547b7c7a76d4
Author: Richard Antalik
Date:   Mon Mar 29 08:09:01 2021 +0200
Branches: temp-vse-multi-framerates
https://developer.blender.org/rBdc450a9dfe39fbe8bae06c463f8f547b7c7a76d4

[WIP]VSE: Allow playback of multiple framerates

WARNING: Need to update FFmpeg tests

Store playback rate in `Sequence` and use it to calculate length
and to convert timeline frame to frame index.

Playback rate is stored as absolute value which allows easy update on
framechange. This means that scene framerate has to be available, so
a lot of functions had to be supplied with pointer to scene.

With relative value, scene frame rate properties would need `_set`
accessor function that would first go over all strips to update
framerate value, then scene framerate and finally update strip offsets.
There is also risk of precision loss for playback rate when doing these
calculations.

-----

I am undecided whether to keep this property for users to utilize for
other purposes (it could possibly replace speed effect). See for
example D4067, which is attempt for more advanced version of this
feature.

Right now property is exposed in time panel (it's badly aligned...)
It has no effect on effect strips, only movie, image, scene and similar strips.

Problem with speed effect is, that it is more difficult to work with
because whole effect chain has to be cut and time related issues and
inconsistencies do require special treatment.

On the other hand this approach does not work well with animation -
retiming strip won' t move keyframes.

So either this feature will work only for movie (and scene) strips
and will be hidden under the hood
Or it could replace speed effect completely.

Perhaps it would be better to first make this feature invisible and catch bugs, because I am quite sure there will be some.

Differential Revision: https://developer.blender.org/D10807

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

M	release/scripts/startup/bl_ui/space_sequencer.py
M	source/blender/blenloader/intern/versioning_290.c
M	source/blender/editors/space_sequencer/sequencer_add.c
M	source/blender/editors/space_sequencer/sequencer_draw.c
M	source/blender/editors/space_sequencer/sequencer_edit.c
M	source/blender/editors/transform/transform_convert_sequencer.c
M	source/blender/makesdna/DNA_sequence_types.h
M	source/blender/makesrna/intern/rna_scene.c
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_relations.h
M	source/blender/sequencer/SEQ_render.h
M	source/blender/sequencer/SEQ_time.h
M	source/blender/sequencer/SEQ_transform.h
M	source/blender/sequencer/intern/effects.c
M	source/blender/sequencer/intern/image_cache.c
M	source/blender/sequencer/intern/proxy.c
M	source/blender/sequencer/intern/render.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

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

diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index f6a03b4769c..46fcee1dbd1 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -1554,6 +1554,11 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
         max_length = max(len(x) for x in length_list)
         max_factor = (1.9 - max_length) / 30
 
+        split = layout.split(factor=0.5 + max_factor)
+        split.label(text="Playback Rate")
+        split.prop(strip, "playback_rate", text="")
+
+
         layout.enabled = not strip.lock
         layout.active = not strip.mute
 
diff --git a/source/blender/blenloader/intern/versioning_290.c b/source/blender/blenloader/intern/versioning_290.c
index 31e4b659c2f..cb8b411c1fb 100644
--- a/source/blender/blenloader/intern/versioning_290.c
+++ b/source/blender/blenloader/intern/versioning_290.c
@@ -156,7 +156,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;
@@ -284,7 +284,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;
   }
@@ -346,8 +346,10 @@ static void seq_convert_transform_crop_lb_2(const Scene *scene,
   }
 }
 
-static void seq_update_meta_disp_range(Editing *ed)
+static void seq_update_meta_disp_range(Scene *scene)
 {
+  Editing *ed = SEQ_editing_get(scene, false);
+
   if (ed == NULL) {
     return;
   }
@@ -359,9 +361,9 @@ static void seq_update_meta_disp_range(Editing *ed)
     }
 
     /* Update meta strip endpoints. */
-    SEQ_transform_set_left_handle_frame(ms->parseq, ms->disp_range[0]);
-    SEQ_transform_set_right_handle_frame(ms->parseq, ms->disp_range[1]);
-    SEQ_transform_fix_single_image_seq_offsets(ms->parseq);
+    SEQ_transform_set_left_handle_frame(scene, ms->parseq, ms->disp_range[0]);
+    SEQ_transform_set_right_handle_frame(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) {
@@ -653,7 +655,7 @@ void do_versions_after_linking_290(Main *bmain, ReportList *UNUSED(reports))
     /* Keep this block, even when empty. */
 
     LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
-      seq_update_meta_disp_range(SEQ_editing_get(scene, false));
+      seq_update_meta_disp_range(scene);
     }
   }
 }
diff --git a/source/blender/editors/space_sequencer/sequencer_add.c b/source/blender/editors/space_sequencer/sequencer_add.c
index a6e7903d1b1..7ba4ca1bf3f 100644
--- a/source/blender/editors/space_sequencer/sequencer_add.c
+++ b/source/blender/editors/space_sequencer/sequencer_add.c
@@ -986,8 +986,12 @@ static int sequencer_add_image_strip_calculate_length(wmOperator *op,
   return RNA_property_collection_length(op->ptr, RNA_struct_find_property(op->ptr, "files"));
 }
 
-static void sequencer_add_image_strip_load_files(
-    wmOperator *op, Sequence *seq, SeqLoadData *load_data, const int minframe, const int numdigits)
+static void sequencer_add_image_strip_load_files(wmOperator *op,
+                                                 Scene *scene,
+                                                 Sequence *seq,
+                                                 SeqLoadData *load_data,
+                                                 const int minframe,
+                                                 const int numdigits)
 {
   const bool use_placeholders = RNA_boolean_get(op->ptr, "use_placeholders");
 
@@ -1001,7 +1005,7 @@ static void sequencer_add_image_strip_load_files(
     size_t strip_frame = 0;
     RNA_BEGIN (op->ptr, itemptr, "files") {
       char *filename = RNA_string_get_alloc(&itemptr, "name", NULL, 0);
-      SEQ_add_image_load_file(seq, strip_frame, filename);
+      SEQ_add_image_load_file(scene, seq, strip_frame, filename);
       MEM_freeN(filename);
       strip_frame++;
     }
@@ -1029,12 +1033,12 @@ static int sequencer_add_image_strip_exec(bContext *C, wmOperator *op)
   }
 
   Sequence *seq = SEQ_add_image_strip(CTX_data_main(C), scene, ed->seqbasep, &load_data);
-  sequencer_add_image_strip_load_files(op, seq, &load_data, minframe, numdigits);
+  sequencer_add_image_strip_load_files(op, scene, seq, &load_data, minframe, numdigits);
   SEQ_add_image_init_alpha_mode(seq);
 
   /* Adjust length. */
   if (load_data.image.len == 1) {
-    SEQ_transform_set_right_handle_frame(seq, load_data.image.end_frame);
+    SEQ_transform_set_right_handle_frame(scene, seq, load_data.image.end_frame);
     SEQ_time_update_sequence(scene, seq);
   }
 
diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c
index e4afb27dd2e..39801d5f27c 100644
--- a/source/blender/editors/space_sequencer/sequencer_draw.c
+++ b/source/blender/editors/space_sequencer/sequencer_draw.c
@@ -791,12 +791,19 @@ static void draw_sequence_extensions_overlay(Scene *scene, Sequence *seq, uint p
   }
   if (seq->endofs) {
     immUniformColor4ubv(col);
-    immRectf(pos, x2, y2 + pixely, (float)(seq->start + seq->len), y2 + SEQ_STRIP_OFSBOTTOM);
+    immRectf(pos,
+             x2,
+             y2 + pixely,
+             (float)(seq->start + SEQ_time_strip_length_get(scene, seq)),
+             y2 + SEQ_STRIP_OFSBOTTOM);
 
     /* Outline. */
     immUniformColor3ubv(blend_col);
-    imm_draw_box_wire_2d(
-        pos, x2, y2 + pixely, (float)(seq->start + seq->len), y2 + SEQ_STRIP_OFSBOTTOM);
+    imm_draw_box_wire_2d(pos,
+                         x2,
+                         y2 + pixely,
+                         (float)(seq->start + SEQ_time_strip_length_get(scene, seq)),
+                         y2 + SEQ_STRIP_OFSBOTTOM);
   }
   GPU_blend(GPU_BLEND_NONE);
 }
@@ -872,9 +879,9 @@ static void draw_seq_background(Scene *scene,
   /* Draw the main strip body. */
   if (is_single_image) {
     immRectf(pos,
-             SEQ_transform_get_left_handle_frame(seq, false),
+             SEQ_transform_get_left_handle_frame(scene, seq, false),
              y1,
-             SEQ_transform_get_right_handle_frame(seq, false),
+             SEQ_transform_get_right_handle_frame(scene, seq, false),
              y2);
   }
   else {
@@ -890,7 +897,8 @@ static void draw_seq_background(Scene *scene,
       immRectf(pos, seq->startdisp, y1, (float)(seq->start), y2);
     }
     if (seq->endstill) {
-      immRectf(pos, (float)(seq->start + seq->len), y1, seq->enddisp, y2);
+      immRectf(
+          pos, (float)(seq->start + SEQ_time_strip_length_get(scene, seq)), y1, seq->enddisp, y2);
     }
   }
 
@@ -1104,7 +1112,7 @@ static void draw_seq_strip(const bContext *C,
   /* Draw strip body. */
   x1 = (seq->startstill) ? seq->start : seq->startdisp;
   y1 = seq->machine + SEQ_STRIP_OFSBOTTOM;
-  x2 = (seq->endstill) ? (seq->start + seq->len) : seq->enddisp;
+  x2 = (seq->endstill) ? (seq->start + SEQ_time_strip_length_get(scene, seq)) : seq->enddisp;
   y2 = seq->machine + SEQ_STRIP_OFSTOP;
 
   float text_margin_y;
@@ -2009,7 +2017,8 @@ static void draw_seq_strips(const bContext *C, Editing *ed, ARegion *region)
       if (min_ii(seq->startdisp, seq->start) > v2d->cur.xmax) {
         continue;
       }
-      if (max_ii(seq->enddisp, seq->start + seq->len) < v2d->cur.xmin) {
+      if (max_ii(seq->enddisp, seq->start + SEQ_time_strip_length_get(scene, seq)) <
+          v2d->cur.xmin) {
         continue;
       }
       if (seq->machine + 1.0f < v2d->cur.ymin) {
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 78d263dffad..0ddf5e764cf 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -300,13 +300,14 @@ static int sequencer_snap_exec(bContext *C, wmOperator *op)
       }
       else {
         if (seq->flag & SEQ_LEFTSEL) {
-          SEQ_transform_set_left_handle_frame(seq, snap_frame);
+          SEQ_transform_set_left_handle_frame(scene, seq, snap_frame);
         }
         else { /* SEQ_RIGHTSEL */
-          SEQ_transform_set_right_handle_frame(seq, snap_frame);
+          SEQ_transform_set_right_handle_frame(scene, seq, snap_frame);
         }
-        SEQ_transform_handle_xlimits(seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
-        SEQ_transform_fix_single_image_seq_offsets(seq);
+        SEQ_transform_handle_xlimits(
+            scene, seq, seq->flag & SEQ_LEFTSEL, seq->flag & SEQ_RIGHTSEL);
+        SEQ_transform_fix_single_image_seq_offsets(scene, seq);
       }
       SEQ_time_update_sequence(scene, seq);
     }
@@ -1789,12 +1790,12 @@ static int sequencer_separate_images_exec(bContext *C, wmOperator *op)
       /* if (seq->ipo) id_us_min(&seq->ipo->id); */
       /* XXX, remove fcurve and assign to split image strips */
 
-      start_ofs = timeline_frame = SEQ_transform_get_left_handle_frame(seq, false);
-      frame_end = SEQ_transform_get_right_handle_frame(seq, false);
+      start_ofs = timeline_frame = SEQ_transform_get_left_handle_frame(scene, seq, false);
+      frame_end = SEQ_transform_get_right_handle_frame(scene, seq, false);
 
       while (timeline_frame < frame_end) {
         /* New seq. */
-        se = SEQ_render_give_stripelem(seq, timeline_frame);
+        se = SEQ_render_give_stripelem(scene, seq, timeline_frame);
 
         seq_new = SEQ_sequence_dupli_recursive(
             scene, scene, ed->seqbasep, seq, SEQ_DUPE_UNIQUE_NAME);
@@ -2296,7 +2297,7 @@ static int se

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list