gst_bin_add_many

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

gst_bin_add_many

Beitrag von Mathias »

Die Funktion gst_bin_add_many ist 2 mal in gstutils.inc vorhanden.
So wie ich festgestellt, habe, funktioniert die Variante ohne "array of const" niemals, und löst ein SIGSEV aus, da es am Ende immer ein "nil" braucht.

Wen man nur ein Element hinzufügen will, gibt es alternativ "gst_bin_add".

Soll ich dies als Bug melden ?

Bei "gst_bin_remove_many" ist das gleiche Problem.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: gst_bin_add_many

Beitrag von Zvoni »

Wie kommst du auf das dünne Eis?

Code: Alles auswählen

program Project1;

procedure test(s: String; i: Integer; args: array of const);
Var
  j:integer;
  a:String;
begin
  For j:=low(args) to High(args) Do
    Begin
    a:=string(args[j].VAnsiString);
    Writeln('With args', s,i,a);
    end;
end;

procedure test(s: String; i: Integer);
begin
  Writeln('Without args',s,i);
  Test(s,i,[]);
end;

begin
  test('Without',42);
  test('With',100,['test1','test2']);
end.
Funzt ohne Probleme (Laz2.2.2/FPC3.2.2-32Bit Windows).
Es wird jedesmal die richtige überladene Funktion aufgerufen.

Und wie kommst du darauf, dass es am Ende immer ein Nil braucht?!?!?!
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: gst_bin_add_many

Beitrag von Mathias »

Es wird jedesmal die richtige überladene Funktion aufgerufen.
Du verwechselst Äpfel mit Birnen.

Das dein Beispiel funktioniert, ist mir schon klar.
Und wie kommst du darauf, dass es am Ende immer ein Nil braucht?!?!?!
Du muss diesen Funktions beschrieb angucken.
Da wird zwingend ein "nil" am Ende verlangt.
Und dies ist vielfach bei C-Libs so, wen es ein varargs ist.
printf ist da eher die Ausnahme, da man schon im Formatstring angibt, wie viele Elemente es in varargs braucht.

https://gstreamer.freedesktop.org/docum ... n_add_many
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: gst_bin_add_many

Beitrag von Zvoni »

Ich hab GStreamer nicht bei mir installiert.
Aber deine Aussage lese ich so, dass es von Pascal aus die "falsche" Funktion zieht, und das kann ich mir eben nicht vorstellen.

Kannst du mal die zwei Pascal-Signaturen aus der inc hier reinstellen?

EDIT: Hmmm..... https://www.freepascal.org/daily/packag ... _many.html

Code: Alles auswählen

procedure gst_bin_add_many(
  bin: PGstBin;
  element_1: PGstElement;
  args: array of Const
);

procedure gst_bin_add_many(
  bin: PGstBin;
  element_1: PGstElement
);

//Zusätzlich....
function gst_bin_add(
  bin: PGstBin;
  element: PGstElement
):TGboolean;
OK, und welche von den beiden funktioniert nie? UNd wo soll bei der zweiten Variante ein Nil hin?
Ich wäre nicht überrascht, wenn im Code bei der zweiten Variante einfach gst_bin_add, bei der ersten Variante dann noch eine ZUSÄTZLICHE Schleife für gst_bin_add aufgerufen wird.
So wie ich das lese, wird da nie ein NIL mitgegeben.
Achtung: Das ist ne Vermutung. Wie gesagt. Hab das Package nicht installiert

Code: Alles auswählen

Begin
//1 Element hinzufügen
gst_bin_add_many(MyBin, MyElement);  //-->Ruft einmal gst_bin_add(MyBin, MyElement) auf

