[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14218] trunk/blender/source/blender: == Sequencer / ImBuf ==
Peter Schlaile
peter at schlaile.de
Sun Mar 23 18:56:51 CET 2008
Revision: 14218
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14218
Author: schlaile
Date: 2008-03-23 18:56:44 +0100 (Sun, 23 Mar 2008)
Log Message:
-----------
== Sequencer / ImBuf ==
Fixed a long standing bug in IMB_dupImBuf: refcounter should be better 0
within the duplicated ImBuf...
Finally removed this strange STRIPELEM_META mumbo jumbo.
On a way to asset management: made METAs behave like true input strips:
* proxying should work
* input filter options should work (including transform and color balance :)
* IPOs now work in replace mode
Modified Paths:
--------------
trunk/blender/source/blender/imbuf/intern/allocimbuf.c
trunk/blender/source/blender/include/BSE_sequence.h
trunk/blender/source/blender/makesdna/DNA_sequence_types.h
trunk/blender/source/blender/src/buttons_scene.c
trunk/blender/source/blender/src/editseq.c
trunk/blender/source/blender/src/sequence.c
Modified: trunk/blender/source/blender/imbuf/intern/allocimbuf.c
===================================================================
--- trunk/blender/source/blender/imbuf/intern/allocimbuf.c 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/imbuf/intern/allocimbuf.c 2008-03-23 17:56:44 UTC (rev 14218)
@@ -478,6 +478,7 @@
// set malloc flag
tbuf.mall = ibuf2->mall;
tbuf.c_handle = 0;
+ tbuf.refcounter = 0;
// for now don't duplicate image info
tbuf.img_info = 0;
Modified: trunk/blender/source/blender/include/BSE_sequence.h
===================================================================
--- trunk/blender/source/blender/include/BSE_sequence.h 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/include/BSE_sequence.h 2008-03-23 17:56:44 UTC (rev 14218)
@@ -71,7 +71,6 @@
int evaluate_seq_frame(int cfra);
struct StripElem *give_stripelem(struct Sequence *seq, int cfra);
struct TStripElem *give_tstripelem(struct Sequence *seq, int cfra);
-void set_meta_stripdata(struct Sequence *seqm);
struct ImBuf *give_ibuf_seq(int rectx, int recty, int cfra, int chansel);
/* chansel: render this channel. Default=0 (renders end result)*/
struct ImBuf *give_ibuf_seq_direct(int rectx, int recty, int cfra,
Modified: trunk/blender/source/blender/makesdna/DNA_sequence_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_sequence_types.h 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/makesdna/DNA_sequence_types.h 2008-03-23 17:56:44 UTC (rev 14218)
@@ -293,7 +293,6 @@
#define STRIPELEM_FAILED 0
#define STRIPELEM_OK 1
-#define STRIPELEM_META 2
#define STRIPELEM_PREVIEW_DONE 1
Modified: trunk/blender/source/blender/src/buttons_scene.c
===================================================================
--- trunk/blender/source/blender/src/buttons_scene.c 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/src/buttons_scene.c 2008-03-23 17:56:44 UTC (rev 14218)
@@ -790,7 +790,8 @@
if (last_seq->type == SEQ_MOVIE
|| last_seq->type == SEQ_IMAGE
- || last_seq->type == SEQ_SCENE) {
+ || last_seq->type == SEQ_SCENE
+ || last_seq->type == SEQ_META) {
uiDefButBitI(block, TOG, SEQ_USE_CROP,
B_SEQ_BUT_RELOAD, "Use Crop",
10,100,240,19, &last_seq->flag,
@@ -1229,7 +1230,8 @@
panels = SEQ_PANEL_EDITING;
- if (type == SEQ_MOVIE || type == SEQ_IMAGE || type == SEQ_SCENE) {
+ if (type == SEQ_MOVIE || type == SEQ_IMAGE || type == SEQ_SCENE
+ || type == SEQ_META) {
panels |= SEQ_PANEL_INPUT | SEQ_PANEL_FILTER | SEQ_PANEL_PROXY;
}
Modified: trunk/blender/source/blender/src/editseq.c
===================================================================
--- trunk/blender/source/blender/src/editseq.c 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/src/editseq.c 2008-03-23 17:56:44 UTC (rev 14218)
@@ -2339,7 +2339,7 @@
seqn = deep_dupli_seq(seq);
}
- if (seqn) { /* should never fail */
+ if (seqn) {
seqn->flag |= SELECT;
/* Second Strip! */
@@ -2690,8 +2690,6 @@
seqm->strip->len= seqm->len;
seqm->strip->us= 1;
- set_meta_stripdata(seqm);
-
if( test_overlap_seq(seqm) ) shuffle_seq(seqm);
BIF_undo_push("Make Meta Strip, Sequencer");
@@ -2768,9 +2766,6 @@
ed->seqbasep= ms->oldbasep;
- /* recalc entire meta */
- set_meta_stripdata(ms->parseq);
-
/* recalc all: the meta can have effects connected to it */
seq= ed->seqbasep->first;
while(seq) {
Modified: trunk/blender/source/blender/src/sequence.c
===================================================================
--- trunk/blender/source/blender/src/sequence.c 2008-03-23 16:27:34 UTC (rev 14217)
+++ trunk/blender/source/blender/src/sequence.c 2008-03-23 17:56:44 UTC (rev 14218)
@@ -401,8 +401,10 @@
if(seqm->enddisp > max) max= seqm->enddisp;
seqm= seqm->next;
}
- seq->start= min;
- seq->len= max-min;
+ seq->start= min + seq->anim_startofs;
+ seq->len = max-min;
+ seq->len -= seq->anim_startofs;
+ seq->len -= seq->anim_endofs;
if(seq->strip && seq->len!=seq->strip->len) {
new_tstripdata(seq);
@@ -713,14 +715,9 @@
return;
}
- if(se->se1->ok == STRIPELEM_META) se1= se->se1->se1;
- else se1= se->se1;
-
- if(se->se2->ok == STRIPELEM_META) se2= se->se2->se1;
- else se2= se->se2;
-
- if(se->se3->ok == STRIPELEM_META) se3= se->se3->se1;
- else se3= se->se3;
+ se1= se->se1;
+ se2= se->se2;
+ se3= se->se3;
if ( (se1==0 || se2==0 || se3==0)
|| (se1->ibuf==0 || se2->ibuf==0 || se3->ibuf==0)) {
@@ -735,8 +732,7 @@
return;
}
- if(se->se1->ok == STRIPELEM_META) se1= se->se1->se1;
- else se1= se->se1;
+ se1= se->se1;
if (se1 == 0 || se1->ibuf == 0) {
make_black_ibuf(se->ibuf);
@@ -755,8 +751,7 @@
return;
}
- if(se->se2->ok == STRIPELEM_META) se2= se->se2->se1;
- else se2= se->se2;
+ se2= se->se2;
if (se2 == 0 || se2->ibuf == 0) {
make_black_ibuf(se->ibuf);
@@ -998,44 +993,7 @@
return cnt;
}
-static int get_shown_seq_from_metastrip(Sequence * seqm, int cfra,
- Sequence ** seq_arr_out)
-{
- return get_shown_sequences(&seqm->seqbase, cfra, 0, seq_arr_out);
-}
-void set_meta_stripdata(Sequence *seqm)
-{
- TStripElem *se;
- int a, cfra;
-
- se= seqm->strip->tstripdata;
-
- if (se == 0 && seqm->len > 0) {
- int i;
- se = seqm->strip->tstripdata = MEM_callocN(
- seqm->len*sizeof(TStripElem), "tstripelems");
- for (i = 0; i < seqm->len; i++) {
- se[i].ok = STRIPELEM_META;
- }
- }
-
- /* sets all ->se1 pointers in stripdata, to read the ibuf from it */
-
- for(a=0; a<seqm->len; a++, se++) {
- int cnt;
- Sequence *seq_arr[MAXSEQ+1];
-
- cfra= a+seqm->start;
- cnt = get_shown_seq_from_metastrip(seqm, cfra, seq_arr);
- if (cnt) {
- se->se1= give_tstripelem(seq_arr[cnt-1], cfra);
- } else {
- se->se1= 0;
- }
- }
-}
-
/* **********************************************************************
proxy management
********************************************************************** */
@@ -1266,7 +1224,7 @@
if (!(cb.flag & SEQ_COLOR_BALANCE_INVERSE_GAMMA)) {
for (c = 0; c < 3; c++) {
- if (cb.gain[c] != 0.0) {
+ if (cb.gamma[c] != 0.0) {
cb.gamma[c] = 1.0/cb.gamma[c];
} else {
cb.gamma[c] = 1000000; /* should be enough :) */
@@ -1419,6 +1377,38 @@
*/
+static int input_have_to_preprocess(Sequence * seq, TStripElem* se, int cfra)
+{
+ float mul;
+
+ if ((seq->flag & SEQ_FILTERY) ||
+ (seq->flag & SEQ_USE_CROP) ||
+ (seq->flag & SEQ_USE_TRANSFORM) ||
+ (seq->flag & SEQ_FLIPX) ||
+ (seq->flag & SEQ_FLIPY) ||
+ (seq->flag & SEQ_USE_COLOR_BALANCE) ||
+ (seq->flag & SEQ_MAKE_PREMUL) ||
+ (se->ibuf->x != seqrectx || se->ibuf->y != seqrecty)) {
+ return TRUE;
+ }
+
+ mul = seq->mul;
+
+ if(seq->blend_mode == SEQ_BLEND_REPLACE) {
+ if (seq->ipo && seq->ipo->curve.first) {
+ do_seq_ipo(seq, cfra);
+ mul *= seq->facf0;
+ }
+ mul *= seq->blend_opacity / 100.0;
+ }
+
+ if (mul != 1.0) {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void input_preprocess(Sequence * seq, TStripElem* se, int cfra)
{
float mul;
@@ -1620,39 +1610,59 @@
int build_proxy_run)
{
char name[FILE_MAXDIR+FILE_MAXFILE];
+ int use_limiter = TRUE;
+ test_and_auto_discard_ibuf(se);
+ test_and_auto_discard_ibuf_stills(seq->strip);
- if (seq->type != SEQ_META) {
- test_and_auto_discard_ibuf(se);
- test_and_auto_discard_ibuf_stills(seq->strip);
- }
+ if(seq->type == SEQ_META) {
+ TStripElem * meta_se = 0;
+ use_limiter = FALSE;
- if(seq->type == SEQ_META) {
- if(seq->seqbase.first) {
+ if (!build_proxy_run && se->ibuf == 0) {
+ se->ibuf = seq_proxy_fetch(seq, cfra);
+ if (se->ibuf) {
+ use_limiter = TRUE;
+ }
+ }
+
+ if(!se->ibuf && seq->seqbase.first) {
if(cfra < seq->start) {
- do_build_seq_array_recursively(
+ meta_se = do_build_seq_array_recursively(
&seq->seqbase,
seq->start, 0);
} else if(cfra > seq->start + seq->len - 1) {
- do_build_seq_array_recursively(
+ meta_se = do_build_seq_array_recursively(
&seq->seqbase,
seq->start + seq->len - 1, 0);
} else {
- do_build_seq_array_recursively(
+ meta_se = do_build_seq_array_recursively(
&seq->seqbase,
cfra, 0);
}
}
- se->ok = STRIPELEM_META;
- if(se->se1 == 0) set_meta_stripdata(seq);
- if(se->se1) {
- if(se->ibuf) {
- IMB_freeImBuf(se->ibuf);
- }
- se->ibuf = se->se1->ibuf_comp;
- if(se->ibuf) {
+ se->ok = STRIPELEM_OK;
+
+ if(!se->ibuf && meta_se) {
+ se->ibuf = meta_se->ibuf_comp;
+ if(se->ibuf &&
+ (!input_have_to_preprocess(seq, se, cfra) ||
+ build_proxy_run)) {
IMB_refImBuf(se->ibuf);
+ if (build_proxy_run) {
+ IMB_cache_limiter_unref(se->ibuf);
+ }
+ } else if (se->ibuf) {
+ struct ImBuf * i = IMB_dupImBuf(se->ibuf);
+
+ IMB_cache_limiter_unref(se->ibuf);
+
+ se->ibuf = i;
+
+ input_preprocess(seq, se, cfra);
+
+ use_limiter = TRUE;
}
}
} else if(seq->type & SEQ_EFFECT) {
@@ -1818,7 +1828,7 @@
}
}
if (!build_proxy_run) {
- if (se->ibuf && seq->type != SEQ_META) {
+ if (se->ibuf && use_limiter) {
IMB_cache_limiter_insert(se->ibuf);
IMB_cache_limiter_ref(se->ibuf);
IMB_cache_limiter_touch(se->ibuf);
More information about the Bf-blender-cvs
mailing list