Seite 1 von 1

FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 18:16
von cms
In Referenz auf viewtopic.php?p=666966#p666966 und auf viewtopic.php?t=19612, weil das Thema dort vielleicht etwas ungünstig platziert ist.

Ich suche:
- Welche PIDs sind auf dem aktuellen Transponder verfügbar?
- Konfigurierbare Aufnahme bestimmter PIDs

Könnte sich einer unserer EMMA Spezialisten einmal erbarmen?

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 19:11
von FireBird
Wie man alle auf einem Transponder verfügbaren PIDs aufzeichnet, steht im zweiten von Dir verlinkten Thread. :wink:

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 21:04
von cms
FireBird hat geschrieben:Wie man alle auf einem Transponder verfügbaren PIDs aufzeichnet, steht im zweiten von Dir verlinkten Thread. :wink:


a) record-a-mux läuft nicht auf meinem MP, außerdem hatte ich es so verstanden, daß maximal 16 PIDs aufgenommen werden. Compilieren kann ich es, irgendwie traue ich mich aber nicht, es zu modifizieren, da ich den HW Bezug in der Init Lib nicht verstehe und auflösen kann.

b) Das Code Fragment habe ich einmal compiliert und vor der Aufnahme ausgeführt. Der Effekt ist null. Die Aufnahme sieht auf wie immer.

c) Wie spezifiziere ich PIDs zur Aufnahme (ich nehme an, das ist tägliches Brot für den EPG Author, der im Recorder Scan wahrscheinlich nur die EIT aufnimmt)?

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 21:09
von FireBird
Ich meinte auch das EMMA-Register einen Beitrag darunter. Das Bit darf erst geändert werden, wenn die Aufnahme läuft und sich alles stabilisiert hat.

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 21:50
von cms
[quote="FireBird"]Ich meinte auch das EMMA-Register einen Beitrag darunter. Das Bit darf erst geändert werden, wenn die Aufnahme läuft und sich alles stabilisiert hat.[/quote]

Das ändert auch nichts: Aufnahme starten, 10sec warten, EMMA Register ändern - kein Effekt, ganz normale Aufnahme.

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 21:58
von FireBird
Dann machst Du irgendetwas falsch.

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 22:34
von cms
FireBird hat geschrieben:Dann machst Du irgendetwas falsch.

Code: Alles auswählen

#include <tap.h>

#define	ID_FILTER	0x8000d042

TAP_ID( ID_FILTER );
TAP_PROGRAM_NAME("PIDFilter 0.1");
TAP_AUTHOR_NAME("CMSA");
TAP_DESCRIPTION("Fuck around with EMMA");
TAP_ETCINFO(__DATE__);

