Fix R/B swap with as_png(); support as_png() for any pixel format. v2.13.129
authorCarl Hetherington <cth@carlh.net>
Tue, 12 Mar 2019 23:16:03 +0000 (23:16 +0000)
committerCarl Hetherington <cth@carlh.net>
Tue, 12 Mar 2019 23:16:03 +0000 (23:16 +0000)
src/lib/image.cc
test/image_test.cc

index f005e3f..95cb93b 100644 (file)
@@ -1248,7 +1248,9 @@ Image::as_png () const
 {
        DCPOMATIC_ASSERT (bytes_per_pixel(0) == 4);
        DCPOMATIC_ASSERT (planes() == 1);
-       DCPOMATIC_ASSERT (pixel_format() == AV_PIX_FMT_BGRA);
+       if (pixel_format() != AV_PIX_FMT_RGBA) {
+               return convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_RGBA, true, false)->as_png();
+       }
 
        /* error handling? */
        png_structp png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, reinterpret_cast<void*>(const_cast<Image*>(this)), png_error_fn, 0);
index 9d07f8a..2bbe9d1 100644 (file)
@@ -266,3 +266,15 @@ BOOST_AUTO_TEST_CASE (crop_scale_window_test)
        write_image(save, "build/test/crop_scale_window_test.png", "RGB");
        check_image("test/data/crop_scale_window_test.png", "build/test/crop_scale_window_test.png");
 }
+
+BOOST_AUTO_TEST_CASE (as_png_test)
+{
+       shared_ptr<FFmpegImageProxy> proxy(new FFmpegImageProxy("test/data/3d_test/000001.png"));
+       shared_ptr<Image> image_rgb = proxy->image().first;
+       shared_ptr<Image> image_bgr = image_rgb->convert_pixel_format(dcp::YUV_TO_RGB_REC709, AV_PIX_FMT_BGRA, true, false);
+       image_rgb->as_png().write ("build/test/as_png_rgb.png");
+       image_bgr->as_png().write ("build/test/as_png_bgr.png");
+
+       check_image ("test/data/3d_test/000001.png", "build/test/as_png_rgb.png");
+       check_image ("test/data/3d_test/000001.png", "build/test/as_png_bgr.png");
+}