VideoText in DVB.NET 3.9 für Entwickler

Da ich für das Service Pack 1 gerade ein bißchen am Code herumspielen musst, hier eine grobe Zusammenfassung der Möglichkeiten, die DVB.NET einem Entwickler zur Auswertung von VideoText bietet.

Kern ist die Klasse TTXParser, deren AddPayload Methode mit dem Rohdatenstrom (ES) beschickt wird. Sobald eine Seite (TTXPage) vollständig bereit steht, wird ein entsprechendes Ereignis ausgelöst (OnPage). Ergänzend bietet DVB.NET mit der Klasse PageManager die Möglichkeit, einmal empfangene Seiten vorzuhalten. Diese können dann gezielt angefordert werden (CurrentPage) und werden dann unmittelbar oder nach Empfang der ersten Version über ein Ereignis gemeldet (OnPageAvailable) – dito bei jeder folgenden Aktualisierung der Seite [unabhängig davon, ob sich der Inhalt verändert hat]. Sollten kein Rohdatenstrom vorliegen (so wie es beim DVB Empfang oft der Fall ist), kann dieser durch Kombination mit einer TTXStream Instanz aus einem PES erzeugt werden.

Im Zentrum der eigentlichen Darstellung stehen Instanzen der TTXPage Klasse. Diese verwaltet eine voranalyiserte Darstellung der Seite, die allerdings für die direkte Auswertung nicht zwingend geeignet ist. Hier sind noch Steuersequenzen für Zeichengröße, Zeichensatz, Vorder- und Hintergrundfarbe etc. eingebettet. Mit einem Aufruf von CreatePage erfolgt die Umsetzung in eine .NET Bitmap Instanz, die direkt zur Anzeige verwendet werden kann. Die Unterstützung des VideoText Standards ist zwar recht rudimentär (international Zeichensätze werden nicht korrekt dargestellt, was etwa ARTE oder BBC etwas komisch aussehen lässt), für die deutschen Sender reicht es aber. Ebenso vorhanden sind transparente Seiten etwa für Untertitel.

Ergänzend zur Bitmap und den Rohdaten bietet CreatePage die Option, eine Information über alle auf der Seite ausgegebenen Ziffern zu erfragen. Diese werden über eine Klasse DigitManager verwaltet. Mit der Methode GetTTXDigitAt kann zu einer relativen Position auf der Seite (in den Koordinaten 0.0 bis 1.0, wobei 0.0 / 0.0 wie gewohnt oben links ist) ermittelt werden, ob dort eine Ziffer ausgegeben wurde. Ist das der Fall, so wird auch der Rahmen des Zeichens in relativen Koordinaten gemeldet. Ergänzend prüft GetPageAt zu einer Position, ob dort eine dreistellige Seitennummer im Bereich 100 bis 899 (jeweils einschließlich) vorhanden ist – dazu wird natürlich GetTTXDigitAt eingesetzt. Bedingung ist eine Sequenz aus genau drei Ziffern gleicher Größe – Höhe und Breite.

Viel Spaß

Jochen

Noch ein kleines Tool: BBC / ITV Programmzeitschrift

Ich habe aus Eigennutz mal ein kleines Tool geschrieben, das die FreeSat Programmzeitschrift in eine Excel fähige Datei auslesen kann. Nix Dolles und sicher noch mit Bugs und Schönheitsfehlern, aber vielleicht nützlich für den den einen oder anderen. Es wird eine funktionsfähige (i.e. mindestens ein Geräteprofil mit durchgeführtem Suchlauf auf Astra 2 / EuroBird) DVB.NET 3.9 Installation vorausgesetzt. Die Quelltexte sind als Beispiel dabei (es ist eine ganz einfache Page basierte WPF Anwendung).

Viel Spaß

Jochen

Zum Beispiel

Puh – 3.9 fertig

Ich habe nun endlich die 3.9er Version meiner DVB Software freigeben. Auch wenn es eigentlich nichts Halbes (der kleine Schritt nach 3.5.1) und Ganzes (der große Schritt nach 4.0) ist, bin ich mit dem Erreichten doch ganz zufrieden. Immerhin funktioniert die neue Infrastruktur recht gut und DVB.NET ist nun nicht mehr an der Urarchitektur nahe der Nexus API orientiert. Ich hoffe, dass insbesondere VCR.NET 3.9 die hohe Stabilität der Vorgängerversionen halten kann und dass nicht allzu viele Patches nachkleckern (4 waren es bei der 3.5 und die 3.9 hat relativ wenig Tests im PayTV Umfeld, daher abwarten).

Ich werde jetzt erst mal eine Weile was anderes machen und vermutlich im Spätherbst schauen, dass die ‚echte‘ 4.0 in die Gänge kommt. Was danach passiert, steht in den Sternen…

Jochen

DVB.NET 4.0 Konzepte: Abstraktion der ‚PID‘-Filter

