== Sequencer ==

This fixes several issues with the Speed Control Effect:
* IPO curve-deletion resulted in non-working effect
* easy retiming only allowed enlarging of strips,
  now shrinking is also possible (easy retiming:
  use the right display handle of input strip and
  shrink or enlarge, will make the speed of the
  strip exactly fit the effect strip's length)
* frames after end-of-display of input strips can
  now be accessed (which is necessary for fix #2)
  
=> just use easy retiming from now on, it's fun :)
This commit is contained in:
Peter Schlaile 2009-06-26 07:32:24 +00:00
parent 6b9e817032
commit 6f87d03b3c
5 changed files with 111 additions and 91 deletions

@ -66,8 +66,10 @@ char *give_seqname_by_type(int type);
char *give_seqname(struct Sequence *seq);
int evaluate_seq_frame(int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra,
int in_display_range);
struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra,
int in_display_range);
struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel,
int render_size);
/* chansel: render this channel. Default=0 (renders end result)*/

@ -767,7 +767,7 @@ static void seq_panel_editing()
if(last_seq->type==SEQ_IMAGE) {
if (last_seq->len > 1) {
/* CURRENT */
StripElem * se= give_stripelem(last_seq, CFRA);
StripElem * se= give_stripelem(last_seq, CFRA, TRUE);
StripElem * last;
/* FIRST AND LAST */
@ -809,7 +809,8 @@ static void seq_panel_editing()
}
}
else if(last_seq->type==SEQ_SCENE) {
TStripElem * se= give_tstripelem(last_seq, (G.scene->r.cfra));
TStripElem * se= give_tstripelem(last_seq, (G.scene->r.cfra),
TRUE);
if(se && last_seq->scene) {
sprintf(str, "First: %d\nLast: %d\nCur: %d\n", last_seq->sfra+se->nr, last_seq->sfra, last_seq->sfra+last_seq->len-1);
}
@ -882,7 +883,7 @@ static void seq_panel_input()
cfra = last_seq->enddisp - 1;
}
se = give_stripelem(last_seq, cfra);
se = give_stripelem(last_seq, cfra, TRUE);
if (se) {
uiDefBut(block, TEX,

@ -3720,7 +3720,7 @@ void seq_separate_images(void)
while (cfra < frame_end) {
/* new seq */
se = give_stripelem(seq, cfra);
se = give_stripelem(seq, cfra, TRUE);
seq_new= alloc_sequence(((Editing *)G.scene->ed)->seqbasep, start_ofs, seq->machine);
seq_new->type= SEQ_IMAGE;

@ -32,6 +32,7 @@
#include "MEM_guardedalloc.h"
#include "PIL_dynlib.h"
#include "DNA_ipo_types.h"
#include "DNA_scene_types.h"
#include "DNA_sequence_types.h"
@ -2805,20 +2806,11 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
/* if there is no IPO, try to make retiming easy by stretching the
strip */
if (!seq->ipo && seq->seq1 && seq->seq1->enddisp != seq->seq1->start
if ((!seq->ipo || !seq->ipo->curve.first) &&
seq->seq1 && seq->seq1->enddisp != seq->seq1->start
&& seq->seq1->len != 0) {
fallback_fac = (float) seq->seq1->len /
(float) (seq->seq1->enddisp - seq->seq1->start);
/* FIXME: this strip stretching gets screwed by stripdata
handling one layer up.
So it currently works by enlarging, never by shrinking!
(IPOs still work, if used correctly)
*/
if (fallback_fac > 1.0) {
fallback_fac = 1.0;
}
}
if ((v->flags & SEQ_SPEED_INTEGRATE) != 0) {
@ -2828,7 +2820,7 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
v->lastValidFrame = 0;
for (cfra = 1; cfra < v->length; cfra++) {
if(seq->ipo) {
if(seq->ipo && seq->ipo->curve.first) {
if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
ctime = frame_to_float(seq->startdisp
+ cfra);
@ -2848,7 +2840,7 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
cursor += seq->facf0;
if (cursor >= v->length) {
if (cursor >= seq->seq1->len) {
v->frameMap[cfra] = v->length - 1;
} else {
v->frameMap[cfra] = cursor;
@ -2858,7 +2850,7 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
} else {
v->lastValidFrame = 0;
for (cfra = 0; cfra < v->length; cfra++) {
if(seq->ipo) {
if(seq->ipo && seq->ipo->curve.first) {
if((seq->flag & SEQ_IPO_FRAME_LOCKED) != 0) {
ctime = frame_to_float(seq->startdisp
+ cfra);
@ -2876,11 +2868,11 @@ void sequence_effect_speed_rebuild_map(struct Sequence * seq, int force)
if (v->flags & SEQ_SPEED_COMPRESS_IPO_Y) {
seq->facf0 *= v->length;
}
if (!seq->ipo) {
if ((!seq->ipo || !seq->ipo->curve.first)) {
seq->facf0 = (float) cfra * fallback_fac;
}
seq->facf0 *= v->globalSpeed;
if (seq->facf0 >= v->length) {
if (seq->facf0 >= seq->seq1->len) {
seq->facf0 = v->length - 1;
} else {
v->lastValidFrame = cfra;

@ -838,11 +838,13 @@ static void do_effect(int cfra, Sequence *seq, TStripElem * se)
se->ibuf);
}
static int give_stripelem_index(Sequence *seq, int cfra)
static int give_stripelem_index(Sequence *seq, int cfra, int in_display_range)
{
int nr;
if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
if (in_display_range) {
if(seq->startdisp >cfra || seq->enddisp <= cfra) return -1;
}
if(seq->len == 0) return -1;
if(seq->flag&SEQ_REVERSE_FRAMES) {
/*reverse frame in this sequence */
@ -872,7 +874,7 @@ static TStripElem* alloc_tstripdata(int len, const char * name)
return se;
}
TStripElem *give_tstripelem(Sequence *seq, int cfra)
TStripElem *give_tstripelem(Sequence *seq, int cfra, int in_display_range)
{
TStripElem *se;
int nr;
@ -882,7 +884,7 @@ TStripElem *give_tstripelem(Sequence *seq, int cfra)
se = seq->strip->tstripdata = alloc_tstripdata(seq->len,
"tstripelems");
}
nr = give_stripelem_index(seq, cfra);
nr = give_stripelem_index(seq, cfra, in_display_range);
if (nr == -1) return 0;
if (se == 0) return 0;
@ -943,13 +945,13 @@ TStripElem *give_tstripelem(Sequence *seq, int cfra)
return se;
}
StripElem *give_stripelem(Sequence *seq, int cfra)
StripElem *give_stripelem(Sequence *seq, int cfra, int in_display_range)
{
StripElem *se;
int nr;
se = seq->strip->stripdata;
nr = give_stripelem_index(seq, cfra);
nr = give_stripelem_index(seq, cfra, in_display_range);
if (nr == -1) return 0;
if (se == 0) return 0;
@ -1051,7 +1053,7 @@ static int get_shown_sequences(
#define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE)
static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
int render_size)
int render_size, int in_display_range)
{
int frameno;
char dir[FILE_MAXDIR];
@ -1060,7 +1062,8 @@ static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
return FALSE;
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) {
if ((seq->flag & SEQ_USE_PROXY_CUSTOM_DIR) ||
(seq->flag & SEQ_USE_PROXY_CUSTOM_FILE)) {
strcpy(dir, seq->strip->proxy->dir);
} else {
if (seq->type == SEQ_IMAGE || seq->type == SEQ_MOVIE) {
@ -1082,12 +1085,12 @@ static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
/* generate a seperate proxy directory for each preview size */
if (seq->type == SEQ_IMAGE) {
StripElem * se = give_stripelem(seq, cfra);
StripElem * se = give_stripelem(seq, cfra, in_display_range);
snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy",
dir, render_size, se->name);
frameno = 1;
} else if (seq->type == SEQ_MOVIE) {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
frameno = tse->nr + seq->anim_startofs;
@ -1095,7 +1098,7 @@ static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
seq->strip->stripdata->name,
render_size);
} else {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
frameno = tse->nr + seq->anim_startofs;
@ -1113,7 +1116,7 @@ static int seq_proxy_get_fname(Sequence * seq, int cfra, char * name,
}
static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
int render_size)
int render_size, int in_display_range)
{
char name[PROXY_MAXFILE];
@ -1127,10 +1130,11 @@ static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
}
if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra,in_display_range);
int frameno = tse->nr + seq->anim_startofs;
if (!seq->strip->proxy->anim) {
if (!seq_proxy_get_fname(seq, cfra,name,render_size)) {
if (!seq_proxy_get_fname(seq, cfra,name,render_size,
in_display_range)) {
return 0;
}
@ -1143,7 +1147,8 @@ static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
return IMB_anim_absolute(seq->strip->proxy->anim, frameno);
}
if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
if (!seq_proxy_get_fname(seq, cfra, name, render_size,
in_display_range)) {
return 0;
}
@ -1155,7 +1160,8 @@ static struct ImBuf * seq_proxy_fetch(Sequence * seq, int cfra,
}
static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
int build_proxy_run, int render_size);
int build_proxy_run, int render_size,
int in_display_range);
static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size)
{
@ -1180,11 +1186,11 @@ static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size)
return;
}
if (!seq_proxy_get_fname(seq, cfra, name, render_size)) {
if (!seq_proxy_get_fname(seq, cfra, name, render_size, TRUE)) {
return;
}
se = give_tstripelem(seq, cfra);
se = give_tstripelem(seq, cfra, TRUE);
if (!se) {
return;
}
@ -1194,7 +1200,7 @@ static void seq_proxy_build_frame(Sequence * seq, int cfra, int render_size)
se->ibuf = 0;
}
do_build_seq_ibuf(seq, se, cfra, TRUE, render_size);
do_build_seq_ibuf(seq, se, cfra, TRUE, render_size, TRUE);
if (!se->ibuf) {
return;
@ -1244,7 +1250,7 @@ void seq_proxy_rebuild(Sequence * seq)
*/
for (cfra = seq->startdisp; cfra < seq->enddisp; cfra++) {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
tse->flag &= ~STRIPELEM_PREVIEW_DONE;
}
@ -1256,7 +1262,7 @@ void seq_proxy_rebuild(Sequence * seq)
if (seq->flag & SEQ_REVERSE_FRAMES) {
for (cfra = seq->enddisp-seq->endstill-1;
cfra >= seq->startdisp + seq->startstill; cfra--) {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
set_timecursor(cfra);
@ -1270,7 +1276,7 @@ void seq_proxy_rebuild(Sequence * seq)
} else {
for (cfra = seq->startdisp + seq->startstill;
cfra < seq->enddisp - seq->endstill; cfra++) {
TStripElem * tse = give_tstripelem(seq, cfra);
TStripElem * tse = give_tstripelem(seq, cfra, TRUE);
if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) {
set_timecursor(cfra);
@ -1707,7 +1713,7 @@ static void free_metastrip_imbufs(ListBase *seqbasep, int cfra, int chanshown)
if (!video_seq_is_rendered(seq_arr[i])) {
continue;
}
se = give_tstripelem(seq_arr[i], cfra);
se = give_tstripelem(seq_arr[i], cfra, FALSE);
if (se) {
if (se->ibuf) {
IMB_freeImBuf(se->ibuf);
@ -1765,7 +1771,8 @@ static TStripElem* do_build_seq_array_recursively(
ListBase *seqbasep, int cfra, int chanshown, int render_size);
static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
int build_proxy_run, int render_size)
int build_proxy_run, int render_size,
int in_display_range)
{
char name[FILE_MAXDIR+FILE_MAXFILE];
int use_limiter = TRUE;
@ -1779,7 +1786,8 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
use_limiter = FALSE;
if (!build_proxy_run && se->ibuf == 0) {
se->ibuf = seq_proxy_fetch(seq, cfra, render_size);
se->ibuf = seq_proxy_fetch(seq, cfra, render_size,
in_display_range);
if (se->ibuf) {
use_limiter = TRUE;
use_preprocess = TRUE;
@ -1832,7 +1840,8 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
/* should the effect be recalculated? */
if (!build_proxy_run && se->ibuf == 0) {
se->ibuf = seq_proxy_fetch(seq, cfra, render_size);
se->ibuf = seq_proxy_fetch(seq, cfra, render_size,
in_display_range);
if (se->ibuf) {
use_preprocess = TRUE;
}
@ -1867,13 +1876,15 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
}
} else if(seq->type == SEQ_IMAGE) {
if(se->ok == STRIPELEM_OK && se->ibuf == 0) {
StripElem * s_elem = give_stripelem(seq, cfra);
StripElem * s_elem = give_stripelem(
seq, cfra, in_display_range);
BLI_join_dirfile(name, seq->strip->dir, s_elem->name);
BLI_convertstringcode(name, G.sce);
BLI_convertstringframe(name, G.scene->r.cfra);
if (!build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra,
render_size);
se->ibuf = seq_proxy_fetch(
seq, cfra, render_size,
in_display_range);
}
copy_from_ibuf_still(seq, se);
@ -1898,8 +1909,9 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
} else if(seq->type == SEQ_MOVIE) {
if(se->ok == STRIPELEM_OK && se->ibuf==0) {
if(!build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra,
render_size);
se->ibuf = seq_proxy_fetch(
seq, cfra, render_size,
in_display_range);
}
copy_from_ibuf_still(seq, se);
@ -1945,7 +1957,8 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
int sce_valid =sce&& (sce->camera || sce->r.scemode & R_DOSEQ);
if (se->ibuf == NULL && sce_valid && !build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra, render_size);
se->ibuf = seq_proxy_fetch(seq, cfra, render_size,
in_display_range);
if (se->ibuf) {
input_preprocess(seq, se, cfra);
}
@ -2045,10 +2058,11 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
}
static TStripElem* do_build_seq_recursively(Sequence * seq, int cfra,
int render_size);
int render_size,
int in_display_range);
static void do_effect_seq_recursively(Sequence * seq, TStripElem *se, int cfra,
int render_size)
int render_size, int in_display_range)
{
float fac, facf;
struct SeqEffectHandle sh = get_sequence_effect(seq);
@ -2074,27 +2088,27 @@ static void do_effect_seq_recursively(Sequence * seq, TStripElem *se, int cfra,
/* no input needed */
break;
case 0:
se->se1 = do_build_seq_recursively(seq->seq1, cfra,
render_size);
se->se2 = do_build_seq_recursively(seq->seq2, cfra,
render_size);
se->se1 = do_build_seq_recursively(
seq->seq1, cfra, render_size, in_display_range);
se->se2 = do_build_seq_recursively(
seq->seq2, cfra, render_size, in_display_range);
if (seq->seq3) {
se->se3 = do_build_seq_recursively(seq->seq3, cfra,
render_size);
se->se3 = do_build_seq_recursively(
seq->seq3, cfra, render_size,in_display_range);
}
break;
case 1:
se->se1 = do_build_seq_recursively(seq->seq1, cfra,
render_size);
se->se1 = do_build_seq_recursively(
seq->seq1, cfra, render_size, in_display_range);
break;
case 2:
se->se2 = do_build_seq_recursively(seq->seq2, cfra,
render_size);
se->se2 = do_build_seq_recursively(
seq->seq2, cfra, render_size, in_display_range);
break;
}
do_build_seq_ibuf(seq, se, cfra, FALSE, render_size);
do_build_seq_ibuf(seq, se, cfra, FALSE, render_size, in_display_range);
/* children are not needed anymore ... */
@ -2111,17 +2125,20 @@ static void do_effect_seq_recursively(Sequence * seq, TStripElem *se, int cfra,
}
static TStripElem* do_build_seq_recursively_impl(Sequence * seq, int cfra,
int render_size)
int render_size,
int in_display_range)
{
TStripElem *se;
se = give_tstripelem(seq, cfra);
se = give_tstripelem(seq, cfra, in_display_range);
if(se) {
if (seq->type & SEQ_EFFECT) {
do_effect_seq_recursively(seq, se, cfra, render_size);
do_effect_seq_recursively(seq, se, cfra, render_size,
in_display_range);
} else {
do_build_seq_ibuf(seq, se, cfra, FALSE, render_size);
do_build_seq_ibuf(seq, se, cfra, FALSE, render_size,
in_display_range);
}
}
check_limiter_refcount("do_build_seq_recursively_impl", se);
@ -2137,7 +2154,8 @@ instead of faking using the blend code below...
*/
static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra,
int render_size)
int render_size,
int in_display_range)
{
SpeedControlVars * s = (SpeedControlVars *)seq->effectdata;
int nr = cfra - seq->start;
@ -2155,7 +2173,7 @@ static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra,
cfra_left = (int) floor(f_cfra);
cfra_right = (int) ceil(f_cfra);
se = give_tstripelem(seq, cfra);
se = give_tstripelem(seq, cfra, in_display_range);
if (!se) {
return se;
@ -2167,7 +2185,7 @@ static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra,
if (se->ibuf == NULL) {
se1 = do_build_seq_recursively_impl(
seq->seq1, cfra_left, render_size);
seq->seq1, cfra_left, render_size, FALSE);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@ -2200,9 +2218,9 @@ static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra,
if (se->ibuf == NULL) {
se1 = do_build_seq_recursively_impl(
seq->seq1, cfra_left, render_size);
seq->seq1, cfra_left, render_size, FALSE);
se2 = do_build_seq_recursively_impl(
seq->seq1, cfra_right, render_size);
seq->seq1, cfra_right, render_size, FALSE);
if((se1 && se1->ibuf && se1->ibuf->rect_float))
se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0);
@ -2255,13 +2273,16 @@ static TStripElem* do_handle_speed_effect(Sequence * seq, int cfra,
*/
static TStripElem* do_build_seq_recursively(Sequence * seq, int cfra,
int render_size)
int render_size,
int in_display_range)
{
TStripElem* se;
if (seq->type == SEQ_SPEED) {
se = do_handle_speed_effect(seq, cfra, render_size);
se = do_handle_speed_effect(seq, cfra, render_size,
in_display_range);
} else {
se = do_build_seq_recursively_impl(seq, cfra, render_size);
se = do_build_seq_recursively_impl(seq, cfra, render_size,
in_display_range);
}
check_limiter_refcount("do_build_seq_recursively", se);
@ -2283,7 +2304,7 @@ static TStripElem* do_build_seq_array_recursively(
return 0;
}
se = give_tstripelem(seq_arr[count - 1], cfra);
se = give_tstripelem(seq_arr[count - 1], cfra, TRUE);
if (!se) {
return 0;
@ -2300,7 +2321,8 @@ static TStripElem* do_build_seq_array_recursively(
if(count == 1) {
se = do_build_seq_recursively(seq_arr[0], cfra, render_size);
se = do_build_seq_recursively(seq_arr[0], cfra, render_size,
TRUE);
if (se->ibuf) {
se->ibuf_comp = se->ibuf;
IMB_refImBuf(se->ibuf_comp);
@ -2314,7 +2336,7 @@ static TStripElem* do_build_seq_array_recursively(
Sequence * seq = seq_arr[i];
struct SeqEffectHandle sh;
se = give_tstripelem(seq, cfra);
se = give_tstripelem(seq, cfra, TRUE);
test_and_auto_discard_ibuf(se);
@ -2322,7 +2344,7 @@ static TStripElem* do_build_seq_array_recursively(
break;
}
if (seq->blend_mode == SEQ_BLEND_REPLACE) {
do_build_seq_recursively(seq, cfra, render_size);
do_build_seq_recursively(seq, cfra, render_size, TRUE);
if (se->ibuf) {
se->ibuf_comp = se->ibuf;
IMB_refImBuf(se->ibuf);
@ -2355,7 +2377,7 @@ static TStripElem* do_build_seq_array_recursively(
switch (early_out) {
case -1:
case 2:
do_build_seq_recursively(seq, cfra, render_size);
do_build_seq_recursively(seq, cfra, render_size, TRUE);
if (se->ibuf) {
se->ibuf_comp = se->ibuf;
IMB_refImBuf(se->ibuf_comp);
@ -2379,7 +2401,7 @@ static TStripElem* do_build_seq_array_recursively(
}
break;
case 0:
do_build_seq_recursively(seq, cfra, render_size);
do_build_seq_recursively(seq, cfra, render_size, TRUE);
if (!se->ibuf) {
se->ibuf = IMB_allocImBuf(
(short)seqrectx, (short)seqrecty,
@ -2405,8 +2427,8 @@ static TStripElem* do_build_seq_array_recursively(
for (; i < count; i++) {
Sequence * seq = seq_arr[i];
struct SeqEffectHandle sh = get_sequence_blend(seq);
TStripElem* se1 = give_tstripelem(seq_arr[i-1], cfra);
TStripElem* se2 = give_tstripelem(seq_arr[i], cfra);
TStripElem* se1 = give_tstripelem(seq_arr[i-1], cfra, TRUE);
TStripElem* se2 = give_tstripelem(seq_arr[i], cfra, TRUE);
int early_out = sh.early_out(seq, seq->facf0, seq->facf1);
switch (early_out) {
@ -2535,7 +2557,7 @@ ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra, int render_size,
seqrectx= rectx; /* bad bad global! */
seqrecty= recty;
se = do_build_seq_recursively(seq, cfra, render_size);
se = do_build_seq_recursively(seq, cfra, render_size, TRUE);
if(!se) {
return 0;
@ -2934,7 +2956,7 @@ void free_imbuf_seq_except(int cfra)
WHILE_SEQ(&ed->seqbase) {
if(seq->strip) {
TStripElem * curelem = give_tstripelem(seq, cfra);
TStripElem * curelem = give_tstripelem(seq, cfra,TRUE);
for(a = 0, se = seq->strip->tstripdata;
a < seq->strip->len && se; a++, se++) {
@ -2967,6 +2989,9 @@ void free_imbuf_seq_except(int cfra)
if(seq->type==SEQ_MOVIE)
if(seq->startdisp > cfra || seq->enddisp < cfra)
free_anim_seq(seq);
if(seq->type==SEQ_SPEED) {
sequence_effect_speed_rebuild_map(seq, TRUE);
}
free_proxy_seq(seq);
}
}
@ -3008,7 +3033,7 @@ static void free_imbuf_seq_editing(Editing * ed)
if(seq->type==SEQ_MOVIE)
free_anim_seq(seq);
if(seq->type==SEQ_SPEED) {
sequence_effect_speed_rebuild_map(seq, 1);
sequence_effect_speed_rebuild_map(seq, TRUE);
}
free_proxy_seq(seq);
}
@ -3083,7 +3108,7 @@ static int update_changed_seq_recurs(Sequence *seq, Sequence *changed_seq, int l
if(seq->type == SEQ_MOVIE)
free_anim_seq(seq);
if(seq->type == SEQ_SPEED) {
sequence_effect_speed_rebuild_map(seq, 1);
sequence_effect_speed_rebuild_map(seq, TRUE);
}
free_proxy_seq(seq);
}