int TAP_Main(void)
{
  dword* EMMA_TTSD_SR_CMD     = (dword*)0xb000a400;
  dword* EMMA_TTSD_PID_0      = (dword*)0xb000a038;
  dword* EMMA_TTSD_PID_47     = (dword*)0xb000a0f4;
  dword* EMMA_TTSD_PID_48     = (dword*)0xb000a640;
  dword* EMMA_TTSD_PID_EXT_47 = (dword*)0xb000a7bc;
  dword   *i;

  if ((*EMMA_TTSD_SR_CMD & 0x00000060) == 0)
  {
    for (i = EMMA_TTSD_PID_0; i <= EMMA_TTSD_PID_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    for (i = EMMA_TTSD_PID_48; i <= EMMA_TTSD_PID_EXT_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    *EMMA_TTSD_SR_CMD |= 0x00000060;
  }
  else
    *EMMA_TTSD_SR_CMD &= 0xffffff9f;
  return 0;
}

AW: FreeSAT EPG

Verfasst: Sa 10. Apr 2010, 23:36
von FireBird
Grundsätzlich funktioniert Dein Code, aber...
  • ...das kurze TAP wird bei mir nicht korrekt erzeugt. Auf der seriellen Konsole wird „TAP: not enough space“ ausgegeben und in der .TAP-Datei selbst fehlt „TFAPMIPS“ und ein paar andere Header-Infos. Ein Dummy-TAP_Print() hat das gefixt.
  • ...schreit bei mir der Linker, wenn die TAP_EventHandler() fehlt.
  • ...sollte man nur den Kanal durchschalten, den man auch aufnimmt, sonst gibt es ganz schnell einen erfrorenen Topf.

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 09:51
von cms
Damit hat es wirklich begonnen "etwas" zu tun, es war also vorher zu kurz.
Etwas: Der Bildschirm zeigt ein buntes flirren und der Receiver wird unbedienbar. Dabei ist es egal, ob eine Aufnahme läuft oder ob man es vorher macht. Die laufende Aufnahme ist defekt, 0 Bytes. Ist am MP noch irgendetwas anders?

Code: Alles auswählen

#include <tap.h>

#define	ID_FILTER	0x8000d042

TAP_ID( ID_FILTER );
TAP_PROGRAM_NAME("PIDFilter 0.1");
TAP_AUTHOR_NAME("CMSA");
TAP_DESCRIPTION("Fuck around with EMMA");
TAP_ETCINFO(__DATE__);

dword TAP_EventHandler( word event, dword param1, dword param2 )
{
  // return FilterEventHandler(event, param1, param2);
  return 0;
}

int TAP_Main(void)
{
  dword* EMMA_TTSD_SR_CMD     = (dword*)0xb000a400;
  dword* EMMA_TTSD_PID_0      = (dword*)0xb000a038;
  dword* EMMA_TTSD_PID_47     = (dword*)0xb000a0f4;
  dword* EMMA_TTSD_PID_48     = (dword*)0xb000a640;
  dword* EMMA_TTSD_PID_EXT_47 = (dword*)0xb000a7bc;
  dword   *i;

  if ((*EMMA_TTSD_SR_CMD & 0x00000060) == 0)
  {
    for (i = EMMA_TTSD_PID_0; i <= EMMA_TTSD_PID_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    for (i = EMMA_TTSD_PID_48; i <= EMMA_TTSD_PID_EXT_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    *EMMA_TTSD_SR_CMD |= 0x00000060;
  }
  else
    *EMMA_TTSD_SR_CMD &= 0xffffff9f;

  return 0;

  TAP_Print("Dummy\n");
}

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 09:58
von FireBird
[quote="cms"]Ist am MP noch irgendetwas anders?[/quote]
Nein, denn ich habe auch einen MP. Aber wie bereits oben geschrieben, sollst Du nicht einfach beide Kanäle durchschalten (0x60), sondern nur den, über den gerade aufgenommen wird. Mit hoher Wahrscheinlichkeit ist es der Slot 0 (0x20), aber korrekter Weise ermittelt man das mit TAP_Hdd_GetRecInfo ().

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 10:59
von Happy
cms hat geschrieben:
Etwas: Der Bildschirm zeigt ein buntes flirren und der Receiver wird unbedienbar.

Im Eventhandler solltest du return param1 verwenden statt return 0

Gruß,
Happy

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 11:05
von FireBird
Der kommt aus der TAP_Main eh nicht raus.

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 11:09
von Happy
[quote="FireBird"]Der kommt aus der TAP_Main eh nicht raus.[/quote]
ok....

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 23:39
von cms
Noch eine Erfolgsrückmeldung: Nach den letzten Modifikationen läuft es, ich habe ein 'selbst' geschriebenes Record-a-Mux.
Eine Aufnahmeminute gibt 300MB, die ich einmal durch den dvbsnoop gequetscht habe. Das Ergebnis ist ein 80% Erfolg, die EPG PIDs sind da.
Aber es sind die falschen, es sind die low-speed PIDs 3841 und 3842, ich wollte ja 3002 & 3003 finden.
So ist es auch kein Wunder, daß meine Kanalaufnahme, in der ich einfach einen Kanal mit eine VPID von 3002 und einer APID von 3003 eingerichtet hatte, überhaupt nicht zielführend war.

Aber ich bin meinem Traum, TGDs direkt am Topf aus einer Aufnahme zu produzieren, ein klitzekleines Stück nähergerückt.

Bis hierhin danke für Euren Input.

Das sind die mit dvbsnoop gesnifften PIDs:

Code: Alles auswählen

PID: 0 (0x0000)  [= Programm Association Table]
PID: 1 (0x0001)  [= Conditional Access Table]
PID: 1280 (0x0500)  [= NIT, PMT or Elementary PID, etc.]
PID: 1281 (0x0501)  [= NIT, PMT or Elementary PID, etc.]
PID: 1282 (0x0502)  [= NIT, PMT or Elementary PID, etc.]
PID: 1283 (0x0503)  [= NIT, PMT or Elementary PID, etc.]
PID: 1284 (0x0504)  [= NIT, PMT or Elementary PID, etc.]
PID: 16 (0x0010)  [= NIT, PMT or Elementary PID, etc.]
PID: 17 (0x0011)  [= NIT, PMT or Elementary PID, etc.]
PID: 18 (0x0012)  [= NIT, PMT or Elementary PID, etc.]
PID: 192 (0x00c0)  [= NIT, PMT or Elementary PID, etc.]
PID: 20 (0x0014)  [= NIT, PMT or Elementary PID, etc.]
PID: 2305 (0x0901)  [= NIT, PMT or Elementary PID, etc.]
PID: 2306 (0x0902)  [= NIT, PMT or Elementary PID, etc.]
PID: 2307 (0x0903)  [= NIT, PMT or Elementary PID, etc.]
PID: 2308 (0x0904)  [= NIT, PMT or Elementary PID, etc.]
PID: 2309 (0x0905)  [= NIT, PMT or Elementary PID, etc.]
PID: 2310 (0x0906)  [= NIT, PMT or Elementary PID, etc.]
PID: 2318 (0x090e)  [= NIT, PMT or Elementary PID, etc.]
PID: 2319 (0x090f)  [= NIT, PMT or Elementary PID, etc.]
PID: 2320 (0x0910)  [= NIT, PMT or Elementary PID, etc.]
PID: 2321 (0x0911)  [= NIT, PMT or Elementary PID, etc.]
PID: 2322 (0x0912)  [= NIT, PMT or Elementary PID, etc.]
PID: 2323 (0x0913)  [= NIT, PMT or Elementary PID, etc.]
PID: 2324 (0x0914)  [= NIT, PMT or Elementary PID, etc.]
PID: 2325 (0x0915)  [= NIT, PMT or Elementary PID, etc.]
PID: 2326 (0x0916)  [= NIT, PMT or Elementary PID, etc.]
PID: 2327 (0x0917)  [= NIT, PMT or Elementary PID, etc.]
PID: 2328 (0x0918)  [= NIT, PMT or Elementary PID, etc.]
PID: 2329 (0x0919)  [= NIT, PMT or Elementary PID, etc.]
PID: 2330 (0x091a)  [= NIT, PMT or Elementary PID, etc.]
PID: 2331 (0x091b)  [= NIT, PMT or Elementary PID, etc.]
PID: 2332 (0x091c)  [= NIT, PMT or Elementary PID, etc.]
PID: 2333 (0x091d)  [= NIT, PMT or Elementary PID, etc.]
PID: 2334 (0x091e)  [= NIT, PMT or Elementary PID, etc.]
PID: 2335 (0x091f)  [= NIT, PMT or Elementary PID, etc.]
PID: 2336 (0x0920)  [= NIT, PMT or Elementary PID, etc.]
PID: 2337 (0x0921)  [= NIT, PMT or Elementary PID, etc.]
PID: 257 (0x0101)  [= NIT, PMT or Elementary PID, etc.]
PID: 258 (0x0102)  [= NIT, PMT or Elementary PID, etc.]
PID: 259 (0x0103)  [= NIT, PMT or Elementary PID, etc.]
PID: 260 (0x0104)  [= NIT, PMT or Elementary PID, etc.]
PID: 261 (0x0105)  [= NIT, PMT or Elementary PID, etc.]
PID: 262 (0x0106)  [= NIT, PMT or Elementary PID, etc.]
PID: 263 (0x0107)  [= NIT, PMT or Elementary PID, etc.]
PID: 264 (0x0108)  [= NIT, PMT or Elementary PID, etc.]
PID: 266 (0x010a)  [= NIT, PMT or Elementary PID, etc.]
PID: 267 (0x010b)  [= NIT, PMT or Elementary PID, etc.]
PID: 268 (0x010c)  [= NIT, PMT or Elementary PID, etc.]
PID: 269 (0x010d)  [= NIT, PMT or Elementary PID, etc.]
PID: 3840 (0x0f00)  [= NIT, PMT or Elementary PID, etc.]
PID: 3841 (0x0f01)  [= NIT, PMT or Elementary PID, etc.]
PID: 3842 (0x0f02)  [= NIT, PMT or Elementary PID, etc.]
PID: 3843 (0x0f03)  [= NIT, PMT or Elementary PID, etc.]
PID: 3844 (0x0f04)  [= NIT, PMT or Elementary PID, etc.]
PID: 49 (0x0031)  [= NIT, PMT or Elementary PID, etc.]
PID: 80 (0x0050)  [= NIT, PMT or Elementary PID, etc.]
PID: 8191 (0x1fff)  [= Null-packet]
PID: 85 (0x0055)  [= NIT, PMT or Elementary PID, etc.]
PID: 89 (0x0059)  [= NIT, PMT or Elementary PID, etc.]
PID: 96 (0x0060)  [= NIT, PMT or Elementary PID, etc.]

AW: FreeSAT EPG

Verfasst: So 11. Apr 2010, 23:52
von cms
Und hier für die Nachwelt der Code zur freundlichen Kenntnisnahme und Nachahmung.
Ich wage jedoch keine Doppelaufnahme...

Code: Alles auswählen

#include <tap.h>

#define	ID_FILTER	0x8000d042

TAP_ID( ID_FILTER );
TAP_PROGRAM_NAME("PIDFilter 0.1");
TAP_AUTHOR_NAME("CMSA");
TAP_DESCRIPTION("Fuck around with EMMA");
TAP_ETCINFO(__DATE__);

// For API Bug, reserve 256 byte after playinfo/recinfo
typedef struct
{
  TYPE_RecInfo   myRecInfo;
  char           extraBuffer[256];
} TYPE_myNewRecInfo;

typedef struct
{
  TYPE_PlayInfo  myPlayInfo;
  char           extraBuffer[256];
} TYPE_myNewPlayInfo;

dword TAP_EventHandler( word event, dword param1, dword param2 )
{
  // return FilterEventHandler(event, param1, param2);
  return 1;
}

int TAP_Main(void)
{
  dword* EMMA_TTSD_SR_CMD     = (dword*)0xb000a400;
  dword* EMMA_TTSD_PID_0      = (dword*)0xb000a038;
  dword* EMMA_TTSD_PID_47     = (dword*)0xb000a0f4;
  dword* EMMA_TTSD_PID_48     = (dword*)0xb000a640;
  dword* EMMA_TTSD_PID_EXT_47 = (dword*)0xb000a7bc;
  dword   *i;
  dword val=0;
  static TYPE_myNewRecInfo myNewRecInfo;
  TYPE_RecInfo* myRecInfo = (TYPE_RecInfo*)&myNewRecInfo;
  bool myRecInfoValid;

  if ((*EMMA_TTSD_SR_CMD & 0x00000060) == 0)
  {
    for (i = EMMA_TTSD_PID_0; i <= EMMA_TTSD_PID_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    for (i = EMMA_TTSD_PID_48; i <= EMMA_TTSD_PID_EXT_47; i++)
    {
      if ((*i & 0x1fff) == 18) *i = 0x00001fff;
    }

    if(TAP_Hdd_GetRecInfo(0, myRecInfo)) {
      if(myRecInfo->recType == RECTYPE_Normal) val |= 0x00000020;
    } 
    if(TAP_Hdd_GetRecInfo(1, myRecInfo)) {
      if(myRecInfo->recType == RECTYPE_Normal) val |= 0x00000040;
    } 
    //*EMMA_TTSD_SR_CMD |= 0x00000060;
    *EMMA_TTSD_SR_CMD |= val;
  }
  else
    *EMMA_TTSD_SR_CMD &= 0xffffff9f;

  return 0;

  TAP_Print("Dummy\n");
}

AW: FreeSAT EPG

Verfasst: Mo 12. Apr 2010, 07:19
von cms
Dann also die erste Bedienungsanleitung:

Es wird ein Programmplatz erzeugt (z.B. Topset).

Astra2
Transponder: 11426MHz / 27500KS / H Arqiva Transponder (*)
PCR PID: 3001
Video PID: 3002
Audio PID: 3003
Service ID: 0

Jetzt auf diesem Programmplatz eine Aufnahme starten, in 70 Sekunden ist der komplette Freesat EPG eingelesen. Da kommen ca. 35MBytes Aufnahme heraus.

Träum #1:
In Zukunft wird ein TAP aus dieser Aufnahme die TGDs rechnen, die von den üblichen Verdächtigen direkt auf dem Topf weiterverarbeitet werden.

Träum #2:
In weiterer Zukunft werden die EPG TAPs die Verarbeitung als Teil des Recorder Scans direkt integriert haben.

Einstweilen schieben wir die Aufnahme auf den PC, nehmen den Scanner (DotNet Code). Das ist natürlich kein echtes Tool, sondern nur eine Fingerübung eines Programmierers, ist aber schon einmal ganz nett um sich von der grundsätzlichen Funktion zu überzeugen.

(*) Ich hatte am Anfang auf V probiert, das ist das erste Mal, dass die Sendefrequenz (fast) identisch ist, und nur nach Polarisationsebene unterschieden wird.

AW: FreeSAT EPG

Verfasst: Mo 12. Apr 2010, 22:57
von cms
Oh, dass macht Spaß.

FreeSat EPG hält sich an den Standard, man findet in der PID 3003 eine klassische EIT (Event Information Table).
Anders ist nur die Codierung der Strings:
Für die Analyse habe ich den dvbsnoop etwas erweitert, so dass er die Strings zusätzlich mit Hexdumps anzeigt.

Die ersten beiden Bytes sind nicht standardisierte Deskriptoren, man findet

Code: Alles auswählen

0x1F 0x01
Codierung mit Huffman Tabelle 1 (Anhang)

Code: Alles auswählen

0x1F 0x02
Codierung mit Huffman Tabelle 2 (Anhang)

Die Tabellen sind zu lesen wie ein Zustandsautomat, das Ausgabealfabet ist die Menge der Zustände, die Kanten sind die Binärwerte der Eingabe. Besonders gekennzeichnete Zustände machen genau, was man so denkt (START, STOP, ...).

Ich habe einmal herausgesucht, zum Beispiel Event_ID: 29249 (0x7241) Start_time: 0xd802232000 [= 2010-04-12 23:20:00 (UTC)] Duration: 0x0005000 [= 00:50:00 (UTC)]

Code: Alles auswählen

1F01 9B5EBE6FC70F60
Das übersetzt sich mit Tabelle 1 zu:

Code: Alles auswählen

In Plain Sight
Funktioniert also prima.

Hier noch die beiden Tabellen (Quelle: BDB/DigitalSpy, aus dem VDR Sourcecode):