Bedingt durch seine Historie verbinden bisherige DVB.NET Versionen einen Verbraucher eines Teildatenstroms (Bild, Ton, Steuerdaten, Videotext, … – eindeutig spezifiziert durch eine Datenstromkennung PID) immer direkt mit den von den Hardwareabstraktionen angebotenen Filtern. Das hat einige eigenartige Effekte und ich möchte hier einen Aspekt kurz erläutern: außerhalb des halbstündigen Regionalfensters empfängt man auf WDR Bonn identisch das gleiche wie auf WDR Aachen. Technisch ist das so realisiert, dass beide Sender identische PID Kennungen für Bild und Ton melden. Wenn man in DVB.NET nun eine Aufzeichnung auf WDR Bonn starten würde, so wird ganz normal das gewünschte Ergebnis erzeugt. Wenn dann allerdings gleichzeitig eine Aufzeichnung auf WDR Aachen aktiviert wird, werden die notwendigen PID Kennungen neu angemeldet. Mit dem Effekt, dass die Bonn Aufzeichnung keine neuen Daten mehr erhält, sondern nur noch die Aachener. Noch häßlicher wird es, wenn man Bonn dann stoppt: nun werden die Filter abgemeldet und Aachen bekommt keine Daten mehr.

Sehr unbefriedigend! DVB.NET wird ab Version 3.9 die Konzepte strikt trennen. Es können pro Datenstromkennung (PID) beliebig viele Verbraucher angemeldet sein, die alle individiuell aktiviert oder deaktiviert werden können. Ein Filter der Hardwareabstraktion wird aktiviert, sobald mindestens ein Verbraucher aktiv ist. Er wird deaktiviert, wenn der letzte aktive Verbraucher deaktiviert oder abgemeldet wird (oder die Quellgruppe (früher Transponder genannt) gewechselt wird).

Mag sich wie ein Detail anhören, ist aber im Hinblick auf einige Probleme in der Vergangenheit ein wichtiger Schritt.

Bis bald

Jochen

DVB.NET 4.0 Konzepte: Installation und Verzeichnisse

Beginnend mit DVB.NET 3.9 verfolge ich ein etwas anderes Konzept, was das Laden der Bibliotheken angeht. Mehr oder weniger historisch bedingt durch die Notwendigkeit, die properitäre Treiberdatei (DLL) der Hauppauge Nexus im selben Verzeichnis zu haben wie die Anwendung [ja, da gibt es durchaus Alternativen, aber alle haben ihren eigenen kleinen Haken], die sie benutzt, brachte jede DVB.NET Anwendung letztlich die gesamte Bibliothek mit sich – siehe VCR.NET. Scheint es erst mal von Vorteil zu sein (DVB.NET und VCR.NET werden unabhängig voneinander installiert), kann es doch auch lästig sein (der Viewer MUSS in das DVB.NET Installationsverzeichnis, Fixes für DVB.NET MÜSSEN auch immer im VCR.NET eingespielt werden und so weiter).

Da ich es auch für bedenklich halte, DVB.NET Bibliotheken (Assemblies) mit teilweise sehr direktem Zugriff aus .NET heraus auf das Betriebssystem blind in das .NET GAC (Global Assembly Cache) zu installieren. habe ich folgende Lösung gewählt:

  • DVB.NET installiert ab 3.9 eine einzige Bibliothek in den GAC
  • Zukünftige Versionen werden diese nicht einfach ersetzen, sondern separate Varianten einstellen – DVB.NET Versionen sollen weiterhin parallel betrieben werden können
  • Zusätzlich wird für jede Version ab 3.9 separat in der Registry vermerkt, wohin DVB.NET installiert wurde
  • Jede DVB.NET Anwendung referenziert diese eine Bibliothek und initialisiert sie geeignet (sehr einfach gehalten)
  • Werden DVB.NET Bibliotheken benötigt, so werden diese automatisch dem RunTime Unterverzeichnis des Installationsverzeichnisses entnommen
  • Für propertitäre Treiber wird ein ähnlicher Mechanismus (Stichwort: SetDllDirectory) und das Unterverzeichnis Driver verwendet
  • Ein grundsätzlicher Erweiterungsmechanismus kann von Anwendungen wie dem Administrationswerkzeug verwendet werden (hier das Unterverzeichnis Administration PlugIns)

Insgesamt enthält das Installationsverzeichnis von DVB.NET im Wesentlichen nur noch Anwendungen. Eine auf DVB.NET basierte selbst erstelle Anwendung muss eigentlich nur noch die eigenen Dateien kopieren und hat volle DVB.NET Unterstützung – inklusive eines vereinfachten Aktualisierungsmechanismus.

Ich hoffe, dadurch etwas Übersichtlichkeit in die Installation des DVB.NET Kerns und abhängiger Anwendungen zu bringen.

Wir werden sehen…

Jochen

So könnte es aussehen