Delphi SDK für virtualdub nach Lazarus portieren [gelöst]

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Delphi SDK für virtualdub nach Lazarus portieren [gelöst]

Beitrag von KreuzBlick »

Hallo zusammen,

ich habe ein Projekt, das ich gerne nach Lazarus portieren würde. Es handelt sich um das Delphi SDK für virtualdub. Es dient dazu, Filter für das Videobearbeitungsprogramm virtualdub zu schreiben.
Dafür gibt es zwar ein SDK des Originalautors von virtualdub, das aber für die Sprache visual C/C++ konzipiert ist.

Nun hat im Jahr 2005 Fernando Reis freundlicherweise dieses SDK nach Delphi portiert und ich hatte das damals auch benutzt. Das ist aber nun schon eine Weile her. Nun würde ich gerne meine damaligen Projekte wieder überarbeiten. Und irgendwo auf meiner Systemplatte gibt es sicher noch ein altes Delphi 7. Aber es wäre doch viel schöner, das jetzt in Lazarus zu machen. Das gäbe dem SDK wieder ein neues Leben und würde auch Lazarus noch attraktiver machen.

Dieses Delphi SDK war früher auch im Internet zu finden. Seit vielen Jahren ist es jedoch nicht mehr auffindbar, so dass das erste, was ich tun muss, ist, diese Daten wieder zur Verfügung zu stellen. Ich nehme an, dass der Originalverfasser damit einverstanden ist, da er seine Arbeit ausdrücklich unter die GPL gestellt hat.

Leider ist eine direkte Verwendung in Lazarus nicht möglich. Eine Portierung nach Lazarus ist mir bisher nicht gelungen. Was getan werden muss, ist zunächst, eine unit namens VdFilter.pas in Lazarus zu compilieren. Die Datei befindet sich im Delphi SDK im Verzeichnis "include". Einige Dinge habe ich schon herausgefunden.
1. muss man vor "interface" eine Zeile "{$mode delphi}" einfügen.
2. muss man bei der Deklaration einer Prozedur vor "implementation" das "forward;" entfernen und
3. muss man wegen der Verwendung von Assemblercode irgendwo(?) die Compilerdirektive "{$ASMMODE intel}" einsetzen.
Dann läuft die Compilierung bis zur Zeile

Code: Alles auswählen

  CALL DWORD PTR TFilterPreviewInterface([EAX]).SetButtonCallback; // Call function
mit der Fehlermeldung
Error: Asm: [call mem32] invalid combination of opcode and operands

An der Stelle musste ich dann endgültig passen.
Vielleicht kann ja jemand mit der Fehlermeldung etwas anfangen.
Dateianhänge
Delphi SDK.zip
(77.57 KiB) 67-mal heruntergeladen
Zuletzt geändert von KreuzBlick am Mi 22. Feb 2023, 11:26, insgesamt 2-mal geändert.
Viele Grüße
Gerold

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Delphi SDK nach Lazarus portieren

Beitrag von theo »

Hab's nicht angeschaut, aber mal so als Schuss ins Blaue würde ich sagen, dass du 32bit Assembler auf einem 64bit System kompilieren willst.

eax -> rax

Aber eigentlich habe ich keine Ahnung. :wink:

TSchnuckenbock
Beiträge: 118
Registriert: Do 20. Jul 2017, 23:47
OS, Lazarus, FPC: Win7 und Win10
CPU-Target: xxBit
Wohnort: Südheide (Schnuckenland)

Re: Delphi SDK nach Lazarus portieren

Beitrag von TSchnuckenbock »

Ich hab mir das SDK mal vorgenommen und das Tutorial 3 auf einem Delphi XE5 mit 32 Bit Zielplattform erzeugt: Geht.

Dann 64 Bit Zielplattform hinzugefügt und erzeugt: Geht nicht z.B. mit Fehler "E2107 Operandengröße stimmt nicht überein" in Zeile 556 im VDFilter.pas beim

Code: Alles auswählen

MOV ECX, [EAX].FCObj; // Instance pointer needs to be in ECX for VC++ objects
Für andere Code-Zeilen wird dann z.B. noch öfters der Fehler "Ungültige Kombination von Opcode und Operanden" angezeigt, z.b. auch bei der Zeile

Code: Alles auswählen

 CALL DWORD PTR TFilterPreviewInterface([EAX]).SetButtonCallback; // Call function
Ich denke, daß theo mit seiner Vermutung richtig lag, daß der ASM-Code die Zielplatform 32 Bit hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6776
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Delphi SDK nach Lazarus portieren

