Snap for 8917908 from ed1361fda9f40193b7d9cf715bb4b450429f38b3 to mainline-uwb-release
Change-Id: I618fb2e403836b6bfd09d9a4192b73891f24ed00
diff --git a/gralloc/gr_buf_mgr.cpp b/gralloc/gr_buf_mgr.cpp
index 65ad3e6..cd14a6b 100644
--- a/gralloc/gr_buf_mgr.cpp
+++ b/gralloc/gr_buf_mgr.cpp
@@ -52,6 +52,7 @@
using aidl::android::hardware::graphics::common::StandardMetadataType;
using aidl::android::hardware::graphics::common::XyColor;
using ::android::hardware::graphics::common::V1_2::PixelFormat;
+using IMapper_4_0_Error = ::android::hardware::graphics::mapper::V4_0::Error;
static BufferInfo GetBufferInfo(const BufferDescriptor &descriptor) {
return BufferInfo(descriptor.GetWidth(), descriptor.GetHeight(), descriptor.GetFormat(),
@@ -66,14 +67,15 @@
return static_cast<uint64_t>(ROUND_UP_PAGESIZE(sizeof(MetaData_t) + reserved_region_size));
}
-static void unmapAndReset(private_handle_t *handle, uint64_t reserved_region_size = 0) {
+static void unmapAndReset(private_handle_t *handle) {
+ uint64_t reserved_region_size = handle->reserved_size;
if (private_handle_t::validate(handle) == 0 && handle->base_metadata) {
munmap(reinterpret_cast<void *>(handle->base_metadata), getMetaDataSize(reserved_region_size));
handle->base_metadata = 0;
}
}
-static int validateAndMap(private_handle_t *handle, uint64_t reserved_region_size = 0) {
+static int validateAndMap(private_handle_t *handle) {
if (private_handle_t::validate(handle)) {
ALOGE("%s: Private handle is invalid - handle:%p", __func__, handle);
return -1;
@@ -84,6 +86,7 @@
}
if (!handle->base_metadata) {
+ uint64_t reserved_region_size = handle->reserved_size;
uint64_t size = getMetaDataSize(reserved_region_size);
void *base = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, handle->fd_metadata, 0);
if (base == reinterpret_cast<void *>(MAP_FAILED)) {
@@ -92,24 +95,6 @@
return -1;
}
handle->base_metadata = (uintptr_t)base;
-#ifdef METADATA_V2
- // The allocator process gets the reserved region size from the BufferDescriptor.
- // When importing to another process, the reserved size is unknown until mapping the metadata,
- // hence the re-mapping below
- auto metadata = reinterpret_cast<MetaData_t*>(handle->base_metadata);
- if (reserved_region_size == 0 && metadata->reservedSize) {
- size = getMetaDataSize(metadata->reservedSize);
- unmapAndReset(handle);
- void *new_base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
- handle->fd_metadata, 0);
- if (new_base == reinterpret_cast<void*>(MAP_FAILED)) {
- ALOGE("%s: metadata mmap failed - handle:%p fd: %d err: %s",
- __func__, handle, handle->fd_metadata, strerror(errno));
- return -1;
- }
- handle->base_metadata = (uintptr_t)new_base;
- }
-#endif
}
return 0;
}
@@ -740,7 +725,7 @@
return Error::BAD_BUFFER;
}
- auto meta_size = getMetaDataSize(buf->reserved_size);
+ auto meta_size = getMetaDataSize(hnd->reserved_size);
if (allocator_->FreeBuffer(reinterpret_cast<void *>(hnd->base), hnd->size, hnd->offset, hnd->fd,
buf->ion_handle_main) != 0) {
@@ -1072,6 +1057,7 @@
data.fd, e_data.fd, INT(flags), INT(alignedw), INT(alignedh), descriptor.GetWidth(),
descriptor.GetHeight(), format, buffer_type, data.size, usage);
+ hnd->reserved_size = descriptor.GetReservedSize();
hnd->id = ++next_id_;
hnd->base = 0;
hnd->base_metadata = 0;
@@ -1082,11 +1068,7 @@
setMetaDataAndUnmap(hnd, SET_GRAPHICS_METADATA, reinterpret_cast<void *>(&graphics_metadata));
}
-#ifdef METADATA_V2
- auto error = validateAndMap(hnd, descriptor.GetReservedSize());
-#else
auto error = validateAndMap(hnd);
-#endif
if (error != 0) {
ALOGE("validateAndMap failed");
@@ -1108,7 +1090,7 @@
metadata->crop.right = hnd->width;
metadata->crop.bottom = hnd->height;
- unmapAndReset(hnd, descriptor.GetReservedSize());
+ unmapAndReset(hnd);
*handle = hnd;
@@ -1535,7 +1517,9 @@
return Error::UNSUPPORTED;
case (int64_t)StandardMetadataType::DATASPACE:
Dataspace dataspace;
- android::gralloc4::decodeDataspace(in, &dataspace);
+ if (android::gralloc4::decodeDataspace(in, &dataspace)) {
+ return Error::UNSUPPORTED;
+ }
dataspaceToColorMetadata(dataspace, &metadata->color);
break;
case (int64_t)StandardMetadataType::BLEND_MODE:
@@ -1545,7 +1529,9 @@
break;
case (int64_t)StandardMetadataType::SMPTE2086: {
std::optional<Smpte2086> mastering_display_values;
- android::gralloc4::decodeSmpte2086(in, &mastering_display_values);
+ if (android::gralloc4::decodeSmpte2086(in, &mastering_display_values)) {
+ return Error::UNSUPPORTED;
+ }
if (mastering_display_values != std::nullopt) {
metadata->color.masteringDisplayInfo.colorVolumeSEIEnabled = true;
@@ -1584,7 +1570,9 @@
}
case (int64_t)StandardMetadataType::CTA861_3: {
std::optional<Cta861_3> content_light_level;
- android::gralloc4::decodeCta861_3(in, &content_light_level);
+ if (android::gralloc4::decodeCta861_3(in, &content_light_level)) {
+ return Error::UNSUPPORTED;
+ }
if (content_light_level != std::nullopt) {
metadata->color.contentLightLevel.lightLevelSEIEnabled = true;
metadata->color.contentLightLevel.maxContentLightLevel =
@@ -1602,7 +1590,9 @@
}
case (int64_t)StandardMetadataType::SMPTE2094_40: {
std::optional<std::vector<uint8_t>> dynamic_metadata_payload;
- android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload);
+ if (android::gralloc4::decodeSmpte2094_40(in, &dynamic_metadata_payload)) {
+ return Error::UNSUPPORTED;
+ }
if (dynamic_metadata_payload != std::nullopt) {
if (dynamic_metadata_payload->size() > HDR_DYNAMIC_META_DATA_SZ ||
dynamic_metadata_payload->size() == 0)
@@ -1645,9 +1635,13 @@
}
case (int64_t)StandardMetadataType::CROP: {
std::vector<Rect> in_crop;
- android::gralloc4::decodeCrop(in, &in_crop);
- if (in_crop.size() != 1)
+ if (android::gralloc4::decodeCrop(in, &in_crop)) {
return Error::UNSUPPORTED;
+ }
+
+ if (in_crop.size() != 1) {
+ return Error::UNSUPPORTED;
+ }
metadata->crop.left = in_crop[0].left;
metadata->crop.top = in_crop[0].top;
@@ -1656,49 +1650,75 @@
break;
}
case QTI_VT_TIMESTAMP:
- android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
- &metadata->vtTimeStamp);
+ if (android::gralloc4::decodeUint64(qtigralloc::MetadataType_VTTimestamp, in,
+ &metadata->vtTimeStamp)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_COLOR_METADATA:
ColorMetaData color;
- qtigralloc::decodeColorMetadata(in, &color);
+ if (qtigralloc::decodeColorMetadata(in, &color) != IMapper_4_0_Error::NONE) {
+ return Error::UNSUPPORTED;
+ }
metadata->color = color;
break;
case QTI_PP_PARAM_INTERLACED:
- android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
- &metadata->interlaced);
+ if (android::gralloc4::decodeInt32(qtigralloc::MetadataType_PPParamInterlaced, in,
+ &metadata->interlaced)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_VIDEO_PERF_MODE:
- android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
- &metadata->isVideoPerfMode);
+ if (android::gralloc4::decodeUint32(qtigralloc::MetadataType_VideoPerfMode, in,
+ &metadata->isVideoPerfMode)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_GRAPHICS_METADATA:
- qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata);
+ if (qtigralloc::decodeGraphicsMetadata(in, &metadata->graphics_metadata) !=
+ IMapper_4_0_Error::NONE) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_UBWC_CR_STATS_INFO:
- qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]);
+ if (qtigralloc::decodeUBWCStats(in, &metadata->ubwcCRStats[0]) != IMapper_4_0_Error::NONE) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_REFRESH_RATE:
- android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
- &metadata->refreshrate);
+ if (android::gralloc4::decodeFloat(qtigralloc::MetadataType_RefreshRate, in,
+ &metadata->refreshrate)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_MAP_SECURE_BUFFER:
- android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
- &metadata->mapSecureBuffer);
+ if (android::gralloc4::decodeInt32(qtigralloc::MetadataType_MapSecureBuffer, in,
+ &metadata->mapSecureBuffer)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_LINEAR_FORMAT:
- android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
- &metadata->linearFormat);
+ if (android::gralloc4::decodeUint32(qtigralloc::MetadataType_LinearFormat, in,
+ &metadata->linearFormat)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_SINGLE_BUFFER_MODE:
- android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
- &metadata->isSingleBufferMode);
+ if (android::gralloc4::decodeUint32(qtigralloc::MetadataType_SingleBufferMode, in,
+ &metadata->isSingleBufferMode)) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_CVP_METADATA:
- qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata);
+ if (qtigralloc::decodeCVPMetadata(in, &metadata->cvpMetadata) != IMapper_4_0_Error::NONE) {
+ return Error::UNSUPPORTED;
+ }
break;
case QTI_VIDEO_HISTOGRAM_STATS:
- qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats);
+ if (qtigralloc::decodeVideoHistogramMetadata(in, &metadata->video_histogram_stats) !=
+ IMapper_4_0_Error::NONE) {
+ return Error::UNSUPPORTED;
+ }
break;
default:
#ifdef METADATA_V2