From 0f664dab81a835feebd5db92942413f91747481f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 25 May 2017 00:03:51 +0100 Subject: [PATCH] More tests; fix blend for YUV420P10LE. --- src/lib/image.cc | 39 ++++++++++++++++++++++++++++++++++++++- src/lib/image.h | 2 +- test/image_test.cc | 4 ++++ test/test.cc | 4 ++-- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/lib/image.cc b/src/lib/image.cc index 2511df73e..228685442 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -429,6 +429,36 @@ Image::make_transparent () memset (data()[0], 0, sample_size(0).height * stride()[0]); } +template +void +component ( + int n, + Image* base, + shared_ptr other, + shared_ptr rgba, + int start_base_x, int start_base_y, + int start_other_x, int start_other_y + ) +{ + dcp::Size const base_size = base->sample_size(n); + dcp::Size const other_size = other->sample_size(n); + for (int by = start_base_y, oy = start_other_y; by < base_size.height && oy < other_size.height; ++by, ++oy) { + /* base image */ + T* bp = ((T*) (base->data()[n] + by * base->stride()[n])) + start_base_x; + /* overlay image */ + T* op = ((T*) (other->data()[n] + oy * other->stride()[n])); + /* original RGBA for alpha channel */ + uint8_t* rp = rgba->data()[0] + oy * rgba->stride()[0]; + for (int bx = start_base_x, ox = start_other_x; bx < base_size.width && ox < other_size.width; ++bx, ++ox) { + float const alpha = float (rp[3]) / 255; + *bp = *op * alpha + *bp * (1 - alpha); + ++bp; + ++op; + rp += 4; + } + } +} + void Image::alpha_blend (shared_ptr other, Position position) { @@ -547,7 +577,6 @@ Image::alpha_blend (shared_ptr other, Position position) break; } case AV_PIX_FMT_YUV420P: - case AV_PIX_FMT_YUV420P10: { shared_ptr yuv = other->scale (other->size(), dcp::YUV_TO_RGB_REC709, _pixel_format, false, false); @@ -579,6 +608,14 @@ Image::alpha_blend (shared_ptr other, Position position) } break; } + case AV_PIX_FMT_YUV420P10: + { + shared_ptr yuv = other->scale (other->size(), dcp::YUV_TO_RGB_REC709, _pixel_format, false, false); + component (0, this, yuv, other, start_tx, start_ty, start_ox, start_oy); + component (1, this, yuv, other, start_tx, start_ty, start_ox, start_oy); + component (2, this, yuv, other, start_tx, start_ty, start_ox, start_oy); + break; + } default: throw PixelFormatError ("alpha_blend()", _pixel_format); } diff --git a/src/lib/image.h b/src/lib/image.h index dde42f1bc..fd5adb076 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -57,6 +57,7 @@ public: int vertical_factor (int) const; int horizontal_factor (int) const; dcp::Size sample_size (int) const; + float bytes_per_pixel (int) const; boost::shared_ptr scale (dcp::Size out_size, dcp::YUVToRGB yuv_to_rgb, AVPixelFormat out_format, bool aligned, bool fast) const; boost::shared_ptr crop_scale_window ( @@ -81,7 +82,6 @@ private: void allocate (); void swap (Image &); - float bytes_per_pixel (int) const; void yuv_16_black (uint16_t, bool); static uint16_t swap_16 (uint16_t); diff --git a/test/image_test.cc b/test/image_test.cc index 6a35be07f..59000918a 100644 --- a/test/image_test.cc +++ b/test/image_test.cc @@ -180,8 +180,12 @@ alpha_blend_test_one (AVPixelFormat format, string suffix) /** Test Image::alpha_blend */ BOOST_AUTO_TEST_CASE (alpha_blend_test) { + alpha_blend_test_one (AV_PIX_FMT_RGB24, "rgb24"); + alpha_blend_test_one (AV_PIX_FMT_BGRA, "bgra"); alpha_blend_test_one (AV_PIX_FMT_RGBA, "rgba"); + alpha_blend_test_one (AV_PIX_FMT_RGB48LE, "rgb48le"); alpha_blend_test_one (AV_PIX_FMT_YUV420P, "yuv420p"); + alpha_blend_test_one (AV_PIX_FMT_YUV420P10LE, "yuv420p10le"); } /** Test merge (list) with a single image */ diff --git a/test/test.cc b/test/test.cc index 85c36c16c..b81d20134 100644 --- a/test/test.cc +++ b/test/test.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2015 Carl Hetherington + Copyright (C) 2012-2017 Carl Hetherington This file is part of DCP-o-matic. @@ -175,7 +175,7 @@ check_image (boost::filesystem::path ref, boost::filesystem::path check) ref_image.read (ref.string ()); Magick::Image check_image; check_image.read (check.string ()); - DCPOMATIC_ASSERT (ref_image.compare (check_image)); + BOOST_CHECK_MESSAGE (ref_image.compare (check_image), ref << " differs from " << check); } void -- 2.30.2