Beitrag von af0815 »

Dann sollte man tunlichst die Portierung auf Lazarus auf 32Bit vornehmen. Und da ist ein 32Bit fpc/Lazarus gespann von Vorteil.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Delphi SDK nach Lazarus portieren

Beitrag von KreuzBlick »

So, es geht weiter.
Zunächst mal vielen Dank für die wertvollen Hinweise. Es scheint tatsächlich das Problem zu sein, dass das ein 32bit-Projekt ist.

Also habe ich mir ein Lazarus 32bit installiert und das Projekt so vorbereitet, wie oben unter 1. - 3. beschrieben. Tatsächlich läuft es beim Compilieren nun weiter durch und stoppt erst an einer späteren Stelle. Es scheint so zu sein, dass es nur noch eine Art von Fehler bis zum Schluss gibt, so dass es sich lohnt, weiter zu forschen.
Die Stelle ist:

Code: Alles auswählen

function TVFBitmap.StretchBltBilinearFast(x1, y1: TPixCoord; dx, dy: TPixDim;
  const src: PCObj_VFBitmap; x2, y2, dx2, dy2: double): Boolean; register;
asm
  PUSH DWORD PTR dy2.DoubleHiLo.Hi;
  PUSH DWORD PTR dy2.DoubleHiLo.Lo;
  PUSH DWORD PTR dx2.DoubleHiLo.Hi;
  PUSH DWORD PTR dx2.DoubleHiLo.Lo;
  PUSH DWORD PTR y2.DoubleHiLo.Hi;
  PUSH DWORD PTR y2.DoubleHiLo.Lo;
  PUSH DWORD PTR x2.DoubleHiLo.Hi;
  PUSH DWORD PTR x2.DoubleHiLo.Lo;
  PUSH src;
  PUSH dy;
  PUSH &dx;
  PUSH y1;
  PUSH x1;
  MOV ECX, [EAX].FCObj;
  MOV EAX, [ECX];
  CALL DWORD PTR TVFBitmapInterface([EAX]).StretchBltBilinearFast;
end;
Der Fehler tritt in allen "PUSH"-Zeilen auf, die Fehlermeldung lautet: "Error building record offset". Es kommt weiter unten noch eine ähnliche Prozedur, so dass der Fehler insgesamt 16-mal gemeldet wird.
Ich werde weiter forschen, bin aber für alle Tipps weiterhin dankbar.
Viele Grüße
Gerold

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Delphi SDK nach Lazarus portieren

Beitrag von theo »

Ich mache noch einen Schuss ins Blaue: https://www.freepascal.org/docs-html/prog/progsu60.html

Aber wie immer: Ich habe keine Ahnung! :wink:

KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Delphi SDK nach Lazarus portieren

Beitrag von KreuzBlick »

Erst mal vielen Dank für den Hinweis, leider hat er mich nicht weitergebracht.

So habe ich versucht nachzuvollziehen, was in der Zeile passiert, die der Compiler bemängelt:

Code: Alles auswählen

  PUSH DWORD PTR dy2.DoubleHiLo.Hi;
PUSH DWORD PTR legt 4 byte auf den Stack. dy2 ist vom Typ double und umfasst 8 byte. Die Vermutung liegt nahe, dass mit Hi und Lo diese 8 byte in zwei Vierergruppen aufgesplittet werden sollen. Aber was ist DoubleHiLo?
Das steht im Quelltext weiter oben:

Code: Alles auswählen

type
  //This type is used to put a double (8 bytes) into the stack half by half.
  DoubleHiLo = record
    Lo: LongWord;
    Hi: LongWord;
  end;
Das ist ein Typ, der diese Aufspaltung ermöglichen soll. Also soll dy2 vom Typ double in den Typ DoubleHiLo umgewandelt werden, so dass dann auf die Komponenten Hi und Lo zugegriffen werden kann. Ich vermute, dass diese Typumwandlung nicht funktioniert, so dass die Variable in Klammern hinter den Typ geschrieben werden muss. Meine Zeile, die den Fehler verursacht hat, muss also geändert werden in:

Code: Alles auswählen

  PUSH DWORD PTR DoubleHiLo(dy2).Hi;
Das mache ich 16-mal. Tatsächlich sind die Fehlermeldungen weg.
Tief durchatmen!
Leider gibt es zwei neue Fehlermeldungen bzw. Warnungen, nicht in der unit, sondern im aufrufenden Hauptprogramm.
Die Warnung besagt, dass es die Compilerdirektive

Code: Alles auswählen

