commit | 0572615e397ded644361e7f9444e1157984eaa7f | [log] [tgz] |
---|---|---|
author | Simon Ser <contact@emersion.fr> | Sun Jan 05 17:32:24 2025 |
committer | Simon Ser <contact@emersion.fr> | Thu Jan 23 14:48:49 2025 |
tree | f8cce65f1166011116c0c1823fe64d30f6dd6c27 | |
parent | 211fa636a3c49da81bcedc115457a003f28f9a58 [diff] |
info: add di_info_get_device_tag() Display servers need to be able to identify a monitor regardless of which port it happens to be connected to. This new API offers the key to do that. Add new API to create a string as specified. New API is required because I want libdisplay-info to reserve the right to change what get_make(), get_model() and get_serial() may return (e.g. prefer DisplayID blob over EDID blob) without breaking configuration keys a user may have stored. When DisplayID becomes supported, the new function wants to maintain backward compatibility. For the above reasons, the implementation does not rely on calling get_make() etc. but depends only on the low-level API. Signed-off-by: Simon Ser <contact@emersion.fr> Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com> Co-authored-by: Pekka Paalanen <pekka.paalanen@collabora.com>
EDID and DisplayID library.
Goals:
Documentation is available on the website.
The public API headers are categorised as either high-level or low-level API as per the comments in the header files. Users of libdisplay-info should prefer high-level API over low-level API when possible.
If high-level API lacks needed features, please propose additions to the high-level API upstream before using low-level API to get what you need. If the additions are rejected, you are welcome to use the low-level API.
This policy is aimed to propagate best practises when interpreting EDID and DisplayID information which can often be cryptic or even inconsistent.
libdisplay-info uses semantic versioning. The public API is not yet stable.
Open issues and merge requests on the GitLab project. Discuss and ask questions in the #wayland IRC channel on OFTC.
In general, the Wayland contribution guidelines should be followed. In particular, each commit must carry a Signed-off-by tag to denote that the submitter adheres to the Developer Certificate of Origin 1.1. This project follows the freedesktop.org Contributor Covenant.
Both EDID and DisplayID are defined by VESA and the specifications are publicly available. There are multiple versions defined and they have multiple mechanisms for extending the base specification. Some of the extensions also have mechanisms for additional extensions. This sometimes makes it hard to find where a particular data structure is defined.
The raw data is usually read from the Display Data Channel (DDC) but other methods of delivery exist.
Available freely from VESA directly are the base EDID specifications, VESA specified EDID extensions, as well as the base DisplayID specifications. EDID also specifies how DisplayID can be embedded in EDID.
The most common extension to both EDID and DisplayID is CTA-861 which can be downloaded for free from CTA.
The CTA-861 specification allows for Vendor Specific Data Blocks (VSDB). Their specifications are often proprietary and have to be reverse engineered. Some specifications are available publicly.
The libdisplay-info structures of the low-level API always point to the relevant specification and section therein.
libdisplay-info has the following dependencies:
libdisplay-info is built using Meson:
meson setup build/ ninja -C build/
The low-level EDID library is tested against edid-decode. test/data/
contains a small collection of EDID blobs and diffs between upstream edid-decode
and our di-edid-decode
clone. Our CI ensures the diffs are up-to-date. A patch should never make the diffs grow larger. To re-generate the test data, build edid-decode
at the Git revision mentioned in .gitlab-ci.yml
, put the executable in PATH
, and run ninja -C build/ gen-test-data
.
The latest code coverage report is available on GitLab CI.
To fuzz libdisplay-info with AFL, the library needs to be instrumented:
CC=afl-gcc meson build/ ninja -C build/ afl-fuzz -i test/data/ -o afl/ build/di-edid-decode/di-edid-decode