Jump to content
t5b6_de

Plugin-API DVBViewer (Media Server)

Recommended Posts

t5b6_de

Hallo zusammen, 

 

ich möchte für den DVBViewer und den Media Server plugins schreiben die  (im ersten Schritt Daten im TS-Datenstrom abgreifen, später dann auch manipulieren)
 

Gibt es irgendwo ein Projektbeispiel für Visual Studio in c++ oder c?

Ich konnte leider keines finden, oder war nicht in der Lage einen passenden Suchbegriff zu formulieren.

 

Grüße

Thomas

Share this post


Link to post
Griga

Dieses Thema scheint mir als Einstiegspunkt geeignet. Gefunden mit

 

site:dvbviewer.tv "C++"

 

in Google.

 

Share this post


Link to post
t5b6_de

Danke, ich schaue mir das die Tage mal an.
Sollte das so funktionieren wie ich hoffe, stelle ich gerne ein SDK mit den Einsprungspunkten und ggf. Beispielen hier zur Verfügung.

Share this post


Link to post
hackbart

Das ist allerdings für das COM Interface. Zum Abgreifen von TS Paketen braucht es die, nennen wir die Api mal Low-Level Api. Ich glaube die Beispiele sollten im Mitgliederbereich zu finden sein. Ist schon etliche Jahre her. Ich suche morgen am PC mal passende Schnipsel.

Share this post


Link to post
t5b6_de

Danke dir!

 

Dass das die COM-Api ist, habe ich auch gerade bemerkt, dafür habe ich bereits vor einiger Zeit ein Projekt in C# geschrieben.

Bin jetzt erst dazu gekommen.


Ich möchte aber tatsächlich eben an den Stream dran. 

 

Und ja, eine chm gab es, allerdings war die glaube ich nicht ganz vollständig, und die Einsprungpunkte wurden nur in Delphi angegeben.

 

Grüße

 

Nachtrag: tatsächlich benötige ich mehr Infos.
Leider weiß ich nicht wie die Typen aufgebaut sind, was da drin steckt, in TTuner usw.

 

Nachtrag2: Habe gesehen, dass die Infos in dem Delphi-Beispiel stehen. Ich versuche die nächste Zeit wenn ich zu komme mal mein Glück.

Edited by t5b6_de
nachtrag 2

Share this post


Link to post
t5b6_de

Ich habe nun ein Plugin angelegt in Visual Studio 2019, allerdings wird es nicht vom DVBViewer geladen, geschweige denn angefasst.
Gibt es bestimmte Compiler/Linker-Flags, damit der DVBViewer die Dateien überhaupt anfässt?

Quellcode im Anhang. 
 

 

Nachtrag:

declspec(dllexport) vergessen - das ist punkt1

aber wenn ich dann rein schaue in die dll werden alle Funktionen mit einem underscore exportiert.

 

_copyright
_PluginName

 

usw.

 

dann findet der DVBViewer die einnsprungpunkte nicht.

 

Edited by t5b6_de

Share this post


Link to post
Griga

Keine Ahnung. Im Quellcode sehe ich kein Problem. Wenn du die DLL anhängst, kann ich mal mit dem Debugger nachschauen, was im DVBViewer beim Laden passiert.

Share this post


Link to post
t5b6_de

Anbei die dll,

 

wird nicht gehen, weil ich den Compiler/Linker nicht dazu überredet bekomme den underscore wegzulassen.

 

Nachtrag:

Das sog. name mangling and decoration muss abgeschaltet werden.

 

so wird aus _Execute@8 -> _Execute

wie das geht habe ich aber noch nicht herausgefunden.

 

def-datei mit Exports drin, zack stimmt es übrein.

 

Im Anhang ist eine lib, die der DVBViewer jetzt endlich lädt und auch blockiert, wenn der offen ist, aber immer  noch nicht funktioniert.

Unter Hilfe -> Info.. taucht das ding nicht auf.

 

Blockiert aber den DVBViewer, es lässt sich nichts abspielen. Ich teste mal weiter.

 

 

 

 

dvbvplugintest.zip

Edited by t5b6_de

Share this post


Link to post
Griga

 

image.png

Share this post


Link to post
HaraldL

Das Teil ist offensichtlich im Debug-Mode kompiliert (daher VCRUNTIME140D.dll nötig statt VCRUNTIME140.dll). Von daher wäre auch die Debug-Version der VC-Runtime erforderlich, auf dem Rechner mit VS2019 ist die natürlich mit installiert und zum freien Download gibt es die nicht.

Share this post


Link to post
t5b6_de

Sorry,

 

Anbei das  komplette (bisherige) projekt.

 

Habe die release dll im release ordner mit reingepackt.

 

Ich verwende Visual Studio 2019 Community

 

dvbvplugintest.zip

Share this post


Link to post
Griga

Ich finde keine DLL. Mit .h und .cpp Dateien kann ich noch so ungefähr etwas anfangen (d.h. sie lesen), aber der Rest sagt mir überhaupt nichts.

 

