blob: cc5106a066fe002776f6fe3090740726eb1fae79 [file] [log] [blame]
/*
* Copyright (C) 2020 Arm Limited.
*
* Copyright 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "SharedMetadata.h"
#include "mali_gralloc_log.h"
//#include <VendorVideoAPI.h>
namespace arm
{
namespace mapper
{
namespace common
{
void shared_metadata_init(void *memory, std::string_view name)
{
shared_metadata *m = new(memory) shared_metadata(name);
}
size_t shared_metadata_size()
{
return sizeof(shared_metadata);
}
void get_name(const private_handle_t *hnd, std::string *name)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*name = metadata->get_name();
}
void get_crop_rect(const private_handle_t *hnd, std::optional<Rect> *crop)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*crop = metadata->crop.to_std_optional();
}
android::status_t set_crop_rect(const private_handle_t *hnd, const Rect &crop)
{
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
if (crop.top < 0 || crop.left < 0 ||
crop.left > crop.right || crop.right > hnd->plane_info[0].alloc_width ||
crop.top > crop.bottom || crop.bottom > hnd->plane_info[0].alloc_height ||
(crop.right - crop.left) != hnd->width ||
(crop.bottom - crop.top) != hnd->height)
{
MALI_GRALLOC_LOGE("Attempt to set invalid crop rectangle");
return android::BAD_VALUE;
}
metadata->crop = aligned_optional(crop);
return android::OK;
}
void get_dataspace(const private_handle_t *hnd, std::optional<Dataspace> *dataspace)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*dataspace = metadata->dataspace.to_std_optional();
}
void set_dataspace(const private_handle_t *hnd, const Dataspace &dataspace)
{
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
metadata->dataspace = aligned_optional(dataspace);
}
void get_blend_mode(const private_handle_t *hnd, std::optional<BlendMode> *blend_mode)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*blend_mode = metadata->blend_mode.to_std_optional();
}
void set_blend_mode(const private_handle_t *hnd, const BlendMode &blend_mode)
{
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
metadata->blend_mode = aligned_optional(blend_mode);
}
void get_smpte2086(const private_handle_t *hnd, std::optional<Smpte2086> *smpte2086)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*smpte2086 = metadata->smpte2086.to_std_optional();
}
android::status_t set_smpte2086(const private_handle_t *hnd, const std::optional<Smpte2086> &smpte2086)
{
if (!smpte2086.has_value())
{
return android::BAD_VALUE;
}
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
metadata->smpte2086 = aligned_optional(smpte2086);
return android::OK;
}
void get_cta861_3(const private_handle_t *hnd, std::optional<Cta861_3> *cta861_3)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
*cta861_3 = metadata->cta861_3.to_std_optional();
}
android::status_t set_cta861_3(const private_handle_t *hnd, const std::optional<Cta861_3> &cta861_3)
{
if (!cta861_3.has_value())
{
return android::BAD_VALUE;
}
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
metadata->cta861_3 = aligned_optional(cta861_3);
return android::OK;
}
void get_smpte2094_40(const private_handle_t *hnd, std::optional<std::vector<uint8_t>> *smpte2094_40)
{
auto *metadata = reinterpret_cast<const shared_metadata *>(hnd->attr_base);
if (metadata->smpte2094_40.size > 0)
{
const uint8_t *begin = metadata->smpte2094_40.data();
const uint8_t *end = begin + metadata->smpte2094_40.size;
smpte2094_40->emplace(begin, end);
}
else
{
smpte2094_40->reset();
}
}
android::status_t set_smpte2094_40(const private_handle_t *hnd, const std::optional<std::vector<uint8_t>> &smpte2094_40)
{
auto *metadata = reinterpret_cast<shared_metadata *>(hnd->attr_base);
const size_t size = smpte2094_40.has_value() ? smpte2094_40->size() : 0;
if (size > metadata->smpte2094_40.capacity())
{
MALI_GRALLOC_LOGE("SMPTE 2094-40 metadata too large to fit in shared metadata region");
return android::BAD_VALUE;
}
metadata->smpte2094_40.size = (uint32_t) size;
std::memcpy(metadata->smpte2094_40.data(), smpte2094_40->data(), size);
return android::OK;
}
} // namespace common
} // namespace mapper
} // namespace arm