Loading libs/gui/HdrMetadata.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #include <gui/HdrMetadata.h> #include <limits> namespace android { Loading @@ -26,6 +27,10 @@ size_t HdrMetadata::getFlattenedSize() const { if (validTypes & CTA861_3) { size += sizeof(cta8613); } if (validTypes & HDR10PLUS) { size += sizeof(size_t); size += hdr10plus.size(); } return size; } Loading @@ -41,6 +46,12 @@ status_t HdrMetadata::flatten(void* buffer, size_t size) const { if (validTypes & CTA861_3) { FlattenableUtils::write(buffer, size, cta8613); } if (validTypes & HDR10PLUS) { size_t metadataSize = hdr10plus.size(); FlattenableUtils::write(buffer, size, metadataSize); memcpy(buffer, hdr10plus.data(), metadataSize); FlattenableUtils::advance(buffer, size, metadataSize); } return NO_ERROR; } Loading @@ -62,6 +73,22 @@ status_t HdrMetadata::unflatten(void const* buffer, size_t size) { } FlattenableUtils::read(buffer, size, cta8613); } if (validTypes & HDR10PLUS) { if (size < sizeof(size_t)) { return NO_MEMORY; } size_t metadataSize; FlattenableUtils::read(buffer, size, metadataSize); if (size < metadataSize) { return NO_MEMORY; } hdr10plus.resize(metadataSize); memcpy(hdr10plus.data(), buffer, metadataSize); FlattenableUtils::advance(buffer, size, metadataSize); } return NO_ERROR; } Loading Loading @@ -91,6 +118,10 @@ bool HdrMetadata::operator==(const HdrMetadata& rhs) const { } } if ((validTypes & HDR10PLUS) == HDR10PLUS) { if (hdr10plus != rhs.hdr10plus) return false; } return true; } Loading libs/gui/Surface.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -965,6 +965,9 @@ int Surface::perform(int operation, va_list args) case NATIVE_WINDOW_SET_BUFFERS_CTA861_3_METADATA: res = dispatchSetBuffersCta8613Metadata(args); break; case NATIVE_WINDOW_SET_BUFFERS_HDR10_PLUS_METADATA: res = dispatchSetBuffersHdr10PlusMetadata(args); break; case NATIVE_WINDOW_SET_SURFACE_DAMAGE: res = dispatchSetSurfaceDamage(args); break; Loading Loading @@ -1120,6 +1123,12 @@ int Surface::dispatchSetBuffersCta8613Metadata(va_list args) { return setBuffersCta8613Metadata(metadata); } int Surface::dispatchSetBuffersHdr10PlusMetadata(va_list args) { const size_t size = va_arg(args, size_t); const uint8_t* metadata = va_arg(args, const uint8_t*); return setBuffersHdr10PlusMetadata(size, metadata); } int Surface::dispatchSetSurfaceDamage(va_list args) { android_native_rect_t* rects = va_arg(args, android_native_rect_t*); size_t numRects = va_arg(args, size_t); Loading Loading @@ -1568,6 +1577,19 @@ int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata return NO_ERROR; } int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) { ALOGV("Surface::setBuffersBlobMetadata"); Mutex::Autolock lock(mMutex); if (size > 0) { mHdrMetadata.hdr10plus.assign(metadata, metadata + size); mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS; } else { mHdrMetadata.validTypes &= ~HdrMetadata::HDR10PLUS; mHdrMetadata.hdr10plus.clear(); } return NO_ERROR; } Dataspace Surface::getBuffersDataSpace() { ALOGV("Surface::getBuffersDataSpace"); Mutex::Autolock lock(mMutex); Loading libs/gui/include/gui/HdrMetadata.h +5 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #pragma once #include <stdint.h> #include <vector> #include <system/graphics.h> #include <utils/Flattenable.h> Loading @@ -27,11 +28,14 @@ struct HdrMetadata : public LightFlattenable<HdrMetadata> { enum Type : uint32_t { SMPTE2086 = 1 << 0, CTA861_3 = 1 << 1, HDR10PLUS = 1 << 2, }; uint32_t validTypes{0}; android_smpte2086_metadata smpte2086{}; android_cta861_3_metadata cta8613{}; std::vector<uint8_t> hdr10plus{}; // LightFlattenable bool isFixedSize() const { return false; } Loading libs/gui/include/gui/Surface.h +2 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,7 @@ private: int dispatchSetBuffersDataSpace(va_list args); int dispatchSetBuffersSmpte2086Metadata(va_list args); int dispatchSetBuffersCta8613Metadata(va_list args); int dispatchSetBuffersHdr10PlusMetadata(va_list args); int dispatchSetSurfaceDamage(va_list args); int dispatchSetSharedBufferMode(va_list args); int dispatchSetAutoRefresh(va_list args); Loading Loading @@ -249,6 +250,7 @@ protected: virtual int setBuffersDataSpace(ui::Dataspace dataSpace); virtual int setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata); virtual int setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata); virtual int setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata); virtual int setCrop(Rect const* rect); virtual int setUsage(uint64_t reqUsage); virtual void setSurfaceDamage(android_native_rect_t* rects, size_t numRects); Loading libs/gui/tests/Surface_test.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -366,10 +366,17 @@ TEST_F(SurfaceTest, SetHdrMetadata) { 78.0, 62.0, }; std::vector<uint8_t> hdr10plus; hdr10plus.push_back(0xff); int error = native_window_set_buffers_smpte2086_metadata(window.get(), &smpte2086); ASSERT_EQ(error, NO_ERROR); error = native_window_set_buffers_cta861_3_metadata(window.get(), &cta861_3); ASSERT_EQ(error, NO_ERROR); error = native_window_set_buffers_hdr10_plus_metadata(window.get(), hdr10plus.size(), hdr10plus.data()); ASSERT_EQ(error, NO_ERROR); } TEST_F(SurfaceTest, DynamicSetBufferCount) { Loading Loading
libs/gui/HdrMetadata.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -15,6 +15,7 @@ */ #include <gui/HdrMetadata.h> #include <limits> namespace android { Loading @@ -26,6 +27,10 @@ size_t HdrMetadata::getFlattenedSize() const { if (validTypes & CTA861_3) { size += sizeof(cta8613); } if (validTypes & HDR10PLUS) { size += sizeof(size_t); size += hdr10plus.size(); } return size; } Loading @@ -41,6 +46,12 @@ status_t HdrMetadata::flatten(void* buffer, size_t size) const { if (validTypes & CTA861_3) { FlattenableUtils::write(buffer, size, cta8613); } if (validTypes & HDR10PLUS) { size_t metadataSize = hdr10plus.size(); FlattenableUtils::write(buffer, size, metadataSize); memcpy(buffer, hdr10plus.data(), metadataSize); FlattenableUtils::advance(buffer, size, metadataSize); } return NO_ERROR; } Loading @@ -62,6 +73,22 @@ status_t HdrMetadata::unflatten(void const* buffer, size_t size) { } FlattenableUtils::read(buffer, size, cta8613); } if (validTypes & HDR10PLUS) { if (size < sizeof(size_t)) { return NO_MEMORY; } size_t metadataSize; FlattenableUtils::read(buffer, size, metadataSize); if (size < metadataSize) { return NO_MEMORY; } hdr10plus.resize(metadataSize); memcpy(hdr10plus.data(), buffer, metadataSize); FlattenableUtils::advance(buffer, size, metadataSize); } return NO_ERROR; } Loading Loading @@ -91,6 +118,10 @@ bool HdrMetadata::operator==(const HdrMetadata& rhs) const { } } if ((validTypes & HDR10PLUS) == HDR10PLUS) { if (hdr10plus != rhs.hdr10plus) return false; } return true; } Loading
libs/gui/Surface.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -965,6 +965,9 @@ int Surface::perform(int operation, va_list args) case NATIVE_WINDOW_SET_BUFFERS_CTA861_3_METADATA: res = dispatchSetBuffersCta8613Metadata(args); break; case NATIVE_WINDOW_SET_BUFFERS_HDR10_PLUS_METADATA: res = dispatchSetBuffersHdr10PlusMetadata(args); break; case NATIVE_WINDOW_SET_SURFACE_DAMAGE: res = dispatchSetSurfaceDamage(args); break; Loading Loading @@ -1120,6 +1123,12 @@ int Surface::dispatchSetBuffersCta8613Metadata(va_list args) { return setBuffersCta8613Metadata(metadata); } int Surface::dispatchSetBuffersHdr10PlusMetadata(va_list args) { const size_t size = va_arg(args, size_t); const uint8_t* metadata = va_arg(args, const uint8_t*); return setBuffersHdr10PlusMetadata(size, metadata); } int Surface::dispatchSetSurfaceDamage(va_list args) { android_native_rect_t* rects = va_arg(args, android_native_rect_t*); size_t numRects = va_arg(args, size_t); Loading Loading @@ -1568,6 +1577,19 @@ int Surface::setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata return NO_ERROR; } int Surface::setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata) { ALOGV("Surface::setBuffersBlobMetadata"); Mutex::Autolock lock(mMutex); if (size > 0) { mHdrMetadata.hdr10plus.assign(metadata, metadata + size); mHdrMetadata.validTypes |= HdrMetadata::HDR10PLUS; } else { mHdrMetadata.validTypes &= ~HdrMetadata::HDR10PLUS; mHdrMetadata.hdr10plus.clear(); } return NO_ERROR; } Dataspace Surface::getBuffersDataSpace() { ALOGV("Surface::getBuffersDataSpace"); Mutex::Autolock lock(mMutex); Loading
libs/gui/include/gui/HdrMetadata.h +5 −1 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #pragma once #include <stdint.h> #include <vector> #include <system/graphics.h> #include <utils/Flattenable.h> Loading @@ -27,11 +28,14 @@ struct HdrMetadata : public LightFlattenable<HdrMetadata> { enum Type : uint32_t { SMPTE2086 = 1 << 0, CTA861_3 = 1 << 1, HDR10PLUS = 1 << 2, }; uint32_t validTypes{0}; android_smpte2086_metadata smpte2086{}; android_cta861_3_metadata cta8613{}; std::vector<uint8_t> hdr10plus{}; // LightFlattenable bool isFixedSize() const { return false; } Loading
libs/gui/include/gui/Surface.h +2 −0 Original line number Diff line number Diff line Loading @@ -218,6 +218,7 @@ private: int dispatchSetBuffersDataSpace(va_list args); int dispatchSetBuffersSmpte2086Metadata(va_list args); int dispatchSetBuffersCta8613Metadata(va_list args); int dispatchSetBuffersHdr10PlusMetadata(va_list args); int dispatchSetSurfaceDamage(va_list args); int dispatchSetSharedBufferMode(va_list args); int dispatchSetAutoRefresh(va_list args); Loading Loading @@ -249,6 +250,7 @@ protected: virtual int setBuffersDataSpace(ui::Dataspace dataSpace); virtual int setBuffersSmpte2086Metadata(const android_smpte2086_metadata* metadata); virtual int setBuffersCta8613Metadata(const android_cta861_3_metadata* metadata); virtual int setBuffersHdr10PlusMetadata(const size_t size, const uint8_t* metadata); virtual int setCrop(Rect const* rect); virtual int setUsage(uint64_t reqUsage); virtual void setSurfaceDamage(android_native_rect_t* rects, size_t numRects); Loading
libs/gui/tests/Surface_test.cpp +7 −0 Original line number Diff line number Diff line Loading @@ -366,10 +366,17 @@ TEST_F(SurfaceTest, SetHdrMetadata) { 78.0, 62.0, }; std::vector<uint8_t> hdr10plus; hdr10plus.push_back(0xff); int error = native_window_set_buffers_smpte2086_metadata(window.get(), &smpte2086); ASSERT_EQ(error, NO_ERROR); error = native_window_set_buffers_cta861_3_metadata(window.get(), &cta861_3); ASSERT_EQ(error, NO_ERROR); error = native_window_set_buffers_hdr10_plus_metadata(window.get(), hdr10plus.size(), hdr10plus.data()); ASSERT_EQ(error, NO_ERROR); } TEST_F(SurfaceTest, DynamicSetBufferCount) { Loading