blob: d36fe57a3725dd858274a73479793fb248b946c2 [file] [log] [blame]
// 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 "format_conversion.h"
namespace camera {
fuchsia_sysmem_ImageFormat_2 ConvertHlcppImageFormat2toCType(
const fuchsia::sysmem::ImageFormat_2& hlcpp_image_format2) {
return {
.pixel_format =
{
.type = *reinterpret_cast<const fuchsia_sysmem_PixelFormatType*>(
&hlcpp_image_format2.pixel_format.type),
.has_format_modifier = hlcpp_image_format2.pixel_format.has_format_modifier,
.format_modifier.value = hlcpp_image_format2.pixel_format.format_modifier.value,
},
.coded_width = hlcpp_image_format2.coded_width,
.coded_height = hlcpp_image_format2.coded_height,
.bytes_per_row = hlcpp_image_format2.bytes_per_row,
.display_width = hlcpp_image_format2.display_width,
.display_height = hlcpp_image_format2.display_height,
.layers = hlcpp_image_format2.layers,
.color_space = *reinterpret_cast<const fuchsia_sysmem_ColorSpace*>(
&hlcpp_image_format2.color_space.type),
.has_pixel_aspect_ratio = hlcpp_image_format2.has_pixel_aspect_ratio,
.pixel_aspect_ratio_width = hlcpp_image_format2.pixel_aspect_ratio_width,
.pixel_aspect_ratio_height = hlcpp_image_format2.pixel_aspect_ratio_height,
};
}
void ConvertToCTypeBufferCollectionInfo2(
const fuchsia::sysmem::BufferCollectionInfo_2& hlcpp_buffer_collection,
fuchsia_sysmem_BufferCollectionInfo_2* buffer_collection) {
buffer_collection->buffer_count = hlcpp_buffer_collection.buffer_count;
auto& buffer_settings = buffer_collection->settings.buffer_settings;
auto& hlcpp_buffer_settings = hlcpp_buffer_collection.settings.buffer_settings;
buffer_settings.size_bytes = hlcpp_buffer_settings.size_bytes;
buffer_settings.is_physically_contiguous = hlcpp_buffer_settings.is_physically_contiguous;
buffer_settings.is_secure = hlcpp_buffer_settings.is_secure;
buffer_settings.coherency_domain = *reinterpret_cast<const fuchsia_sysmem_CoherencyDomain*>(
&hlcpp_buffer_settings.coherency_domain);
buffer_settings.heap =
*reinterpret_cast<const fuchsia_sysmem_HeapType*>(&hlcpp_buffer_settings.heap);
buffer_collection->settings.has_image_format_constraints =
hlcpp_buffer_collection.settings.has_image_format_constraints;
auto& image_format_constraints = buffer_collection->settings.image_format_constraints;
auto& hlcpp_image_format_constraints = hlcpp_buffer_collection.settings.image_format_constraints;
image_format_constraints.pixel_format.type =
*reinterpret_cast<const fuchsia_sysmem_PixelFormatType*>(
&hlcpp_image_format_constraints.pixel_format.type);
image_format_constraints.pixel_format.has_format_modifier =
hlcpp_image_format_constraints.pixel_format.has_format_modifier;
image_format_constraints.pixel_format.format_modifier.value =
hlcpp_image_format_constraints.pixel_format.format_modifier.value;
image_format_constraints.color_spaces_count = hlcpp_image_format_constraints.color_spaces_count;
for (uint32_t i = 0; i < image_format_constraints.color_spaces_count; ++i) {
image_format_constraints.color_space[i] = *reinterpret_cast<const fuchsia_sysmem_ColorSpace*>(
&hlcpp_image_format_constraints.color_space[i].type);
}
image_format_constraints.min_coded_width = hlcpp_image_format_constraints.min_coded_width;
image_format_constraints.max_coded_width = hlcpp_image_format_constraints.max_coded_width;
image_format_constraints.min_coded_height = hlcpp_image_format_constraints.min_coded_height;
image_format_constraints.max_coded_height = hlcpp_image_format_constraints.max_coded_height;
image_format_constraints.min_bytes_per_row = hlcpp_image_format_constraints.min_bytes_per_row;
image_format_constraints.max_bytes_per_row = hlcpp_image_format_constraints.max_bytes_per_row;
image_format_constraints.max_coded_width_times_coded_height =
hlcpp_image_format_constraints.max_coded_width_times_coded_height;
image_format_constraints.layers = hlcpp_image_format_constraints.layers;
image_format_constraints.coded_width_divisor = hlcpp_image_format_constraints.coded_width_divisor;
image_format_constraints.coded_height_divisor =
hlcpp_image_format_constraints.coded_height_divisor;
image_format_constraints.bytes_per_row_divisor =
hlcpp_image_format_constraints.bytes_per_row_divisor;
image_format_constraints.start_offset_divisor =
hlcpp_image_format_constraints.start_offset_divisor;
image_format_constraints.display_width_divisor =
hlcpp_image_format_constraints.display_width_divisor;
image_format_constraints.display_height_divisor =
hlcpp_image_format_constraints.display_height_divisor;
image_format_constraints.required_min_coded_width =
hlcpp_image_format_constraints.required_min_coded_width;
image_format_constraints.required_max_coded_width =
hlcpp_image_format_constraints.required_max_coded_width;
image_format_constraints.required_min_coded_height =
hlcpp_image_format_constraints.required_min_coded_height;
image_format_constraints.required_max_coded_height =
hlcpp_image_format_constraints.required_max_coded_height;
image_format_constraints.required_min_bytes_per_row =
hlcpp_image_format_constraints.required_min_bytes_per_row;
image_format_constraints.required_max_bytes_per_row =
hlcpp_image_format_constraints.required_max_bytes_per_row;
for (uint32_t i = 0; i < hlcpp_buffer_collection.buffer_count; ++i) {
buffer_collection->buffers[i].vmo = hlcpp_buffer_collection.buffers[i].vmo.get();
}
}
fuchsia_sysmem_ImageFormat_2 GetImageFormatFromBufferCollection(
const fuchsia_sysmem_BufferCollectionInfo_2& buffer_collection, uint32_t coded_width,
uint32_t coded_height) {
ZX_ASSERT(buffer_collection.settings.has_image_format_constraints);
auto& constraints = buffer_collection.settings.image_format_constraints;
uint32_t bytes_per_row;
bool success = ImageFormatMinimumRowBytes(&constraints, coded_width, &bytes_per_row);
ZX_ASSERT(success);
return {.pixel_format = constraints.pixel_format,
.coded_width = coded_width,
.coded_height = coded_height,
.bytes_per_row = bytes_per_row,
.display_width = coded_width,
.display_height = coded_height,
.layers = 1,
.color_space = constraints.color_space[0]};
}
} // namespace camera