X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Flib%2Fimage.cc;h=dbea62d26b3b7363d7c33ce7df19dff170430a5f;hb=7b96999f95cd715ad49b1715602287fa4cae0950;hp=5c04f70e6ab40f0e4c5ee1afd32f0ff6a14b2a55;hpb=d6be9f27147113dc6355ed0de7c99d1312aaeebd;p=dcpomatic.git diff --git a/src/lib/image.cc b/src/lib/image.cc index 5c04f70e6..dbea62d26 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -420,9 +420,19 @@ Image::allocate () _stride[0] = _stride[1] = _stride[2] = _stride[3] = 0; for (int i = 0; i < components(); ++i) { - _line_size[i] = _size.width * bytes_per_pixel(i); + _line_size[i] = ceil (_size.width * bytes_per_pixel(i)); _stride[i] = stride_round_up (i, _line_size, _aligned ? 32 : 1); - _data[i] = (uint8_t *) av_malloc (_stride[i] * lines (i)); + + /* The assembler function ff_rgb24ToY_avx (in libswscale/x86/input.asm) + uses a 16-byte fetch to read three bytes (R/G/B) of image data. + Hence on the last pixel of the last line it reads over the end of + the actual data by 1 byte. If the width of an image is a multiple + of the stride alignment there will be no padding at the end of image lines. + OS X crashes on this illegal read, though other operating systems don't + seem to mind. The nasty + 1 in this malloc makes sure there is always a byte + for that instruction to read safely. + */ + _data[i] = (uint8_t *) av_malloc (_stride[i] * lines (i) + 1); } }