From 01502a0fd529f308be248b6f8264c3a8642fce49 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 20 Sep 2013 21:29:56 +0100 Subject: [PATCH] Port make_black fix for YUVA from master. --- src/lib/image.cc | 55 +++++++++++++++++++++++++++++++++++------ src/lib/image.h | 2 +- test/make_black_test.cc | 18 ++++++++++++++ 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/lib/image.cc b/src/lib/image.cc index dbea62d26..9a3aa8d45 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -185,18 +185,23 @@ Image::crop (Crop crop, bool aligned) const /** Blacken a YUV image whose bits per pixel is rounded up to 16 */ void -Image::yuv_16_black (uint16_t v) +Image::yuv_16_black (uint16_t v, bool alpha) { memset (data()[0], 0, lines(0) * stride()[0]); for (int i = 1; i < 3; ++i) { int16_t* p = reinterpret_cast (data()[i]); - for (int y = 0; y < size().height; ++y) { + for (int y = 0; y < lines(i); ++y) { + /* We divide by 2 here because we are writing 2 bytes at a time */ for (int x = 0; x < line_size()[i] / 2; ++x) { p[x] = v; } p += stride()[i] / 2; } } + + if (alpha) { + memset (data()[3], 0, lines(3) * stride()[3]); + } } uint16_t @@ -236,27 +241,63 @@ Image::make_black () case PIX_FMT_YUV422P9LE: case PIX_FMT_YUV444P9LE: - yuv_16_black (nine_bit_uv); + yuv_16_black (nine_bit_uv, false); break; case PIX_FMT_YUV422P9BE: case PIX_FMT_YUV444P9BE: - yuv_16_black (swap_16 (nine_bit_uv)); + yuv_16_black (swap_16 (nine_bit_uv), false); break; case PIX_FMT_YUV422P10LE: case PIX_FMT_YUV444P10LE: - yuv_16_black (ten_bit_uv); + yuv_16_black (ten_bit_uv, false); break; case PIX_FMT_YUV422P16LE: case PIX_FMT_YUV444P16LE: - yuv_16_black (sixteen_bit_uv); + yuv_16_black (sixteen_bit_uv, false); break; case PIX_FMT_YUV444P10BE: case PIX_FMT_YUV422P10BE: - yuv_16_black (swap_16 (ten_bit_uv)); + yuv_16_black (swap_16 (ten_bit_uv), false); + break; + + case AV_PIX_FMT_YUVA420P9BE: + case AV_PIX_FMT_YUVA422P9BE: + case AV_PIX_FMT_YUVA444P9BE: + yuv_16_black (swap_16 (nine_bit_uv), true); + break; + + case AV_PIX_FMT_YUVA420P9LE: + case AV_PIX_FMT_YUVA422P9LE: + case AV_PIX_FMT_YUVA444P9LE: + yuv_16_black (nine_bit_uv, true); + break; + + case AV_PIX_FMT_YUVA420P10BE: + case AV_PIX_FMT_YUVA422P10BE: + case AV_PIX_FMT_YUVA444P10BE: + yuv_16_black (swap_16 (ten_bit_uv), true); + break; + + case AV_PIX_FMT_YUVA420P10LE: + case AV_PIX_FMT_YUVA422P10LE: + case AV_PIX_FMT_YUVA444P10LE: + yuv_16_black (ten_bit_uv, true); + break; + + case AV_PIX_FMT_YUVA420P16BE: + case AV_PIX_FMT_YUVA422P16BE: + case AV_PIX_FMT_YUVA444P16BE: + yuv_16_black (swap_16 (sixteen_bit_uv), true); + break; + + case AV_PIX_FMT_YUVA420P16LE: + case AV_PIX_FMT_YUVA422P16LE: + case AV_PIX_FMT_YUVA444P16LE: + yuv_16_black (sixteen_bit_uv, true); break; case PIX_FMT_RGB24: diff --git a/src/lib/image.h b/src/lib/image.h index 6af74a8c5..e455f22c6 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -78,7 +78,7 @@ private: void allocate (); void swap (Image &); float bytes_per_pixel (int) const; - void yuv_16_black (uint16_t); + void yuv_16_black (uint16_t, bool); static uint16_t swap_16 (uint16_t); AVPixelFormat _pixel_format; ///< FFmpeg's way of describing the pixel format of this Image diff --git a/test/make_black_test.cc b/test/make_black_test.cc index 17c78d231..2960a596f 100644 --- a/test/make_black_test.cc +++ b/test/make_black_test.cc @@ -48,6 +48,24 @@ BOOST_AUTO_TEST_CASE (make_black_test) pix_fmts.push_back (AV_PIX_FMT_YUVJ420P); pix_fmts.push_back (AV_PIX_FMT_YUVJ422P); pix_fmts.push_back (AV_PIX_FMT_YUVJ444P); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P9BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P9BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P9BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P9LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P9LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P9LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P10BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P10BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P10BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P10LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P10LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P10LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P16BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P16BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P16BE); + pix_fmts.push_back (AV_PIX_FMT_YUVA420P16LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA422P16LE); + pix_fmts.push_back (AV_PIX_FMT_YUVA444P16LE); int N = 0; for (list::const_iterator i = pix_fmts.begin(); i != pix_fmts.end(); ++i) { -- 2.30.2