Hi, Following a bug reported on Kdenlive's forum, I get a strange result when requesting mlt_image_rgb24a images from an affine transition. There seems to be a problem with the alpha compositing.
You can see the problem here: http://kdenlive.org/images/affine2.png The correct result should be: http://kdenlive.org/images/affine1.png For some reason, this problem only appears when requesting rgb24a, so it does not appear in Kdenlive's SDL monitor. After some tests, it seems to me that the problem is in the interp routines used by the affine transition. I did some tests with the interpNN_b32 function which is used by default, and it seems to me that there is something not correct, since the alpha channel of the top layer is copied to the alpha layer of the bottom layer. Here is the code: int interpNN_b32(unsigned char *sl, int w, int h, float x, float y, float o, unsigned char *v) { #ifdef TEST_XY_LIMITS if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1; #endif v[3] = sl[(int)rintf(x)*4+(int)rintf(y)*4*w+3]; <--- HERE WE COPY ALPHA FROM TOP LAYER float alpha = (float) v[3] / 255.0 * o; v[0]= v[0] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w] * alpha; v[1]= v[1] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+1] * alpha; v[2]= v[2] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+2] * alpha; return 0; } With this patch, the problem disappears: diff --git a/src/modules/plus/interp.h b/src/modules/plus/interp.h index 39e626d..23b447b 100644 --- a/src/modules/plus/interp.h +++ b/src/modules/plus/interp.h @@ -165,8 +165,8 @@ int interpNN_b32(unsigned char *sl, int w, int h, float x, float y, float o, uns #ifdef TEST_XY_LIMITS if ((x<0)||(x>=(w-1))||(y<0)||(y>=(h-1))) return -1; #endif - v[3]= sl[(int)rintf(x)*4+(int)rintf(y)*4*w+3]; - float alpha = (float) v[3] / 255.0 * o; + float overlayAlpha = sl[(int)rintf(x)*4+(int)rintf(y)*4*w+3]; + float alpha = (float) overlayAlpha / 255.0 * o; v[0]= v[0] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w] * alpha; v[1]= v[1] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+1] * alpha; v[2]= v[2] * (1.0 - alpha) + sl[(int)rintf(x)*4+(int)rintf(y)*4*w+2] * alpha; (As a side note, it also seems to me that we should not calculate 4 times (int)rintf(x)*4+(int)rintf(y)*4*w, saving it to an int would seem more efficient). Maybe I am completely wrong and the problem is in my QImage conversion of the frame, but I would be glad to have your opinion on the subject... Also, other interpolation methods seem to be affected by the same problem. Thanks, jb ------------------------------------------------------------------------------ For Developers, A Lot Can Happen In A Second. Boundary is the first to Know...and Tell You. Monitor Your Applications in Ultra-Fine Resolution. Try it FREE! http://p.sf.net/sfu/Boundary-d2dvs2 _______________________________________________ Mlt-devel mailing list Mlt-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mlt-devel