Need help on adding RTSP support in nvdsanalytics example

Hi,
Please refer to the patch:

diff --git a/apps/deepstream/sample_apps/deepstream-nvdsanalytics-test/deepstream_nvdsanalytics_test.cpp b/apps/deepstream/sample_apps/deepstream-nvdsanalytics-test/deepstream_nvdsanalytics_test.cpp
index c7ae52d..2a38c1e 100644
--- a/apps/deepstream/sample_apps/deepstream-nvdsanalytics-test/deepstream_nvdsanalytics_test.cpp
+++ b/apps/deepstream/sample_apps/deepstream-nvdsanalytics-test/deepstream_nvdsanalytics_test.cpp
@@ -21,6 +21,7 @@
  */
 
 #include <gst/gst.h>
+#include <gst/rtsp-server/rtsp-server.h>
 #include <glib.h>
 #include <stdio.h>
 #include <math.h>
@@ -278,22 +279,86 @@ create_source_bin (guint index, gchar * uri)
   return bin;
 }
 
+static GstRTSPServer *server;
+static gboolean
+start_rtsp_streaming (guint rtsp_port_num, guint updsink_port_num,
+                      guint64 udp_buffer_size)
+{
+  GstRTSPMountPoints *mounts;
+  GstRTSPMediaFactory *factory;
+  char udpsrc_pipeline[512];
+
+  char port_num_Str[64] = { 0 };
+  char *encoder_name;
+
+  if (udp_buffer_size == 0)
+    udp_buffer_size = 512 * 1024;
+
+  sprintf (udpsrc_pipeline,
+      "( udpsrc name=pay0 port=%d buffer-size=%lu caps=\"application/x-rtp, media=video, "
+      "clock-rate=90000, encoding-name=H265, payload=96 \" )",
+      updsink_port_num, udp_buffer_size);
+
+  sprintf (port_num_Str, "%d", rtsp_port_num);
+
+  server = gst_rtsp_server_new ();
+  g_object_set (server, "service", port_num_Str, NULL);
+
+  mounts = gst_rtsp_server_get_mount_points (server);
+
+  factory = gst_rtsp_media_factory_new ();
+  gst_rtsp_media_factory_set_launch (factory, udpsrc_pipeline);
+
+  gst_rtsp_mount_points_add_factory (mounts, "/ds-test", factory);
+
+  g_object_unref (mounts);
+
+  gst_rtsp_server_attach (server, NULL);
+
+  g_print
+      ("\n *** DeepStream: Launched RTSP Streaming at rtsp://localhost:%d/ds-test ***\n\n",
+      rtsp_port_num);
+
+  return TRUE;
+}
+
+static GstRTSPFilterResult
+client_filter (GstRTSPServer * server, GstRTSPClient * client,
+    gpointer user_data)
+{
+  return GST_RTSP_FILTER_REMOVE;
+}
+
+static void
+destroy_sink_bin ()
+{
+  GstRTSPMountPoints *mounts;
+  GstRTSPSessionPool *pool;
+
+  mounts = gst_rtsp_server_get_mount_points (server);
+  gst_rtsp_mount_points_remove_factory (mounts, "/ds-test");
+  g_object_unref (mounts);
+  gst_rtsp_server_client_filter (server, client_filter, NULL);
+  pool = gst_rtsp_server_get_session_pool (server);
+  gst_rtsp_session_pool_cleanup (pool);
+  g_object_unref (pool);
+}
+
 int
 main (int argc, char *argv[])
 {
   GMainLoop *loop = NULL;
   GstElement *pipeline = NULL, *streammux = NULL, *sink = NULL, *pgie = NULL,
              *nvtracker = NULL, *nvdsanalytics = NULL,
-      *nvvidconv = NULL, *nvosd = NULL, *tiler = NULL;
-#ifdef PLATFORM_TEGRA
-  GstElement *transform = NULL;
-#endif
+      *nvvidconv = NULL, *nvosd = NULL, *tiler = NULL,
+      *transform = NULL, *encoder = NULL, *parse= NULL, *rtppay = NULL;
   GstBus *bus = NULL;
   guint bus_watch_id;
   GstPad *nvdsanalytics_src_pad = NULL;
   guint i, num_sources;
   guint tiler_rows, tiler_columns;
   guint pgie_batch_size;
+  guint udp_port = 5400;
 
   /* Check input arguments */
   if (argc < 2) {
@@ -372,11 +437,11 @@ main (int argc, char *argv[])
   /* Create OSD to draw on the converted RGBA buffer */
   nvosd = gst_element_factory_make ("nvdsosd", "nv-onscreendisplay");
 
-  /* Finally render the osd output */
-#ifdef PLATFORM_TEGRA
-  transform = gst_element_factory_make ("nvegltransform", "nvegl-transform");
-#endif
-  sink = gst_element_factory_make ("nveglglessink", "nvvideo-renderer");
+  transform = gst_element_factory_make ("nvvideoconvert", "nvvideo-converter2");
+  encoder = gst_element_factory_make ("nvv4l2h265enc", "hardware-encoder");
+  parse = gst_element_factory_make ("h265parse", "h265-parser");
+  rtppay = gst_element_factory_make ("rtph265pay", "rtp-payer");
+  sink = gst_element_factory_make ("udpsink", "udp-sink");
 
   if (!pgie || !nvtracker || !nvdsanalytics || !tiler || !nvvidconv ||
       !nvosd || !sink) {
@@ -384,12 +449,10 @@ main (int argc, char *argv[])
     return -1;
   }
 
-#ifdef PLATFORM_TEGRA
   if(!transform) {
     g_printerr ("One tegra element could not be created. Exiting.\n");
     return -1;
   }
-#endif
 
   g_object_set (G_OBJECT (streammux), "width", MUXER_OUTPUT_WIDTH, "height",
       MUXER_OUTPUT_HEIGHT, "batch-size", num_sources,
@@ -430,35 +493,23 @@ main (int argc, char *argv[])
   bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
   gst_object_unref (bus);
 
-  /* Set up the pipeline */
-  /* we add all elements into the pipeline */
-#ifdef PLATFORM_TEGRA
-  gst_bin_add_many (GST_BIN (pipeline), pgie, nvtracker, nvdsanalytics , tiler,
-          nvvidconv, nvosd, transform, sink,
-      NULL);
 
-  /* we link the elements together
-   * nvstreammux -> nvinfer -> nvtracker -> nvdsanalytics -> nvtiler ->
-   * nvvideoconvert -> nvosd -> transform -> sink
-   */
-  if (!gst_element_link_many (streammux, pgie, nvtracker, nvdsanalytics, tiler,
-                              nvvidconv, nvosd, transform, sink, NULL)) {
-    g_printerr ("Elements could not be linked. Exiting.\n");
-    return -1;
-  }
-#else
-  gst_bin_add_many (GST_BIN (pipeline), pgie, nvtracker, nvdsanalytics, tiler,
-                    nvvidconv, nvosd, sink, NULL);
-  /* we link the elements together
-   * nvstreammux -> nvinfer -> nvtracker -> nvdsanalytics -> nvtiler ->
-   * nvvideoconvert -> nvosd -> sink
-   */
-  if (!gst_element_link_many (streammux, pgie, nvtracker, nvdsanalytics,
-      tiler, nvvidconv, nvosd, sink, NULL)) {
-    g_printerr ("Elements could not be linked. Exiting.\n");
-    return -1;
-  }
-#endif
+
+
+    gst_bin_add_many (GST_BIN (pipeline), pgie, nvtracker, nvdsanalytics , tiler,
+            nvvidconv, nvosd, transform, encoder, parse, rtppay, sink,
+        NULL);
+    if (!gst_element_link_many (streammux, pgie, nvtracker, nvdsanalytics, tiler,
+                                nvvidconv, nvosd, transform, encoder, parse, rtppay, sink, NULL)) {
+      g_printerr ("Elements could not be linked. Exiting.\n");
+      return -1;
+    }
+    g_object_set (G_OBJECT (encoder), "preset-level", 1, NULL);
+    g_object_set (G_OBJECT (encoder), "insert-sps-pps", 1, NULL);
+    g_object_set (G_OBJECT (encoder), "bufapi-version", 1, NULL);
+    g_object_set (G_OBJECT (sink), "host", "224.224.255.255", "port",
+        udp_port, "async", FALSE, "sync", 0, NULL);
+    start_rtsp_streaming (8554/*rtsp_port*/, udp_port, 0);
 
   /* Lets add probe to get informed of the meta data generated, we add probe to
    * the sink pad of the nvdsanalytics element, since by that time, the buffer
@@ -487,6 +538,7 @@ main (int argc, char *argv[])
   g_print ("Returned, stopping playback\n");
   gst_element_set_state (pipeline, GST_STATE_NULL);
   g_print ("Deleting pipeline\n");
+  destroy_sink_bin();
   gst_object_unref (GST_OBJECT (pipeline));
   g_source_remove (bus_watch_id);
   g_main_loop_unref (loop);

1 Like