Jump to content

OSD und EPG


Recommended Posts

Hallo,

 

wie ich ein OSD-Menü auf den Bildschirm per PlugIn zaubere weiß ich ja nun, aber wenn ich "EPG-Info" oder das OSD-Menü wähle, kommt beide Male das selbe Fenster.

 

Wie kann ich dem Plugin nun klar machen, dass er unterscheiden soll, ob man das EPG-Info-Fenster oder das OSD-Menü haben möchte?

 

Kann ich außerdem noch ein paar Infos zum auslesen der EPG-Daten bekommen? Damit ich diese ins EPG-Info-Fenster packen kann?

 

Viele Grüße

Sascha

 

 

Edit:

 

Bitte noch eine Erkärung der Funktionen "OSDExecute" und "OSDAddEntries".

 

Wie kann man beide nutzen? z.B. die Variabeln "Entries" und "Action".

 

Edit2:

Für LoadEPGData brauch ich die TEPGClass. Die kennt er natürlich nicht, weil sie nirgendswo vorher erwähnt wird. Was brauch ich da für Daten?

Edited by Sascha
Link to comment
Guest Lars_MQ

hmm mal nicht so fix :)

 

Also Du möchtest jetzt genau was tun? ein plugin schreiben, das die osd Darstellung übernimmt?

 

wie ich ein OSD-Menü auf den Bildschirm per PlugIn zaubere weiß ich ja nun, aber wenn ich "EPG-Info" oder das OSD-Menü wähle, kommt beide Male das selbe Fenster.

 

Wie kann ich dem Plugin nun klar machen, dass er unterscheiden soll, ob man das EPG-Info-Fenster oder das OSD-Menü haben möchte?

 

Wenn Du ein richtiges OSD-Plugin schreiben willst, dann musst du auf alle 4 OSD-Typen reagieren (Menu, EPG, EPGInfo, Duration). Du (also Dein Plugin) bekommst vom DVBViewer mitgeteilt, was jetzt angezeigt werden soll und erstellst es entsprechend.

Einfach nur einen Teil rauspicken, das geht nicht, so ist das nicht möglich (und auch nicht sinnvoll).

 

Ich setze mal vorraus, das du die

procedure OSDDisplay(Handle: THandle; Rect: TRect; Typ: TOSDType; Data: TListArray; Buttons: TActionArray; Selected: integer); stdcall;

nimmst. Dort wird dir unter Typ der verlangte OSD-Typ mitgeteilt.

TOSDType  = (otMenu,otEPG,otEPGInfo, otDuration);

 

Was ich dir empfehlen kann ist, in die routine mal ne log-funktion einzubauen, also alles, was geliefert wird in 'ne text-datei schreiben und dann systematisch mal die einzelnen OSD Bereiche des DVBViewer durch zu klicken und Dir mal das log anzuschauen. Das sagt viel mehr als 'n roman von mir hier :D Dort wird das EPG u.a. auch gleich mitgeliefert...

 

Ansonsten gilt, je genauer die Beschreibung deines Problems und Deines Vorgehens ist, desto besser können wir Dir helfen.

 

Gruss

lars

Link to comment

danke für den Tipp mit "otMENU", etc.... das hatte ich übersehen :D

 

Nun habe ich das schon mal hin bekommen :)

 

Ehrlich gesagt, wüsste ich nun nicht, wie ich das mit der Log-Funktion machen könnte....

 

Ich habe für die Sache mit den EPG-Infos folgendes gefunden:

 

TMSG_EPGInfo = record

    Time: TDateTime;

    Duration: TDateTime;

    Title, Info, Description: PChar;

    Charset: Integer;

  end;

 

TEPGData = record

    Now, Next: TMSG_EPGInfo;

 

Wenn ich dann mithilfe von Canvas.TextOut die laufende Sendung angezeigt haben möchte, steht dann entweder gar nichts, oder mal nur ein einziger Buchstabe bzw. Hyroglyph. D.h. (wenn var epg:tepgdata) epg.now.title leer ist, dann fehlen ihm die Informationen. Ich denke mal dafür ist die Prozedure "LoadEPGData", jedoch geht diese nicht (s. 1. Post oben).

Link to comment
Guest Lars_MQ
Ehrlich gesagt, wüsste ich nun nicht, wie ich das mit der Log-Funktion machen könnte....

 

global:

 

var log : TStrings;

 

Beim initialisieren des plugins:

 

