Pipeline freeze after multiple pad probe
MichaelHsu170
michaelhsu170 at gmail.com
Thu Mar 9 06:21:38 UTC 2017
Hi all,
My pipeline is illustrated as the following.
===========================================================================
videotestsrc--convert--queue--h264--queue_mux_v--muxer--queue--filesink
audiotestsrc--convert--resample--queue--aac--queue_mux_a--
===========================================================================
I need to save the video/audio streaming into different files, splited by a
fixed time interval, so I block both of the src pads of GstElement
queue_mux_v and queue_mux_a to replace elements from muxer with new ones,
and then resume the flow.
A timeout is set in the main function, and inside its callback function
probes are added onto source pads of GstElement h264 and aac, respectively.
===========================================================================
typedef struct _CustomData {
GMainLoop *main_loop; /* GLib's Main Loop */
GstElement *pipeline_main;
gulong probe_v;
gulong probe_a;
} CustomData;
GstPadProbeReturn on_probe_v_cb(GstPad *pad, GstPadProbeInfo *info, gpointer
user_data)
{
g_print("event_probe_v\n");
CustomData *data = (CustomData*)user_data;
// data->probe_v = GST_PAD_PROBE_INFO_ID(info);
g_print("probe_return_v\n");
return GST_PAD_PROBE_OK;
}
GstPadProbeReturn on_probe_a_cb(GstPad *pad, GstPadProbeInfo *info, gpointer
user_data)
{
g_print("event_probe_a\n");
CustomData *data = (CustomData*)user_data;
// data->probe_a = GST_PAD_PROBE_INFO_ID(info);
g_print("probe_return_a\n");
return GST_PAD_PROBE_OK;
}
gboolean on_timeout(gpointer arg) {
g_print("timer timeout\n");
CustomData *data = (CustomData*)arg;
GstElement *bin;
GstPad *pad;
bin = gst_bin_get_by_name(GST_BIN(data->pipeline_main), "queue_mux_h264");
pad = gst_element_get_static_pad(bin, "src");
data->probe_v = gst_pad_add_probe(pad,
GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, on_probe_v_cb, arg, NULL);
gst_object_unref(pad);
bin = gst_bin_get_by_name(GST_BIN(data->pipeline_main), "queue_mux_aac");
pad = gst_element_get_static_pad(bin, "src");
data->probe_a = gst_pad_add_probe(pad,
GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM, on_probe_a_cb, arg, NULL);
gst_object_unref(pad);
g_print("timeout_return\n");
return FALSE;
}
int main(int argc, char *argv[]) {
...
CustomData data;
...
g_timeout_add(3000, on_timeout, &data);
...
}
===========================================================================
EOS will be fired through muxer--queue-filesink in any of the probe callback
functions. In filesink's probe callback function, the muxer-queue-filesink
will be replaced, and then probes will be removed to resume the flow
.
The PROBLEM now is that once the src pad of either queue_mux_v or
queue_mux_a get blocked, the pipeline seems to be blocked as well. I cannot
see the g_print inside the callback function of another probe.
E.g. output of the program is
===========================================================================
timer timeout
timeout_return
event_probe_v
probe_return_v
===========================================================================
However, What I expect is
===========================================================================
timer timeout
timeout_return
event_probe_v
probe_return_v
event_probe_a
probe_return_a
===========================================================================
How can I solve the problem?
Many thanks!!!
--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/Pipeline-freeze-after-multiple-pad-probe-tp4682132.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.
More information about the gstreamer-devel
mailing list