add on / plugin
AVARDS
(Automatic Video Aspect Ratio Detection and Signaling)
habichthugo@freemail.de 2007-06-10
5.1.3 Was machen wir nu damit?
Wer sich beim Fernsehen des Öfteren über ein verzerrtes Bild (Breitmaulfroschgesichter), offensichtlich unnötige ‚schwarze Balken’ rund um oder ähnliches ärgert, die er mit händischer Formatumschaltung oder dergleichen bekämpfen oder sich damit abfinden muss, den dürfte dieses Thema interessieren. Ist ein VDR die Bildquelle und sind noch ein paar weitere Kleinigkeiten gegeben, kann man hiermit etwas dagegen tun. Auch wen bisher eigentlich nichts störte, der wird unter Umständen etwas Schärfe gewinnen können.
Der Ursprung und die Diskussion dieser Thematik findet sich hier.
Wen das im Detail interessiert, der beginne z.B. hiermit, sich in die Fernsehübertragungstechnik einzulesen.
Die Fernsehübertragungstechnik (PAL) war ursprünglich nur für Bilder mit einem Seitenverhältnis, neudeutsch ‚aspect ratio’, von 4:3 (Breite:Höhe) ausgelegt und im Grunde hat sich daran bis heute nichts geändert.
Will man damit ‚breitere’ Bilder, also z.B. mit einem Seitenverhältnis von 16:9 oder für Kinofilme typische 2.21:1, verzerrungsfrei und vollständig darstellen, so bleibt im ersten Ansatz nur, das Bild aufzufüllen (oben und unten mit schwarzen Bereichen). Das Ganze nennt sich dann neudeutsch ‚Letterbox’ (wie ein Blick durch einen Briefkastenschlitz) und die hinzugefügten Bereiche ‚PAN’.
Das hat den Vorteil, dass das auch uralte (4:3-) Fernseher richtig darstellen. Ein großer Teil des Bildes enthält so jedoch keine Informationen (ist schwarz). Wird so ein Bild auf einem modernen (16:9-) Gerät wiedergegeben, wird also schlicht Detailtreue (Schärfe) verschenkt. Nun kann man das ‚breitere’ Bild zur Übertragung aber auch horizontal stauchen und es das Wiedergabegerät wieder auseinander ziehen lassen, um dies zu vermeiden. So was nennt man dann neudeutsch ‚anamorph’.
Aus so zugespielten Bildern allein kann ein Wiedergabegerät nicht eindeutig erkennen, wie sie korrekt darzustellen sind. Dazu bedarf es zusätzlicher Informationen, dem s.g. WSS (Wide Screen Signaling). Und genau daran hapert es. Auf digitalem Wege (DVB) wird praktisch nur die Grundinformation, ob es sich um 4:3 oder anamorphe (16:9, 2.21:1) Bilder handelt, übertragen, um welche (4:3-) Letterbox es sich ggf. handelt nicht. Damit macht dann z.B. ein 16:9-Gerät aus einem 16:9-Letterbox-Bild so was:
Leider werden die meisten Sendungen mit Breitbild in Letterboxen übertragen. Anamorph übertragen in unseren Breiten praktisch nur die öffentlich rechtlichen Sendeanstalten und auch die praktisch nur 16:9. Bei Kinofilmen (2.21:1) kommt scheinbar immer die (4:3-) Letterbox zum Einsatz.
Dazu hapert es bei analogen Gerätschaften offenbar an der Unterstützung von WSS. Mit der bisherigen Firmware übertrugen die s.g. Full-Featured-DVB-Karten (FF) das WSS nur für (anamorphes) 16:9-Bildmaterial, bei 4:3 fehlte es. Sofern analoge Wiedergabegeräte WSS überhaupt unterstützen, reagiert offenbar jedes anders auf das fehlende WSS. Einige gehen dann einfach von 4:3 aus und schalten entsprechend um, andere verharren einfach im zuletzt bekannten Format (16:9) und produzieren dann so was:
Im ersten Schritt mussten die Full-Featured-DVB-Karten mittels einer Firmwareänderung dazu ertüchtigt werden, WSS auch bei 4:3-Bildmaterial zu übertragen. Sobald dies klar war hat das Oliver Endris sofort in die Praxis umgesetzt. Dazu musste ein Stück Software her, das die fehlende Information, welches Letterbox-Format ggf. vorliegt, aus dem Bildmaterial ermittelt, deren Erstellung ich mich verschrieben habe. Und schließlich muss diese Information zu den Full-Featured-DVB-Karten, damit diese sie weiter geben können. Um die dafür notwendigen Änderungen an den DVB-Treibern hat sich ebenfalls Oliver gekümmert. An dieser Stelle ein großes Dankeschön an Oliver Endriss (o.endriss@gmx.de), für seine Arbeit.
Die Erkennung des Letterbox-Formats scheint grundsätzlich gar nicht so schwierig. Im ersten Ansatz braucht man ja nur die Breite der schwarzen Bereiche oben und unten im Bild zu ermitteln. Das klappt so zwar schon ganz gut, allerdings gibt es doch eine Menge Situationen, wo das alleine versagt, beispielsweise, wenn in diesen Bereichen ein Senderlogo platziert ist. Auch so etwas ist noch recht einfach beherrschbar, jedoch gibt es noch viel Kniffligeres. Man denke z.B. an einen Filmvor- oder -abspann, wo, auf schwarzem Hintergrund, nur etwas Text in der Bildmitte erscheint. Bei händischer Umschaltung braucht man meist selbst eine Weile, bis man das richtige Format gefunden hat. Einem Stück Software geht das nicht anders. Die automatische Formatumschaltung kann also schon theoretisch (wenn das Bild zu unspezifisch ist) nie hundertprozentig funktionieren. Den mittlerweile erreichten Stand betrachte ich jedoch schon als gut alltagstauglich.
Neben einem VDR mit Full-Featured-DVB-Karte als Bildquelle muss das Wiedergabegerät (Fernseher, Beamer etc.) WSS unterstützen. Die WSS-Übertragung funktioniert sowohl über den standardmäßigen Clinch-Ausgang (Composite), als auch über JP2-Lösungen (Chinch, Hosiden, SCART bzw. Composite, S-Video, RGB).
Die 'nackte' 4:3/16:9-Umschaltung sollte bereits nach einem Update der Firmware funktionieren. Sofern /usr/lib/hotplug/firmware/dvb-ttpci-01.fw vorhanden ist, muss diese durch eine Variante ab Version '2623' (yyyy) ersetzt bzw. darauf verlinkt werden. Die gibt's (noch) nicht unter http://www.linuxtv.org/downloads/firmware sonder in einem der Threads 'Neue Testversion <xxyyyy> für AV7110 firmware'. Die dortige test_av-<xxyyyy>.tar.bz2 entpackt man (tar -xjvf ...) und findet dann im Verzeichnis test_av die benötigte dvb-ttpci-01.fw (die man tunlichst gleich in dvb-ttpci-01.fw-<xxyyyy> umbenennen sollte). Das 'xx' ist übrigens eine zweistellige Hexadezimalziffer, die, bei ff beginnend, rückwärts gezählt wird! f32623 ist folglich aktueller als f42663! Ich verwende die f32623 (bereits ausgepackt).
Für alles Weitere braucht man aktuelle Treiber, konkret v4l mit einem Stand ab Ende Januar 2006 (minimal Olivers WSS-Patch). Um einen aktuellen 2.6er Kernel oder höher kommt man nicht herum (da v4l nur dafür weiter entwickelt wird). Wer bereits einen 2.6.16er betreibt hat v4l mit dem notwendigen Stand schon dabei.
Für c't-VDRler: Die 5er-Distribution bringt einen passenden 2.6.16er-Kernel gleich mit. Für c't-vdr 4(.5) gibt es hier ein passendes Kernelpaket. Dieses trägt nicht umsonst den Namen 2.6.15‑ct‑1, denn es ist (bis auf Olivers WSS-Patch und die revision number 2) weitgehend identisch mit dem von c't angebotenen. D.h. man kann sich alle für den VDR typischen Module von hier ziehen. Man kann 'meinen Kernel' sogar im laufenden Betrieb über den ggf. schon installierten 2.6.15-ct-1 ziehen. Bei Neuinstallation beachtet bitte das, was auf der c't Seite zu diesem Kernel steht! Für 3.06er und früher kann ich keine einfache Lösung anbieten.
LinVDR 0.7er können drseltsam's Kernel-Paket verwenden.
Die Voraussetzungen sind geschaffen, wenn /dev/vbi0 (bzw. ein neues /dev/vbi<x>) auf eurem System erschienen ist.
besteht derzeit aus zwei Stand-Alone-Tülchens namens dvb-aspect und dvb-wss-overdrive oder einem Plugin für den VDR. dvb-aspect dient der Erkennung des Bildformats. dvb‑wss‑overdrive überträgt den WSS-Modus an die Full-Featured-DVB-Karte. Das Plugin vereinigt beides und hat natürlich darüber hinaus gehende Möglichkeiten.
Die Software gibt's hier zum downloaden, als Sourcen (avards-<version>.tar.gz bzw. das Plugin als vdr-avards-<version>.tgz) und für die Stand-Alone-Tülchens auch als Binary (avards-<version>_i386.tar.gz). Die Binaries sind so übersetzt, dass sie auf jedem (Sarge-) System laufen sollten. 'DarkAngle' hat speziell für LinVDR (0.7) optimierte Binary-Pakete (avards-<version>_linvdr.tgz) geschnürt.
dvb-wss-overdrive [<dev>] (Default ist /dev/vbi0) ließt von der Standardeingabe (Konsole), welches WSS die Full-Featured-DVB-Karte ausgeben soll (/dev/vbi<x> muss also zur Full-Featured-DVB-Karte gehören). WSS für (4:3-) Letterboxen lässt sich in den Stufen 14:9, 16:9 und >16:9 (2.21:1) signalisieren. Das kann in Hexadezimalcodierung (0..f) erfolgen, es werden aber auch (die von dvb-aspect ausgegebenen) Mnemoniks verstanden (16:9, 4:3, L14:9, L16:9, L>16:9). dvb-wss-overdrive liest zeilenweise, also z.B. 16:9<Enter>. Dazu werden noch 'free' und 'exit' verstanden. 'free' gibt das vbi-Device temporär frei, bis eine neue Eingabe erfolgt. Bei 'exit' beendet sich dvb-wss-overdrive (definiert).
Damit können wir jetzt schon mal trocken testen, was unser Endgerät überhaupt kann. Hier gibt's noch nen paar Testbilder dazu (underscan im Image-Plugin abstellen!).
Nicht vergessen im VDR-OSD 'Einstellungen/DVB/Video Format' auf '16:9' zu stellen!
# dvb-aspect --help Usage: dvb-aspect [<Options>] -v, --dev_video=<Device> Video device (default is /dev/video0) -d, --dev_dvb=<Device> DVB device (default is /dev/dvb/adapter0) -t, --pan_tone_tolerance Maximum difference of a pixel from the most gray tone pixels within =<Value> a pan vector (hex; grayscale; 0..ff; default is 08). This option and its value is ignored if -b or --black is given -b, --black=<Value> Enable pan vector detection by a given lowest value of a pixel, interpreted as black (hex; grayscale; 0..ff; choose 20 or so). Otherwise the gray tone of the pan vector is detected automaticly (may be white, green or whatever just as well). -s, --overscan=<Value> The width of a frame around the picture which is ignored during analyzing of the pan vectors (real number; percent; 0..100; default is 3) -l, --logo_width=<Value> Maximum width of a range with wrong pixels (a logo) within a pan vector (real number; percent; 0..100; default is 20) -p, --poll_rate=<Value> Poll rate (frequency of picture analyzing; real number; seconds; >0; (default is 0.08; lower values than 0.08 makes no sense at the moment) -e, --delay=<Value> Delay output until last <Value> analyzed pictures produces the same result (multiply with poll_rate to get delay time; decimal number; >= 0; default is 25) -a, --aspect Output aspect ratio in addition as number (e.g "133 4:3") -f Enable 'frontend has lock' test (no longer useful, because of black screen detection, but...) -o Enable L>16:9 output (normaly this makes no sense) -h, --help Displays this page (and exits) |
dvb-aspect ermittelt das grundsätzliche Bildformat (4:3, 16:9) über ein Device (dev/dvb/adapter<x>/video0) der Full-Featured-DVB-Karte (2.21:1 wird von der Full-Featured-DVB-Karte grundsätzlich nach 16:9 umgesetzt). 16:9 wird 1:1 ausgegeben, bei 4:3 erfolgt über ein zweites Device (dev/video<x>) der Full-Featured-DVB-Karte eine Analyse des Bildes, ob und wie breit ggf. die PAN-Bereiche sind. Das Ergebnis wird bei jeder Veränderung i.d.R. mnemonisch (16:9, 4:3, L14:9, L16:9, L>16:9), zeilenweise auf die Standardausgabe geschrieben. Die mit ‚L’ beginnenden Mnemoniks stehen für Letterbox (4:3, mit entsprechend breiten PAN-Bereichen).
Wenn das Darstellungsgerät alle WSS-Modi (alle von dvb-aspect ausgegebenen Mnemoniks) korrekt versteht, kann man dvb-aspect und dvb-wss-overdrive einfach zusammen pipen (dvb-aspect | dvb-wss-overdrive). Ansonsten kann man sich ein Filter (-Script) dazwischen pipen. Da dvb-aspect das Seitenverhältnis auch als Zahlenwert ausgeben kann, kann man sich die Zuordnung zum WSS z.B. über ein Script selbst gestalten.
Mit dem Folgenden kann man sich nun schon eine über das VDR-OSD steuerbare Lösung basteln:
dvb-aspect und dvb-wss-overdrive kommen nach /usr/bin (irgendwo in den Suchpfad, ansonsten Pfade beim Aufruf nicht vergessen).
/usr/sbin/runvdr (Kommandos direkt vor den Aufruf des vdr-Binaries)
... killall dvb-aspect 2>&- killall dvb-wss-overdrive 2>&- rm -f /dev/dvb-wss-overdrive mkfifo /dev/dvb-wss-overdrive dvb-wss-overdrive </dev/dvb-wss-overdrive >/var/log/dvb-wss-overdrive 2>&1 & dvb-aspect >/dev/dvb-wss-overdrive 2>&- &
eval $VDRCMD >/dev/null 2>"$VDR_ERR" ... |
/usr/share/vdr/command-hooks/commands.wss.conf (wird Teil der commands.conf)
WSS ... : echo "no function" -1 Standard : killall dvb-aspect 2>&-; echo "free" >/dev/dvb-wss-overdrive -2 Automatik : killall dvb-aspect 2>&-; echo "dvb-aspect >/dev/dvb-wss-overdrive" | at now -3 4/3 : killall dvb-aspect 2>&-; echo "4:3" >/dev/dvb-wss-overdrive -4 16/9 : killall dvb-aspect 2>&-; echo "16:9" >/dev/dvb-wss-overdrive -5 14/9 Letterbox : killall dvb-aspect 2>&-; echo "L14:9" >/dev/dvb-wss-overdrive -6 16/9 Letterbox : killall dvb-aspect 2>&-; echo "L16:9" >/dev/dvb-wss-overdrive |
Der Entwicklung des Plugins hat sich FireFly angenommen. Der erste Thread dazu findet sich hier.
Man braucht dazu die aktuellen Kernel-Header (videodev2.h)
unter /usr/include/linux. Wie die debiantechnisch sauber dorthin gelangen weiß
ich auch nicht. Man installiere sich z.B. die kernel-headers-2.6.15-ct-1_2_i386.deb (nach /usr/src) und
lege dann beispielsweise einen Link von /usr/include/linux nach
/usr/src/kernel-headers-2.6.15-ct-1/include/linux (die Header aus anderen
kernel-headers-/source-Paketen >= 2.6.15 sollten es auch tun). Alternativ
(z.B. für LinVDRler) habe hier die kernel-headers-2.6.15_include_linux.tar.gz liegen. Die kann
man sich einfach mit tar auspacken. Verlinkt wird /usr/include/linux dann auf
das ausgepackte Verzeichnis (/usr/src/) kernel-headers-2.6.15_include_linux.
Statt Verlinken oder Überkopieren geht z.B. auch 'mount --bind
/usr/src/kernel-headers-2.6.15_include_linux /usr/include/linux'. Das wirkt nur
temporär (bis zum nächsten reboot oder umount /usr/include/linux) und das
System bleibt so sauber. Man kann ja nie wissen, ob man die alten Header unter
/usr/include/linux noch mal braucht...
Die derzeitige Implementierung greift, um an das Bild zu gelangen, auf den Framebuffer der FF zu. Da dieser zeitgleich nur einer Anwendung (einem Prozess) zur Verfügung steht, funktionieren dadurch andere Anwendungen wie fbtv, die Bildanzeige im vdr-admin oder die Bildspeicher-Funktion (svdrp grab) nicht, bzw. umgekehrt.
Dazu wursteln die Stand‑Alone‑Tülchens komplett am VDR vorbei. dvb-aspect weiß z.B. nicht, wann das OSD eingeblendet ist. Ein 'offenes' OSD (z.B. beim zappen) verwirrt natürlich die Letterbox-Erkennung sofern sich - und das ist i.d.R. der Fall - OSD-Anteile in den PAN-Bereichen befinden. Dazu müsste die Größe und Position des OSD abhängig vom erkannten Format des 'nakten' Bildes mit umgeschaltet werden. Bei 16:9-Letterbox werden sonst Teile des (auf volle 4:3-Größe eingestellten) OSD 'weggezoomt' bzw. führen halt derzeit noch dazu, dass auf 'normales' 4:3 zurückgeschaltet wird. Als Abhilfe kann man zur Zeit nur sein OSD kastrieren (oben und unten entsprechend viel Luft lassen).
Letztere Problemchen sind in der Plugin-Variante natürlich geschickter lösbar, beispielsweise durch dynamische Anpassung der Größe des OSD…