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

Commit f0ef43a9 authored by Gil Dekel's avatar Gil Dekel Committed by Android (Google) Code Review
Browse files

Merge changes I954afae5,Icb2ce797 into main

* changes:
  DisplayIdentification: Video input type
  DisplayIdentification: Parse EDID structure version
parents a178091e 1d7fd15d
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -43,6 +43,18 @@ parcelable DeviceProductInfo {
        ManufactureWeekAndYear manufactureWeekAndYear;
    }

    parcelable EdidStructureMetadata {
        // The EDID structure version number and revision number fields (required).
        int version;
        int revision;
    }

    @Backing(type="byte")
    enum InputType {
        ANALOG,
        DIGITAL
    }

    // Display name.
    @utf8InCpp String name;

@@ -54,5 +66,12 @@ parcelable DeviceProductInfo {

    ManufactureOrModelDate manufactureOrModelDate;

    // General EDID structure metadata.
    EdidStructureMetadata edidStructureMetadata;

    // The input type of the device (analog or digital; required).
    InputType inputType;

    // Relative address in the display network.
    byte[] relativeAddress;
}
+17 −1
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@

#include <array>
#include <cstdint>
#include <optional>
#include <string>
#include <type_traits>
#include <variant>
@@ -44,6 +43,17 @@ struct DeviceProductInfo {
        uint8_t week;
    };

    struct EdidStructureMetadata {
        // The EDID structure version number and revision number fields (required).
        uint8_t version;
        uint8_t revision;
    };

    enum InputType {
        ANALOG,
        DIGITAL,
    };

    // Display name.
    std::string name;

@@ -57,6 +67,12 @@ struct DeviceProductInfo {
    static_assert(std::is_trivially_copyable_v<ManufactureOrModelDate>);
    ManufactureOrModelDate manufactureOrModelDate;

    // General EDID structure metadata.
    EdidStructureMetadata edidStructureMetadata;

    // The input type of the device (analog or digital; required).
    InputType inputType;

    // Relative address in the display network. Empty vector indicates that the
    // address is unavailable.
    // For example, for HDMI connected device this will be the physical address.
+28 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@
#include <ftl/concat.h>
#include <ftl/hash.h>
#include <log/log.h>
#include <ui/DeviceProductInfo.h>
#include <ui/Size.h>

namespace android::display {
@@ -79,6 +80,10 @@ char getPnpLetter(uint16_t id) {

DeviceProductInfo buildDeviceProductInfo(const Edid& edid) {
    DeviceProductInfo info;
    info.edidStructureMetadata = {.version = edid.edidStructureVersion,
                                  .revision = edid.edidStructureRevision};
    info.inputType = edid.isDigital ? DeviceProductInfo::InputType::DIGITAL
                                    : DeviceProductInfo::InputType::ANALOG;
    info.name.assign(edid.displayName);
    info.productId = std::to_string(edid.productId);
    info.manufacturerPnpId = edid.pnpId;
@@ -234,6 +239,26 @@ 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].");

    uint8_t edidStructureVersion = 0;
    uint8_t edidStructureRevision = 0;
    bool isDigital = false;
    if (FlagManager::getInstance().parse_edid_version_and_input_type()) {
        constexpr uint8_t kEdidStructureVersionOffset = 18;
        if (edid.size() < kEdidStructureVersionOffset + sizeof(uint16_t)) {
            ALOGE("Invalid EDID: EDID structure version is truncated.");
            return {};
        }
        edidStructureVersion = edid[kEdidStructureVersionOffset];
        edidStructureRevision = edid[kEdidStructureVersionOffset + 1];

        constexpr uint8_t kVideoInputDefinitionOffset = 20;
        if (edid.size() < kVideoInputDefinitionOffset + sizeof(uint8_t)) {
            ALOGE("Invalid EDID: EDID video input definition byte is truncated.");
            return {};
        }
        isDigital = edid[kVideoInputDefinitionOffset] >> 7;
    }

    constexpr size_t kMaxHorizontalPhysicalSizeOffset = 21;
    constexpr size_t kMaxVerticalPhysicalSizeOffset = 22;
    if (edid.size() < kMaxVerticalPhysicalSizeOffset + sizeof(uint8_t)) {
@@ -388,6 +413,9 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
            .displayName = displayName,
            .manufactureOrModelYear = manufactureOrModelYear,
            .manufactureWeek = manufactureWeek,
            .edidStructureVersion = edidStructureVersion,
            .edidStructureRevision = edidStructureRevision,
            .isDigital = isDigital,
            .physicalSizeInCm = maxPhysicalSizeInCm,
            .cea861Block = cea861Block,
            .preferredDetailedTimingDescriptor = preferredDetailedTimingDescriptor,
+3 −0
Original line number Diff line number Diff line
@@ -87,6 +87,9 @@ struct Edid {
    std::string_view displayName;
    uint8_t manufactureOrModelYear;
    uint8_t manufactureWeek;
    uint8_t edidStructureVersion;
    uint8_t edidStructureRevision;
    bool isDigital;
    ui::Size physicalSizeInCm;
    std::optional<Cea861ExtensionBlock> cea861Block;
    std::optional<DetailedTimingDescriptor> preferredDetailedTimingDescriptor;
+78 −3
Original line number Diff line number Diff line
@@ -18,14 +18,14 @@
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wextra"

#include <string_view>

#include <common/test/FlagUtils.h>
#include <ftl/hash.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <ui/ScreenPartStatus.h>

#include "Display/DisplayIdentification.h"
#include "com_android_graphics_surfaceflinger_flags.h"

using ::testing::ElementsAre;

@@ -94,7 +94,7 @@ const unsigned char kPanasonicTvEdid[] =

const unsigned char kHisenseTvEdid[] =
        "\x00\xff\xff\xff\xff\xff\xff\x00\x20\xa3\x00\x00\x00\x00\x00"
        "\x00\x12\x1d\x01\x03\x80\x00\x00\x78\x0a\xd7\xa5\xa2\x59\x4a"
        "\x00\x12\x1d\x01\x03\x00\x00\x00\x78\x0a\xd7\xa5\xa2\x59\x4a"
        "\x96\x24\x14\x50\x54\xa3\x08\x00\xd1\xc0\xb3\x00\x81\x00\x81"
        "\x80\x81\x40\x81\xc0\x01\x01\x01\x01\x02\x3a\x80\x18\x71\x38"
        "\x2d\x40\x58\x2c\x45\x00\x3f\x43\x21\x00\x00\x1a\x02\x3a\x80"
@@ -553,6 +553,81 @@ TEST(DisplayIdentificationTest, deviceProductInfo) {
    }
}

// This test can be folded into DisplayIdentificationTest#deviceProductInfo once
// the flag is removed.
TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVideoInputType) {
    SET_FLAG_FOR_TEST(com::android::graphics::surfaceflinger::flags::
                              parse_edid_version_and_input_type,
                      true);

    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getInternalEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(3, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getExternalEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(4, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getExternalEedid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(3, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getPanasonicTvEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(3, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getHisenseTvEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(3, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::ANALOG, info.inputType);
    }
    {
        const auto displayIdInfo =
                parseDisplayIdentificationData(0, getCtlDisplayEdid(),
                                               android::ScreenPartStatus::UNSUPPORTED);
        ASSERT_TRUE(displayIdInfo);
        ASSERT_TRUE(displayIdInfo->deviceProductInfo);
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(4, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
}

} // namespace android::display

// TODO(b/129481165): remove the #pragma below and fix conversion issues