==Sequencer==
authorPeter Schlaile <peter@schlaile.de>
Sat, 10 Jun 2006 19:56:28 +0000 (19:56 +0000)
committerPeter Schlaile <peter@schlaile.de>
Sat, 10 Jun 2006 19:56:28 +0000 (19:56 +0000)
Fixed the blur-plugin (and maybe a lot more) crashes by expecting
future float-buffer aware sequencer-plugins to have a bumped PLUGIN_VERSION
number. Since quality and speed is degraded by converting the float
buffer first to byte, performing the effect on bytes and then converting
back again an additional warning is displayed in the effect strip,
suggesting to update the used sequencer-plugins.

Fixed some more crashes along the way.

Float buffer aware sequencer plugins should
- first check, if the output-ibuf has a rect_float
  => perform all operations with floats (input and output)
- if not: perform everything on bytes (intput and output)

release/plugins/sequence/blur.c
source/blender/imbuf/intern/rectop.c
source/blender/imbuf/intern/scaling.c
source/blender/src/drawseq.c
source/blender/src/seqeffects.c

index 975a0c8df93eb93f00b1a1b1478fad632fb3c35b..9687d04e066cf4680258e810beda915b9f8d8190 100644 (file)
@@ -115,7 +115,7 @@ void blurbuf(struct ImBuf *ibuf, int nr, Cast *cast)
                }
                if(tbuf->x<4 || tbuf->y<4) break;
        }
-       
+
        /* enlarge */
        for(i=0; i<nr; i++) {
                ttbuf = double_x(tbuf);
@@ -137,6 +137,7 @@ void blurbuf(struct ImBuf *ibuf, int nr, Cast *cast)
        
        if(cast->gamma != 1.0) gamwarp(tbuf, 1.0 / cast->gamma);
 
+       /* Very bad code warning! This fails badly with float-buffers!!! */
        freeN(ibuf->rect);
        ibuf->rect= tbuf->rect;
        freeN(tbuf);
index c764d06b500d02d8be0e82bb59711012511fcb25..1b806b8fa1f6441a776ebecb8466fd205af64002 100644 (file)
@@ -51,7 +51,7 @@ void IMB_rectcpy(struct ImBuf *dbuf, struct ImBuf *sbuf, int destx,
 
        if (dbuf == NULL) return;
        
-       if (sbuf->rect_float) do_float = 1;
+       if (sbuf && sbuf->rect_float && dbuf->rect_float) do_float = 1;
 
        if (destx < 0){
                srcx -= destx ;
index a21e5c7b5924afb6b418033f6bf2538279fde5d4..be391fad69d40634e8437ef52479f6fceae5efb2 100644 (file)
@@ -849,7 +849,7 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
                _newrectf = MEM_mallocN(newy * ibuf->x * sizeof(float) * 4, "scaleupyf");
                if (_newrectf==NULL) return(ibuf);
        }
-       
+
        add = (ibuf->y - 1.001) / (newy - 1.0);
        skipx = 4 * ibuf->x;
 
@@ -919,7 +919,6 @@ static struct ImBuf *scaleupy(struct ImBuf *ibuf, int newy)
                ibuf->mall |= IB_rectfloat;
                ibuf->rect_float = _newrectf;
        }
-       
        ibuf->y = newy;
        return(ibuf);
 }
index 017b602c4f482d67e339ef1131e6365e88a05bed..07ad3e1fd2edbdba489f2d3c90d8b4d06dd01530 100644 (file)
@@ -114,7 +114,8 @@ static char *give_seqname(Sequence *seq)
        else if(seq->type==SEQ_WIPE) return "Wipe";
        else if(seq->type==SEQ_GLOW) return "Glow";
        else if(seq->type==SEQ_PLUGIN) {
-               if(seq->plugin && seq->plugin->doit) return seq->plugin->pname;
+               if(!(seq->flag & SEQ_EFFECT_NOT_LOADED) &&
+                  seq->plugin && seq->plugin->doit) return seq->plugin->pname;
                return "Plugin";
        }
        else return "Effect";
