From a29d9b38be1b9c7569bc522cdc6aa39169cfdf2d Mon Sep 17 00:00:00 2001 From: Barzan Hayati Date: Sat, 12 Jul 2025 23:40:25 +0000 Subject: [PATCH] Fix rtsp streaming --- data/configuration.json | 2 +- src/pipeline_manager.cpp | 33 +++++++++++++++++---------------- src/rtsp_streaming_manager.cpp | 8 ++++---- src/sink_manager.cpp | 10 ++++++++-- src/sink_manager.hpp | 5 ++--- 5 files changed, 32 insertions(+), 26 deletions(-) diff --git a/data/configuration.json b/data/configuration.json index d8a23fb..75e08d2 100644 --- a/data/configuration.json +++ b/data/configuration.json @@ -9,7 +9,7 @@ "clock_rate": 90000, "bitrate":4000000, "payload": 96, - "rtsp_port": 8554, + "rtsp_port": 3087, "updsink_port_num": 5400, "host": "224.224.255.255" } diff --git a/src/pipeline_manager.cpp b/src/pipeline_manager.cpp index 4f51686..1b430bc 100644 --- a/src/pipeline_manager.cpp +++ b/src/pipeline_manager.cpp @@ -16,9 +16,8 @@ std::chrono::time_point PipelineManager::PipelineManager() { ; } PipelineManager::PipelineManager(int num_sources, char** url_camera) -: csv_fp("csv_fps.csv") - { - if (!csv_fp.is_open()) { + : csv_fp("csv_fps.csv") { + if (!csv_fp.is_open()) { std::cerr << "Failed to open csv_fp csv file.\n"; throw std::runtime_error("Failed to open csv_fps_buffer_probe.csv"); } @@ -69,18 +68,16 @@ char* createName(const char* str, int num) { return result; } -void PipelineManager::set_row_csv_fps(const std::string& name, double fps){ +void PipelineManager::set_row_csv_fps(const std::string& name, double fps) { if (!csv_fp.is_open()) { std::cerr << "Failed to write: stream not open for " << name << "\n"; return; - } - else{ + } else { csv_fp << name << "," << fps << "\n"; std::cout << "Wrote: " << name << " = " << fps << "\n"; - } + } } - GstPadProbeReturn PipelineManager::osd_sink_pad_buffer_probe( GstPad* pad, GstPadProbeInfo* info, gpointer user_data) { (void)pad; // This explicitly marks it as unused @@ -166,7 +163,8 @@ GstPadProbeReturn PipelineManager::buffer_probe(GstPad* pad, long long elapsed = std::chrono::duration_cast( current_time_buffer_probe - last_time_buffer_probe) .count(); - fps_buffer_probe = (double)(frame_count_buffer_probe * 1000 / (double)elapsed); + fps_buffer_probe = + (double)(frame_count_buffer_probe * 1000 / (double)elapsed); if (elapsed >= 1000) { // Update every second g_print("FPS_buffer_probe: %.2f\n", fps_buffer_probe); frame_count_buffer_probe = 0; @@ -201,7 +199,7 @@ bool PipelineManager::playing_pipeline(int num_sources, char** url_camera) { gst_element_set_state(pipeline, GST_STATE_PLAYING); GstStateChangeReturn ret = gst_element_set_state(pipeline, GST_STATE_PLAYING); - if(ret == GST_STATE_CHANGE_FAILURE) { + if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr("Unable to set pipeline to playing.\n"); gst_object_unref(pipeline); return false; @@ -346,7 +344,8 @@ bool PipelineManager::create_pipeline_elements(int num_sources, } nv_ds_logger_manager->create_nv_ds_logger(); - sink_manager->create_sink(prop); + sink_manager->create_sink(prop, rtsp_streaming_manager->host, + rtsp_streaming_manager->updsink_port_num); message_handling->create_message_handler(pipeline, g_run_forever, loop); setup_pipeline(); @@ -380,11 +379,18 @@ bool PipelineManager::create_pipeline_elements(int num_sources, g_main_loop_run(loop); + auto end = std::chrono::system_clock::now(); + std::cout << " Overall running time = " + << std::chrono::duration_cast(end - + start) + .count() + << "us" << std::endl; /* Out of the main loop, clean up nicely */ g_print("Returned, stopping playback \n"); gst_element_set_state(pipeline, GST_STATE_NULL); g_print("Deleting pipeline \n"); gst_object_unref(GST_OBJECT(pipeline)); + rtsp_streaming_manager->destroy_sink_bin(); // g_source_remove (bus_watch_id); message_handling->source_remove(); g_main_loop_unref(loop); @@ -392,11 +398,6 @@ bool PipelineManager::create_pipeline_elements(int num_sources, // g_free (g_source_bin_list); // g_free (uri); g_mutex_clear(&eos_lock); - rtsp_streaming_manager->destroy_sink_bin(); - auto end = std::chrono::system_clock::now(); - std::cout <<" Overall running time = " << - std::chrono::duration_cast(end - start).count() << - "us" << std::endl; return true; } \ No newline at end of file diff --git a/src/rtsp_streaming_manager.cpp b/src/rtsp_streaming_manager.cpp index f9382ed..8703302 100644 --- a/src/rtsp_streaming_manager.cpp +++ b/src/rtsp_streaming_manager.cpp @@ -32,12 +32,11 @@ gboolean RtspStreamingManager::start_rtsp_streaming() { GstRTSPMediaFactory *factory; char udpsrc_pipeline[512]; char port_num_Str[64] = {0}; - // char *encoder_name; + char *encoder_name; + (void)encoder_name; - // if (udp_buffer_size == 0) - // udp_buffer_size = 512 * 1024;//524288 + if (udp_buffer_size == 0) udp_buffer_size = 512 * 1024; - server = gst_rtsp_server_new(); sprintf(port_num_Str, "%d", rtsp_port); sprintf(udpsrc_pipeline, "( udpsrc name=pay0 port=%d buffer-size=%u " @@ -47,6 +46,7 @@ gboolean RtspStreamingManager::start_rtsp_streaming() { codec_rtsp_out.c_str(), payload); // H264 // g_print(udpsrc_pipeline); g_print("%s\n", udpsrc_pipeline); + 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(); diff --git a/src/sink_manager.cpp b/src/sink_manager.cpp index 20bf566..ad62e61 100644 --- a/src/sink_manager.cpp +++ b/src/sink_manager.cpp @@ -11,7 +11,8 @@ SinkManager::SinkManager() { config.at("codec_rtsp_out").get_to(codec_rtsp_out); } -bool SinkManager::create_sink(cudaDeviceProp prop) { +bool SinkManager::create_sink(cudaDeviceProp prop, std::string host, + guint updsink_port_num) { if (display_output == 0) { output_sink = "fake_sink"; sink = gst_element_factory_make("fakesink", "nvvideo-renderer"); @@ -43,7 +44,8 @@ bool SinkManager::create_sink(cudaDeviceProp prop) { caps = gst_element_factory_make("capsfilter", "filter"); g_object_set( caps, "caps", - gst_caps_from_string("video/x-raw(memory:NVMM), format=I420"), + gst_caps_from_string( + "video/x-raw(memory:NVMM), format=I420"), // video/x-raw NULL); if (!caps) { g_printerr("Unable to create caps. Exiting.\n"); @@ -53,6 +55,10 @@ bool SinkManager::create_sink(cudaDeviceProp prop) { // Make the encoder if (!strcmp(codec_rtsp_out.c_str(), "H264")) { encoder = gst_element_factory_make("nvv4l2h264enc", "encoder"); + // encoder = gst_element_factory_make("x264enc", "h264 encoder"); + // 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_printerr("Creating H264 Encoder.\n"); } else if (!strcmp(codec_rtsp_out.c_str(), "H265")) { encoder = gst_element_factory_make("nvv4l2h265enc", "encoder"); diff --git a/src/sink_manager.hpp b/src/sink_manager.hpp index 0e1a996..aa1cb35 100644 --- a/src/sink_manager.hpp +++ b/src/sink_manager.hpp @@ -13,10 +13,9 @@ class SinkManager { public: GstElement *sink = NULL, *nvvidconv_postosd = NULL, *caps = NULL, *encoder = NULL, *rtppay = NULL; - std::string host, output_sink, output_video_path; + std::string output_sink, output_video_path; int display_output = 1, bitrate; - guint updsink_port_num; SinkManager(); - bool create_sink(cudaDeviceProp prop); + bool create_sink(cudaDeviceProp prop, std::string, guint); ~SinkManager(); }; \ No newline at end of file