Jump to content

EPG Info


Recommended Posts

Guest hackbart

extern geht nicht, da Windows keine Zeiger von Programm zu Programm shared.

Als Plugin kannste aber folgendes machen:

 

const WM_DVBVIEWER = $B2C2;

MSG_GETCOMPLETEEPG = $2216;

 

type

TEPGEntryStruct=packed record

EventID:Word;

Time:TDateTime;

Duration:TDateTime;

PresentFollowing:Byte;

Event,

Title,

Description: PChar;

Charset: Integer;

Content: Byte;

ServiceID: DWord;

Frequency: DWord;

end;

TEPGStruct=packed record

Count: Integer;

Entries: Array of TEPGEntryStruct;

end;

PEPGStruct=^TEPGStruct;

 

...

 

var EPG: TEPGStruct;

 

...

 

EPG.Entries:=nil;

SendMessage(DVBViewerHandle,WM_DVBVIEWER,MSG_GETCOMPLETEEPG, DWord(@EPG));

setlength(EPG.entries,EPG.Count);

SendMessage(DVBViewerHandle,WM_DVBVIEWER,MSG_GETCOMPLETEEPG, DWord(@EPG));

 

und schon haste die Daten ;)

 

Christian

Link to comment
  • 1 month later...

Hi,

 

hab nun mein erstes Plugin in C gebacken (Dank an erwin und Christian)

und auch gleich die EPG-Info geladen:

ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen?

Dann eben FindWindow().

Und die Menge an EPG-Daten ist gewaltig; gibt es vielleicht die Möglichkeit an

die EPG Daten des aktuellen Senders, also das, was erscheint, wenn man auf die

EPG-Info im laufenden Bild klickt?

 

gema

Link to comment
ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen?

 

Mit Sicherheit doch. Benutze ich in allen meinen Plugins, bislang ohne Probleme. Vielleicht ein kleiner Bug...

 

die EPG Daten des aktuellen Senders

 

...lassen sich über die Service-ID zuordnen.

 

Leider fehlt in der obigen Struktur die TransportStream ID (ein Designfehler), die für eine zuverlässigere Zuordnung zusätzlich erforderlich wäre. Diese wird zwar inzwischen auf mein Bestreben hin im DVBViewer erfasst, aber offenbar noch nicht weitergereicht.

 

Die Frequenz, die anstattdessen geliefert wird, ist dagegen denkbar ungeeignet (noch ein Designfehler), da ein und der gleiche Kanal mit leicht abweichender Frequenz in der Kanalliste auftauchen kann. Wenn man sie verwendet, muss man "tolerant" testen, also z.B. auf ein Intervall von +/- 3 MHz. Zusätzlich ist dabei blöd, dass die EPG-Daten, die die ARD für das ZDF sendet, natürlich mit der Frequenz des ARD-Transponders erscheinen. Außerdem hat die ARD zwei Transponder. Es können also EPG-Einträge für die ARD-Programme mit zwei verschiedenen Frequenzen erscheinen..... usw. Am besten vergessen.

 

Immer, wenn der DVBViewer auf einen Sender umschaltet, ruft er folgendes in allen Plugins auf:

 

function Execute(ch: PTuner; Pid: PPluginPids): Boolean; stdcall;
begin
result:=false; //erlaubt die Senderumschaltung!!!
//....
end;

exports Execute;

 

PTuner referenziert die Tuner-Struktur des betreffenden Senders mit den Daten, die du auch in der Kanalliste siehst (einschließlich Service-ID). Weiteres dazu in dem Channel Shortcutter-Sourcecode, der im Service Center erhältlich ist - er demonstriert auch, wie man die gesamte Kanalliste lädt, wodurch sich alle EPG-Daten Sendern zuordnen lassen. Den Pointer für die PluginPids kannst du erst mal ignorieren (d.h. einen untypisierten Zeiger einsetzen).

Link to comment
ging fast sofort bis auf SetAppHandle() wird nicht vom DVBViewer aufgerufen?

Ich habs so gemacht:

 

void __stdcall SetAppHandle( int Handle, void * /* TRebuildFunc */RebuildFunc )

{

_DVBHandle = ( HWND ) Handle;

 

//bla bla

 

}

 

und es funzt.

 

 

und auch gleich die EPG-Info geladen:

 