log:=TStrings.create;

 

 

in der OSDDisplay:

 

for i:= 0 to 22 do

log.add(Data.caption);

 

hier noch was dir sonst zum loggen einfällt hinzufügen...

 

in der Finalization der DLL:

 

log.savetofile('c:\hierbinich.log');

log. free;

 

(der code ist ohne gewähr :D )

 

damit hast du recht fix einige kilobyte an daten zusammen...

klar funktioniert nur, wenn das plugin sauber mit dem DVBViewer beendet wird... (ist auch nicht für echte debugging zwecke geeignet weil rumms = alle daten weg aus TStrings)

 

kleiner hint: initialization und finalization am besten über die

procedure DLLEntry(dwReason: Integer);
begin
 if dwReason = DLL_PROCESS_DETACH then   // = 0
 begin
   //hier gehts aufs ende zu....
 end
 else
 if dwreason = DLL_PROCESS_ATTACH then   // =1
 begin
  //hier kannste initialisieren....
 end;
end;

begin // hauptteil der DLL
 DLLProc := @DLLEntry;
 DLLEntry(1);
end.

 

Zu deinem Canvas Problem, vielleicht mal nen codeschnippsel wäre nett :)

 

Gruss

Lars

Link to comment

danke. werde das mit der log-funktion nachher mal testen.

 

zum epg:

 

procedure OSDDisplay (Handle:THandle;Rect:TRect;Typ:TOSDType;Data:TListArray;Buttons:TActionArray;Selected:integer);stdcall;
var Canvas:TCanvas;
epg: TEPGData;
begin
Canvas:=TCanvas.create;
Canvas.handle:=handle;
canvas.Brush.Color:=clnavy;
Canvas.FillRect(rect);
Canvas.Font.Color := clwhite;
Canvas.Font.Size := 12;
Canvas.TextOut(rect.Left,rect.Top,epg.Now.Title);
Canvas.destroy;
end;

 

 

Gruß

Sascha

Link to comment
Guest Lars_MQ

Canvas.TextOut(rect.Left,rect.Top,epg.Now.Title);

 

hmm du willst zuviel auf einmal :) ein normales

 

Canvas.TextOut(rect.Left,rect.Top,'Sascha was here');

 

macht er nehme ich mal an...

 

versuch dich erstmal im auslesen der Data : TListArray variable per log. da steht wirklich das epg drin :D (sofern ne epg-seite vom DVBViewer abgerufen wird natürlich).

 

die epgdaten (ob aus der epg.dat oder per abruf) sind ein ganz anderes kapitel, da kriegst du alles und muss dir selber raussuchen, welches epg in bezug auf kanal und uhrzeit anzuzeigen wäre.

 

übrigens überleg ich verzweifelt, was das "LoadEPGData" war. woher hast du die funktion? (auswendig kenn ich die api bei weitem nicht B) )

 

Gruss

lars

Link to comment

ja, wenn ich bei textout selber einen string eingebe, dann geht es.

 

loadepgdata habe ich von christian per mail mal bekommen. das teil poste ich nachher mal.

 

gruß

sascha

Link to comment
Guest hackbart

wichtig ist außerdem, dass die Schnittstelle für das OSD sich geändert hat. Die Parameter sind nun wie folgt:

 

TString4k = Array [0..4095] of char;

TActionRecord = record

caption: TString4k;

Id: Integer;

end;

TActionArray = array[0..3] of TActionRecord;

TListArray = array[0..22] of TActionRecord;

 

Weiterhin sind noch ein paar Funktionen zum hinzufügen eigener Menüpunkte hinzugekommen, sowie die Möglichkeit Befehle abzufangen und auf Eingaben über Keyboard und WinLIRC eigenständig zu reagieren.

 

Christian

Link to comment

Hallo Experten!

 

Ich versuch mich schon eine Weile mit dem OSD (allerdings in C++). Ich kriegs nicht gebacken. Wahrscheinlich habe ich die Philosophie noch nicht durchschaut.

Ich denke OSDDisplay (...) muß im Plugin implementiert werden und wird dann vom DVBViewer gegebenenfalls aufgerufen. Wirds aber nicht. Muß ich noch was initailisieren? Habt Erbarmen und gebt mir ein Code-Schnitzel (Delphi reicht mir) über die allgemeine Struktur eines solchen OSD-Plugins.

 

Gruß Erwin

Link to comment
Guest Lars_MQ

