blob: 1c872d5f2bad35e9634adbe6281ab17f612506c8 [file] [log] [blame]
// Copyright 2022 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.
#ifndef SRC_CAMERA_LIB_RAW_FORMATS_RAW_BIT_DEPTH_H_
#define SRC_CAMERA_LIB_RAW_FORMATS_RAW_BIT_DEPTH_H_
#include "src/camera/lib/raw_formats/pointer_list.h"
#include "src/camera/lib/raw_formats/raw_hash.h"
namespace camera::raw {
// This describes the number of bits used for each pixel in a color filter.
struct BitDepthMap {
const uint32_t width;
const uint32_t height;
const PointerList<uint8_t> rows;
constexpr explicit BitDepthMap(const PointerList<uint8_t>& r)
: width(static_cast<uint32_t>(r.element_array_size())),
height(static_cast<uint32_t>(r.size())),
rows(r) {}
constexpr explicit BitDepthMap(PointerList<uint8_t>&& r)
: width(static_cast<uint32_t>(r.element_array_size())),
height(static_cast<uint32_t>(r.size())),
rows(std::move(r)) {}
};
// Given a BitDepthMap, return the bit depth of the specified pixel.
// Pixel is specified as an x (width) and y (height) coordinate.
constexpr uint8_t GetBitDepth(const BitDepthMap& map, uint32_t x, uint32_t y) {
uint32_t map_y = y % map.height;
uint32_t map_x = x % map.width;
return map.rows[map_y][map_x];
}
// Given a ColorFilter and the image width/height, return the bit depth of the specified pixel.
// Pixel is specified as an index (0 to (width * height) - 1).
constexpr uint8_t GetBitDepth(const BitDepthMap& map, uint32_t width, uint32_t /*height*/,
uint32_t pixel_index) {
uint32_t y = pixel_index / width;
uint32_t x = pixel_index - (y * width);
return GetBitDepth(map, x, y);
}
namespace internal {
template <>
struct hash<BitDepthMap> {
constexpr size_t operator()(BitDepthMap const& map) {
size_t seed = 0;
internal::hash_combine(seed, map.width);
internal::hash_combine(seed, map.height);
for (uint32_t j = 0; j < map.height; ++j) {
for (uint32_t i = 0; i < map.width; ++i) {
internal::hash_combine(seed, map.rows[j][i]);
}
}
return seed;
}
};
constexpr const uint8_t kBayer10DepthRow0[] = {10, 10};
constexpr const uint8_t kBayer10DepthRow1[] = {10, 10};
constexpr const uint8_t* kBayer10DepthRows[] = {kBayer10DepthRow0, kBayer10DepthRow1};
constexpr const uint64_t kBayer10Width = sizeof(kBayer10DepthRow0) / sizeof(*kBayer10DepthRow0);
constexpr const uint64_t kBayer10Height = sizeof(kBayer10DepthRows) / sizeof(*kBayer10DepthRows);
constexpr const PointerList<uint8_t> kBayer10DepthList(kBayer10DepthRows, kBayer10Height,
kBayer10Width);
} // namespace internal
constexpr const BitDepthMap kBayer10DepthMap(internal::kBayer10DepthList);
} // namespace camera::raw
#endif // SRC_CAMERA_LIB_RAW_FORMATS_RAW_BIT_DEPTH_H_