Hast Du's so wie oben von Hackbart beschrieben gemacht? Wenn ja kannste dich ja revanchieren. Ich habs nicht hingekriegt. Irgendwie habe ich das dynamische Array von Delphi nicht richtig in eine passende C-Struct bekommen. Jedenfalls stürtzt es bei mir ab.

 

 

Gruß erwin

Link to comment
Irgendwie habe ich das dynamische Array von Delphi nicht richtig in eine passende C-Struct bekommen. Jedenfalls stürtzt es bei mir ab.

 

Der häufigste Fehler bei der Übernahme von DVBViewer-Daten in Plugins ist, die begrenzte Gültigkeit der übergebenen Zeiger nicht ausreichend zu berücksichtigen. Insbesondere muss man alles, was als PChar kommt, *sofort* in Plugin-eigene Variablen kopieren. Später zeigen die womöglich sonstwohin...

Link to comment

Hi erwin,

 

typedef struct {

....

} TEPGEntryStruct;

 

 

typedef struct {

int Count;

TEPGEntryStruct *Entries;

} TEPGStruct;

 

 

und dann in der Funktion:

 

TEPGStruct EPG;

EPG.Entries = NULL;

EPG.Count = 0;

SendMessage (DVBVHandle, WM_DVBVIEWER, MSG_GETCOMPLETEEPG, (long)&EPG);

EPG.Entries = (TEPGEntryStruct *)malloc(EPG.Count * sizeof(TEPGEntryStruct));

SendMessage (DVBVHandle, WM_DVBVIEWER, MSG_GETCOMPLETEEPG, (long)&EPG);

for (i = 0; i < EPG.Count; i++)

{

....

}

free (EPG.Entries);

Link to comment

Ein kleines Problem hab ich noch, meine Structur sieht so aus:

 

typedef struct {

WORD EventID;

LONG Time;

LONG Duration;

BYTE PresentFollowing;

char *Event;

char *Title;

char *Description;

int Charset;

BYTE Content;

DWORD ServiceID;

DWORD Frequency;

} TEPGEntryStruct;

 

Damit stimmt die Größe (44 Byte) mit dem Überein was DVBViewer liefert.

Ein Log der gelieferten Daten sieht so schlecht nicht aus, bis auf die Pointer

Event, Title, Description. Verarbeite ich die Daten zu schnell?

Vielleicht sonst einen Tip?

 

Danke,

gema

 

EPG.count 742

 

EventID 4c9d

Time acf9e38e

Duration 1c7240e2

PresentFollowing c7

Event 48003fa1

Title 840145d4

Description 70014c8f

Charset 1503a

Content 0

ServiceID 6d66

Frequency 2eb2

 

EventID 4d96

Time ad160000

Duration 555540e2

PresentFollowing 55

Event 20003f95

Title f8030517

Description dc014ca5

Charset 3096c

Content 0

ServiceID 6d66

Frequency 2eb2

....

und der Daten Dump in Hex:

00000000: 9d 4c e4 38 8e e3 f9 ac

00000008: e2 40 72 1c c7 71 1c c7

00000010: a1 3f 00 48 d4 45 01 84

00000018: 8f 4c 01 70 3a 50 01 00

00000020: 00 00 00 15 66 6d 00 00

00000028: b2 2e 00 00 96 4d 00 00

00000030: 00 00 16 ad e2 40 55 55

00000038: 55 55 55 55 95 3f 00 20

00000040: 17 05 03 f8 a5 4c 01 dc

00000048: 6c 09 03 00 00 00 00 22

00000050: 66 6d 00 00 b2 2e 00 00

00000058: ca 4d 56 55 55 55 f9 ac

00000060: e2 40 1c c7 71 1c c7 71

Link to comment
typedef struct {

WORD EventID;

LONG Time;

LONG Duration;

[...]

} TEPGEntryStruct;

 

Ich weiss nicht ob das so richtig ist, die Time und Duration werden als TDateTime abgelegt, das ist ein Doublewert (float?) (8 byte), wenn long dem Longint (32 Bit/ 4 Byte) entspricht könnte das probleme geben...

 

lars

Link to comment

Erstmal Danke an alle.

 

@Griga

Dieser Tip ist sicher in allen DVB-Plugin-Fragen bedeutsam. Nun Ich habe einen Absturz mitten im Handling der zweiten Sendmessage(); Wahrscheinlich ist bei mir die Umsetzung der TEPGEntryStruct nach C falsch.

 

