konstantin_doncov
konstantin_doncov

Reputation: 2879

Pointer to pointer to an array

[This is a common C/C++ question, don't look on the Gst and G types]

I have a pointer to an array with 2 items:

GstElement *videoconvert, *audioconvert;

GstElement *convert_array[2];
convert_array[0] = videoconvert;
convert_array[1] = audioconvert;

Which will pass in the callback function:

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array);

After "pad-added" signal my callback function will receive this pointer(convert_array) as a gpointer type:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data);

In this callback I need to extract my GstElements from the gpointer data, that's my unsuccessful attempt:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
    GstElement videoelem = ((GstElement *)data)[0];
    GstElement audioelem = ((GstElement *)data)[1];
...
}

How can I do this?

Upvotes: 1

Views: 403

Answers (2)

Simo Erkinheimo
Simo Erkinheimo

Reputation: 1397

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
  GstElement videoelem = ((GstElement *)data)[0];
  GstElement audioelem = ((GstElement *)data)[1];
  ...
}

if your gpointer is actually same type as GstElement** then GstElements in the function should be pointer types:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
  GstElement* videoelem = ((GstElement **)data)[0];
  GstElement* audioelem = ((GstElement **)data)[1];
...
}

Upvotes: 2

R Sahu
R Sahu

Reputation: 206667

data needs to be cast to GstElement**, not GstElement*. Remember that convert_array decays to GstElement**, not GstElement* when you use it in the line:

g_signal_connect(decodebin, "pad-added", G_CALLBACK(on_pad_added), convert_array);

Hence, you need to use:

void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {
    GstElement* videoelem = ((GstElement **)data)[0];
    GstElement* audioelem = ((GstElement **)data)[1];
    ...
}

Upvotes: 4

Related Questions