//Mehrere Elemente hinzufügen
gst_bin_add_many(MyBin, MyElement1, [MyElement2, MyElement3, MyElement4]); 
//-->Ruft einmal gst_bin_add(MyBin, MyElement1) auf, 
//und dann ZUSÄTZLICH eine Schleife Low(args) To High(args) Do gst_bin_add(MyBin, args[i])
End;
EDIT2: https://gitlab.freedesktop.org/gstreame ... t/gstbin.c (Zeile 254)
Wobei ich überrascht bin, wieso gst_bin_add in Pascal eine Funktion mit einem Boolean-Result ist, wenn es in C ein "void" (Procedure?) ist
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: gst_bin_add_many

Beitrag von Mathias »

Wobei ich überrascht bin, wieso gst_bin_add in Pascal eine Funktion mit einem Boolean-Result ist, wenn es in C ein "void" (Procedure?) ist
Dies ist jetzt aber echt spannend.
Bei deinem Link ist es void und in meinem Header ist es gboolen.

Code: Alles auswählen

gboolean	gst_bin_add			(GstBin *bin, GstElement *element);
gstbin.h Zeile 76

Edit: Jetzt ist der Fall klar, du hast ein echtes Museumsstück erwischt, 22 Jahre alt.
Und meine gstbin.c ist brandneu.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: gst_bin_add_many

Beitrag von Zvoni »

Mathias hat geschrieben: Di 20. Aug 2024, 13:50 Edit: Jetzt ist der Fall klar, du hast ein echtes Museumsstück erwischt, 22 Jahre alt.
Und meine gstbin.c ist brandneu.
Och menno.... :lol: :lol:

Wobei ich jetzt aber echt blind bin?
https://gitlab.freedesktop.org/gstreame ... t/gstbin.h
Wo zum Henker ist gst_bin_add_many?!?!??!
Und das ist der "main"-Branch (Trunk)
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: gst_bin_add_many

Beitrag von Mathias »

Wo zum Henker ist gst_bin_add_many?!?!??!
Mit dieser Funktion kann man mehrere GstElemente auf einmal hinzufügen.
Ohne das many nur eines.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
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: gst_bin_add_many

Beitrag von af0815 »

Mathias hat geschrieben: Di 20. Aug 2024, 16:46
Wo zum Henker ist gst_bin_add_many?!?!??!
Mit dieser Funktion kann man mehrere GstElemente auf einmal hinzufügen.
Ohne das many nur eines.
Zvoni hat nur gemeit, das es in den aktuellen Headern fehlt, bzw. wo ist das hin verschwunden. Ich habe auch gesucht, in den aktuellen Headern (gstbin.h) ist es nicht enthalten, in der Doku sehr wohl. Was es macht ist klar und das man es selbst sehr leicht implemtieren kann, ist auch klar, es iteriert ja nur durch die Liste, Also keine Hexenkunst. Nur in den Headern dort wo man es erwarten würde ist es nicht mehr drinnen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: gst_bin_add_many

Beitrag von Mathias »

Zvoni hat nur gemeit, das es in den aktuellen Headern fehlt, bzw. wo ist das hin verschwunden. Ich habe auch gesucht, in den aktuellen Headern (gstbin.h) ist es nicht enthalten, in der Doku sehr wohl. Was es macht ist klar und das man es selbst sehr leicht implemtieren kann, ist auch klar, es iteriert ja nur durch die Liste, Also keine Hexenkunst. Nur in den Headern dort wo man es erwarten würde ist es nicht mehr drinnen.
Ich habe gerade die neuster Version von gstreamer gezogen.
Die Funktion gibt es immer noch.
Sie ist in gstutils.h Zeile 1145.

Ich habe noch in der stable geguckt, welche bei Mint dabei ist, sie ist auch dort in gstutils.h .
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6762
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: gst_bin_add_many

Beitrag von af0815 »

Ok, dann ist es jetzt woanders. In der Namensgebung von gstreamer würde man das normalerweise in gstbin.h erwarten (Normalerweise wird gst_bin zu gstbin.h für die Header). Beim Projekt ist aber in den letzten 2 Jahren offensichtlich sehr viel restrukturiert worden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: gst_bin_add_many

Beitrag von Zvoni »

