blob: 9d6fc671277438a5352123620de350b4094f2cd8 [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_RAW10_H_
#define SRC_CAMERA_LIB_RAW_FORMATS_RAW10_H_
#include "src/camera/lib/raw_formats/raw.h"
namespace camera::raw {
namespace raw10_internal {
/* This file contains the format descriptors for the RAW10 formats defined by Android. The RAW10
definition only covers the packing of samples in sequence in the buffer, it does not specify
any specific bayer phase or set of bayer phases. Thus the descriptors in this file combine the
RAW10 packing rules with the 4 common bayer phases. More can be added if necessary.
The RAW10 packing rules also match the packing layout commonly used by many MIPI-CSI busses when
writing to a memory buffer.
*/
// A block of 4 pixels in 5 bytes, repeated enough time to fill the width of the image (which must
// be a multiple of 4 pixels). The 8 most significant bits of each pixel get their own byte,
// followed by a byte that contains the 2 least significant bits of each pixel in reverse order.
// clang-format off
// index, mask, shift.
constexpr PixelPiece p00(0, 0b11111111, 2);
constexpr PixelPiece p10(1, 0b11111111, 2);
constexpr PixelPiece p20(2, 0b11111111, 2);
constexpr PixelPiece p30(3, 0b11111111, 2);
constexpr PixelPiece p31(3, 0b11000000, -6);
constexpr PixelPiece p21(2, 0b00110000, -4);
constexpr PixelPiece p11(1, 0b00001100, -2);
constexpr PixelPiece p01(0, 0b00000011, 0);
// clang-format on
constexpr const Chunk* pixels[] = {&p00, &p10, &p20, &p30, &p31, &p21, &p11, &p01};
constexpr PointerList<Chunk> pixel_list(&(pixels[0]), /*size*/ 8);
constexpr PackingBlock pixel_block(pixel_list, ChunkRepeat::fill_width());
// If the image row_stride is greater than with * (5 / 4), padding will be added to make up the
// difference.
constexpr Padding stride_pad(0, ChunkRepeat::fill_stride());
constexpr const Chunk* line_block_chunks[] = {&pixel_block, &stride_pad};
constexpr PointerList<Chunk> line_block_chunk_list(&(line_block_chunks[0]), /*size*/ 2);
} // namespace raw10_internal
// This packing block represents a line of pixels (potentially with padding at the end) which
// repeats as necessary (height times) to fill the image. The height (in pixels) must be even.
constexpr PackingBlock kRaw10PackingBlock(raw10_internal::line_block_chunk_list,
ChunkRepeat::fill_image());
constexpr RawFormat kRaw10FormatBGGR(kRaw10PackingBlock, kBayerBGGR, kBayer10DepthMap);
constexpr RawFormat kRaw10FormatGBRG(kRaw10PackingBlock, kBayerGBRG, kBayer10DepthMap);
constexpr RawFormat kRaw10FormatGRBG(kRaw10PackingBlock, kBayerGRBG, kBayer10DepthMap);
constexpr RawFormat kRaw10FormatRGGB(kRaw10PackingBlock, kBayerRGGB, kBayer10DepthMap);
} // namespace camera::raw
#endif // SRC_CAMERA_LIB_RAW_FORMATS_RAW10_H_