blob: d98e154d630a837de85ad63fcca5f15dfe4154c0 [file] [log] [blame]
// Copyright 2016 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CAMERA_CAMERA3_TEST_CAMERA3_FRAME_FIXTURE_H_
#define CAMERA_CAMERA3_TEST_CAMERA3_FRAME_FIXTURE_H_
#include <memory>
#include <string>
#include <tuple>
#include <vector>
#include "camera3_test/camera3_stream_fixture.h"
namespace camera3_test {
class Camera3FrameFixture : public Camera3StreamFixture {
public:
const uint32_t kDefaultTimeoutMs = 1000;
static const uint32_t kARGBPixelWidth = 4;
explicit Camera3FrameFixture(int cam_id)
: Camera3StreamFixture(cam_id),
color_bars_test_patterns_(
{{
// Android standard
// Color map: R , G , B , Start position
{0xFF, 0xFF, 0xFF, 0.0f}, // White
{0xFF, 0xFF, 0x00, 1.0f / 8}, // Yellow
{0x00, 0xFF, 0xFF, 2.0f / 8}, // Cyan
{0x00, 0xFF, 0x00, 3.0f / 8}, // Green
{0xFF, 0x00, 0xFF, 4.0f / 8}, // Magenta
{0xFF, 0x00, 0x00, 5.0f / 8}, // Red
{0x00, 0x00, 0xFF, 6.0f / 8}, // Blue
{0x00, 0x00, 0x00, 7.0f / 8}, // Black
},
{
// Ov02a10 color bars
{0x00, 0x00, 0xFF, 0.0f},
{0x00, 0xFF, 0x00, 1.0f / 8},
{0xFF, 0x00, 0x00, 2.0f / 8},
{0xC1, 0x8D, 0x07, 3.0f / 8},
{0x00, 0xFF, 0xFF, 4.0f / 8},
{0xFF, 0x00, 0xFF, 5.0f / 8},
{0xFF, 0xFF, 0x00, 6.0f / 8},
{0xFF, 0xFF, 0xFF, 7.0f / 8},
},
{
// OV5670 color bars
{0xFF, 0xFF, 0xFF, 0.0f},
{0xC8, 0xC8, 0xC8, 1.0f / 16},
{0x96, 0x96, 0x96, 2.0f / 16},
{0x64, 0x64, 0x64, 3.0f / 16},
{0x32, 0x32, 0x32, 4.0f / 16},
{0x00, 0x00, 0x00, 5.0f / 16},
{0xFF, 0x00, 0x00, 6.0f / 16},
{0xFF, 0x32, 0x00, 7.0f / 16},
{0xFF, 0x00, 0xE6, 8.0f / 16},
{0x00, 0xFF, 0x00, 9.0f / 16},
{0x00, 0xFF, 0x00, 10.0f / 16},
{0x00, 0xFF, 0x00, 11.0f / 16},
{0x00, 0x00, 0xFF, 12.0f / 16},
{0xD2, 0x00, 0xFF, 13.0f / 16},
{0x00, 0xA0, 0xFF, 14.0f / 16},
{0xFF, 0xFF, 0xFF, 15.0f / 16},
},
{
// OV5695 color bars
{0xFF, 0xFF, 0xFF, 0.0f}, // White
{0xFF, 0xFF, 0x00, 0.1146f}, // Yellow
{0x00, 0xFF, 0xFF, 0.2379f}, // Cyan
{0x00, 0xFF, 0x00, 0.3612f}, // Green
{0xFF, 0x00, 0xFF, 0.4845f}, // Magenta
{0xFF, 0x00, 0x00, 0.6078f}, // Red
{0x00, 0x00, 0xFF, 0.7311f}, // Blue
{0x00, 0x00, 0x00, 0.8544f}, // Black
},
{
// IMX258 color bars
{0xFF, 0xFF, 0xFF, 0.0f}, // White
{0x00, 0xFF, 0xFF, 1.0f / 8}, // Cyan
{0xFF, 0xFF, 0x00, 2.0f / 8}, // Yellow
{0x00, 0xFF, 0x00, 3.0f / 8}, // Green
{0xFF, 0x00, 0xFF, 4.0f / 8}, // Magenta
{0x00, 0x00, 0xFF, 5.0f / 8}, // Blue
{0xFF, 0x00, 0x00, 6.0f / 8}, // Red
{0x00, 0x00, 0x00, 7.0f / 8}, // Black
},
{
// OV5675 color bars
{0xFF, 0xFF, 0xFF, 0.0f}, // White
{0x00, 0xFF, 0xFF, 0.1226f}, // Cyan
{0xFF, 0xFF, 0x00, 0.2471f}, // Yellow
{0x00, 0xFF, 0x00, 0.3679f}, // Green
{0xFF, 0x00, 0xFF, 0.4906f}, // Magenta
{0x00, 0x00, 0xFF, 0.6132f}, // Blue
{0xFF, 0x00, 0x00, 0.7358f}, // Red
{0x00, 0x00, 0x00, 0.8585f}, // Black
}}),
supported_color_bars_test_pattern_modes_(
{ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS_FADE_TO_GRAY,
ANDROID_SENSOR_TEST_PATTERN_MODE_COLOR_BARS}) {}
Camera3FrameFixture(const Camera3FrameFixture&) = delete;
Camera3FrameFixture& operator=(const Camera3FrameFixture&) = delete;
protected:
// Create and process capture request of given metadata |metadata|. The frame
// number of the created request is returned if |frame_number| is not null.
int CreateCaptureRequestByMetadata(const ScopedCameraMetadata& metadata,
uint32_t* frame_number);
// Create and process capture request of given template |type|. The frame
// number of the created request is returned if |frame_number| is not null.
int CreateCaptureRequestByTemplate(int type, uint32_t* frame_number);
// Wait for shutter and capture result with timeout
void WaitShutterAndCaptureResult(const struct timespec& timeout);
// Get available color bars test pattern modes
std::vector<int32_t> GetAvailableColorBarsTestPatternModes();
enum class ImageFormat {
IMAGE_FORMAT_ARGB,
IMAGE_FORMAT_I420,
IMAGE_FORMAT_END
};
struct ImagePlane {
ImagePlane(uint32_t stride, uint32_t size, uint8_t* addr);
uint32_t stride;
uint32_t size;
uint8_t* addr;
};
struct Image {
Image(uint32_t w, uint32_t h, ImageFormat f);
int SaveToFile(const std::string filename) const;
uint32_t width;
uint32_t height;
ImageFormat format;
std::vector<uint8_t> data;
uint32_t size;
std::vector<ImagePlane> planes;
};
typedef std::unique_ptr<struct Image> ScopedImage;
// Convert the buffer to given format and return a new buffer in the Image
// structure. The input buffer is freed.
ScopedImage ConvertToImage(cros::ScopedBufferHandle buffer,
uint32_t width,
uint32_t height,
ImageFormat format);
// Convert the buffer to given format, rotate the image by rotation and return
// a new buffer in the Image structure. The input buffer is freed.
ScopedImage ConvertToImageAndRotate(cros::ScopedBufferHandle buffer,
uint32_t width,
uint32_t height,
ImageFormat format,
int32_t rotation);
// Generate a new I420 image of color bar pattern
ScopedImage GenerateColorBarsPattern(
uint32_t width,
uint32_t height,
const std::vector<std::tuple<uint8_t, uint8_t, uint8_t, float>>&
color_bars_pattern,
int32_t color_bars_pattern_mode,
uint32_t sensor_pixel_array_width,
uint32_t sensor_pixel_array_height);
// Crop, rotate and scale the input image and return a new I420 image. The
// input image is freed.
ScopedImage CropRotateScale(ScopedImage input_image,
int32_t rotation_degrees,
uint32_t width,
uint32_t height);
// Computes the structural similarity of given images. Given images must
// be of the I420 format; otherwise, a value of 0.0 is returned. When given
// images are very similar, it usually returns a score no less than 0.8.
double ComputeSsim(const Image& buffer_a, const Image& buffer_b);
std::vector<std::vector<std::tuple<uint8_t, uint8_t, uint8_t, float>>>
color_bars_test_patterns_;
private:
// Create and process capture request of given metadata |metadata|. The frame
// number of the created request is returned if |frame_number| is not null.
int32_t CreateCaptureRequest(const camera_metadata_t& metadata,
uint32_t* frame_number);
std::vector<int32_t> supported_color_bars_test_pattern_modes_;
};
void GetTimeOfTimeout(int32_t ms, struct timespec* ts);
} // namespace camera3_test
#endif // CAMERA_CAMERA3_TEST_CAMERA3_FRAME_FIXTURE_H_