forked from bartvdbraak/blender
==Sequencer==
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)
This commit is contained in:
parent
43e776690f
commit
c4229b0272
@ -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);
|
||||
|
@ -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 ;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user