Die Sprachbarriere macht sich hier ziemlich bemerkbar ;)

 

Share this post


Link to post
t5b6_de

Drecks Antivierensoftware, blockiert den Zugriff auf die dll beim Zippen (facepalm)


Also soweit bin ich schon, ich habe mir von dem Plugin eine Log schreiben lassen, die Funktionen werdne in der Reihenfolge (und Häufigkeit) ausgeführt:
 

init
libtype
libtype
libtype
pluginname
pluginname
pluginname
pluginname
pluginname
pluginname
apphandle
--> Version 1537

 

Version 1537 hol ich mir über das SendMessage über hwnd, heißt die parameter (zumindest der fensterhandle) werden korrekt übergeben.

 

Dass der DVBViewer die Plugin-geschichten nicht frisst könnte ich mir vorstellen, dass pchar bei Delphi anders aufgebaut ist, als ein char* bei C/C++

 

Die Frage ist hier nun wo der Unterschied liegt.
Ich denke ich komme dem näher wenn ich ein funktionierendes Plugin einmal in einem C++ Programm lade und mir die rückgabe der Funktionen anschaue und es mit meinem Plugin vergleiche.

 

Nachtrag: das sieht soweit alles identisch aus. Habe mir die Plugins reingeholt und die Funktionen libtyp, pluginname usw. geholt.  vom Aufbau der Daten ist das identisch. Keine Ahnung warum der DVBViewer das Plugin nicht frisst.

 

 

dll.zip

Edited by t5b6_de

Share this post


Link to post
t5b6_de

Alles klar, 

 

so langsam komme ich dem auf die Schliche. Der DVBViewer führt die Calls wie angegeben aus. Warum das Plugin dennoch nicht unter Hilfe usw. sichtbar ist weiß ich nicht.

Execute wird ausgeführt. Boolean-Typen von c++ und delphi passen nicht, return 0 scheint zu klappen.
 

 

Bezüglich der CHM-Datei -> Die habe ich im öffentlichen Bereich unter Plugin SDK gefunden, allerdings scheint die tatsächlich stark veraltet zu sein.

 

 

Nachtrag:

Ich komme nun an den Transportstream ran, die EventMsg Funktion wird jedoch nie aufgerufen.
Meinem Verständnis nach müsste der DVBViewer die aber mindestens mehrfach aufrufen, bei Init,  Channel Tune, etc.
Jedoch passiert das nicht.

 

Ich gehe nun ins Bett, euch eine gute Nacht falls ihr das heute noch lesen solltet.

Wenn alles wie gewünscht funktioniert, dann stelle ich hier ein Plugin-SDK Online und versuche es so gut wie möglich zu dokumentieren
 

Edited by t5b6_de

Share this post


Link to post
hackbart

Boolean sind 8bit groß. Bei c++ sind die 32bit (longbool). Pchar ist *char, wobei char nicht wide ist. 

  • Thanks 1

Share this post


Link to post
Griga
Am 22.9.2019 um 22:20 schrieb t5b6_de:

Warum das Plugin dennoch nicht unter Hilfe usw. sichtbar ist weiß ich nicht.

 

Weil der DVBViewer bei der Anzeige unter Hilfe -> Info die Dateiversion mit GetFileVersionInfo abfragt und keine bekommt.

 

Am 22.9.2019 um 22:20 schrieb t5b6_de:

Ich komme nun an den Transportstream ran, die EventMsg Funktion wird jedoch nie aufgerufen.

 

Um sowas mit dem Debugger zu überprüfen, brauche ich immer eine DLL.

 

  • Thanks 1

Share this post


Link to post
t5b6_de

Danke euch!

 

EventMsg wird nun aufgerufen, mein Fehler, hab es in den exports vergessen.

 

Gibt es irgendwo eine aktuelle Liste mit den Events die da durchlaufen?
Bekomme da elendig lange liste
u.a. 11 und 1000 kann ich nicht zuordnen (werde ich aber vielleicht nicht benötigen)
 

Weitere Frage:

Müssen die Methoden Threadsafe sein? Heißt kann es vorkommen, dass bestimmte Methoden parallel aufgerufen werden von mehreren Threads?

 

Gruß

Edited by t5b6_de
weitere frage

Share this post


Link to post
t5b6_de
Posted (edited)

Wenn ich nun bestimmte Packets oder gar ganze Sections beeinflussen möchte, muss ich mehrere packets teilweise anpassen.

 

der PidCallback wird jedoch nur einzeln, singlethreaded aufgerufen.

 

 

wenn ich eine Section anpasse muss  ich packetübergreifend den kram anpassen. Gibt es ein bestimmtes Zeitfenster währenddessen die Packets weiter durch Plugins angepasst werden können? Wenn der PidCallback durchgelaufen ist, muss ich davon ausgehen, dass die Packets weiter durch den DVBViewer(Media Server) verarbeitet werden?


