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

Commit 1d7fd15d authored by Gil Dekel's avatar Gil Dekel
Browse files

DisplayIdentification: Video input type

Parse and serve the display's video input type DeviceProductInfo in SF.
The display input type is a required bit.

Flag: com.android.graphics.surfaceflinger.flags.parse_edid_version_and_input_type
Bug: 420767380
Bug: 426524259
Test: DisplayIdentificationTest#deviceProductInfoWithEdidStructureMetadataAndVideoInputType
Change-Id: I954afae5d7d302fece05783a4437288bcfc44bb9
parent 652f5c10
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -49,6 +49,12 @@ parcelable DeviceProductInfo {
        int revision;
    }

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

    // Display name.
    @utf8InCpp String name;

@@ -63,5 +69,9 @@ parcelable DeviceProductInfo {
    // 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;
}
+8 −0
Original line number Diff line number Diff line
@@ -49,6 +49,11 @@ struct DeviceProductInfo {
        uint8_t revision;
    };

    enum InputType {
        ANALOG,
        DIGITAL,
    };

    // Display name.
    std::string name;

@@ -65,6 +70,9 @@ struct DeviceProductInfo {
    // 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.
+12 −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 {
@@ -81,6 +82,8 @@ 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;
@@ -238,6 +241,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {

    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)) {
@@ -246,6 +250,13 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
        }
        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;
@@ -404,6 +415,7 @@ std::optional<Edid> parseEdid(const DisplayIdentificationData& edid) {
            .manufactureWeek = manufactureWeek,
            .edidStructureVersion = edidStructureVersion,
            .edidStructureRevision = edidStructureRevision,
            .isDigital = isDigital,
            .physicalSizeInCm = maxPhysicalSizeInCm,
            .cea861Block = cea861Block,
            .preferredDetailedTimingDescriptor = preferredDetailedTimingDescriptor,
+1 −0
Original line number Diff line number Diff line
@@ -89,6 +89,7 @@ struct Edid {
    uint8_t manufactureWeek;
    uint8_t edidStructureVersion;
    uint8_t edidStructureRevision;
    bool isDigital;
    ui::Size physicalSizeInCm;
    std::optional<Cea861ExtensionBlock> cea861Block;
    std::optional<DetailedTimingDescriptor> preferredDetailedTimingDescriptor;
+7 −3
Original line number Diff line number Diff line
@@ -18,8 +18,6 @@
#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>
@@ -96,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"
@@ -571,6 +569,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        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 =
@@ -581,6 +580,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        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 =
@@ -591,6 +591,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        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 =
@@ -601,6 +602,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        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 =
@@ -611,6 +613,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        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 =
@@ -621,6 +624,7 @@ TEST(DisplayIdentificationTest, deviceProductInfoWithEdidStructureMetadataAndVid
        const auto& info = *displayIdInfo->deviceProductInfo;
        EXPECT_EQ(1, info.edidStructureMetadata.version);
        EXPECT_EQ(4, info.edidStructureMetadata.revision);
        EXPECT_EQ(DeviceProductInfo::InputType::DIGITAL, info.inputType);
    }
}