diff options
Diffstat (limited to 'source/blender/blenkernel/intern/sequence.c')
-rw-r--r-- | source/blender/blenkernel/intern/sequence.c | 284 |
1 files changed, 203 insertions, 81 deletions
diff --git a/source/blender/blenkernel/intern/sequence.c b/source/blender/blenkernel/intern/sequence.c index 121dfce4980..3365af36f8c 100644 --- a/source/blender/blenkernel/intern/sequence.c +++ b/source/blender/blenkernel/intern/sequence.c @@ -122,6 +122,14 @@ void new_tstripdata(Sequence *seq) /* free */ +static void free_proxy_seq(Sequence *seq) +{ + if (seq->strip && seq->strip->proxy && seq->strip->proxy->anim) { + IMB_free_anim(seq->strip->proxy->anim); + seq->strip->proxy->anim = 0; + } +} + void seq_free_strip(Strip *strip) { strip->us--; @@ -136,6 +144,10 @@ void seq_free_strip(Strip *strip) } if (strip->proxy) { + if (strip->proxy->anim) { + IMB_free_anim(strip->proxy->anim); + } + MEM_freeN(strip->proxy); } if (strip->crop) { @@ -598,6 +610,8 @@ void reload_sequence_new_file(Scene *scene, Sequence * seq) seq->strip->len = seq->len; } + free_proxy_seq(seq); + calc_sequence(seq); } @@ -1112,7 +1126,7 @@ static int get_shown_sequences( ListBase * seqbasep, int cfra, int chanshown, Se #define PROXY_MAXFILE (2*FILE_MAXDIR+FILE_MAXFILE) -static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * name) +static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * name, int render_size) { int frameno; char dir[FILE_MAXDIR]; @@ -1132,12 +1146,20 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na } } + if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { + BLI_join_dirfile(name, dir, seq->strip->proxy->file); + BLI_convertstringcode(name, G.sce); + BLI_convertstringframe(name, cfra); + + return TRUE; + } + /* generate a seperate proxy directory for each preview size */ if (seq->type == SEQ_IMAGE) { StripElem * se = give_stripelem(seq, cfra); snprintf(name, PROXY_MAXFILE, "%s/images/%d/%s_proxy", - dir, scene->r.size, se->name); + dir, render_size, se->name); frameno = 1; } else if (seq->type == SEQ_MOVIE) { TStripElem * tse = give_tstripelem(seq, cfra); @@ -1146,14 +1168,14 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na snprintf(name, PROXY_MAXFILE, "%s/%s/%d/####", dir, seq->strip->stripdata->name, - scene->r.size); + render_size); } else { TStripElem * tse = give_tstripelem(seq, cfra); frameno = tse->nr + seq->anim_startofs; snprintf(name, PROXY_MAXFILE, "%s/proxy_misc/%d/####", dir, - scene->r.size); + render_size); } BLI_convertstringcode(name, G.sce); @@ -1165,7 +1187,7 @@ static int seq_proxy_get_fname(Scene *scene, Sequence * seq, int cfra, char * na return TRUE; } -static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra) +static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra, int render_size) { char name[PROXY_MAXFILE]; @@ -1174,11 +1196,28 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra) } /* rendering at 100% ? No real sense in proxy-ing, right? */ - if (scene->r.size == 100.0) { + if (render_size == 100) { return 0; } - if (!seq_proxy_get_fname(scene, seq, cfra, name)) { + if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { + TStripElem * tse = give_tstripelem(seq, cfra); + int frameno = tse->nr + seq->anim_startofs; + if (!seq->strip->proxy->anim) { + if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) { + return 0; + } + + seq->strip->proxy->anim = openanim(name, IB_rect); + } + if (!seq->strip->proxy->anim) { + return 0; + } + + return IMB_anim_absolute(seq->strip->proxy->anim, frameno); + } + + if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) { return 0; } @@ -1190,9 +1229,9 @@ static struct ImBuf * seq_proxy_fetch(Scene *scene, Sequence * seq, int cfra) } static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra, - int build_proxy_run); + int build_proxy_run, int render_size); -static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra) +static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra, int render_size) { char name[PROXY_MAXFILE]; int quality; @@ -1206,11 +1245,16 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra) } /* rendering at 100% ? No real sense in proxy-ing, right? */ - if (scene->r.size == 100.0) { + if (render_size == 100) { return; } - if (!seq_proxy_get_fname(scene, seq, cfra, name)) { + /* that's why it is called custom... */ + if (seq->flag & SEQ_USE_PROXY_CUSTOM_FILE) { + return; + } + + if (!seq_proxy_get_fname(scene, seq, cfra, name, render_size)) { return; } @@ -1224,14 +1268,14 @@ static void seq_proxy_build_frame(Scene *scene, Sequence * seq, int cfra) se->ibuf = 0; } - do_build_seq_ibuf(scene, seq, se, cfra, TRUE); + do_build_seq_ibuf(scene, seq, se, cfra, TRUE, render_size); if (!se->ibuf) { return; } - rectx= (scene->r.size*scene->r.xsch)/100; - recty= (scene->r.size*scene->r.ysch)/100; + rectx= (render_size*scene->r.xsch)/100; + recty= (render_size*scene->r.ysch)/100; ibuf = se->ibuf; @@ -1286,7 +1330,7 @@ void seq_proxy_rebuild(Scene *scene, Sequence * seq) TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { - seq_proxy_build_frame(scene, seq, cfra); + seq_proxy_build_frame(scene, seq, cfra, scene->r.size); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1299,7 +1343,7 @@ void seq_proxy_rebuild(Scene *scene, Sequence * seq) TStripElem * tse = give_tstripelem(seq, cfra); if (!(tse->flag & STRIPELEM_PREVIEW_DONE)) { - seq_proxy_build_frame(scene, seq, cfra); + seq_proxy_build_frame(scene, seq, cfra, scene->r.size); tse->flag |= STRIPELEM_PREVIEW_DONE; } if (blender_test_break()) { @@ -1752,11 +1796,46 @@ static void free_metastrip_imbufs(ListBase *seqbasep, int cfra, int chanshown) } +static void check_limiter_refcount(const char * func, TStripElem *se) +{ + if (se && se->ibuf) { + int refcount = IMB_cache_limiter_get_refcount(se->ibuf); + if (refcount != 1) { + /* can happen on complex pipelines */ + if (refcount > 1 && (G.f & G_DEBUG) == 0) { + return; + } + + fprintf(stderr, + "sequencer: (ibuf) %s: " + "suspicious memcache " + "limiter refcount: %d\n", func, refcount); + } + } +} + +static void check_limiter_refcount_comp(const char * func, TStripElem *se) +{ + if (se && se->ibuf_comp) { + int refcount = IMB_cache_limiter_get_refcount(se->ibuf_comp); + if (refcount != 1) { + /* can happen on complex pipelines */ + if (refcount > 1 && (G.f & G_DEBUG) == 0) { + return; + } + fprintf(stderr, + "sequencer: (ibuf comp) %s: " + "suspicious memcache " + "limiter refcount: %d\n", func, refcount); + } + } +} + static TStripElem* do_build_seq_array_recursively(Scene *scene, - ListBase *seqbasep, int cfra, int chanshown); + ListBase *seqbasep, int cfra, int chanshown, int render_size); static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int cfra, - int build_proxy_run) + int build_proxy_run, int render_size) { char name[FILE_MAXDIR+FILE_MAXFILE]; int use_limiter = TRUE; @@ -1766,18 +1845,23 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(seq->type == SEQ_META) { TStripElem * meta_se = 0; + int use_preprocess = FALSE; use_limiter = FALSE; if (!build_proxy_run && se->ibuf == 0) { - se->ibuf = seq_proxy_fetch(scene, seq, cfra); + se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); if (se->ibuf) { use_limiter = TRUE; + use_preprocess = TRUE; } } if(!se->ibuf && seq->seqbase.first) { meta_se = do_build_seq_array_recursively(scene, - &seq->seqbase, seq->start + se->nr, 0); + &seq->seqbase, seq->start + se->nr, 0, + render_size); + + check_limiter_refcount("do_build_seq_ibuf: for META", meta_se); } se->ok = STRIPELEM_OK; @@ -1799,21 +1883,24 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int se->ibuf = i; use_limiter = TRUE; + use_preprocess = TRUE; } + } else if (se->ibuf) { + use_limiter = TRUE; } if (meta_se) { free_metastrip_imbufs( &seq->seqbase, seq->start + se->nr, 0); } - if (use_limiter) { + if (use_preprocess) { input_preprocess(scene, seq, se, cfra); } } else if(seq->type & SEQ_EFFECT) { /* should the effect be recalculated? */ if (!build_proxy_run && se->ibuf == 0) { - se->ibuf = seq_proxy_fetch(scene, seq, cfra); + se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); } if(se->ibuf == 0) { @@ -1834,13 +1921,19 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int BLI_convertstringcode(name, G.sce); BLI_convertstringframe(name, scene->r.cfra); if (!build_proxy_run) { - se->ibuf = seq_proxy_fetch(scene, seq, cfra); + se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); } copy_from_ibuf_still(seq, se); if (!se->ibuf) { se->ibuf= IMB_loadiffname( name, IB_rect); + /* we don't need both (speed reasons)! */ + if (se->ibuf && + se->ibuf->rect_float && se->ibuf->rect) { + imb_freerectImBuf(se->ibuf); + } + copy_to_ibuf_still(seq, se); } @@ -1853,7 +1946,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int } else if(seq->type == SEQ_MOVIE) { if(se->ok == STRIPELEM_OK && se->ibuf==0) { if(!build_proxy_run) { - se->ibuf = seq_proxy_fetch(scene, seq, cfra); + se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); } copy_from_ibuf_still(seq, se); @@ -1871,6 +1964,13 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if(seq->anim) { IMB_anim_set_preseek(seq->anim, seq->anim_preseek); se->ibuf = IMB_anim_absolute(seq->anim, se->nr + seq->anim_startofs); + /* we don't need both (speed reasons)! */ + if (se->ibuf + && se->ibuf->rect_float + && se->ibuf->rect) { + imb_freerectImBuf(se->ibuf); + } + } copy_to_ibuf_still(seq, se); } @@ -1894,7 +1994,7 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int 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(scene, seq, cfra); + se->ibuf = seq_proxy_fetch(scene, seq, cfra, render_size); if (se->ibuf) { input_preprocess(scene, seq, se, cfra); } @@ -1910,7 +2010,10 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int if (!sce_valid) { se->ok = STRIPELEM_FAILED; } else if (se->ibuf==NULL && sce_valid) { - waitcursor(1); + /* no need to display a waitcursor on sequencer + scene strips */ + if (!(sce->r.scemode & R_DOSEQ)) + waitcursor(1); /* Hack! This function can be called from do_render_seq(), in that case the seq->scene can already have a Render initialized with same name, @@ -1960,6 +2063,13 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int /* restore */ scene->r.scemode |= doseq; + + // XXX +#if 0 + if((G.f & G_PLAYANIM)==0 /* bad, is set on do_render_seq */ + && !(sce->r.scemode & R_DOSEQ)) + waitcursor(0); +#endif CFRA = oldcfra; set_last_seq(oldseq); @@ -1986,9 +2096,9 @@ static void do_build_seq_ibuf(Scene *scene, Sequence * seq, TStripElem *se, int } } -static TStripElem* do_build_seq_recursively(Scene *scene, Sequence *seq, int cfra); +static TStripElem* do_build_seq_recursively(Scene *scene, Sequence *seq, int cfra, int render_size); -static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *se, int cfra) +static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *se, int cfra, int render_size) { float fac, facf; struct SeqEffectHandle sh = get_sequence_effect(seq); @@ -2017,22 +2127,22 @@ static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *s /* no input needed */ break; case 0: - se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra); - se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra); + se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size); + se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size); if (seq->seq3) { - se->se3 = do_build_seq_recursively(scene, seq->seq3, cfra); + se->se3 = do_build_seq_recursively(scene, seq->seq3, cfra, render_size); } break; case 1: - se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra); + se->se1 = do_build_seq_recursively(scene, seq->seq1, cfra, render_size); break; case 2: - se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra); + se->se2 = do_build_seq_recursively(scene, seq->seq2, cfra, render_size); break; } - do_build_seq_ibuf(scene, seq, se, cfra, FALSE); + do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size); /* children are not needed anymore ... */ @@ -2045,9 +2155,10 @@ static void do_effect_seq_recursively(Scene *scene, Sequence *seq, TStripElem *s if (se->se3 && se->se3->ibuf) { IMB_cache_limiter_unref(se->se3->ibuf); } + check_limiter_refcount("do_effect_seq_recursively", se); } -static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, int cfra) +static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, int cfra, int render_size) { TStripElem *se; @@ -2055,9 +2166,9 @@ static TStripElem* do_build_seq_recursively_impl(Scene *scene, Sequence * seq, i if(se) { if (seq->type & SEQ_EFFECT) { - do_effect_seq_recursively(scene, seq, se, cfra); + do_effect_seq_recursively(scene, seq, se, cfra, render_size); } else { - do_build_seq_ibuf(scene, seq, se, cfra, FALSE); + do_build_seq_ibuf(scene, seq, se, cfra, FALSE, render_size); } } return se; @@ -2071,7 +2182,7 @@ instead of faking using the blend code below... */ -static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra) +static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra, int render_size) { SpeedControlVars * s = (SpeedControlVars *)seq->effectdata; int nr = cfra - seq->start; @@ -2100,7 +2211,7 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra test_and_auto_discard_ibuf(se); if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left); + se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2132,8 +2243,8 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra } if (se->ibuf == NULL) { - se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left); - se2 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_right); + se1 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_left, render_size); + se2 = do_build_seq_recursively_impl(scene, seq->seq1, cfra_right, render_size); if((se1 && se1->ibuf && se1->ibuf->rect_float)) se->ibuf= IMB_allocImBuf((short)seqrectx, (short)seqrecty, 32, IB_rectfloat, 0); @@ -2168,6 +2279,8 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra if (se2 && se2->ibuf) IMB_cache_limiter_unref(se2->ibuf); + check_limiter_refcount("do_handle_speed_effect", se); + return se; } @@ -2183,25 +2296,22 @@ static TStripElem* do_handle_speed_effect(Scene *scene, Sequence * seq, int cfra * */ -static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra) +static TStripElem* do_build_seq_recursively(Scene *scene, Sequence * seq, int cfra, int render_size) { + TStripElem *se; if (seq->type == SEQ_SPEED) { - return do_handle_speed_effect(scene, seq, cfra); + se = do_handle_speed_effect(scene, seq, cfra, render_size); } else { - return do_build_seq_recursively_impl(scene, seq, cfra); + se = do_build_seq_recursively_impl(scene, seq, cfra, render_size); } -} -/* Bug: 18209 - * when dragging the mouse over a metastrip, on mouse-up for some unknown - * reason in some cases the metastrips TStripElem->ibuf->rect is NULL, - * This should be fixed but I had a look and couldnt work out why its - * happening so for now workaround with a NULL check - campbell */ + check_limiter_refcount("do_build_seq_recursively", se); -#define SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND + return se; +} static TStripElem* do_build_seq_array_recursively(Scene *scene, - ListBase *seqbasep, int cfra, int chanshown) + ListBase *seqbasep, int cfra, int chanshown, int render_size) { Sequence* seq_arr[MAXSEQ+1]; int count; @@ -2231,7 +2341,7 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, if(count == 1) { - se = do_build_seq_recursively(scene, seq_arr[0], cfra); + se = do_build_seq_recursively(scene, seq_arr[0], cfra, render_size); if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf_comp); @@ -2253,7 +2363,7 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, break; } if (seq->blend_mode == SEQ_BLEND_REPLACE) { - do_build_seq_recursively(scene, seq, cfra); + do_build_seq_recursively(scene, seq, cfra, render_size); if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf); @@ -2261,6 +2371,9 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, se->ibuf_comp = IMB_allocImBuf( (short)seqrectx, (short)seqrecty, 32, IB_rect, 0); + IMB_cache_limiter_insert(se->ibuf_comp); + IMB_cache_limiter_ref(se->ibuf_comp); + IMB_cache_limiter_touch(se->ibuf_comp); } break; } @@ -2285,7 +2398,7 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, switch (early_out) { case -1: case 2: - do_build_seq_recursively(scene, seq, cfra); + do_build_seq_recursively(scene, seq, cfra, render_size); if (se->ibuf) { se->ibuf_comp = se->ibuf; IMB_refImBuf(se->ibuf_comp); @@ -2293,6 +2406,9 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, se->ibuf_comp = IMB_allocImBuf( (short)seqrectx, (short)seqrecty, 32, IB_rect, 0); + IMB_cache_limiter_insert(se->ibuf_comp); + IMB_cache_limiter_ref(se->ibuf_comp); + IMB_cache_limiter_touch(se->ibuf_comp); } break; case 1: @@ -2306,11 +2422,14 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, } break; case 0: - do_build_seq_recursively(scene, seq, cfra); + do_build_seq_recursively(scene, seq, cfra, render_size); if (!se->ibuf) { se->ibuf = IMB_allocImBuf( (short)seqrectx, (short)seqrecty, 32, IB_rect, 0); + IMB_cache_limiter_insert(se->ibuf); + IMB_cache_limiter_ref(se->ibuf); + IMB_cache_limiter_touch(se->ibuf); } if (i == 0) { se->ibuf_comp = se->ibuf; @@ -2369,13 +2488,6 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, IMB_rect_from_float(se2->ibuf); } -#ifdef SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND - if (se2->ibuf->rect==NULL && se2->ibuf->rect_float==NULL) { - printf("ERROR: sequencer se2->ibuf missing buffer\n"); - } else if (se1->ibuf && se1->ibuf->rect==NULL && se1->ibuf->rect_float==NULL) { - printf("ERROR: sequencer se1->ibuf missing buffer\n"); - } else { -#endif /* bad hack, to fix crazy input ordering of those two effects */ @@ -2397,10 +2509,6 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, se2->ibuf_comp); } -#ifdef SEQ_SPECIAL_SEQ_UPDATE_WORKAROUND - } -#endif - IMB_cache_limiter_insert(se2->ibuf_comp); IMB_cache_limiter_ref(se2->ibuf_comp); IMB_cache_limiter_touch(se2->ibuf_comp); @@ -2428,7 +2536,7 @@ static TStripElem* do_build_seq_array_recursively(Scene *scene, * you have to unref after usage! */ -static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, int chanshown) +static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size) { Editing *ed= seq_give_editing(scene, FALSE); int count; @@ -2449,28 +2557,32 @@ static ImBuf *give_ibuf_seq_impl(Scene *scene, int rectx, int recty, int cfra, i seqrectx= rectx; /* bad bad global! */ seqrecty= recty; - se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown); + se = do_build_seq_array_recursively(scene, seqbasep, cfra, chanshown, render_size); if(!se) { return 0; } + check_limiter_refcount_comp("give_ibuf_seq_impl", se); + return se->ibuf_comp; } -ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, Sequence *seq) +ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, int render_size, Sequence *seq) { TStripElem* se; seqrectx= rectx; /* bad bad global! */ seqrecty= recty; - se = do_build_seq_recursively(scene, seq, cfra); + se = do_build_seq_recursively(scene, seq, cfra, render_size); if(!se) { return 0; } + check_limiter_refcount("give_ibuf_seq_direct", se); + if (se->ibuf) { IMB_cache_limiter_unref(se->ibuf); } @@ -2478,9 +2590,9 @@ ImBuf *give_ibuf_seq_direct(Scene *scene, int rectx, int recty, int cfra, Sequen return se->ibuf; } -ImBuf *give_ibuf_seq(Scene *scene, int rectx, int recty, int cfra, int chanshown) +ImBuf *give_ibuf_seq(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size) { - ImBuf* i = give_ibuf_seq_impl(scene, rectx, recty, cfra, chanshown); + ImBuf* i = give_ibuf_seq_impl(scene, rectx, recty, cfra, chanshown, render_size); if (i) { IMB_cache_limiter_unref(i); @@ -2535,6 +2647,7 @@ typedef struct PrefetchQueueElem { int recty; int cfra; int chanshown; + int render_size; int monoton_cfra; @@ -2580,7 +2693,8 @@ static void *seq_prefetch_thread(void * This_) if (e->cfra >= s_last) { e->ibuf = give_ibuf_seq_impl(This->scene, - e->rectx, e->recty, e->cfra, e->chanshown); + e->rectx, e->recty, e->cfra, e->chanshown, + e->render_size); } pthread_mutex_lock(&queue_lock); @@ -2689,7 +2803,8 @@ void seq_stop_threads() BLI_end_threads(0); } -void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown) +void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown, + int render_size) { PrefetchQueueElem *e; if (seq_thread_shutdown) { @@ -2701,6 +2816,7 @@ void give_ibuf_prefetch_request(int rectx, int recty, int cfra, int chanshown) e->recty = recty; e->cfra = cfra; e->chanshown = chanshown; + e->render_size = render_size; e->monoton_cfra = monoton_cfra++; pthread_mutex_lock(&queue_lock); @@ -2741,13 +2857,13 @@ void seq_wait_for_prefetch_ready() fprintf(stderr, "SEQ-THREAD: prefetch done\n"); } -ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int chanshown) +ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int chanshown, int render_size) { PrefetchQueueElem *e = NULL; int found_something = FALSE; if (seq_thread_shutdown) { - return give_ibuf_seq(scene, rectx, recty, cfra, chanshown); + return give_ibuf_seq(scene, rectx, recty, cfra, chanshown, render_size); } while (!e) { @@ -2758,7 +2874,8 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int if (cfra == e->cfra && chanshown == e->chanshown && rectx == e->rectx && - recty == e->recty) { + recty == e->recty && + render_size == e->render_size) { success = TRUE; found_something = TRUE; break; @@ -2770,7 +2887,8 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int if (cfra == e->cfra && chanshown == e->chanshown && rectx == e->rectx && - recty == e->recty) { + recty == e->recty && + render_size == e->render_size) { found_something = TRUE; break; } @@ -2786,7 +2904,8 @@ ImBuf *give_ibuf_seq_threaded(Scene *scene, int rectx, int recty, int cfra, int cfra == tslot->current->cfra && chanshown == tslot->current->chanshown && rectx == tslot->current->rectx && - recty == tslot->current->recty) { + recty == tslot->current->recty && + render_size== tslot->current->render_size){ found_something = TRUE; break; } @@ -2887,6 +3006,7 @@ void free_imbuf_seq_except(Scene *scene, int cfra) if(seq->type==SEQ_MOVIE) if(seq->startdisp > cfra || seq->enddisp < cfra) free_anim_seq(seq); + free_proxy_seq(seq); } } SEQ_END @@ -3010,6 +3130,7 @@ void free_imbuf_seq_with_ipo(Scene *scene, struct Ipo *ipo) if(seq->type == SEQ_SPEED) { sequence_effect_speed_rebuild_map(seq, 1); } + free_proxy_seq(seq); } } SEQ_END @@ -3021,7 +3142,7 @@ void do_render_seq(RenderResult *rr, int cfra) { ImBuf *ibuf; - ibuf= give_ibuf_seq(scene, rr->rectx, rr->recty, cfra, 0); + ibuf= give_ibuf_seq(scene, rr->rectx, rr->recty, cfra, 0, scene->r.size); if(ibuf) { if(ibuf->rect_float) { @@ -3076,6 +3197,7 @@ void do_render_seq(RenderResult *rr, int cfra) "user preferences.\n"); free_imbuf_seq(); } + free_proxy_seq(seq); } } else { |