diff options
-rw-r--r-- | source/blender/blenloader/intern/readfile.c | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_sequence_types.h | 2 | ||||
-rw-r--r-- | source/blender/src/editseq.c | 2 | ||||
-rw-r--r-- | source/blender/src/sequence.c | 115 |
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); |