blob: 333df39c8b1e15942f89e14b323280af6b440a6d [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"
#include <lib/image-format/image_format.h>
#include "fidl/fuchsia.sysmem/cpp/wire_types.h"
namespace camera {
fuchsia_sysmem::wire::ImageFormat2 ConvertToWireType(fuchsia::sysmem::ImageFormat_2 image_format) {
return {
.pixel_format =
{
.type = static_cast<const fuchsia_sysmem::wire::PixelFormatType>(
image_format.pixel_format.type),
.has_format_modifier = image_format.pixel_format.has_format_modifier,
.format_modifier =
{
.value = image_format.pixel_format.format_modifier.value,
},
},
.coded_width = image_format.coded_width,
.coded_height = image_format.coded_height,
.bytes_per_row = image_format.bytes_per_row,
.display_width = image_format.display_width,
.display_height = image_format.display_height,
.layers = image_format.layers,
.color_space =
{
.type = static_cast<const fuchsia_sysmem::wire::ColorSpaceType>(
image_format.color_space.type),
},
.has_pixel_aspect_ratio = image_format.has_pixel_aspect_ratio,
.pixel_aspect_ratio_width = image_format.pixel_aspect_ratio_width,
.pixel_aspect_ratio_height = image_format.pixel_aspect_ratio_height,
};
}
// TODO: Please use fidl::ToWire() instead. See sysmem-version.cc for an UnusedArena that can
// avoid the caller needing to pass in a real arena, since sysmem V1 flat structs don't really need
// one (but fidl::ToWire() requires an arena param).
fuchsia_sysmem::wire::ImageFormatConstraints ConvertToWireType(
fuchsia::sysmem::ImageFormatConstraints constraints) {
return {
.pixel_format =
{
.type =
static_cast<fuchsia_sysmem::wire::PixelFormatType>(constraints.pixel_format.type),
.has_format_modifier = constraints.pixel_format.has_format_modifier,
.format_modifier =
{
.value = constraints.pixel_format.format_modifier.value,
},
},
.color_spaces_count = constraints.color_spaces_count,
.color_space =
[&]() {
fidl::Array<fuchsia_sysmem::wire::ColorSpace, 32> color_space;
for (size_t i = 0; i < constraints.color_spaces_count; ++i) {
color_space[i].type = static_cast<fuchsia_sysmem::wire::ColorSpaceType>(
constraints.color_space[i].type);
}
return color_space;
}(),
.min_coded_width = constraints.min_coded_width,
.max_coded_width = constraints.max_coded_width,
.min_coded_height = constraints.min_coded_height,
.max_coded_height = constraints.max_coded_height,
.min_bytes_per_row = constraints.min_bytes_per_row,
.max_bytes_per_row = constraints.max_bytes_per_row,
.max_coded_width_times_coded_height = constraints.max_coded_width_times_coded_height,
.layers = constraints.layers,
.coded_width_divisor = constraints.coded_width_divisor,
.coded_height_divisor = constraints.coded_height_divisor,
.bytes_per_row_divisor = constraints.bytes_per_row_divisor,
.start_offset_divisor = constraints.start_offset_divisor,
.display_width_divisor = constraints.display_width_divisor,
.display_height_divisor = constraints.display_height_divisor,
.required_min_coded_width = constraints.required_min_coded_width,
.required_max_coded_width = constraints.required_max_coded_width,
.required_min_coded_height = constraints.required_min_coded_height,
.required_max_coded_height = constraints.required_max_coded_height,
.required_min_bytes_per_row = constraints.required_min_bytes_per_row,
.required_max_bytes_per_row = constraints.required_max_bytes_per_row,
};
}
fuchsia_sysmem::wire::ImageFormat2 GetImageFormatFromConstraints(
fuchsia_sysmem::wire::ImageFormatConstraints constraints, uint32_t coded_width,
uint32_t coded_height) {
uint32_t bytes_per_row;
bool success = ImageFormatMinimumRowBytes(constraints, coded_width, &bytes_per_row);
if (!success) {
ZX_ASSERT(coded_width > 0);
ZX_ASSERT(coded_width <= constraints.max_coded_width);
ZX_ASSERT(coded_width >= constraints.min_coded_width);
ZX_ASSERT(!constraints.pixel_format.has_format_modifier);
ZX_ASSERT_MSG(constraints.max_bytes_per_row >= coded_width, "???? %d vs %d",
constraints.max_bytes_per_row, coded_width);
}
ZX_ASSERT(success);
ZX_ASSERT(bytes_per_row != 0);
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