@@ -556,10 +557,13 @@ static void draw_seq_text(Sequence *seq, float x1, float x2, float y1, float y2)
                        sprintf(str, "%d | %s%s", seq->len, seq->strip->dir, seq->strip->stripdata->name);
                }
                else if(seq->type & SEQ_EFFECT) {
+                       int can_float = (seq->type != SEQ_PLUGIN)
+                               || (seq->plugin && seq->plugin->version >= 4);
+
                        if(seq->seq3!=seq->seq2 && seq->seq1!=seq->seq3)
-                               sprintf(str, "%d | %s: %d>%d (use %d)", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine, seq->seq3->machine);
+                               sprintf(str, "%d | %s: %d>%d (use %d)%s", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine, seq->seq3->machine, can_float ? "" : " No float, upgrade plugin!");
                        else
-                               sprintf(str, "%d | %s: %d>%d", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine);
+                               sprintf(str, "%d | %s: %d>%d%s", seq->len, give_seqname(seq), seq->seq1->machine, seq->seq2->machine, can_float ? "" : " No float, upgrade plugin!");
                }
                else if (seq->type == SEQ_RAM_SOUND) {
                        sprintf(str, "%d | %s", seq->len, seq->strip->stripdata->name);
index 5464a2a188a5366a615085648b680572b1dedf80..493e43cfc3389b091cfc962dfe330c00e9d7c2fa 100644 (file)
@@ -104,7 +104,8 @@ static void open_plugin_seq(PluginSeq *pis, const char *seqname)
 
                if (version != 0) {
                        pis->version= version();
-                       if (pis->version==2 || pis->version==3) {
+                       if (pis->version==2 || pis->version==3
+                           || pis->version==4) {
                                int (*info_func)(PluginInfo *);
                                PluginInfo *info= (PluginInfo*) MEM_mallocN(sizeof(PluginInfo), "plugin_info");;
 
@@ -220,7 +221,11 @@ static void do_plugin_effect(Sequence * seq,int cfra,
                             struct ImBuf *ibuf3, struct ImBuf *out)
 {
        char *cp;
-       
+       int float_rendering;
+       int use_temp_bufs = 0; /* Are needed since blur.c (and maybe some other
+                                 old plugins) do very bad stuff
+                                 with imbuf-internals */
+
        if(seq->plugin && seq->plugin->doit) {
                if(seq->plugin->cfra) 
                        *(seq->plugin->cfra)= frame_to_float(cfra);
@@ -235,6 +240,34 @@ static void do_plugin_effect(Sequence * seq,int cfra,
                                = seq->plugin->instance_private_data;
                }
 
+               float_rendering = (out->rect_float != NULL);
+
+               if (seq->plugin->version<=3 && float_rendering) {
+                       use_temp_bufs = 1;
+
+                       if (ibuf1) {
+                               ibuf1 = IMB_dupImBuf(ibuf1);
+                               IMB_rect_from_float(ibuf1);
+                               imb_freerectfloatImBuf(ibuf1);
+                               ibuf1->flags &= ~IB_rectfloat;
+                       }
+                       if (ibuf2) {
+                               ibuf2 = IMB_dupImBuf(ibuf2);
+                               IMB_rect_from_float(ibuf2);
+                               imb_freerectfloatImBuf(ibuf2);
+                               ibuf2->flags &= ~IB_rectfloat;
+                       } 
+                       if (ibuf3) {
+                               ibuf3 = IMB_dupImBuf(ibuf3);
+                               IMB_rect_from_float(ibuf3);
+                               imb_freerectfloatImBuf(ibuf3);
+                               ibuf3->flags &= ~IB_rectfloat;
+                       } 
+                       if (!out->rect) imb_addrectImBuf(out);
+                       imb_freerectfloatImBuf(out);
+                       out->flags &= ~IB_rectfloat;
+               }
+
                if (seq->plugin->version<=2) {
                        if(ibuf1) IMB_convert_rgba_to_abgr(ibuf1);
                        if(ibuf2) IMB_convert_rgba_to_abgr(ibuf2);
@@ -246,11 +279,22 @@ static void do_plugin_effect(Sequence * seq,int cfra,
                        ibuf1, ibuf2, out, ibuf3);
 
                if (seq->plugin->version<=2) {
-                       if(ibuf1) IMB_convert_rgba_to_abgr(ibuf1);
-                       if(ibuf2) IMB_convert_rgba_to_abgr(ibuf2);
-                       if(ibuf3) IMB_convert_rgba_to_abgr(ibuf3);
+                       if (!use_temp_bufs) {
+                               if(ibuf1) IMB_convert_rgba_to_abgr(ibuf1);
+                               if(ibuf2) IMB_convert_rgba_to_abgr(ibuf2);
+                               if(ibuf3) IMB_convert_rgba_to_abgr(ibuf3);
+                       }
                        IMB_convert_rgba_to_abgr(out);
                }
+               if (seq->plugin->version<=3 && float_rendering) {
+                       IMB_float_from_rect(out);
+               }
+
+               if (use_temp_bufs) {
+                       if (ibuf1) IMB_freeImBuf(ibuf1);
+                       if (ibuf2) IMB_freeImBuf(ibuf2);
+                       if (ibuf3) IMB_freeImBuf(ibuf3);
+               }
        }
 }