Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenloader/intern/readfile.c2
-rw-r--r--source/blender/makesdna/DNA_sequence_types.h2
-rw-r--r--source/blender/src/editseq.c2
-rw-r--r--source/blender/src/sequence.c115
4 files changed, 118 insertions, 3 deletions
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 5779f6587b8..ca25f2f0cef 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -3460,6 +3460,8 @@ static void direct_link_scene(FileData *fd, Scene *sce)
seq->strip->tstripdata = 0;
seq->strip->tstripdata_startstill = 0;
seq->strip->tstripdata_endstill = 0;
+ seq->strip->ibuf_startstill = 0;
+ seq->strip->ibuf_endstill = 0;
if(seq->type == SEQ_IMAGE ||
seq->type == SEQ_MOVIE ||
diff --git a/source/blender/makesdna/DNA_sequence_types.h b/source/blender/makesdna/DNA_sequence_types.h
index 0e09823b123..8dad33c411b 100644
--- a/source/blender/makesdna/DNA_sequence_types.h
+++ b/source/blender/makesdna/DNA_sequence_types.h
@@ -97,6 +97,8 @@ typedef struct Strip {
TStripElem *tstripdata;
TStripElem *tstripdata_startstill;
TStripElem *tstripdata_endstill;
+ struct ImBuf *ibuf_startstill;
+ struct ImBuf *ibuf_endstill;
} Strip;
diff --git a/source/blender/src/editseq.c b/source/blender/src/editseq.c
index 303cc742769..057995382bf 100644
--- a/source/blender/src/editseq.c
+++ b/source/blender/src/editseq.c
@@ -2179,6 +2179,8 @@ static Sequence *dupli_seq(Sequence *seq)
seqn->strip->tstripdata = 0;
seqn->strip->tstripdata_startstill = 0;
seqn->strip->tstripdata_endstill = 0;
+ seqn->strip->ibuf_startstill = 0;
+ seqn->strip->ibuf_endstill = 0;
if (seq->strip->crop) {
seqn->strip->crop = MEM_dupallocN(seq->strip->crop);
diff --git a/source/blender/src/sequence.c b/source/blender/src/sequence.c
index 30ba671688b..9f6de0fe69d 100644
--- a/source/blender/src/sequence.c
+++ b/source/blender/src/sequence.c
@@ -139,6 +139,16 @@ void free_strip(Strip *strip)
free_tstripdata(strip->endstill, strip->tstripdata_endstill);
free_tstripdata(strip->startstill, strip->tstripdata_startstill);
+ if(strip->ibuf_startstill) {
+ IMB_freeImBuf(strip->ibuf_startstill);
+ strip->ibuf_startstill = 0;
+ }
+
+ if(strip->ibuf_endstill) {
+ IMB_freeImBuf(strip->ibuf_endstill);
+ strip->ibuf_endstill = 0;
+ }
+
MEM_freeN(strip);
}
@@ -155,6 +165,16 @@ void new_tstripdata(Sequence *seq)
seq->strip->tstripdata_endstill= 0;
seq->strip->tstripdata_startstill= 0;
+ if(seq->strip->ibuf_startstill) {
+ IMB_freeImBuf(seq->strip->ibuf_startstill);
+ seq->strip->ibuf_startstill = 0;
+ }
+
+ if(seq->strip->ibuf_endstill) {
+ IMB_freeImBuf(seq->strip->ibuf_endstill);
+ seq->strip->ibuf_endstill = 0;
+ }
+
seq->strip->len= seq->len;
}
}
@@ -1538,6 +1558,61 @@ static void test_and_auto_discard_ibuf(TStripElem * se)
}
}
+static void test_and_auto_discard_ibuf_stills(Strip * strip)
+{
+ if (strip->ibuf_startstill) {
+ if (!strip->ibuf_startstill->rect &&
+ !strip->ibuf_startstill->rect_float) {
+ IMB_freeImBuf(strip->ibuf_startstill);
+ strip->ibuf_startstill = 0;
+ }
+ }
+ if (strip->ibuf_endstill) {
+ if (!strip->ibuf_endstill->rect &&
+ !strip->ibuf_endstill->rect_float) {
+ IMB_freeImBuf(strip->ibuf_endstill);
+ strip->ibuf_endstill = 0;
+ }
+ }
+}
+
+static void copy_from_ibuf_still(Sequence * seq, TStripElem * se)
+{
+ if (!se->ibuf) {
+ if (se->nr == 0 && seq->strip->ibuf_startstill) {
+ IMB_cache_limiter_touch(seq->strip->ibuf_startstill);
+
+ se->ibuf = IMB_dupImBuf(seq->strip->ibuf_startstill);
+ }
+ if (se->nr == seq->len - 1
+ && (seq->len != 1)
+ && seq->strip->ibuf_endstill) {
+ IMB_cache_limiter_touch(seq->strip->ibuf_endstill);
+
+ se->ibuf = IMB_dupImBuf(seq->strip->ibuf_endstill);
+ }
+ }
+}
+
+static void copy_to_ibuf_still(Sequence * seq, TStripElem * se)
+{
+ if (se->ibuf) {
+ if (se->nr == 0) {
+ seq->strip->ibuf_startstill = IMB_dupImBuf(se->ibuf);
+
+ IMB_cache_limiter_insert(seq->strip->ibuf_startstill);
+ IMB_cache_limiter_touch(seq->strip->ibuf_startstill);
+ }
+ if (se->nr == seq->len - 1 && seq->len != 1) {
+ seq->strip->ibuf_endstill = IMB_dupImBuf(se->ibuf);
+
+ IMB_cache_limiter_insert(seq->strip->ibuf_endstill);
+ IMB_cache_limiter_touch(seq->strip->ibuf_endstill);
+ }
+ }
+}
+
+
static TStripElem* do_build_seq_array_recursively(
ListBase *seqbasep, int cfra, int chanshown);
@@ -1549,6 +1624,7 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
if (seq->type != SEQ_META) {
test_and_auto_discard_ibuf(se);
+ test_and_auto_discard_ibuf_stills(seq->strip);
}
if(seq->type == SEQ_META) {
@@ -1606,9 +1682,12 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
if (!build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra);
}
+ copy_from_ibuf_still(seq, se);
+
if (!se->ibuf) {
se->ibuf= IMB_loadiffname(
name, IB_rect);
+ copy_to_ibuf_still(seq, se);
}
if(se->ibuf == 0) {
@@ -1622,6 +1701,7 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
if(!build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra);
}
+ copy_from_ibuf_still(seq, se);
if (se->ibuf == 0) {
if(seq->anim==0) {
@@ -1635,6 +1715,7 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
IMB_anim_set_preseek(seq->anim, seq->anim_preseek);
se->ibuf = IMB_anim_absolute(seq->anim, se->nr + seq->anim_startofs);
}
+ copy_to_ibuf_still(seq, se);
}
if(se->ibuf == 0) {
@@ -1650,17 +1731,25 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
RenderResult rres;
int doseq, rendering= G.rendering;
char scenename[64];
+ int sce_valid =sce&& (sce->camera || sce->r.scemode & R_DOSEQ);
- if (se->ibuf==NULL && sce && (sce->camera || sce->r.scemode & R_DOSEQ) && !build_proxy_run) {
+ if (se->ibuf == NULL && sce_valid && !build_proxy_run) {
se->ibuf = seq_proxy_fetch(seq, cfra);
if (se->ibuf) {
input_preprocess(seq, se, cfra);
}
}
+
+ if (se->ibuf == NULL && sce_valid) {
+ copy_from_ibuf_still(seq, se);
+ if (se->ibuf) {
+ input_preprocess(seq, se, cfra);
+ }
+ }
- if (sce && sce->camera==NULL && (sce->r.scemode & R_DOSEQ) == 0) {
+ if (!sce_valid) {
se->ok = STRIPELEM_FAILED;
- } else if (se->ibuf==NULL && sce && (sce->camera || sce->r.scemode & R_DOSEQ) ) {
+ } else if (se->ibuf==NULL && sce_valid) {
waitcursor(1);
/* Hack! This function can be called from do_render_seq(), in that case
@@ -1716,6 +1805,8 @@ static void do_build_seq_ibuf(Sequence * seq, TStripElem *se, int cfra,
waitcursor(0);
CFRA = oldcfra;
+ copy_to_ibuf_still(seq, se);
+
if (!build_proxy_run) {
if(se->ibuf == NULL) {
se->ok = STRIPELEM_FAILED;
@@ -2582,6 +2673,15 @@ void free_imbuf_seq_except(int cfra)
free_imbuf_strip_elem(se);
}
}
+ if(seq->strip->ibuf_startstill) {
+ IMB_freeImBuf(seq->strip->ibuf_startstill);
+ seq->strip->ibuf_startstill = 0;
+ }
+
+ if(seq->strip->ibuf_endstill) {
+ IMB_freeImBuf(seq->strip->ibuf_endstill);
+ seq->strip->ibuf_endstill = 0;
+ }
if(seq->type==SEQ_MOVIE)
if(seq->startdisp > cfra || seq->enddisp < cfra)
@@ -2614,6 +2714,15 @@ void free_imbuf_seq()
a < seq->strip->endstill && se; a++, se++) {
free_imbuf_strip_elem(se);
}
+ if(seq->strip->ibuf_startstill) {
+ IMB_freeImBuf(seq->strip->ibuf_startstill);
+ seq->strip->ibuf_startstill = 0;
+ }
+
+ if(seq->strip->ibuf_endstill) {
+ IMB_freeImBuf(seq->strip->ibuf_endstill);
+ seq->strip->ibuf_endstill = 0;
+ }
if(seq->type==SEQ_MOVIE)
free_anim_seq(seq);