From b0923641d689cfd6bcb8715d11ea06502db47a35 Mon Sep 17 00:00:00 2001 From: Marissa Wall Date: Fri, 7 Feb 2020 09:51:58 -0800 Subject: [PATCH] gralloc4: move crop to seperate metadata type Move crop out of PlaneLayout so it can be set and get independently from PlaneLayout. Bug: 141632767 Test: atest VtsHalGraphicsMapperV4_0 Change-Id: Ib685c0a065754e3e3bd697d3518b03b4c76d447e --- .../hardware/graphics/common/PlaneLayout.aidl | 15 ---- .../graphics/common/StandardMetadataType.aidl | 36 +++++++-- .../VtsHalGraphicsMapperV4_0TargetTest.cpp | 75 ++++++++++++++----- 3 files changed, 88 insertions(+), 38 deletions(-) diff --git a/graphics/common/aidl/android/hardware/graphics/common/PlaneLayout.aidl b/graphics/common/aidl/android/hardware/graphics/common/PlaneLayout.aidl index 168028ddcc..ccb0690e82 100644 --- a/graphics/common/aidl/android/hardware/graphics/common/PlaneLayout.aidl +++ b/graphics/common/aidl/android/hardware/graphics/common/PlaneLayout.aidl @@ -107,19 +107,4 @@ parcelable PlaneLayout { */ long horizontalSubsampling; long verticalSubsampling; - - /** - * Some buffer producers require extra padding to their output buffer; therefore the - * physical size of the native buffer will be larger than its logical size. - * The crop rectangle determines the offset and logical size of the buffer that should be - * read by consumers. - * - * The crop rectangle is measured in samples and is relative to the offset of the - * plane. Valid crop rectangles are within the boundaries of the plane: - * [0, 0, widthInSamples, heightInSamples]. - * - * The default crop rectangle is a rectangle the same size as the plane: - * [0, 0, widthInSamples, heightInSamples]. - */ - Rect crop; } diff --git a/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl b/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl index 7b46688d9f..af6045e31d 100644 --- a/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl +++ b/graphics/common/aidl/android/hardware/graphics/common/StandardMetadataType.aidl @@ -259,6 +259,32 @@ enum StandardMetadataType { */ PLANE_LAYOUTS = 15, + /** + * Can be used to get the crop of the buffer. + * + * Some buffer producers require extra padding to their output buffer; therefore the + * physical size of the native buffer will be larger than its logical size. + * The crop rectangle(s) determine the offset and logical size of the buffer that should be + * read by consumers. + * + * The crop is defined per plane. The crop(s) are represented by an array of + * android.hardware.graphics.common.Rects. The array must be the same length and in the same + * order as the array of PlaneLayouts. Eg. the first crop in the array is the crop for the + * first PlaneLayout in the PlaneLayout array. + * + * Each crop Rect is measured in samples and is relative to the offset of the plane. Valid crop + * rectangles are within the boundaries of the plane: [0, 0, widthInSamples, heightInSamples]. + * The default crop rectangle of each plane is a rectangle the same size as the plane: + * [0, 0, widthInSamples, heightInSamples]. + * + * When it is encoded into a byte stream, the total number of Rects is written using + * 8 bytes in little endian. It is followed by each Rect. + * + * To encode a Rect, write the following fields in this order each as 8 bytes in little endian: + * left, top, right and bottom. + */ + CROP = 16, + /** * Can be used to get or set the dataspace of the buffer. The framework may attempt to set * this value. @@ -273,7 +299,7 @@ enum StandardMetadataType { * When it is encoded into a byte stream, it is first cast to a int32_t and then represented in * the byte stream by 4 bytes written in little endian. */ - DATASPACE = 16, + DATASPACE = 17, /** * Can be used to get or set the BlendMode. The framework may attempt to set this value. @@ -287,7 +313,7 @@ enum StandardMetadataType { * When it is encoded into a byte stream, it is first cast to a int32_t and then represented by * 4 bytes written in little endian. */ - BLEND_MODE = 17, + BLEND_MODE = 18, /** * Can be used to get or set static HDR metadata specified by SMPTE ST 2086. @@ -300,7 +326,7 @@ enum StandardMetadataType { * little endian. The ordering of float values follows the definition of Smpte2086 and XyColor. * If this is unset when encoded into a byte stream, the byte stream is empty. */ - SMPTE2086 = 18, + SMPTE2086 = 19, /** * Can be used to get or set static HDR metadata specified by CTA 861.3. @@ -313,7 +339,7 @@ enum StandardMetadataType { * little endian. The ordering of float values follows the definition of Cta861_3. * If this is unset when encoded into a byte stream, the byte stream is empty. */ - CTA861_3 = 19, + CTA861_3 = 20, /** * Can be used to get or set dynamic HDR metadata specified by SMPTE ST 2094-40:2016. @@ -326,5 +352,5 @@ enum StandardMetadataType { * using 8 bytes in little endian. It is followed by the uint8_t byte array. * If this is unset when encoded into a byte stream, the byte stream is empty. */ - SMPTE2094_40 = 20, + SMPTE2094_40 = 21, } diff --git a/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp b/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp index 2aad24245e..7ee94ba1f4 100644 --- a/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp +++ b/graphics/mapper/4.0/vts/functional/VtsHalGraphicsMapperV4_0TargetTest.cpp @@ -151,11 +151,6 @@ class GraphicsMapperHidlTest planeLayout.totalSizeInBytes); EXPECT_EQ(1, planeLayout.horizontalSubsampling); EXPECT_EQ(1, planeLayout.verticalSubsampling); - - EXPECT_EQ(0, planeLayout.crop.left); - EXPECT_EQ(0, planeLayout.crop.top); - EXPECT_EQ(planeLayout.widthInSamples, planeLayout.crop.right); - EXPECT_EQ(planeLayout.heightInSamples, planeLayout.crop.bottom); } void verifyBufferDump(const IMapper::BufferDump& bufferDump, @@ -997,6 +992,22 @@ TEST_P(GraphicsMapperHidlTest, GetPlaneLayouts) { ASSERT_NO_FATAL_FAILURE(verifyDummyDescriptorInfoPlaneLayouts(planeLayouts)); } +/** + * Test IMapper::get(Crop) + */ +TEST_P(GraphicsMapperHidlTest, GetCrop) { + auto info = mDummyDescriptorInfo; + info.format = PixelFormat::RGBA_8888; + info.usage = static_cast(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN); + + testGet(info, gralloc4::MetadataType_Crop, + [](const IMapper::BufferDescriptorInfo& /*info*/, const hidl_vec& vec) { + std::vector crops; + ASSERT_EQ(NO_ERROR, gralloc4::decodeCrop(vec, &crops)); + EXPECT_EQ(1, crops.size()); + }); +} + /** * Test IMapper::get(Dataspace) */ @@ -1104,6 +1115,8 @@ TEST_P(GraphicsMapperHidlTest, GetMetadataBadValue) { ASSERT_EQ(Error::BAD_BUFFER, mGralloc->get(bufferHandle, gralloc4::MetadataType_PlaneLayouts, &vec)); ASSERT_EQ(0, vec.size()); + ASSERT_EQ(Error::BAD_BUFFER, mGralloc->get(bufferHandle, gralloc4::MetadataType_Crop, &vec)); + ASSERT_EQ(0, vec.size()); ASSERT_EQ(Error::BAD_BUFFER, mGralloc->get(bufferHandle, gralloc4::MetadataType_Dataspace, &vec)); ASSERT_EQ(0, vec.size()); @@ -1362,10 +1375,6 @@ TEST_P(GraphicsMapperHidlTest, SetPlaneLayouts) { planeLayoutA.totalSizeInBytes = planeLayoutA.strideInBytes * info.height; planeLayoutA.horizontalSubsampling = 1; planeLayoutA.verticalSubsampling = 1; - planeLayoutA.crop.left = 0; - planeLayoutA.crop.top = 0; - planeLayoutA.crop.right = info.width; - planeLayoutA.crop.bottom = info.height; component.type = gralloc4::PlaneLayoutComponentType_A; component.offsetInBits = 0; @@ -1382,10 +1391,6 @@ TEST_P(GraphicsMapperHidlTest, SetPlaneLayouts) { planeLayoutRGB.totalSizeInBytes = planeLayoutRGB.strideInBytes * info.height; planeLayoutRGB.horizontalSubsampling = 1; planeLayoutRGB.verticalSubsampling = 1; - planeLayoutRGB.crop.left = 0; - planeLayoutRGB.crop.top = 0; - planeLayoutRGB.crop.right = info.width; - planeLayoutRGB.crop.bottom = info.height; component.type = gralloc4::PlaneLayoutComponentType_R; planeLayoutRGB.components.push_back(component); @@ -1423,11 +1428,6 @@ TEST_P(GraphicsMapperHidlTest, SetPlaneLayouts) { EXPECT_EQ(planeLayout.horizontalSubsampling, realPlaneLayout.horizontalSubsampling); EXPECT_EQ(planeLayout.verticalSubsampling, realPlaneLayout.verticalSubsampling); - EXPECT_EQ(planeLayout.crop.left, realPlaneLayout.crop.left); - EXPECT_EQ(planeLayout.crop.top, realPlaneLayout.crop.top); - EXPECT_EQ(planeLayout.crop.right, realPlaneLayout.crop.right); - EXPECT_EQ(planeLayout.crop.bottom, realPlaneLayout.crop.bottom); - ASSERT_EQ(planeLayout.components.size(), realPlaneLayout.components.size()); for (int j = 0; j < realPlaneLayout.components.size(); j++) { @@ -1442,6 +1442,26 @@ TEST_P(GraphicsMapperHidlTest, SetPlaneLayouts) { } } +/** + * Test IMapper::set(Crop) + */ +TEST_P(GraphicsMapperHidlTest, SetCrop) { + std::vector crops{{0, 0, 32, 32}}; + hidl_vec vec; + ASSERT_EQ(NO_ERROR, gralloc4::encodeCrop(crops, &vec)); + + testSet(mDummyDescriptorInfo, gralloc4::MetadataType_Crop, vec, + [&](const IMapper::BufferDescriptorInfo& /*info*/, const hidl_vec& vec) { + std::vector realCrops; + ASSERT_EQ(NO_ERROR, gralloc4::decodeCrop(vec, &realCrops)); + ASSERT_EQ(1, realCrops.size()); + ASSERT_EQ(crops.front().left, realCrops.front().left); + ASSERT_EQ(crops.front().top, realCrops.front().top); + ASSERT_EQ(crops.front().right, realCrops.front().right); + ASSERT_EQ(crops.front().bottom, realCrops.front().bottom); + }); +} + /** * Test IMapper::set(Dataspace) */ @@ -1589,6 +1609,7 @@ TEST_P(GraphicsMapperHidlTest, SetMetadataNullBuffer) { mGralloc->set(bufferHandle, gralloc4::MetadataType_ChromaSiting, vec)); ASSERT_EQ(Error::BAD_BUFFER, mGralloc->set(bufferHandle, gralloc4::MetadataType_PlaneLayouts, vec)); + ASSERT_EQ(Error::BAD_BUFFER, mGralloc->set(bufferHandle, gralloc4::MetadataType_Crop, vec)); ASSERT_EQ(Error::BAD_BUFFER, mGralloc->set(bufferHandle, gralloc4::MetadataType_Dataspace, vec)); ASSERT_EQ(Error::BAD_BUFFER, @@ -1653,6 +1674,7 @@ TEST_P(GraphicsMapperHidlTest, SetBadMetadata) { mGralloc->set(bufferHandle, gralloc4::MetadataType_ChromaSiting, vec)); ASSERT_EQ(Error::UNSUPPORTED, mGralloc->set(bufferHandle, gralloc4::MetadataType_PlaneLayouts, vec)); + ASSERT_EQ(Error::UNSUPPORTED, mGralloc->set(bufferHandle, gralloc4::MetadataType_Crop, vec)); ASSERT_EQ(Error::UNSUPPORTED, mGralloc->set(bufferHandle, gralloc4::MetadataType_Dataspace, vec)); ASSERT_EQ(Error::UNSUPPORTED, @@ -1866,6 +1888,23 @@ TEST_P(GraphicsMapperHidlTest, GetFromBufferDescriptorInfoPlaneLayouts) { ASSERT_NO_FATAL_FAILURE(verifyDummyDescriptorInfoPlaneLayouts(planeLayouts)); } +/** + * Test IMapper::getFromBufferDescriptorInfo(Crop) + */ +TEST_P(GraphicsMapperHidlTest, GetFromBufferDescriptorInfoCrop) { + auto info = mDummyDescriptorInfo; + info.format = PixelFormat::RGBA_8888; + info.usage = static_cast(BufferUsage::CPU_WRITE_OFTEN | BufferUsage::CPU_READ_OFTEN); + + hidl_vec vec; + ASSERT_EQ(Error::NONE, + mGralloc->getFromBufferDescriptorInfo(info, gralloc4::MetadataType_Crop, &vec)); + + std::vector crops; + ASSERT_EQ(NO_ERROR, gralloc4::decodeCrop(vec, &crops)); + EXPECT_EQ(1, crops.size()); +} + /** * Test IMapper::getFromBufferDescriptorInfo(Dataspace) */