Thank you for finding this bug and especially fixing it. You now have commit access to mltframework/mlt.git But, please, we use lrintf (or lrint) now instead of +0.5.
On Thu, Apr 7, 2016 at 1:01 PM Jean-Baptiste Mardelle <j...@kdenlive.org> wrote: > Hi All, > > I recently encountered a bug with image producers and affine transition. > Some corruption appears at the bottom of the composited image. > > I tracked down the problem to the affine transition which in some cases > tries to read pixels outside of the image. > > The problem comes from line 575 in transition_affine.c, because we compare > a float with an integer: > > if ( dx >= 0 && dx < b_width && dy >=0 && dy < b_height ) > > Where dx and dy are floats representing the position inside the image, > and b_width, b_height are integer representing image dimensions. > > Problem is that later in interp(), we use rounding of the dx and dy values, > so for example if image width b_height is 600, and dy is 599.7, it will > pass the test, but later be rounded to 600 and we read outside of image, > because last line of the image is at 599. > > Here are sample screenshot when trying to display a red square image > against a black background using affine transition : > > Before my patch (notice white line at bottom which is not in source image) > http://j-b-m.ch/images/corrupt.png > > After my patch (image appears correctly) > http://j-b-m.ch/images/fixed.png > > > I can provide a full test case with MLT command line if needed. Patch is > just below, comments welcome. > > regards > > Jean-Baptiste Mardelle > > > > > diff --git a/src/modules/plus/transition_affine.c > b/src/modules/plus/transition_affine.c > index b5974a5..316d281 100644 > --- a/src/modules/plus/transition_affine.c > +++ b/src/modules/plus/transition_affine.c > @@ -572,7 +572,7 @@ static int transition_get_image( mlt_frame a_frame, > uint8_t **image, mlt_image_f > { > dx = MapX( affine.matrix, x, y ) / dz + > x_offset; > dy = MapY( affine.matrix, x, y ) / dz + > y_offset; > - if ( dx >= 0 && dx < b_width && dy >=0 && > dy < b_height ) > + if ( dx + 0.5 >= 0 && dx + 0.5 < b_width && > dy + 0.5 >= 0 && dy + 0.5 < b_height ) > interp( b_image, b_width, b_height, > dx, dy, result.mix/100.0, p, b_alpha ); > p += 4; > } > > > > > > > ------------------------------------------------------------------------------ > _______________________________________________ > Mlt-devel mailing list > Mlt-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/mlt-devel >
------------------------------------------------------------------------------
_______________________________________________ Mlt-devel mailing list Mlt-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mlt-devel