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);