Jump to content

Fragen zum Aufbau der channels.dat


Recommended Posts

Hallo zusammen,

 

ich entwickle derzeit eine APP für die Boxee und benötige dazu u.A die Channels.dat. Deren Beschreibung habe ich bereits aus dem Downloadbereich geladen. Dennoch beliben ein paar Fragen offen und ich hoffe es kann mir da jemand weiter helfen.

 

1. Im DVBViewer werden einige Sender gruppiert, bsp. Pro 7 hat eine childnode "Pro Sieben (AC3), ARD HD hat drei childnodes, aber es gibt auch Sender wie VOX die haben keinen childnode. Leider kann ich an hand der channels.dat bsp. mit hilfe der forhandenen Felder nicht erkennen, welche Sendereintärge zusammen gehören. Einzige Möglichkeit währe nach meiner Beobachtung die service_id. Kann ich also die zusammengehörenden Einträge an Hand der service_id herrausfinden?

 

2. Beim Parsen der channels.dat sind mir Sendernamen aufgefallen, deren Länge die forgegebenen 25 Bytes übersteigt - im DVBViewer/RS werden die Namen jedoch korregt angezeigt. Beim Experimentieren mit der channels.dat habe ich dann festgestellt, dass der Rest des channelNamen im eventuell vorhandenen Rest des root- Feldes, getrennt mit einem Sonderzeichen, steht. Da das in der Doku so nicht aufgeführt wird, wollte ich sicher gehen, ob das so gehandhabt wird? Auch das Trennzeichen zwischen root und channelname würde mich interessieren?

 

Vielen Dank

Gruß

strgalt

Link to comment

Zu 1.

 

Service ID geht, ist aber nicht 100% sicher - du müsstest zusätzlich Transportstream_ID und OriginalNetwork_ID überprüfen. Entscheidend ist das höchstwertige Bit 0x80 im Flags-Feld. Es besagt, dass es sich um einen Unterknoten bzw. eine Audiospur des letzten vorangehenden Senders handelt, bei dem dieses Bit nicht gesetzt ist.

 

Zu 2.

 

Da haben wir getrickst, um längere Namen unterbringen zu können, ohne die Feldgrößen und damit das gesamte Dateiformat ändern zu müssen. :) Gespeichert werden in den Feldern Root, ChannelName und Category Strings mit einem vorangestellten Längenbyte, die maximal 25 Zeichen lang sein können. Die Feldgröße beträgt also mitsamt Längenbyte immer konstant 26 Bytes.

 

Wenn die Länge des Sendernamens 25 beträgt (also die maximale Länge), gibt es eventuell eine Fortsetzung im Root-Feld. Sie ist daran zu erkennen, dass sich direkt hinter dem Rootnamen (sofern er nicht das Feld selbst ausfüllt) ein Byte ungleich 0 befindet. Es gibt dann die Anzahl der nachfolgenden Zeichen an, die eine Fortsetzung des Sendernamens darstellen. Nach dem gleichen System kann der Kategoriename eine weitere Fortsetzung enthalten - es sind also beide zu überprüfen. Als Delphi-Code sieht das so aus:

 

type
 TChannelStr = String[25];
 PChannelStr = ^TChannelStr;

function GetChannelName(const ch: TFileChannel): String;

 procedure AddFrom(const s: TChannelStr);
 var
   n: Integer;
 begin
   if Length(s) < SizeOf(TChannelStr)-1 then //less than 25 characters
   begin
     n := Length(s) + 1; //index of the byte after the string
     if (s[n] <> #0) and //another length byte following
        (n + Ord(s[n]) <= SizeOf(TChannelStr)-1) then //doesn't exceed the field
       result := result + PChannelStr(@s[n])^;
   end;
 end;

begin
 with ch do
 begin
   result := ChannelName;
   if Length(ChannelName) = SizeOf(TChannelStr)-1 then //Length = 25
   begin
     AddFrom(Root);
     AddFrom(Category);
   end;
 end;
end;

 

Etwas schräg, aber es funktioniert. ;)

Link to comment

Zu 1. nochmal.

Ich muss wohl dazu sagen, dass es mir u.A. darum geht, den Port zum Streamen via RS zu ermitteln. So wie ich das sehe, werden nur die Sendereinträge vom RS verwendet, die entweder keine childnodes haben oder wenn eine childnode verfügbar ist, die erste davon?

Und zu Sicherheit noch mal zur Erkennung von childnodes für mich:

Service_id, Transportstream_id und originalnetworks_id müssen übereinstimmen. Der erste gefundene Eintrag ist die parentnode und die darauffolgenden mit den o.g. übereinstimmenden id´s sind dann die childs, wobei nur die erste im Port- Pool landet. Habe ich das so richtig verstanden? (Die Bit- Lösung passt so nicht in meine Codestruktur).

 

Gruß

strgalt

Link to comment
Der erste gefundene Eintrag ist die parentnode und die darauffolgenden mit den o.g. übereinstimmenden id´s sind dann die childs, wobei nur die erste im Port- Pool landet.

Mit dem RS kenne ich mich nicht aus, nur mit der Senderliste.

 

Bei 3 übereinstimmenden IDs handelt es sich höchstwahrscheinlich um Unter-Einträge, aber nicht zwangsläufig, da man es mit etwas Gewalt auch hinkriegen kann, dass ein entsprechender Haupteintrag folgt. Es ist in der Senderliste kein Gesetz, dass Einträge, die zum selben Sender gehören, immer als ein einziger Haupteintrag mit Untereinträgen erscheinen. Zum Beispiel sind in der Standard-Astra-Senderliste die Audiospuren von EuroNews auf verschiedene Kategorien verteilt (je nach Sprache).

 

Die Bit- Lösung passt so nicht in meine Codestruktur

Das Flag ist die einzig absolut sichere Methode, wenn man die Struktur der Senderliste 1 zu 1 erfassen will. Du musst das Flag-Feld (als vorzeichenlosen Byte-Wert) nur auf größer gleich 128 testen:

 

if Flags >= 128 then... //Bit 7 gesetzt, Untereintrag

Link to comment

ja, die Bits sind alle bereits ausgewertet. Hätte jetzt nur nicht reingepasst in die Structure wie ich mir das vorstelle - aber hatte das gestern noch mit dem Bit entsprechend sortiert. Es ging mir auch um das Verständnis, woran man erkennt welche Sender(Einträge) zusammen geören. Evtl. möchte ich die Darstellung der Sender später ja verändern. Da war ich eben ziemlich irritiert, dass in der channels.dat Sender- Parentnodes überhaupt Tuner/- Channeldaten haben, zumal diese nicht dem bevorzugten childnode entsprechen.

 

Die aber vielen Dank für deine Geduld !

 

Gruß

strgalt

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...