gralloc: Add handling for custom content metadata

Update QtiGralloc to support getting and setting custom
content metadata.

Change-Id: I6f79eb0d39a82668ef7fb99e30669eb367ef00b1
This commit is contained in:
Christopher Braga
2022-10-18 17:41:10 -04:00
committed by Gerrit - the friendly Code Review server
parent da003a2f1e
commit 5b94666d26

View File

@@ -30,6 +30,8 @@
#include "QtiGralloc.h" #include "QtiGralloc.h"
#include <log/log.h> #include <log/log.h>
#include "color_extensions.h"
namespace qtigralloc { namespace qtigralloc {
using android::hardware::graphics::mapper::V4_0::IMapper; using android::hardware::graphics::mapper::V4_0::IMapper;
@@ -216,6 +218,38 @@ Error encodeYUVPlaneInfoMetadata(qti_ycbcr *in, hidl_vec<uint8_t> *out) {
return Error::NONE; return Error::NONE;
} }
Error decodeCustomContentMetadata(hidl_vec<uint8_t> &in, void *out) {
static size_t target_size = sizeof(CustomContentMetadata);
if (in.size() != target_size || !out) {
return Error::BAD_VALUE;
}
CustomContentMetadata *c_md_in = reinterpret_cast<CustomContentMetadata *>(in.data());
CustomContentMetadata *c_md_out = reinterpret_cast<CustomContentMetadata *>(out);
if (c_md_in->size > CUSTOM_METADATA_SIZE_BYTES) {
return Error::BAD_VALUE;
}
c_md_out->size = c_md_in->size;
memcpy(c_md_out->metadataPayload, c_md_in->metadataPayload, c_md_in->size);
return Error::NONE;
}
Error encodeCustomContentMetadata(const void *in, hidl_vec<uint8_t> *out) {
static size_t target_size = sizeof(CustomContentMetadata);
if (!in || !out) {
return Error::BAD_VALUE;
}
out->resize(target_size);
memcpy(out->data(), in, target_size);
return Error::NONE;
}
MetadataType getMetadataType(uint32_t in) { MetadataType getMetadataType(uint32_t in) {
switch (in) { switch (in) {
case QTI_VT_TIMESTAMP: case QTI_VT_TIMESTAMP:
@@ -272,6 +306,8 @@ MetadataType getMetadataType(uint32_t in) {
return MetadataType_YuvPlaneInfo; return MetadataType_YuvPlaneInfo;
case QTI_TIMED_RENDERING: case QTI_TIMED_RENDERING:
return MetadataType_TimedRendering; return MetadataType_TimedRendering;
case QTI_CUSTOM_CONTENT_METADATA:
return MetadataType_CustomContentMetadata;
default: default:
return MetadataType_Invalid; return MetadataType_Invalid;
} }
@@ -404,6 +440,9 @@ Error get(void *buffer, uint32_t type, void *param) {
err = static_cast<Error>(android::gralloc4::decodeUint32( err = static_cast<Error>(android::gralloc4::decodeUint32(
qtigralloc::MetadataType_TimedRendering, bytestream, reinterpret_cast<uint32_t *>(param))); qtigralloc::MetadataType_TimedRendering, bytestream, reinterpret_cast<uint32_t *>(param)));
break; break;
case QTI_CUSTOM_CONTENT_METADATA:
err = decodeCustomContentMetadata(bytestream, param);
break;
default: default:
param = nullptr; param = nullptr;
return Error::UNSUPPORTED; return Error::UNSUPPORTED;
@@ -484,6 +523,9 @@ Error set(void *buffer, uint32_t type, void *param) {
android::gralloc4::encodeUint32(qtigralloc::MetadataType_TimedRendering, android::gralloc4::encodeUint32(qtigralloc::MetadataType_TimedRendering,
*reinterpret_cast<uint32_t *>(param), &bytestream)); *reinterpret_cast<uint32_t *>(param), &bytestream));
break; break;
case QTI_CUSTOM_CONTENT_METADATA:
err = encodeCustomContentMetadata(param, &bytestream);
break;
default: default:
param = nullptr; param = nullptr;
return Error::UNSUPPORTED; return Error::UNSUPPORTED;