der trick ist in den Einstellungen | Optionen vom DVBViewer unter epg dein osd-plugin einzustellen :-) dann wird deine osddisplay auch aufgerufen...

 

Klar, das Plugingrundgerüst muss stimmen, dafür gibts im membersbereich ja einige beispiele..

 

gruss

lars

Edited by Lars_MQ
Link to comment
der trick ist in den Einstellungen | Optionen  vom DVBViewer unter epg dein osd-plugin einzustellen :-) dann wird deine osddisplay auch aufgerufen...

 

Klar, das Plugingrundgerüst muss stimmen, dafür gibts im membersbereich ja einige beispiele..

 

gruss

lars

Erst mal Dank für deine Bemühungen:

 

Scheint daß ich ziemlich Begriffsstutzig bin. Aber was soll ich wo einstellen?

 

Unter Einstellungen/Optionen/Teletext & EPG finde ich Nichts das OSD betreffend.

 

THX Erwin

Link to comment

fehlermeldung ist weg, datei wird angelegt. super :)

 

nur: der inhalt der log-datei ist stets leer :D

 

var log: TStringList;
// -- Declaration of all Types -------------------------------------------------
procedure OSDDisplay (Handle:THandle;Rect:TRect;Typ:TOSDType;Data:TListArray;Buttons:TActionArray;Selected:integer);stdcall;
var
i:integer;
begin
 for i:= 0 to 22 do
log.add(Data[i].caption);
end;
// -- Exports ------------------------------------------------------------------

exports PluginName;
exports Version;
exports Copyright;
exports LibTyp;
exports OSDDisplay;
exports OSDAspect;
exports OSDExecute;
exports OSDAddEntries;

procedure DLLEntry(dwReason: Integer);
begin
if dwReason = DLL_PROCESS_DETACH then   // = 0
begin
  log.savetofile('c:\hierbinich.log');
  log.Free;
end
else
if dwreason = DLL_PROCESS_ATTACH then   // =1
begin
  log:=TStringList.create;
end;
end;

begin // hauptteil der DLL
DLLProc := @DLLEntry;
DLLEntry(1);
end.

 

@erwin: bei der Skin-Auswahl für das EPG-Info-Fenster.

Edited by Sascha
Link to comment
Guest Lars_MQ

hmm,

 

genau der gleiche code bei mir getestet und innerhalb von 2 minuten gut 13 kb an log... sehr eigenartig

 

 

mal nen anderen weg :-)

debugge deine dll mal direkt aus delphi.

 

Projekt| Optionen | Verzeichnisse/ Bedingungen -> Ausgabeverzeichniss [hier den DVBViewer Pluginfad eintragen]

 

Start | Parameter | Hostanwendung -> hier den DVBViewer.exe inkl. pfad eintragen

 

wenn du jetzt aus delphi raus startest, startet der DVBViewer mit deiner dll und du kannst wie gewohnt breakpoints setzen in deinem code und in ruhe deine werte untersuchen. (naja in ruhe :) der DVBViewer hört sich an wie ne gesprungene platte...)

Edited by Lars_MQ
Link to comment
Guest hackbart

gaanz wichtig. Du wirst das gleiche Problem wie Lars haben. Der DVBViewer ist in D4 entwickelt wurden und das Alignment der Datensätze ist nen anderes als bei >D5.

 

Genau deswegen hab ich die Einträge in der aktuellen Version umgestellt auf feste Datengrößen. Was den Skin angeht, so würde ich mal nicht viel Arbeit investieren, denn das System vom Lars ist schon jetzt extrem flexibel und wenn der OSD Filter ins Spiel kommt, kann fließende Transparenz problemlos im Overlay und anderen Videorendermodis benutzt werden. Wie gesagt es bewegt sich im Untergrund recht viel, also stay tuned :)

 

Christian

Link to comment
Guest Lars_MQ

ja klar sascha, das sollteste im delphi einstellen unter

 

Projekt| Optionen | compiler| Codeerzeugung-> ausrichtung von recordfeldern auf 4!! (gilt für delphi 7 bei 5 und 6 gibts sicher was ähnliches...)

 

sorry hab ich total verdrängt schon :)

 

lars

Edited by Lars_MQ
Link to comment

hab zwar nun in meiner log-datei etwas, aber damit kann man überhaupt nichts anfangen :)

 

Da stehen einfach nur die Texte, die im Menü standen und die Texte aus den EPG-Infos..

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