@gema

genau so hab ichs auch versucht, allerding mit anderer TEPGEntryStruct.:

 

struct EPGEntryStruct {

DWORD EventID;

 

double Time;

double Date;

 

....

}

 

Wenn Du für EventID ein WORD als Type hast und ich DWORD war ich an dieser Stelle vielleicht nur abgelenkt. Ich versuchts heut abend noch mal mit WORD.

Genau wie Lars_MQ anmerkt war mir ein double für die Zeitwerte auch irgenwie passender.

 

<ZITAT>

The TDateTime type holds a date and time value.

It is stored as a Double variable, with the date as the integral part, and time as fractional part. The date is stored as the number of days since 30 Dec 1899.

</Zitat>

 

erwin

Link to comment

Dein Absturz könnte davon kommen, daß du zuwenig Speicher reserviert hast.

EPGEntryStruct muß 44 Bytes groß sein (hab ich ausgemessen).

Wenn Du Visual Studio verwendest hilft ein #pragma pack(1) die Strukturelement

hintereinander zu packen.

Link to comment

Ja, denke schon das mein Patzer beim EventID-Datentyp solche Folgen haben kann.

 

Und: #pragma pack(1) vergißt man auch allzuleicht wenn man C-Strukturen zur Fremdverarbeitung weitergibt.

 

erwin

 

PS: an die Delphi-Entwickler: Gibt es unter Delphi auch Packungs-Optionen für Strukturen und wie müssen diese dann für die Plugins eingestellt werden?

Edited by erwin
Link to comment

Bei delphi sollten die records (=struct) mit

 

TMeinRecord = packed record

...

end;

 

definiert werden, damit ist man auf der sicheren seite...

 

Ansonsten gibt es für die Compileroptionen noch "Ausrichtung von Recordfeldern" dort ist bei mir für alle Sachen den DVBViewer betreffen die 4 eingestellt. Das ist historisch bedingt (DVBViewer wurde auf Delphi 4 erstellt und das konnte nur auf 4 ausrichten, daran halten sich auch die plugins, daher ist eine Umstellung eher schwierig).

 

Ausgerichtete Record-Felder Richtet Elemente in Strukturen gemäß der angegebenen Anzahl von Bytes aus (1, 2, 4 oder 8). Wählen Sie den gewünschten Ausrichtungstyp in der Dropdown-Liste. Entspricht dem Schalter {$A}. Hinweis: In früheren Delphi-Versionen, konnte diese Option an- und ausgeschaltet werden. Auswahl 1 ist äquivalent zu Aus und 8 ist äquivalent zu An.

 

gruss

lars

Edited by Lars_MQ
Link to comment
Ansonsten gibt es für die Compileroptionen noch "Ausrichtung von Recordfeldern" dort ist bei mir für alle Sachen den DVBViewer betreffen die 4 eingestellt. Das ist historisch bedingt (DVBViewer wurde auf Delphi 4 erstellt und das konnte nur auf 4 ausrichten, daran halten sich auch die plugins, daher ist eine Umstellung eher schwierig).

Dann wäre doch #pragma pack(1) eher falsch, denn das bedeuted unter C Ausrichten aufs Byte. Oder?

 

 

mfG erwin

Link to comment

Hi,

Bei mir geht jetzt das Auslesen der EPG, mit pack(1), und die Pointer Event, Title, Description zeigen auch auf Sinnvolles.

 

typedef struct {

WORD EventID;

double Time;

double Duration;

BYTE PresentFollowing;

char *Event;

char *Title;

char *Description;

DWORD Charset;

BYTE Content;

DWORD ServiceID;

DWORD Frequency;

} TEPGEntryStruct;

Link to comment
Hi,

Bei mir geht jetzt das Auslesen der EPG, mit pack(1), und die Pointer Event, Title, Description zeigen auch auf Sinnvolles.

Hi !

 

hab nach dieser Erfolgsmeldung nochmal nachgeschaut. Es bleibt tatsächlich bei #pragma pack(1)

 

Die von Lars_MQ erwähnte 4-Byte-Ausrichtung von Delphi und der DVBViewer-Plugins wird natürlich durch das packed in

 

TMeinRecord = packed record

...

end;

 

dominiert.

 

 

mfG erwin

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...