| // 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. |
| |
| #include "src/camera/lib/formatting/formatting.h" |
| |
| #include <fuchsia/camera2/cpp/fidl.h> |
| #include <fuchsia/camera2/hal/cpp/fidl.h> |
| #include <fuchsia/camera3/cpp/fidl.h> |
| #include <fuchsia/sysmem/cpp/fidl.h> |
| |
| #include <cstdint> |
| #include <map> |
| #include <string> |
| #include <string_view> |
| #include <variant> |
| #include <vector> |
| |
| #include "src/camera/lib/formatting/macros.h" |
| |
| namespace camera::formatting { |
| |
| struct PropertyList; |
| using PropertyListPtr = std::unique_ptr<PropertyList>; |
| struct Property { |
| std::optional<std::string> name; |
| std::variant<std::string, PropertyListPtr> value; |
| }; |
| struct PropertyList { |
| std::vector<Property> properties; |
| static PropertyListPtr New() { return std::make_unique<PropertyList>(); } |
| // NOLINTNEXTLINE(misc-no-recursion): naturally recursive type |
| void Format(std::ostream& os, size_t depth = 0) const { |
| std::string pad(depth * 2, ' '); |
| for (const auto& property : properties) { |
| if (property.name) { |
| os << pad << "\"" << *property.name << "\": "; |
| } |
| if (property.value.index() == 0) { |
| os << "\"" << std::get<std::string>(property.value) << "\"\n"; |
| } else { |
| os << "{\n"; |
| std::get<1>(property.value)->Format(os, depth + 1); |
| os << "}\n"; |
| } |
| } |
| } |
| }; |
| |
| std::ostream& operator<<(std::ostream& os, const PropertyList& p) { |
| p.Format(os); |
| return os; |
| } |
| |
| std::ostream& operator<<(std::ostream& os, const PropertyListPtr& p) { |
| if (p) { |
| os << *p; |
| } else { |
| os << "<MISSING PROPERTY LIST>"; |
| } |
| return os; |
| } |
| |
| template <typename T> |
| PropertyListPtr Dump(const std::vector<T>& x) { |
| auto p = PropertyList::New(); |
| for (size_t i = 0; i < std::size(x); ++i) { |
| p->properties.push_back({.name = std::to_string(i), .value = Dump(x[i])}); |
| } |
| return p; |
| } |
| |
| template <typename T, size_t N> |
| PropertyListPtr Dump(const std::array<T, N>& x) { |
| auto p = PropertyList::New(); |
| for (size_t i = 0; i < std::size(x); ++i) { |
| p->properties.push_back({.name = std::to_string(i), .value = Dump(x[i])}); |
| } |
| return p; |
| } |
| |
| template <typename T> |
| PropertyListPtr Dump(const T& x) { |
| auto p = PropertyList::New(); |
| p->properties.push_back({.value = std::to_string(x)}); |
| return p; |
| } |
| |
| template <> |
| PropertyListPtr Dump(const std::string& x) { |
| auto p = PropertyList::New(); |
| p->properties.push_back({.value = x}); |
| return p; |
| } |
| |
| template <> |
| PropertyListPtr Dump(const bool& x) { |
| auto p = PropertyList::New(); |
| p->properties.push_back({.value = (x ? "true" : "false")}); |
| return p; |
| } |
| |
| zx_koid_t GetKoid(zx_handle_t handle) { |
| zx_info_handle_basic_t info; |
| zx_status_t status = |
| zx_object_get_info(handle, ZX_INFO_HANDLE_BASIC, &info, sizeof(info), nullptr, nullptr); |
| return status == ZX_OK ? info.koid : ZX_KOID_INVALID; |
| } |
| |
| template <> |
| PropertyListPtr Dump(const zx::vmo& x) { |
| auto p = PropertyList::New(); |
| p->properties.push_back({.name = "koid", .value = std::to_string(GetKoid(x.get()))}); |
| return p; |
| } |
| |
| } // namespace camera::formatting |
| |
| ENUM_BEGIN(fuchsia::camera2, DeviceType) |
| ENUM_ELEMENT(DeviceType::BUILTIN) |
| ENUM_ELEMENT(DeviceType::VIRTUAL) |
| ENUM_END() |
| |
| ENUM_BEGIN(fuchsia::camera2, FrameStatus) |
| ENUM_ELEMENT(FrameStatus::OK) |
| ENUM_ELEMENT(FrameStatus::ERROR_FRAME) |
| ENUM_ELEMENT(FrameStatus::ERROR_BUFFER_FULL) |
| ENUM_END() |
| |
| ENUM_BEGIN(fuchsia::sysmem, HeapType) |
| ENUM_ELEMENT(HeapType::SYSTEM_RAM) |
| ENUM_ELEMENT(HeapType::AMLOGIC_SECURE) |
| ENUM_ELEMENT(HeapType::AMLOGIC_SECURE_VDEC) |
| ENUM_ELEMENT(HeapType::GOLDFISH_DEVICE_LOCAL) |
| ENUM_ELEMENT(HeapType::GOLDFISH_HOST_VISIBLE) |
| ENUM_ELEMENT(HeapType::FRAMEBUFFER) |
| ENUM_END() |
| |
| ENUM_BEGIN(fuchsia::sysmem, CoherencyDomain) |
| ENUM_ELEMENT(CoherencyDomain::CPU) |
| ENUM_ELEMENT(CoherencyDomain::RAM) |
| ENUM_ELEMENT(CoherencyDomain::INACCESSIBLE) |
| ENUM_END() |
| |
| ENUM_BEGIN(fuchsia::sysmem, PixelFormatType) |
| ENUM_ELEMENT(PixelFormatType::INVALID) |
| ENUM_ELEMENT(PixelFormatType::R8G8B8A8) |
| ENUM_ELEMENT(PixelFormatType::BGRA32) |
| ENUM_ELEMENT(PixelFormatType::I420) |
| ENUM_ELEMENT(PixelFormatType::M420) |
| ENUM_ELEMENT(PixelFormatType::NV12) |
| ENUM_ELEMENT(PixelFormatType::YUY2) |
| ENUM_ELEMENT(PixelFormatType::MJPEG) |
| ENUM_ELEMENT(PixelFormatType::YV12) |
| ENUM_ELEMENT(PixelFormatType::BGR24) |
| ENUM_ELEMENT(PixelFormatType::RGB565) |
| ENUM_ELEMENT(PixelFormatType::RGB332) |
| ENUM_ELEMENT(PixelFormatType::RGB2220) |
| ENUM_ELEMENT(PixelFormatType::L8) |
| ENUM_ELEMENT(PixelFormatType::R8) |
| ENUM_ELEMENT(PixelFormatType::R8G8) |
| ENUM_ELEMENT(PixelFormatType::A2R10G10B10) |
| ENUM_ELEMENT(PixelFormatType::A2B10G10R10) |
| ENUM_ELEMENT(PixelFormatType::DO_NOT_CARE) |
| ENUM_END() |
| |
| ENUM_BEGIN(fuchsia::sysmem, ColorSpaceType) |
| ENUM_ELEMENT(ColorSpaceType::INVALID) |
| ENUM_ELEMENT(ColorSpaceType::SRGB) |
| ENUM_ELEMENT(ColorSpaceType::REC601_NTSC) |
| ENUM_ELEMENT(ColorSpaceType::REC601_NTSC_FULL_RANGE) |
| ENUM_ELEMENT(ColorSpaceType::REC601_PAL) |
| ENUM_ELEMENT(ColorSpaceType::REC601_PAL_FULL_RANGE) |
| ENUM_ELEMENT(ColorSpaceType::REC709) |
| ENUM_ELEMENT(ColorSpaceType::REC2020) |
| ENUM_ELEMENT(ColorSpaceType::REC2100) |
| ENUM_ELEMENT(ColorSpaceType::PASS_THROUGH) |
| ENUM_ELEMENT(ColorSpaceType::DO_NOT_CARE) |
| ENUM_END() |
| |
| BITS_BEGIN(fuchsia::camera2, CameraStreamType) |
| BITS_ELEMENT(CameraStreamType::MACHINE_LEARNING) |
| BITS_ELEMENT(CameraStreamType::MONITORING) |
| BITS_ELEMENT(CameraStreamType::FULL_RESOLUTION) |
| BITS_ELEMENT(CameraStreamType::DOWNSCALED_RESOLUTION) |
| BITS_ELEMENT(CameraStreamType::VIDEO_CONFERENCE) |
| BITS_ELEMENT(CameraStreamType::EXTENDED_FOV) |
| BITS_END() |
| |
| MARK_NOTIMPL(fuchsia::sysmem, FormatModifier) |
| |
| STRUCT_BEGIN(fuchsia::sysmem, BufferUsage) |
| STRUCT_ELEMENT(none) |
| STRUCT_ELEMENT(cpu) |
| STRUCT_ELEMENT(vulkan) |
| STRUCT_ELEMENT(display) |
| STRUCT_ELEMENT(video) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, PixelFormat) |
| STRUCT_ELEMENT(type) |
| STRUCT_ELEMENT(has_format_modifier) |
| STRUCT_ELEMENT(format_modifier) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, BufferMemorySettings) |
| STRUCT_ELEMENT(size_bytes) |
| STRUCT_ELEMENT(is_physically_contiguous) |
| STRUCT_ELEMENT(is_secure) |
| STRUCT_ELEMENT(coherency_domain) |
| STRUCT_ELEMENT(heap) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, ColorSpace) |
| STRUCT_ELEMENT(type) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, ImageFormatConstraints) |
| STRUCT_ELEMENT(pixel_format) |
| STRUCT_ELEMENT(color_spaces_count) |
| STRUCT_ELEMENT(color_space) |
| STRUCT_ELEMENT(min_coded_width) |
| STRUCT_ELEMENT(max_coded_width) |
| STRUCT_ELEMENT(min_coded_height) |
| STRUCT_ELEMENT(max_coded_height) |
| STRUCT_ELEMENT(max_bytes_per_row) |
| STRUCT_ELEMENT(max_coded_width_times_coded_height) |
| STRUCT_ELEMENT(layers) |
| STRUCT_ELEMENT(coded_width_divisor) |
| STRUCT_ELEMENT(coded_height_divisor) |
| STRUCT_ELEMENT(bytes_per_row_divisor) |
| STRUCT_ELEMENT(start_offset_divisor) |
| STRUCT_ELEMENT(display_width_divisor) |
| STRUCT_ELEMENT(display_height_divisor) |
| STRUCT_ELEMENT(required_min_coded_width) |
| STRUCT_ELEMENT(required_max_coded_width) |
| STRUCT_ELEMENT(required_min_coded_height) |
| STRUCT_ELEMENT(required_max_coded_height) |
| STRUCT_ELEMENT(required_min_bytes_per_row) |
| STRUCT_ELEMENT(required_max_bytes_per_row) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, ImageFormat_2) |
| STRUCT_ELEMENT(pixel_format) |
| STRUCT_ELEMENT(coded_width) |
| STRUCT_ELEMENT(coded_height) |
| STRUCT_ELEMENT(bytes_per_row) |
| STRUCT_ELEMENT(display_width) |
| STRUCT_ELEMENT(display_height) |
| STRUCT_ELEMENT(layers) |
| STRUCT_ELEMENT(color_space) |
| STRUCT_ELEMENT(has_pixel_aspect_ratio) |
| STRUCT_ELEMENT(pixel_aspect_ratio_width) |
| STRUCT_ELEMENT(pixel_aspect_ratio_height) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, BufferMemoryConstraints) |
| STRUCT_ELEMENT(min_size_bytes) |
| STRUCT_ELEMENT(max_size_bytes) |
| STRUCT_ELEMENT(physically_contiguous_required) |
| STRUCT_ELEMENT(secure_required) |
| STRUCT_ELEMENT(ram_domain_supported) |
| STRUCT_ELEMENT(cpu_domain_supported) |
| STRUCT_ELEMENT(inaccessible_domain_supported) |
| STRUCT_ELEMENT(heap_permitted_count) |
| STRUCT_ELEMENT(heap_permitted) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, VmoBuffer) |
| STRUCT_ELEMENT(vmo) |
| STRUCT_ELEMENT(vmo_usable_start) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, SingleBufferSettings) |
| STRUCT_ELEMENT(buffer_settings) |
| STRUCT_ELEMENT(has_image_format_constraints) |
| STRUCT_ELEMENT(image_format_constraints) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, BufferCollectionConstraints) |
| STRUCT_ELEMENT(usage) |
| STRUCT_ELEMENT(min_buffer_count_for_camping) |
| STRUCT_ELEMENT(min_buffer_count_for_dedicated_slack) |
| STRUCT_ELEMENT(min_buffer_count_for_shared_slack) |
| STRUCT_ELEMENT(min_buffer_count) |
| STRUCT_ELEMENT(max_buffer_count) |
| STRUCT_ELEMENT(has_buffer_memory_constraints) |
| STRUCT_ELEMENT(buffer_memory_constraints) |
| STRUCT_ELEMENT(image_format_constraints_count) |
| STRUCT_ELEMENT(image_format_constraints) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::sysmem, BufferCollectionInfo_2) |
| STRUCT_ELEMENT(buffer_count) |
| STRUCT_ELEMENT(settings) |
| STRUCT_ELEMENT(buffers) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::camera2, FrameRate) |
| STRUCT_ELEMENT(frames_per_sec_numerator) |
| STRUCT_ELEMENT(frames_per_sec_denominator) |
| STRUCT_END() |
| |
| TABLE_BEGIN(fuchsia::camera2, FrameMetadata) |
| TABLE_ELEMENT(timestamp); |
| TABLE_ELEMENT(image_format_index); |
| TABLE_ELEMENT(capture_timestamp); |
| TABLE_END() |
| |
| TABLE_BEGIN(fuchsia::camera2, DeviceInfo) |
| TABLE_ELEMENT(vendor_id) |
| TABLE_ELEMENT(vendor_name) |
| TABLE_ELEMENT(product_id) |
| TABLE_ELEMENT(product_name) |
| TABLE_ELEMENT(type) |
| TABLE_END() |
| |
| TABLE_BEGIN(fuchsia::camera2, StreamProperties) |
| TABLE_ELEMENT(stream_type) |
| TABLE_END() |
| |
| STRUCT_BEGIN(fuchsia::camera2, FrameAvailableInfo) |
| STRUCT_ELEMENT(frame_status) |
| STRUCT_ELEMENT(buffer_id) |
| STRUCT_ELEMENT(metadata) |
| STRUCT_END() |
| |
| TABLE_BEGIN(fuchsia::camera2, StreamConstraints) |
| TABLE_ELEMENT(properties) |
| TABLE_ELEMENT(format_index) |
| TABLE_END() |
| |
| STRUCT_BEGIN(fuchsia::camera2::hal, Config) |
| STRUCT_ELEMENT(stream_configs) |
| STRUCT_END() |
| |
| STRUCT_BEGIN(fuchsia::camera2::hal, StreamConfig) |
| STRUCT_ELEMENT(frame_rate) |
| STRUCT_ELEMENT(constraints) |
| STRUCT_ELEMENT(properties) |
| STRUCT_ELEMENT(image_formats) |
| STRUCT_END() |