Das Plugin soll später im Recording-Service genutzt werden.

 

Nachtrag: Selbst RawTsCall liefert mir den Stream päckchenweise, aber da bekomme ich dann tatsächlich jedes einzelne päckchen.

Ich muss mir wohl was einfallen lasssen.

 

Edited by t5b6_de

Share this post


Link to post
t5b6_de

Anbei das versprochene Plugin-SDK in Visual Studio 2019 Community.

 

Anders als ursprünglich versprochen ist das ein C# Plugin mit Unmanaged Exports.


Läuft soweit im DVBViewer.

Assembly-Informationen werden in den Projekteigenschaften festgelegt und werden bei Laufzeit an den DVBViewer weitergegeben.

 

der rest sollte Selbsterklärend sein insb. wenn man sich den oben verlinkten Thread anschaut.

 

DvbviewerPluginSDK.zip

Share this post


Link to post

Join the conversation

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

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


  • Similar Content

    • Matthias Grimmeisen
      By Matthias Grimmeisen
      Hallo,
       
      nachdem ich nach langer Zeit ein Aktualisierung durchgeführt und die DVBViewer Pro-Version 6.1.5.0 installiert habe, sind in den Aufnahmedaten (TS-Format) leider nicht mehr die EPG-Informationen (Folgenname, Sendungsbeschreibung etc.) enthalten. Diese waren in der bisher von mir genutzen Version (leider weiß ich nicht mehr, welche dies war) enthalten und wurden in den Eigenschaften der Datei abgelegt bzw. im Explorer-Fenster angezeigt (sh. auch Screenshot im Anhang..
       
      Zwar ist es möglich, zusätzlich eine Textdatei mit diesen Infos anzulegen, doch dann muss ich diese Textdatei immer zusammen mit der Aufnahme verschieben/kopieren/ablegen, was insgesamt deutlich weniger komfortabel und übersichtlich ist.
       
      Gibt es daher eine Einstellung-Möglichkeit (die ich übersehen habe), um die EPG-Infos wieder direkt in der Aufnahmedatei einzubinden? Falls ja, wäre ich über Tipps7Hinweise dankbar!
       
      Gruß,
       
      Matthias

    • nickneutrino
      By nickneutrino
      Always when  i play a transcodec 4K MKV H265 to WEBM stream from Dbviewer Media Web Server appear in the middle of screen a circle.
       
      Anybody knows Is posible remove that circle and for what reason show this circle because the movie plays well? 
    • sveni2211
      By sveni2211
      Hallo.
      Ich wollte mich mal an einem eigenen Plugin versuchen. Als Informations-Quelle habe ich die DVBViewer Plugin SDK Hilfedatei und das Beispielprojekt "myPrograms".
      Will in dem Plugin eigentlich nur ein paar statistische Informationen zum TS Stream abfassen für den Anfang. Als Typ "Plugin". Nicht per COM auf den DVBViewer selbst zugreifen oder so.
      Benutze dafür Delphi 10.3.1. Habe mir ein DLL Projekt erstellt (32 Bit) und folgende Funktionen exportiert:
      - Copyright
      - Version
      - LibTyp
      - PluginName
      - SetAppHandle
      - EventMsg
      - SetMenuHandle
      - MenuItemClick
      - Execute
      - PidCallback
       
      Die ersten 4 Funktionen geben auch Daten zurück.
      Jetzt habe ich die DLL mal in das DVBViewer Plugins Verzeichnis gepackt. Den DVBViewer gestartet und mit dem Process Explorer (aktuelle Version) geschaut, was für DLL geladen werden. Meine DLL ist dabei nicht zu sehen.
      Nehme ich den "DLL Explorer" und schaue mir z.B. die Universal.dll aus dem Plugins-Verzeichnis an und meine DLL, sind die korrekten Exports da (meiner fehlen natürlich die Imports und der Universal die Stream-bezogenen Funktionen).
       
      Habe dann testweise mal "myPrograms" compiliert und in Plugins gelegt - auch diese ist im Process Explorer nicht zu finden. Sie scheinen nicht geladen zu werden. Woran kann das liegen? Was mache ich falsch?
       
      Kann es am Compiler liegen? Brauche ich eventuell ein sehr viel älteres Delphi?
    • AnBad
      By AnBad
      Hallo,
      weiß jemand eine Möglichkeit wie man von FHEM aus EPG_Daten des Mediaservers aufrufen bzw. nach FHEM importieren kann? Also z.B. einmal am Tag für bestimmte Sender das Programm für z.B. die nächsten drei Tage.
       
      Ich weiß es gibt eine API-Schnittstelle im Mediaserver. Aber ich habe da keine Ahnung. Könnte man mit "http://[user]:[password]@[IP]:[port]/api/" Daten im Browser anzeigen lassen, die man dann mit Parsing abgreift? Wobei ich nicht einmal weiß, welchen User und Passwort ich in das Link eintragen müsste.
       
      Danke
      Michael
×
×
  • Create New...