Achtung:
Dieser Thread beinhaltet eine Fragestellung zu einem Projekt bei meinem Arbeitgeber. Es soll sich bitte jeder seine Meinung bilden, ob er hierfür seine Freizeit "opfern" und sich damit befassen will. Allerdings glaube ich, dass die Thematik auch für die Forengemeinde interessant sein könnte. Am Ende will ich meine Erkenntnisse hier vorstellen. Dabei werde ich aber gewisse Firmeninterna zurückhalten müssen.
Ich habe in der Firma eine Schaltung/Leiterplatte entwickelt, mit der die in vielen neumodernen KFZ (z.B. VW) in der Mittelkonsole verbauten Displays als Bildschirm für eine DVI-Videoquelle (Windows-PC, RPi etc.) verwendet werden können. Normalerweise ist im KFZ ein vierpoliges HF-Kabel vom Autoradio ("Head Unit", HU) zum Display verlegt. Meine Schaltung wandelt die DVI-/HDMI-Videosignale in dieses HF-Format um. Außerdem kann meine Schaltung zwischen den Videoquellen HU und DVI umschalten.
DVI und HDMI sind sich technisch/elektrisch gesehen sehr ähnlich bzw. beinahe gleich. Die HDMI-Norm ist eine Weiterentwicklung der DVI-Norm und implementiert z.B. zusätzlich den Kopierschutz HDCP. Der Hauptunterschied besteht in den verwendeten Steckern und Kabeln.
Eine mit DVI-Anschlüssen ausgeführte Hardware kann mittlerweile genauso gut eine vollständig HDMI-kompatible Umsetzung darstellen.
Prüfkonzept:
Zur Prüfung der Produkte aus der Fertigung wird das HF-Signal am Videoausgang meiner Schaltung über zwei Evalboards des Herstellers nach DVI zurückgewandelt. Dies geschieht verlustfrei, da in allen Stufen digitale Videosignale vorliegen. Bei Anschluss einer FullHD-Videoquelle an meine Schaltung und Weiterleitung über die beiden Evalboards an einen handelsüblichen FullHD-Monitor erhalte ich ein glasklares und unverfälschtes Bild der Videoquelle.
Zur Automatisierung des Prüfablaufs ist nun angedacht, über meine Schaltung ein definiertes (Stand-)Bild von einem RPi zu übertragen und das zurückgewandelte Bild über die Kamera-CSI-Schnittstelle des RPi mit raspistill o.ä. aufzunehmen, als verlustfreie PNG-Datei abzuspeichern und per Software einen pixelweisen 1:1-Bildvergleich mit dem PNG-Quellbild vorzunehmen (z.B. mit diffimg) . Damit sollen Fehler in der Übertragungskette erkannt werden. Da unterstellt wird, dass die Bildquelle (RPi) und die Evalboards funktionieren, liegt ein erkannter Bildunterschied/Fehler somit beim Prüfling, dem getesteten Exemplar meiner Schaltung aus der Fertigung.
Problem:
Die Bildaufnahme kann natürlich nicht über die "echten" PiCamera-Module erfolgen. Vielmehr gibt es vom Hersteller Lintest Systems (Achtung: langsame Seite!) das Modul PiCapture-HD1. Dabei handelt es sich um ein HAT-konformes Modul, das eine "Kamera mit einem HDMI-Anschluss anstelle einer Linse" darstellt. Es ist so aufgebaut, dass es für den RPi aussieht, als sei ein originales PiCamera-Modul angeschlossen: Die am HDMI-Eingang angeschlossenen Videosignale können auf dem RPi mit den einschlägigen Befehlen raspistill, raspivid etc. aufgenommen werden.
Nur leider entspricht das aufgenommene Bild nicht 1:1 den Videosignalen am HDMI-Eingang des Moduls. Die Bildaufnahme über die CSI-Schnittstelle auf dem RPi-SoC findet über die GPU statt. Dabei scheint die GPU automatisch Optimierungsmaßnahmen vorzunehmen, die für die ARM-CPU relativ rechenintensiv wären. Für "echte" Linsenkameras ist dies wohl vorteilhaft, aber am Lintest-PiCapture-Modul führt dies offenbar dazu, dass die DVI-Daten nicht 1:1 aufgenommen werden:
* Es entsteht eine gewisse Unschärfe
* Helligkeit und Farbton sind nicht originalgetreu
* Helligkeit und Farbton des Bildes ändern sich bei Bewegung!
* Flimmern der empfangenen HDMI-Daten in der Vorschau: Führt bei Bildvergleich zweier an sich identischer Einzelbilder zu Pixelfehlern!
Nun gibt es für raspistill etc. eine Menge Kommandozeilenparameter, die ich auch alle(?) durchprobiert habe, aber an obigen Problemen ändert sich nichts. Immerhin habe ich es geschafft, mit den Parametern -awb off -awbg 1.0,1.0 einen einigermaßen originalen Farbton hinzubekommen, vorher hatte ein graues Bild einen leichten Magentastich.
Im Dateianhang habe ich mal ein 10s langes Video beigefügt, in dem man sehen kann, wie sich die Sache auswirkt:
Das Video wurde auf dem RPi mit folgendem Kommando aufgenommen.
Was sieht man hier?
Am HDMI-Eingang des PiCapture-Moduls wurde der zweite DVI-Ausgang meines Firmen-PCs (Windows 10) angeschlossen. Auflösung: 1920x1080@60Hz (FullHD). Dies ist der erweiterte Desktop meines PCs mit einem monochromen Desktophintergrund (Reines Grau 50% Helligkeit).
Vom ersten Desktop wird das cmd.exe-Fenster mit dem ssh-Zugriff auf den RPi mit der Maus in den Bereich des zweiten Desktops (PiCapture-Modul) geschoben. Dabei sieht man die bei Bewegung auftretenden Helligkeitsunterschiede. Gegen Ende zeigt sich auch eine leicht rötliche Verfärbung. Ferner ist die Schrift im cmd-Fenster schlecht zu lesen.
Das aufgenommene Video entspricht genau dem Verhalten in der Vorschau von raspistill.
Unter Windows10 kann es mit dem VLC-Player abgespielt werden, wenn man im VLC die Datei über den Menüpunkt Medien-->Datei öffnen lädt und abspielt. EDIT: Vorher die heruntergeladene Videodatei bitte in rpivid.h264 umbenennen!
Fragen:
* Kann man die GPU so einstellen, dass sie bei Aufnahmen mit raspistill etc. keine Optimierung vornimmt?
* Gibt es eine andere Möglichkeit, auf dem RPi eine DVI-Quelle aufzunehmen?
Dateianhänge:
Einstellungen des zweiten Windows10-Desktops auf dem PiCapture-Modul
Da die Forensoftware nur bestimmte Dateierweiterungen akzeptiert, musste ich die Videodatei in rpivid.h264.txt umbenennen. EDIT: Um sie im vlc-Player abspielen zu können, muss sie vor dem Laden wieder in rpivid.h264 umbenannt werden.
PS:
Ich verwende einen RPi 3B (ohne Plus), da der RPi4 von PiCapture angeblich nicht unterstützt wird. Aber auch mit einem RPi4 das gleiche Problem. Andere RPis habe ich (noch) nicht getestet.