Ok, gefunden.
Und wie ich es mir gedacht habe (und auch schon erwähnt wurde): es iteriert über die varags und ruft gst_bin_add jedesmal auf.

Also zurück zum original Problem: wo soll im Pascal-Aufruf ein Nil hin?
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: gst_bin_add_many

Beitrag von Mathias »

Also zurück zum original Problem: wo soll im Pascal-Aufruf ein Nil hin?
Ich dachte, du hast das Original in C angeguckt ?
Dort hat es eine while Schleife., die solange durchläuft, bis nil kommt.

Also, wen du Pascalseitig die Funktion ohne nil am Ende aufrufst, dann, dann knallt es.

Einzig was bei der der Funktion ohne "array of const" funktioniert ist die, was aber keinen Sinn macht.

Code: Alles auswählen

var
  a : PGstElement;
  bin: PGstBin;

Code: Alles auswählen

  gst_bin_add_many(bin, nil);
Somit kommt nur die Funktion mit "array of const" in Frage.

Code: Alles auswählen

  gst_bin_add_many(bin, a,[nil]);
Die sauberste Lösung wäre, wen es so deklariert wäre.

Code: Alles auswählen

procedure gst_bin_add_many(bin: PGstBin; element_1: PGstElement); varargs; cdecl; external gstreamerlib;
Nur ist dies schwierig bei einer bestehenden Unit umzusetzen, da es nicht abwärts kompatibel ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Zvoni
Beiträge: 363
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: gst_bin_add_many

Beitrag von Zvoni »

Mathias hat geschrieben: Mi 21. Aug 2024, 08:38

Code: Alles auswählen

var
  a : PGstElement;
  bin: PGstBin;

Code: Alles auswählen

  gst_bin_add_many(bin, nil);
 .....
 gst_bin_add_many(bin, a,[nil]); 
 
und genau hier sitzt dein Problem!
Nur um 1 Element hinzuzufügen

Code: Alles auswählen

  gst_bin_add_many(bin, a);
Mehrere Elemente hinzufügen

Code: Alles auswählen

var
  a,b,c : PGstElement;
  bin: PGstBin;

Code: Alles auswählen

  gst_bin_add_many(bin, a,[b,c]);

C erkennt von alleine, dass da nix mehr kommt

Code: Alles auswählen

void
gst_bin_add_many (GstBin * bin, GstElement * element_1, ...)
{
  va_list args;

  g_return_if_fail (GST_IS_BIN (bin));
  g_return_if_fail (GST_IS_ELEMENT (element_1));

  va_start (args, element_1);

  while (element_1) {
    gst_bin_add (bin, element_1);

    element_1 = va_arg (args, GstElement *);
  }

  va_end (args);
}
element_1 ist ein Zeiger!
Bedeutet: Der C-Code erkennt von alleine, dass ein Null-Zeiger nach dem letzten kommt

Zumindest verstehe ich es so.

EDIT: Ich glaube ich versteh dich jetzt:
Also, wen du Pascalseitig die Funktion ohne nil am Ende aufrufst, dann, dann knallt es.
Du meinst wenn du so wie ich es oben beschreibe (ohne Nil), bekommst du ein SIGSEV??
Ergibt ja mal gar keinen Sinn, weil das würde ja bedeuten, dass die gesamte GStreamer-Lib schon immer "falsch" lief

EDIT3: Ok, sehs gerade als Kommentar im C-Quelltext
Adds a %NULL-terminated list of elements to a bin.
NULL-Terminated.
Mathias hat recht. Man muss nen Null-Zeiger mitliefern

Wie sieht denn der Pascal-Code aus für die Variante ohne Array of Const?
Also was steht tatsächlich in der Pascal-Prozedur?
Ruft diese stumpf die C-Funktion auf?
Weil ich hätte ne Idee, ohne die Signatur ändern zu müssen

EDIT2: Mannomann..... ist ja in FPC schon mal ein Act, ein Element an ein Array of Const hinzuzufügen......
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten