diff options
| author | Carl Hetherington <cth@carlh.net> | 2026-04-22 22:24:09 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2026-04-23 16:51:08 +0200 |
| commit | e54f93bf7d144737df4b0331017164360c9121ff (patch) | |
| tree | ac8bd65231b31c414fd87348587a6dabd97d31d2 | |
| parent | 9f828b327e680c322a70883910233337a37e481e (diff) | |
Fix reading of RGB0 images.
We would allocate 3 bytes per pixel instead of 4. I couldn't see a way
to get FFmpeg to tell us about this (unless we used FFmpeg's stride
somehow maybe?)
| -rwxr-xr-x | run/tests | 2 | ||||
| -rw-r--r-- | src/lib/image.cc | 11 | ||||
| -rw-r--r-- | test/image_test.cc | 12 |
3 files changed, 24 insertions, 1 deletions
@@ -3,7 +3,7 @@ # e.g. --run_tests=foo set -e -PRIVATE_GIT="7cbcb10afc73ab559ae9b907881881892aa6d57f" +PRIVATE_GIT="eaa907382be3276e8275858219bd73c816ff5c77" DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" source $DIR/environment diff --git a/src/lib/image.cc b/src/lib/image.cc index 95de4bc03..0810fbbea 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -1219,6 +1219,17 @@ Image::bytes_per_pixel(int component) const } #endif + if ( + _pixel_format == AV_PIX_FMT_0RGB || + _pixel_format == AV_PIX_FMT_RGB0 || + _pixel_format == AV_PIX_FMT_0BGR || + _pixel_format == AV_PIX_FMT_BGR0) { + /* Each pixel has an empty byte which we need to account for when allocating, + * otherwise we'll corrupt the image. + */ + bpp[3] = bpp[0]; + } + if ((d->flags & AV_PIX_FMT_FLAG_PLANAR) == 0) { /* Not planar; sum them up */ return bpp[0] + bpp[1] + bpp[2] + bpp[3]; diff --git a/test/image_test.cc b/test/image_test.cc index 807f88d04..6d566aac7 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -759,3 +759,15 @@ BOOST_AUTO_TEST_CASE(over_crop_test) check_image("test/data/" + filename, "build/test/" + filename); } + +BOOST_AUTO_TEST_CASE(rgb0_image_test) +{ + auto proxy = make_shared<FFmpegImageProxy>(TestPaths::private_data() / "rgb0.tif"); + write_image( + proxy->image(Image::Alignment::PADDED).image->convert_pixel_format( + dcp::YUVToRGB::REC709, AV_PIX_FMT_RGB24, Image::Alignment::COMPACT, false + ), "build/test/rgb0.png" + ); + check_image(TestPaths::private_data() / "rgb0.png", "build/test/rgb0.png"); +} + |
