gst_bin_add_many
-
- 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
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.
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
Mit Java und C/C++ sehe ich rot
- 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
Wie kommst du auf das dünne Eis?
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?!?!?!
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.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- 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
Du verwechselst Äpfel mit Birnen.Es wird jedesmal die richtige überladene Funktion aufgerufen.
Das dein Beispiel funktioniert, ist mir schon klar.
Du muss diesen Funktions beschrieb angucken.Und wie kommst du darauf, dass es am Ende immer ein Nil braucht?!?!?!
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
Mit Java und C/C++ sehe ich rot
- 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
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
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
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
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;
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;
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- 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
Dies ist jetzt aber echt spannend.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
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);
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
Mit Java und C/C++ sehe ich rot
- 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
Och menno....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.


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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- 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
Mit dieser Funktion kann man mehrere GstElemente auf einmal hinzufügen.Wo zum Henker ist gst_bin_add_many?!?!??!
Ohne das many nur eines.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- 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
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.Mathias hat geschrieben: Di 20. Aug 2024, 16:46Mit dieser Funktion kann man mehrere GstElemente auf einmal hinzufügen.Wo zum Henker ist gst_bin_add_many?!?!??!
Ohne das many nur eines.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- 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
Ich habe gerade die neuster Version von gstreamer gezogen.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.
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
Mit Java und C/C++ sehe ich rot
- 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
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).
- 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
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?
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.
-
- 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
Ich dachte, du hast das Original in C angeguckt ?Also zurück zum original Problem: wo soll im Pascal-Aufruf ein Nil hin?
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);
Code: Alles auswählen
gst_bin_add_many(bin, a,[nil]);
Code: Alles auswählen
procedure gst_bin_add_many(bin: PGstBin; element_1: PGstElement); varargs; cdecl; external gstreamerlib;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
- 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
und genau hier sitzt dein Problem!Mathias hat geschrieben: Mi 21. Aug 2024, 08:38Code: 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]);
Nur um 1 Element hinzuzufügen
Code: Alles auswählen
gst_bin_add_many(bin, a);
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);
}
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:
Du meinst wenn du so wie ich es oben beschreibe (ohne Nil), bekommst du ein SIGSEV??Also, wen du Pascalseitig die Funktion ohne nil am Ende aufrufst, dann, dann knallt es.
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
NULL-Terminated.Adds a %NULL-terminated list of elements to a bin.
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.
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.