Sorry, I forgot to add -u
to my diff command to create the patch. Here’s the patch:
--- deepstream_test3_app.c 2019-09-11 09:49:43.000000000 +0000
+++ /code/deepstream_test3_app.c 2019-10-03 16:25:09.258070943 +0000
@@ -67,6 +67,8 @@
/* tiler_sink_pad_buffer_probe will extract metadata received on OSD sink pad
* and update params for drawing rectangle, object information etc. */
+GstElement *pipeline = NULL;
+
static GstPadProbeReturn
tiler_src_pad_buffer_probe (GstPad * pad, GstPadProbeInfo * info,
gpointer u_data)
@@ -134,14 +136,37 @@
return GST_PAD_PROBE_OK;
}
+GstPadProbeReturn
+pad_probe_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data) {
+ g_print("in pad probe callback");
+ gst_pad_remove_probe (pad, GST_PAD_PROBE_INFO_ID (info));
+
+ GstElement *uri_decode_bin = gst_bin_get_by_name(GST_BIN(pipeline), "uri-decode-bin");
+ gst_element_set_state (uri_decode_bin, GST_STATE_NULL);
+
+ GstElement *streammux = gst_bin_get_by_name(GST_BIN(pipeline), "stream-muxer");
+ gchar pad_name[16] = { };
+ g_snprintf (pad_name, 15, "sink_%u", 0);
+ GstPad *sinkpad;
+ sinkpad = gst_element_get_static_pad (streammux, pad_name);
+ if (!sinkpad) {
+ g_printerr ("Streammux request sink pad failed. Exiting.\n");
+ return -1;
+ }
+ g_print ("Before release\n");
+ gst_element_release_request_pad (streammux, sinkpad);
+ g_print ("After release\n");
+ gst_object_unref(sinkpad);
+}
+
static gboolean
bus_call (GstBus * bus, GstMessage * msg, gpointer data)
{
GMainLoop *loop = (GMainLoop *) data;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_EOS:
- g_print ("End of stream\n");
- g_main_loop_quit (loop);
+ //g_print ("End of stream\n");
+ //g_main_loop_quit (loop);
break;
case GST_MESSAGE_WARNING:
{
@@ -176,7 +201,26 @@
guint stream_id;
if (gst_nvmessage_parse_stream_eos (msg, &stream_id)) {
g_print ("Got EOS from stream %d\n", stream_id);
- }
+ GstElement *streammux = gst_bin_get_by_name(GST_BIN(pipeline), "stream-muxer");
+ gchar pad_name[16] = { };
+ g_snprintf (pad_name, 15, "sink_%u", 0);
+ GstPad *sinkpad;
+ sinkpad = gst_element_get_static_pad (streammux, pad_name);
+ if (!sinkpad) {
+ g_printerr ("Streammux request sink pad failed. Exiting.\n");
+ return -1;
+ }
+ GstPad *srcpad = gst_pad_get_peer(sinkpad);
+ gst_object_unref(sinkpad);
+ if (!srcpad) {
+ g_printerr ("Peer request source pad failed. Exiting.\n");
+ return -1;
+ }
+
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_BLOCK_DOWNSTREAM,
+ pad_probe_cb, NULL, NULL);
+ gst_object_unref(srcpad);
+ }
}
break;
}
@@ -283,7 +327,7 @@
main (int argc, char *argv[])
{
GMainLoop *loop = NULL;
- GstElement *pipeline = NULL, *streammux = NULL, *sink = NULL, *pgie = NULL,
+ GstElement *streammux = NULL, *sink = NULL, *pgie = NULL,
*nvvidconv = NULL, *nvosd = NULL, *tiler = NULL;
#ifdef PLATFORM_TEGRA
GstElement *transform = NULL;
@@ -370,7 +414,7 @@
#ifdef PLATFORM_TEGRA
transform = gst_element_factory_make ("nvegltransform", "nvegl-transform");
#endif
- sink = gst_element_factory_make ("nveglglessink", "nvvideo-renderer");
+ sink = gst_element_factory_make ("testsink", "nvvideo-renderer");
if (!pgie || !tiler || !nvvidconv || !nvosd || !sink) {
g_printerr ("One element could not be created. Exiting.\n");
Also, the deadlock is seen by playing a single file. Playing two files causes the longer file to stop being processed after the first one is finished and the pad is released.