Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3e96f94d authored by Gil Dekel's avatar Gil Dekel
Browse files

SF: Parse Physical display size in framework

More EDID fields are required as a part of migrating to EDID-based
display IDs. This CL parses the physical display size in CM from bytes
21-22 of block 0 in the EDID blob and serves it as a part of the Edid
struct.

Later, amongst others, this value will be used to fabricate a unique
display ID that is based on the display's EDID.

See:
1. EDID spec: https://glenwing.github.io/docs/VESA-EEDID-A2.pdf
2. https://en.wikipedia.org/wiki/Extended_Display_Identification_Data#Structure,_version_1.4

Flag: com.android.graphics.surfaceflinger.flags.stable_edid_ids
Bug: 378922658
Test: DisplayIdentification_test
Change-Id: I0bb27f267421941aa56f6147082a05ea3b13f33f
parent 4c575a10
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -212,6 +212,15 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
    ALOGW_IF(manufactureOrModelYear <= 0xf,
             "Invalid EDID: model year or manufacture year cannot be in the range [0x0, 0xf].");

    constexpr size_t kMaxHorizontalPhysicalSizeOffset = 21;
    constexpr size_t kMaxVerticalPhysicalSizeOffset = 22;
    if (edid.size() < kMaxVerticalPhysicalSizeOffset + sizeof(uint8_t)) {
        ALOGE("Invalid EDID: display's physical size is truncated.");
        return {};
    }
    ui::Size maxPhysicalSizeInCm(edid[kMaxHorizontalPhysicalSizeOffset],
                                 edid[kMaxVerticalPhysicalSizeOffset]);

    constexpr size_t kDescriptorOffset = 54;
    if (edid.size() < kDescriptorOffset) {
        ALOGE("Invalid EDID: descriptors are missing.");
@@ -346,6 +355,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
            .displayName = displayName,
            .manufactureOrModelYear = manufactureOrModelYear,
            .manufactureWeek = manufactureWeek,
            .physicalSizeInCm = maxPhysicalSizeInCm,
            .cea861Block = cea861Block,
            .preferredDetailedTimingDescriptor = preferredDetailedTimingDescriptor,
    };
+1 −0
Original line number Diff line number Diff line
@@ -74,6 +74,7 @@ struct Edid {
    std::string_view displayName;
    uint8_t manufactureOrModelYear;
    uint8_t manufactureWeek;
    ui::Size physicalSizeInCm;
    std::optional<Cea861ExtensionBlock> cea861Block;
    std::optional<DetailedTimingDescriptor> preferredDetailedTimingDescriptor;
};
+13 −1
Original line number Diff line number Diff line
@@ -193,6 +193,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(12610, edid->productId);
    EXPECT_EQ(21, edid->manufactureOrModelYear);
    EXPECT_EQ(0, edid->manufactureWeek);
    EXPECT_EQ(26, edid->physicalSizeInCm.width);
    EXPECT_EQ(16, edid->physicalSizeInCm.height);
    EXPECT_FALSE(edid->cea861Block);
    EXPECT_EQ(1280, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);
    EXPECT_EQ(800, edid->preferredDetailedTimingDescriptor->pixelSizeCount.height);
@@ -209,6 +211,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(10348, edid->productId);
    EXPECT_EQ(22, edid->manufactureOrModelYear);
    EXPECT_EQ(2, edid->manufactureWeek);
    EXPECT_EQ(64, edid->physicalSizeInCm.width);
    EXPECT_EQ(40, edid->physicalSizeInCm.height);
    EXPECT_FALSE(edid->cea861Block);
    EXPECT_EQ(1280, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);
    EXPECT_EQ(800, edid->preferredDetailedTimingDescriptor->pixelSizeCount.height);
@@ -225,6 +229,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(2302, edid->productId);
    EXPECT_EQ(21, edid->manufactureOrModelYear);
    EXPECT_EQ(41, edid->manufactureWeek);
    EXPECT_EQ(16, edid->physicalSizeInCm.width);
    EXPECT_EQ(9, edid->physicalSizeInCm.height);
    ASSERT_TRUE(edid->cea861Block);
    ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
    auto physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -247,6 +253,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(41622, edid->productId);
    EXPECT_EQ(29, edid->manufactureOrModelYear);
    EXPECT_EQ(0, edid->manufactureWeek);
    EXPECT_EQ(128, edid->physicalSizeInCm.width);
    EXPECT_EQ(72, edid->physicalSizeInCm.height);
    ASSERT_TRUE(edid->cea861Block);
    ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
    physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -269,6 +277,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(0, edid->productId);
    EXPECT_EQ(29, edid->manufactureOrModelYear);
    EXPECT_EQ(18, edid->manufactureWeek);
    EXPECT_EQ(0, edid->physicalSizeInCm.width);
    EXPECT_EQ(0, edid->physicalSizeInCm.height);
    ASSERT_TRUE(edid->cea861Block);
    ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
    physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -291,6 +301,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
    EXPECT_EQ(9373, edid->productId);
    EXPECT_EQ(23, edid->manufactureOrModelYear);
    EXPECT_EQ(0xff, edid->manufactureWeek);
    EXPECT_EQ(52, edid->physicalSizeInCm.width);
    EXPECT_EQ(29, edid->physicalSizeInCm.height);
    ASSERT_TRUE(edid->cea861Block);
    EXPECT_FALSE(edid->cea861Block->hdmiVendorDataBlock);
    EXPECT_EQ(1360, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);