it-swarm.com.de

Senden Sie stereoskopische Bilder über HDMI Frame Packing

Frame-Packing ist eine Methode zum Senden einer linken und einer rechten Ansicht (für stereoskopisches 3D), die vertikal über HDMI in einem Frame gestapelt sind. Wenn jede Ansicht die Größe width x height Hat, hat der resultierende "gepackte" Rahmen die Größe width x 49/24 height, D. H. Beide Ansichten mit einigen Leerzeilen dazwischen.

Für 1080p ergeben sich Frames der Größe 1920x2205. Bei den meisten FullHD-Geräten (aber nicht UHD oder ähnlichen Geräten) ist Frame-Packing die einzige Methode zum Senden einer FullHD-Ansicht für jedes Auge.

Die folgende Methode funktioniert zum Festlegen der Größe:

cvt cvt 1920 2205 24 #generate Modeline
xrandr --newmode "1920x2205_24.00"  .... #Modeline 
xrandr --addmode HDMI1 "1920x2205_24.00"
xrandr --output  HDMI1 --mode 1920x2205_24.00

Stereoskopische Modi müssen dem Fernseher/Projektor jedoch mit sogenannten Info-Frames angekündigt werden, die den 3D-Modus angeben. Während der Kernel das Senden dieser Info-Frames unterstützt, erlauben xrandr usw. nicht, die relevanten Informationen an drm weiterzuleiten.

Wie kann ich den Kernel veranlassen, die erforderlichen Info-Frames zu senden?

PS: Ich kann einen Tag "stereo3d" wegen fehlender Reputation nicht hinzufügen. Das Tag "3d" passt nicht.

3
frafl

Die folgende Lösung wird ohne Garantie geliefert. Beachten Sie, dass das Senden von HDMI-Signalen, die gegen den Standard verstoßen, für Ihren Fernseher/Projektor schlecht sein kann und dass der folgende winzige Hack Abstraktionsschichten aufteilt, die aus einem bestimmten Grund eingeführt wurden. Bitte fordern Sie keinen Kernel-Patch an (d. H. Melden Sie dort einen Fehler).

Eine Methode ist eine winzige Modifikation des DRM-Kernel-Moduls. Bitte lesen Sie zuerst Wie (Rezept), um nur ein Kernelmodul zu erstellen? .

Die zu ändernde Datei lautet: drivers/gpu/drm/drm_edid.c . Wir ändern diese Zeile zu:

    s3d_flags = (mode->flags & DRM_MODE_FLAG_3D_MASK) ||
            (mode->vdisplay == 2205);

und füge hier die folgenden Zeilen ein:

    if(mode->vdisplay == 2205)
            return HDMI_3D_STRUCTURE_FRAME_PACKING;

Sie sollten die meisten (wenn nicht alle) grafikkartenspezifischen Module aus drivers/gpu/drm/Makefile Entfernen, bevor Sie das DRM-Modul gemäß der eingangs genannten Frage kompilieren. Beachten Sie, dass Sie initramfs aktualisieren müssen, da das DRM-Modul beim Booten geladen wird.

Diese Lösung wurde mit einem Epson-Projektor und einer Intel-Grafikkarte (verwendet i915) getestet. Bevor Sie das DRM-Modul ändern, sollten Sie überprüfen, ob Ihr Grafikkartenkernel-Modul tatsächlich die relevanten Funktionen des DRM-Moduls verwendet. Ansonsten ist dieser Hack sinnlos.

2
frafl