| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/camera/lib/image_utils/hsv_generator.h" |
| |
| #include <lib/fzl/owned-vmo-mapper.h> |
| #include <lib/image-format/image_format.h> |
| |
| #include <gtest/gtest.h> |
| |
| #include "src/camera/lib/image_utils/image_format_rgba.h" |
| |
| namespace camera { |
| namespace { |
| |
| constexpr uint64_t kTestImageWidth = 50; |
| constexpr uint64_t kTestImageHeight = 80; |
| constexpr uint64_t kIndicesToVerify = 50; |
| constexpr uint64_t kFrameIndexToVerify = 123; |
| |
| // Make an ImageFormat_2 struct with default values except for width, height and format. |
| fuchsia::sysmem::ImageFormat_2 MakeImageFormat(uint32_t width, uint32_t height, |
| fuchsia::sysmem::PixelFormatType format) { |
| fuchsia::sysmem::PixelFormat pixel_format = {.type = format, .has_format_modifier = false}; |
| uint32_t bytes_per_row = |
| ImageFormatStrideBytesPerWidthPixel(ConvertPixelFormatToWire(pixel_format)) * width; |
| |
| fuchsia::sysmem::ImageFormat_2 ret = { |
| .pixel_format = {.type = format, .has_format_modifier = false}, |
| .coded_width = width, |
| .coded_height = height, |
| .bytes_per_row = bytes_per_row, |
| .display_width = width, |
| .display_height = width, |
| .layers = 1, |
| .color_space = {.type = fuchsia::sysmem::ColorSpaceType::REC601_PAL}, |
| }; |
| return ret; |
| } |
| |
| fzl::OwnedVmoMapper GenerateImage(const fuchsia::sysmem::ImageFormat_2 format, uint64_t index) { |
| fzl::OwnedVmoMapper buffer; |
| EXPECT_EQ(ZX_OK, |
| buffer.CreateAndMap(ImageFormatImageSize(ConvertImageFormatToWire(format)), "buff")); |
| EXPECT_EQ(ZX_OK, HsvGenerator(buffer.start(), format, static_cast<uint32_t>(index))); |
| return buffer; |
| } |
| |
| // test that the image is being generated |
| // Test that it is changing between indexes |
| TEST(HsvGeneratorTest, ImageGenerated) { |
| auto format1 = |
| MakeImageFormat(kTestImageWidth, kTestImageHeight, fuchsia::sysmem::PixelFormatType::BGRA32); |
| auto buffer = GenerateImage(format1, 0); |
| auto pixels = reinterpret_cast<uint32_t*>(buffer.start()); |
| for (uint64_t i = 0; i < kTestImageWidth; ++i) { |
| EXPECT_EQ(pixels[i], pixels[0]); // same color |
| EXPECT_NE(pixels[i], 0u); // non-zero image |
| } |
| } |
| |
| TEST(HsvGeneratorTest, ImageChanges) { |
| auto format1 = |
| MakeImageFormat(kTestImageWidth, kTestImageHeight, fuchsia::sysmem::PixelFormatType::BGRA32); |
| uint32_t first_pixel = 0; |
| for (size_t i = 0; i < kIndicesToVerify; ++i) { |
| auto buffer = GenerateImage(format1, i); |
| EXPECT_NE(first_pixel, reinterpret_cast<uint32_t*>(buffer.start())[0]); |
| first_pixel = reinterpret_cast<uint32_t*>(buffer.start())[0]; |
| } |
| } |
| |
| // Test that the first rgb pixel is the same between formats |
| // This is just a sample format conversion. Extensive format conversion is done |
| // in the RGBColorConversion test in image_format_test. |
| TEST(HsvGeneratorTest, FormatsAreSameColor) { |
| auto format1 = |
| MakeImageFormat(kTestImageWidth, kTestImageHeight, fuchsia::sysmem::PixelFormatType::BGRA32); |
| auto buffer = GenerateImage(format1, kFrameIndexToVerify); |
| auto bgra_colors = reinterpret_cast<uint8_t*>(buffer.start()); |
| auto format2 = MakeImageFormat(kTestImageWidth, kTestImageHeight, |
| fuchsia::sysmem::PixelFormatType::R8G8B8A8); |
| auto buffer2 = GenerateImage(format2, kFrameIndexToVerify); |
| auto rgba_colors = reinterpret_cast<uint8_t*>(buffer2.start()); |
| EXPECT_EQ(bgra_colors[3], rgba_colors[1]); |
| EXPECT_EQ(bgra_colors[2], rgba_colors[2]); |
| EXPECT_EQ(bgra_colors[1], rgba_colors[3]); |
| EXPECT_EQ(bgra_colors[0], rgba_colors[0]); |
| } |
| |
| } // namespace |
| } // namespace camera |