{$E .vdf}
im Hauptprogramm nicht gibt. Sie soll dafür sorgen, dass die erzeugte dll nicht die Erweiterung .dll hat sondern ,vdf.

Ich denke mal, wenn es nur das ist ...

Aber es gibt noch einen Fehler. Damit kann ich mich aber erst morgen beschäftigen, ich werde berichten.
Viele Grüße
Gerold

KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Delphi SDK nach Lazarus portieren

Beitrag von KreuzBlick »

Wie schon berichtet, gibt es im Hauptprogramm noch einen Fehler.

Code: Alles auswählen

Const
  filterDef_tutorial: TFilterDefinition = (
    next:           nil;
    prev:           nil;
    ...
    initProc:       nil;
    deinitProc:     nil;
--> runProc:        tutorialRunProc;
    paramProc:      nil;
    configProc:     nil;
    ...
    fssProc:        nil);
Der Fehler entsteht in der Zeile, die mit runProg beginnt. Die Fehlermeldung besagt etwas über inkompatible Typen und ist nicht sehr hilfreich.
Worum geht es hier: Es werden die Einsprungadressen verschieldene Prozeduren und Funktionen zusammengestellt. Da die anderen Werte mit nil übergeben werden, entsteht da kein Fehler. Aber die Einsprungadresse zur Funktion tutorialRunProg wird falsch angegeben. Des Rätsels Lösung: Für diese Adresse gibt es die Funktion addr() oder kurz @.
Ersetzen wir die fehlerhafte Zeile durch

Code: Alles auswählen

    runProc:        @tutorialRunProc;
so läuft die Compilierung ohne Fehler durch. Das muss auch beachtet werden, wenn weitere Funktionen verwendet werden.

Die Übertragung nach Lazarus hat funktioniert. Ich kann das Problem als gelöst betrachten und markieren.

Eine Sache bleibt: Gibt es in Lazarus wirklich kein Äquivalent zur Compileroption {$E .vdf}?
Viele Grüße
Gerold

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Delphi SDK nach Lazarus portieren

Beitrag von theo »

KreuzBlick hat geschrieben: Mi 22. Feb 2023, 11:23 Eine Sache bleibt: Gibt es in Lazarus wirklich kein Äquivalent zur Compileroption {$E .vdf}?
Was ist das?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1645
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Delphi SDK für virtualdub nach Lazarus portieren [gelöst]

Beitrag von fliegermichl »

Man kann unter Projekt -> Projekteinstellungen -> Compilereinstellungen -> Pfade den Namen der Ausgabedatei einstellen. Ob es dafür auch einen Compilerswitch gibt, weiß ich nicht.

KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Delphi SDK nach Lazarus portieren

Beitrag von KreuzBlick »

Compileroption {$E .vdf}
Was ist das?
Normalerweise bekommt eine library in compilierter Form die Endung .dll.
Dieser Schalter sorgt unter Delphi dafür, dass die Endung .vdf wird.

Es ist natürlich keine große Sache, diese Umbenennung von Hand vorzunehmen. Dennoch wäre ein solcher Schalter eine Erleichterung. Ich kann mir auch nicht vorstellen, dass die Implementierung schwierig wäre.
Viele Grüße
Gerold

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2809
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Delphi SDK für virtualdub nach Lazarus portieren [gelöst]

Beitrag von m.fuchs »

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

KreuzBlick
Beiträge: 41
Registriert: Fr 3. Mai 2019, 17:45
OS, Lazarus, FPC: Win11 (L 3.6 FPC 3.2.2)
CPU-Target: 64Bit
Wohnort: Saarland

Re: Delphi SDK für virtualdub nach Lazarus portieren [gelöst]

Beitrag von KreuzBlick »

Vielen Dank, wieder etwas gelernt :D
Viele Grüße
Gerold

PascalDragon
Beiträge: 955
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Delphi SDK nach Lazarus portieren

Beitrag von PascalDragon »

KreuzBlick hat geschrieben: Mi 22. Feb 2023, 13:52 Es ist natürlich keine große Sache, diese Umbenennung von Hand vorzunehmen. Dennoch wäre ein solcher Schalter eine Erleichterung. Ich kann mir auch nicht vorstellen, dass die Implementierung schwierig wäre.
In Lazarus macht man dies normal über die Projekteinstellungen: Projekt -> Projekteinstellungen -> Compilereinstellungen -> Pfade -> Ziel-Dateiname (-o). Dort kannst du den gewünschten Dateinamen inklusive Endung angeben (wenn du Konvention anwenden deaktivierst).
FPC Compiler Entwickler

Antworten