Skip to content

Commit 3e96f94

Browse files
committed
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
1 parent 4c575a1 commit 3e96f94

3 files changed

Lines changed: 24 additions & 1 deletion

File tree

libs/ui/DisplayIdentification.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,15 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
212212
ALOGW_IF(manufactureOrModelYear <= 0xf,
213213
"Invalid EDID: model year or manufacture year cannot be in the range [0x0, 0xf].");
214214

215+
constexpr size_t kMaxHorizontalPhysicalSizeOffset = 21;
216+
constexpr size_t kMaxVerticalPhysicalSizeOffset = 22;
217+
if (edid.size() < kMaxVerticalPhysicalSizeOffset + sizeof(uint8_t)) {
218+
ALOGE("Invalid EDID: display's physical size is truncated.");
219+
return {};
220+
}
221+
ui::Size maxPhysicalSizeInCm(edid[kMaxHorizontalPhysicalSizeOffset],
222+
edid[kMaxVerticalPhysicalSizeOffset]);
223+
215224
constexpr size_t kDescriptorOffset = 54;
216225
if (edid.size() < kDescriptorOffset) {
217226
ALOGE("Invalid EDID: descriptors are missing.");
@@ -346,6 +355,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
346355
.displayName = displayName,
347356
.manufactureOrModelYear = manufactureOrModelYear,
348357
.manufactureWeek = manufactureWeek,
358+
.physicalSizeInCm = maxPhysicalSizeInCm,
349359
.cea861Block = cea861Block,
350360
.preferredDetailedTimingDescriptor = preferredDetailedTimingDescriptor,
351361
};

libs/ui/include/ui/DisplayIdentification.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ struct Edid {
7474
std::string_view displayName;
7575
uint8_t manufactureOrModelYear;
7676
uint8_t manufactureWeek;
77+
ui::Size physicalSizeInCm;
7778
std::optional<Cea861ExtensionBlock> cea861Block;
7879
std::optional<DetailedTimingDescriptor> preferredDetailedTimingDescriptor;
7980
};

libs/ui/tests/DisplayIdentification_test.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
193193
EXPECT_EQ(12610, edid->productId);
194194
EXPECT_EQ(21, edid->manufactureOrModelYear);
195195
EXPECT_EQ(0, edid->manufactureWeek);
196+
EXPECT_EQ(26, edid->physicalSizeInCm.width);
197+
EXPECT_EQ(16, edid->physicalSizeInCm.height);
196198
EXPECT_FALSE(edid->cea861Block);
197199
EXPECT_EQ(1280, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);
198200
EXPECT_EQ(800, edid->preferredDetailedTimingDescriptor->pixelSizeCount.height);
@@ -209,6 +211,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
209211
EXPECT_EQ(10348, edid->productId);
210212
EXPECT_EQ(22, edid->manufactureOrModelYear);
211213
EXPECT_EQ(2, edid->manufactureWeek);
214+
EXPECT_EQ(64, edid->physicalSizeInCm.width);
215+
EXPECT_EQ(40, edid->physicalSizeInCm.height);
212216
EXPECT_FALSE(edid->cea861Block);
213217
EXPECT_EQ(1280, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);
214218
EXPECT_EQ(800, edid->preferredDetailedTimingDescriptor->pixelSizeCount.height);
@@ -225,6 +229,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
225229
EXPECT_EQ(2302, edid->productId);
226230
EXPECT_EQ(21, edid->manufactureOrModelYear);
227231
EXPECT_EQ(41, edid->manufactureWeek);
232+
EXPECT_EQ(16, edid->physicalSizeInCm.width);
233+
EXPECT_EQ(9, edid->physicalSizeInCm.height);
228234
ASSERT_TRUE(edid->cea861Block);
229235
ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
230236
auto physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -247,6 +253,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
247253
EXPECT_EQ(41622, edid->productId);
248254
EXPECT_EQ(29, edid->manufactureOrModelYear);
249255
EXPECT_EQ(0, edid->manufactureWeek);
256+
EXPECT_EQ(128, edid->physicalSizeInCm.width);
257+
EXPECT_EQ(72, edid->physicalSizeInCm.height);
250258
ASSERT_TRUE(edid->cea861Block);
251259
ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
252260
physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -269,6 +277,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
269277
EXPECT_EQ(0, edid->productId);
270278
EXPECT_EQ(29, edid->manufactureOrModelYear);
271279
EXPECT_EQ(18, edid->manufactureWeek);
280+
EXPECT_EQ(0, edid->physicalSizeInCm.width);
281+
EXPECT_EQ(0, edid->physicalSizeInCm.height);
272282
ASSERT_TRUE(edid->cea861Block);
273283
ASSERT_TRUE(edid->cea861Block->hdmiVendorDataBlock);
274284
physicalAddress = edid->cea861Block->hdmiVendorDataBlock->physicalAddress;
@@ -291,6 +301,8 @@ TEST(DisplayIdentificationTest, parseEdid) {
291301
EXPECT_EQ(9373, edid->productId);
292302
EXPECT_EQ(23, edid->manufactureOrModelYear);
293303
EXPECT_EQ(0xff, edid->manufactureWeek);
304+
EXPECT_EQ(52, edid->physicalSizeInCm.width);
305+
EXPECT_EQ(29, edid->physicalSizeInCm.height);
294306
ASSERT_TRUE(edid->cea861Block);
295307
EXPECT_FALSE(edid->cea861Block->hdmiVendorDataBlock);
296308
EXPECT_EQ(1360, edid->preferredDetailedTimingDescriptor->pixelSizeCount.width);
@@ -447,4 +459,4 @@ TEST(DisplayIdentificationTest, getVirtualDisplayId) {
447459
} // namespace android
448460

449461
// TODO(b/129481165): remove the #pragma below and fix conversion issues
450-
#pragma clang diagnostic pop // ignored "-Wextra"
462+
#pragma clang diagnostic pop // ignored "-Wextra"

0 commit comments

Comments
 (0)